[ 본 문제풀이에 앞서, 제 블로그에 "Challenge 31 :: 포트 포워딩 1" 을 참고하시면 도움이 됩니다. ]
http://limjunyoung.tistory.com/61
▼ Challenge 37은 다음과 같습니다.
소스는 크게 3부분으로 나누어서 설명하겠습니다.
▼ 첫 번째,
시스템에 시간을 "$time" 이라는 변수에 넣고 "tmp" 디렉터리에 "tmp-$time" 이라는 파일을 만들어서
"127.0.0.1"을 Write 합니다.
첫 페이지에서 새로고침 했을 때, 생성되는 파일들 입니다.
"tmp/.number" 파일은 파일의 갯수를 측정하는 파일로써,
file() 함수로 한줄씩 읽어서 배열로 반환하고 숫자를 증가시킨 값을 다시 파일에 Write 합니다.
( @는 php에서 오류 제어 연산자로 생성되는 오류 메시지를 무시합니다. )
file() : 파일을 읽어서 배열로 반환 ( 예: $변수명[0] : 첫번째 줄, $변수명[1] : 두번째 줄 )
그리고, 업로드한 파일명("$file_nm")에서 특정 문자를 치환하고 본인의 IP를 Write 합니다.
▼ 두 번째,
scandir() 함수로 "tmp" 디렉터리에 있는 파일명을 출력합니다.
scandir() : 디렉터리안에 있는 파일명과 디렉터리명을 배열로 반환
▼ 세 번째,
"tmp/tmp-$time" 파일을 읽어서 첫번째 줄에 있는 IP와 $request 변수에 있는 내용("GET /$pw ...")으로
Socket을 생성하여 해당 IP에 7777번 Port로 데이터를 송신합니다.
fputs(file, string) : File에 String 입력
마지막에 있는 것은 파일 갯수가 30개 이상되면, unlink() 함수로 파일을 삭제합니다.
unlink() : 파일 삭제
결국에는, "tmp/tmp-$time" 파일에 있는 IP의 7777번 Port로 Password를 보낸다는 이야기 입니다.
하지만, 자동으로 생성되는 "tmp/tmp-$time" 파일에는 "127.0.0.1"이라는 IP 주소가 적혀 있으므로,
본인의 IP로 바꾸어줘야 한다는 이야기 입니다.
예전에 time() 함수에 시간을 맞추는 문제가 있었는데, 그 방법을 이용하면 될 것 같습니다.
미리 수초 후의 시간으로 된 파일을 만들어 놓고, 이 곳에 자신의 IP를 적어 놓습니다.
이것을 타이밍에 맞춰, 업로드해주면 "tmp/tmp-$time" 파일에는 "127.0.0.1"이 아닌 본인의 IP가 적혀져 있으므로
Password가 보함된 데이터를 7777번 Port로 수신할 수 있습니다.
풀이 방법은 Challenge 31과 방법은 동일합니다.
1. 해당 포트 Windows 방화벽 Open
2. 포트 포워딩
3. 데이터 수신
자세한 내용은 제 블로그에 Challenge 31 글을 참고하시 바랍니다.
http://limjunyoung.tistory.com/61
▼ 다음과 같이 데이터 수신은 Windows에서 NetCat을 이용하였습니다.
-o 옵션은 해당 파일로 Write 입니다. ( 데이터를 수신하면 바로 창이 닫아져서, -o 옵션을 이용하였습니다. )
▼ 해당 파일을 열어보면 다음과 같이 Password가 나와 있습니다.
'WarGame > webhacking.kr' 카테고리의 다른 글
[webhacking.kr] Challenge 56 :: SQL (와일드카드) (0) | 2015.12.01 |
---|---|
[webhacking.kr] Challenge 41 :: Error Functions (0) | 2015.11.30 |
[webhacking.kr] Challenge 43 :: 파일 업로드 취약점 1 (Content-Type) (0) | 2015.11.26 |
[webhacking.kr] Challenge 51 :: Raw MD5 (0) | 2015.11.24 |
[webhacking.kr] Challenge 21 :: Blind SQL Injection 1 (0) | 2015.11.23 |