Post

Webhacking.kr - web37

web37



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<?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/*");
?>






Solution



문제를 보면 플래그 값이 $host의 7777번 포트로 보내진다.

여기서 $host 값은 tmp/tmp-${time}에 들어있는 값으로 결정되는데 내가 파일을 직접 올려줘야 host 값이 나로 설정이 된다.

따라서 우선 공유기에서 내 PC로 7777포트로 포트포워딩을 시킨다.


나는 windows에서 nc를 다운로드 하지 않고 가상머신으로 nc를 열어서 받을려고 했다.

이 부분에서 막혔었는데, netsh 명령어를 이용해서 내 PC에서 가상머신으로 포트포워딩을 시켜줄 수 있다.
ind2x.github.io/posts/host_to_vm_ubuntu_port_forwarding/


설정을 해준 뒤, 가상머신에서 nc -lvp 7777로 열어두고 형식에 맞게 미리 tmp 파일을 업로드 해주면 나의 외부 IP:7777로 플래그가 보내진 뒤, 공유기에서 내 PC로 포트포워딩을 한 후 다시 내 PC에서 가상머신으로 포트포워딩 되어서 아래와 같이 플래그가 보여진다.


image






This post is licensed under CC BY 4.0 by the author.