아래는 저번에 배웠던 Command Injection 공격이 가능한 취약한 웹페이지이다.
입력한 ip에 ping을 보내는 것 같다.
한번 로컬호스트 ip를 입력 해보았다.
내 서버는 아파치이고 한글 윈도우에서 돌고 있다.
그렇기 때문에 이 웹페이지에서는 한글이 인코딩 되지 않아서 이렇게 깨지는 것을 볼 수 있다.
이번엔 프록시 서버를 키고 버프슈트로 요청 패킷을 인터셉트 해보았다.
아래는 그 요청패킷이다.
POST 방식으로 내 로컬 서버에 /dvwa/vulnerabilities/exec/ 이라는 디렉토리에 요청을 보내고 있다.
직접 들어가보자
아래처럼 그 경로에는 이렇게 난이도마다의 php파일이 있다.
low레벨의 파일을 들여다보니 윈도우와 리눅스를 확인하고 그 각 터미널에서 명령어를 실행한다.
그리고 그 실행결과를 화면에 출력한다.
low레벨의 코드여서 그런지 나의 입력값에 대해서 어떤 필터링도 없는 것을 볼 수 있다.
<?php
if( isset( $_POST[ 'Submit' ] ) ) {
// Get input
$target = $_REQUEST[ 'ip' ];
// Determine OS and execute the ping command.
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// Windows
$cmd = shell_exec( 'ping ' . $target );
}
else {
// *nix
$cmd = shell_exec( 'ping -c 4 ' . $target );
}
// Feedback for the end user
$html .= "<pre>{$cmd}</pre>";
}
?>
일단 한국어가 깨지니 불편하므로 구글의 Web Server for Chrome을 이용해서 아래처럼 한국어를 인코딩했다.
그리고 리눅스의 ls명령어를 사용해서 현 디렉토리의 파일들을 보고 싶었는데 내 서버가 윈도우에서 실행되고 있다보니 윈도우 cmd 명령어를 사용해야 했다.
그래서 찾아본 결과 윈도우에서는 ls대신 dir를 사용한다는 것을 알게 되었다.
그리고 &&문자로 명령어를 한줄에 여러개 실행할 수 있다는 것도 알았다.
이후 127.0.0.1 && dir 이라는 명령어를 POST payload값으로 보냈다.
돌아온 응답을 보니 exec디렉토리의 list의 정보를 보여준다.
나는 py파일을 악성 파일이라고 가정하고 하나 만들어보겠다.
아래처럼 127.0.0.1 && echo print("Hacked") > Hacked.py
라는 명령어를 페이로드로 보내게 되면
그 디렉토리에 print("Hacked") 라는 코드가 실행되는 Hacked.py가 저장될 것이다.
코드가 만약에 복잡한 악성코드였다면 pc는 장악당하기 매우 쉬운 상황인 것이다.
아래처럼 다시 dir를 보게되면 Hacked.py가 만들어진 것을 볼 수 있고
실제로 디렉토리를 GUI환경에서 들어가 봤을 때 Hacked라는 파일이 생긴 것을 볼 수 있다.