본문 바로가기

WarGame/webhacking.kr

[webhacking.kr] Challenge 37 :: 포트 포워딩 2


[ 본 문제풀이에 앞서, 제 블로그에 "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가 나와 있습니다.