본문 바로가기
[웹해킹]/[Webhacking.kr]

[Webhacking.kr] 37번

by Hevton 2020. 10. 28.
반응형

아 또 포트포워딩 해야하는 문제다. 공유기 관리자 접근 계정도 모르겠고 포트포워딩 여는것도 별로 좋아하지 않아서 뇌로 풀었다.

 

소스

<?php
  include "../../config.php";
  if($_GET['view_source']) view_source();
?><html>
<head>
<title>Challenge 37</title>
</head>
<body>
<?php
  $db = dbconnect();
  $query = "select flag from challenge where idx=37";
  $flag = mysqli_fetch_array(mysqli_query($db,$query))['flag'];
  $time = time();

  $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);

  if($file_nm){
    $p = fopen("./tmp/{$file_nm}","w");
    fwrite($p,$_SERVER['REMOTE_ADDR']);
    fclose($p);
  }

  echo "<pre>";
  $dirList = scandir("./tmp");
  for($i=0;$i<=count($dirList);$i++){
    echo "{$dirList[$i]}\n";
  }
  echo "</pre>";

  $host = file_get_contents("tmp/tmp-{$time}");

  $request = "GET /?{$flag} HTTP/1.0\r\n";
  $request .= "Host: {$host}\r\n";
  $request .= "\r\n";

  $socket = fsockopen($host,7777,$errstr,$errno,1);
  fputs($socket,$request);
  fclose($socket);

  if(count($dirList) > 20) system("rm -rf ./tmp/*");
?>
<form method=post enctype="multipart/form-data" action=index.php>
<input type=file name=upfile><input type=submit>
</form>
<a href=./?view_source=1>view-source</a>
</body>
</html>

 

전체 흐름을 보면 현재 시간값을 가져와서 'tmp-시간값' 으로 된 파일들을 접속 시마다 생성한다. 그리고 20개가 되면 모조리 지운다.

이때, 파일 안에 127.0.0.1 이라는 값으로 저장되는데, 해당 서버에서 이 파일 안의 주소값과 포트번호 7777의 호스트에 접속을 하여 플래그값을 뿌려준다. 그래서 이 주소를 내 주소로 바꿔줘야한다.

 

해당 서버에 접속하는 time값에 해당하는 'tmp-시간값' 파일을 새로 만들어서 시간값에 맞는 정확한 시간에 업로드하면

기존의 tmp-시간값 파일이 생성되고 난 뒤 코드에서 해당 파일의 내용을 내 ip로 덮어쓰게된다.

 

그리고 그때 '7777포트를 포트포워딩을 해놓은 상태에서 netcat을 통해 포트를 열어둔 내 호스트'에 플래그값이 전달된다.

FLAG{well...is_it_funny?_i_dont_think_so...}

 

참고로 이런 문제를 '레이스컨디션 기법' 문제라고 합니다.

한정된 자원을 여러 프로세스가 동시에 작업하게 되면서 실행순서의 취약점 발생을 이용해 공격하는 것이죠.

 

 

+ 참고로 php에서 fopen의 w옵션은 덮어쓰기임. a가 내용추가.

 

반응형

'[웹해킹] > [Webhacking.kr]' 카테고리의 다른 글

[Webhacking.kr] 39번  (0) 2020.11.03
[Webhacking.kr] 38번  (0) 2020.11.03
[Webhacking.kr] 36번  (0) 2020.10.28
[Webhacking.kr] 35번  (0) 2020.10.24
[Webhacking.kr] 34번  (0) 2020.10.24