티스토리 뷰

- TinyHosting


문제 서버가 닫혀있어서 캐쉬를 긁어모아서 개인 서버에 비슷하게 구축하였다.

http://rnd.do9.kr/tiny/


소스를 보면 주석으로 처리된 값을 확인할 수 있다.


주석으로 처리된 값을 파라미터로 전송하게 되면 index.php 소스 코드를 볼 수 있다.


index.php

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
<?php
    $savepath="files/".sha1($_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT'])."/";
    if(!is_dir($savepath)){
        $oldmask = umask(0);
        mkdir($savepath0777);
        umask($oldmask);
        touch($savepath."/index.html");
    }
    if((@$_POST['filename']) && (@$_POST['content']) ){
        $fp = fopen("$savepath".$_POST['filename'], 'w');
        fwrite($fpsubstr($_POST['content'],0,7) );
        fclose($fp);
        $msg = 'File saved to <a>'.$savepath.htmlspecialchars($_POST['filename'])."</a>";
    }
?>
<!DOCTYPE html>
<!--[if lt IE 7]> <html class="lt-ie9 lt-ie8 lt-ie7" lang="en"> <![endif]--><!--[if IE 7]> <html class="lt-ie9 lt-ie8" lang="en"> <![endif]--><!--[if IE 8]> <html class="lt-ie9" lang="en"> <![endif]--><!--[if gt IE 8]><!--><html lang="en"><!--<![endif]--><head>
<?php if(@$_GET['src']) show_source("index.php");?>
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  <title>TinyHosting</title>
  <link rel="stylesheet" href="css/style.css">
  <!--[if lt IE 9]><script src="//html5shim.googlecode.com/svn/trunk/html5.js"></script><![endif]-->
</head>
<body>
    <!-- <a href="./?src=">src</a>-->
     <form method="post" action="" class="login">
        <p>
              <label for="login">Filename:</label>
              <input type="text" name="filename" >
        </p>
        <p>
              <label for="password">Content:</label>
              <input type="text" name="content" maxlength="7">
        </p>
        <p class="login-submit">
              <button type="submit" class="login-button">Create!</button>
        </p>
              </form>
<?php echo "<center>$msg</center>";?>
</body></html>
cs


소스 코드를 보면 REMOTE_ADDR 값과 HTTP_USER_AGENT 값을 더한 다음 SHA1으로 암호화한 값을 디렉터리 경로로 해서 index.html 파일이 생성되는 것을 볼 수 있다. 그리고 입력한 filenamecontent를 바탕으로 해당 디렉터리에 파일을 생성하는 코드가 있다.

하지만, 입력할 수 있는 content 7글자로 제한되어 있다.

<?=`w`;

위와 같이 PHP로 실행할 수 있는 명령어는 1글자로 제한된다. 


index.php 내용을 <?=`w`; 로 전송하면 자신의 디렉터리에 파일이 생성되는 것을 볼 수 있다.


생성된 파일을 확인해보면 w 명령어가 실행된 결과를 볼 수 있다.


실행된 결과를 소스 보기로 보면 조금 더 깔끔하게 볼 수 있다.


PHP에서 명령어를 실행할 수 있는 방법 중에 아래와 같은 방법도 있다.

SHELL 이름으로 파일을 생성하고 SHELL 이름보다 알파벳 순으로 뒤에 있는 파일을 생성해준다.

그리고 알파벳 순으로 뒤에 있는 파일 내용에 명령어를 입력해준다.

마지막으로 * 명령어를 이용하면 현재 디렉터리에 있는 파일명들이 명령어로 한 줄로 실행이 되면서 아래와 같이 실행이 된다.

$ csh 알파벳_순으로_csh보다_뒤에_있는_파일 index.php index.html

비슷한 예)

$ python go.py

$ bash bash.sh

$ sh sh_

즉, csh로 뒤에 있는 파일을 실행하게 되기 때문에 파일 내용이 이전보다 6글자 더 길어짐으로써 더 다양한 명령어를 사용할 수 있다.


여기에서는 w 명령어 결과 화면에서 csh가 사용되고 있는 것을 볼 수 있기 때문에 파일명을 csh로 하고 내용은 상관이 없다.

(실제 서버에서 기억하기로는 bash와 dash(Ubuntu Server)가 된 것 같다.)


그리고 csh 보다 알파벳 순으로 뒤에 있는 이름으로 파일명을 만들어주고 7글자 내에서 명령어를 내용으로 만들어준다.

(임의로 파일명은 do, 내용은 ls -al로 하였다.)


그리고 앞에서 만든 파일들을 실행시켜줄 * 명령어를 index.php 형태로 만들어준다.


생성된 index.php을 실행해보면 아래 그림과 같이 ls -al 명령어가 실행된 결과를 볼 수 있다.


동일한 방법으로 루트 디렉터리 목록을 살펴보았다.


루트 디렉터리 내에 file_you_want 파일이 있는 것을 볼 수 있다.


해당 파일을 읽어오는 명령어를 만들어서 실행한다.


flag: 32c3_Gr34T_Th1ng5_Are_D0ne_By_A_Ser13s_0f_5ma11_Th1ngs_Br0ught_T0ge7h3r


댓글
«   2024/04   »
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
링크
공지사항
Total
Today
Yesterday