소스보기 입니다.
소스코드를 해석해보겠습니다.
[소스코드 해석]
<?php
#DB연결 및 $flag에 flag값 저장 , $time에 현재시각 저장
$db = dbconnect();
$query = "select flag from challenge where idx=37";
$flag = mysqli_fetch_array(mysqli_query($db,$query))['flag'];
$time = time();
#새로고침시 /tmp-[time] 파일 생성 후 "127.0.0.1"기록
$p = fopen("./tmp/tmp-{$time}","w");
fwrite($p,"127.0.0.1");
fclose($p);
#업로드된 파일이 있을 경우 아래기호들을 제거
$file_nm = $_FILES['upfile']['name'];
$file_nm = str_replace("<","",$file_nm);
$file_nm = str_replace(">","",$file_nm);
$file_nm = str_replace(".","",$file_nm);
$file_nm = str_replace("/","",$file_nm);
$file_nm = str_replace(" ","",$file_nm);
#업로드된 파일이 있을 경우 ./tmp/[파일명] 파일에 접속 IP기록
if($file_nm){
$p = fopen("./tmp/{$file_nm}","w");
fwrite($p,$_SERVER['REMOTE_ADDR']);
fclose($p);
}
#./tmp 디렉토리의 모든 파일 출력
echo "<pre>";
$dirList = scandir("./tmp");
for($i=0;$i<=count($dirList);$i++){
echo "{$dirList[$i]}\n";
}
echo "</pre>";
#$host에 tmp-[time]의 ip정보 저장
$host = file_get_contents("tmp/tmp-{$time}");
#$request에 flag및 사용자 ip 저장
$request = "GET /?{$flag} HTTP/1.0\r\n";
$request .= "Host: {$host}\r\n";
$request .= "\r\n";
#소켓을 통해 $host에 저장된 ip로 flag 및 사용자 ip정보 전송
$socket = fsockopen($host,7777,$errstr,$errno,1);
fputs($socket,$request);
fclose($socket);
#파일이 20개가 넘으면 ./tmp의 모든 파일 삭제
if(count($dirList) > 20) system("rm -rf ./tmp/*");
?>
[2가지 방법]
1. 공인IP의 7777포트로 flag정보를 전송하기 때문에 공인아이피 7777포트로 수신되는 패킷을 내부 IP로 포트포워딩을 이용
2. tracert나 traceroute를 통해 외부로 나가는 홈네트워크의 최앞단 경로를 확인 후 모뎀이 직접 랜선을 연결하여 브릿지 모드로 작동 시키는 방법
이유는 잘 모르겠지만 포트포워딩이 잘되지 않아서 브릿지 모드를 이용하여 진행했습니다.
먼저 방화벽 인바운드 설정을 통해 7777 tcp/udp 포트를 열어 놓겠습니다.