티스토리 뷰
- 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($savepath, 0777); umask($oldmask); touch($savepath."/index.html"); } if((@$_POST['filename']) && (@$_POST['content']) ){ $fp = fopen("$savepath".$_POST['filename'], 'w'); fwrite($fp, substr($_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 파일이 생성되는 것을 볼 수 있다. 그리고 입력한 filename과 content를 바탕으로 해당 디렉터리에 파일을 생성하는 코드가 있다.
하지만, 입력할 수 있는 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
'CTF (Git으로 이사 예정)' 카테고리의 다른 글
[SSCTF] Up!Up!Up! - Web (100) (0) | 2016.03.01 |
---|---|
[SharifCTF] technews - Web (200) (0) | 2016.02.09 |
[SharifCTF] PhotoBlog - Web (100) (0) | 2016.02.09 |
[32C3] ITD - Web (150) (0) | 2016.01.19 |
[32C3] Sequence Hunt - Web (200) (0) | 2016.01.13 |
[32C3] Kummerkasten - Web (300) (0) | 2016.01.12 |
[32C3] MonkeyBase - Web (200) (0) | 2016.01.07 |
[32C3] forth - Pwn (150) (0) | 2016.01.03 |
[CODEGATE2015] Owltube - Web (400 Point) (0) | 2015.03.16 |
[CODEGATE2015] Owlur - Web (200 Point) (0) | 2015.03.16 |