之前有想过去写一个读取dnslog去获取命令回显的工具,后面看到已经有师傅写过了,就没研究了;但是过了一阵子,工具自带的dnslog改了时区,导致原有工具使用不了,于是,A0WaQ4师傅就二开+优化了这个工具,挺好用,也很方便。
在一次日常的渗透测试任务中,进入了若依的后台,其中存在定时任务命令执行漏洞,但是无法使用http远程加载类执行命令,也无法注入内存马。
此时想到了这个漏洞可以利用ldap协议来执行命令,所以尝试使用了jndi来注入内存马,结果失败了,尝试执行命令,发现可以成功,但是无法直接上线。但此时发现它可以ping通DNS。由此产生了这篇文章。
若依,命令无法正常回显,DNS协议出网,无法注入内存马,无法直接上线,种种特征使我立刻想到了一个工具:
https://github.com/sv3nbeast/DnslogCmdEcho
该工具可以在极端环境下通过DNS获取命令回显。
研究了代码逻辑,发现该工具的实现是使用Hex编码命令执行的结果,将编码存储到一个文件中,再逐行读取该文件,将命令回显的Hex编码通过DNS协议发送出去,然后再根据DNS获取的结果重组编码获取命令回显。
但是在使用过程中出现了很多问题,例如由于DNS服务器的时区和我的电脑时区不一样无法获取命令回显,使用的DNS服务器dim.pm无法接收到目标机器的DNS等。
为了使用该工具,我更换了DNS服务器,调整了时区,最终获取了命令回显。
但是很明显,没有获取到完整的命令回显,最有可能的原因是命令回显太大,发送DNS需要时间,而该工具仅在3秒内就获取结果,导致无法获取完整的命令回显,由此我产生了彻底改造该工具的想法。
改造的目标分为以下几个点:
修改DNS服务器
修改时区
合并两个文件,减少人工行为
获取完整的命令回显
我选择了ceye服务器,利用它的过滤器可以达成dig.pm的token效果。
这一点很简单,因为使用的是ceye服务器,所以使用的也是UTC时区,所以直接使用之前修改工具时已经加上的时区转换。
原工具使用两个文件生成Windows和Linux命令,这可以直接合并在一起,只要让其每一次初始化时可以执行一次获取新的命令即可。
同时发现了Linux的命令在zsh下无法执行,也做了一下兼容。
实现该功能,只需要利用filter获取完整的DNS结果即可。实现过程,实现一个新的初始化函数get_config(),在想要获取完整的命令回显时只使用get_config()来初始化,便可直接进入到解码Hex的过程中,获取命令回显。
usage: HexDnsEchoT.py [-h] [-d DNSURL] [-t TOKEN] [-lt LASTFINISHTIME] [-f FILTER] [-m MODEL]options:
-h, --help show this help message and exit
-d DNSURL, --dnsurl DNSURL
ceye dnslog
-t TOKEN, --token TOKEN
ceye token
-lt LASTFINISHTIME, --lastfinishtime LASTFINISHTIME
the lastfinisgtime
-f FILTER, --filter FILTER
dns filter
-m MODEL, --model MODEL
recent result
命令如下:
python3 HexDnsEchoT.py -d YourCeye.ceye.io -t ceyeToken
复制输出的命令,在目标机器上执行:
DNS获取到请求,进行解密,获取机器信息:
执行成功后自动开启新的filter,无需重新执行直接进行下一步命令执行
有时会出现目标机器的命令未执行完成,但是已经获取到了一部分结果,可以使用以下命令再次获取结果,本命令已经输出在上次的执行结果中,可直接复制使用:
python3 HexDnsEchoT.py -d yourceye.ceye.io -t ceyetoken -f filterstr -lt "上次命令执行的时间" -m GR
在遇到工具无法使用时不要放弃,多想想办法就可以解决。
https://github.com/A0WaQ4/HexDnsEchoT