远程DNS请求Shellcode加载,Shellcode放于服务器服务上,可随意变更ShellCode

前有文章展示了HTTP Shellcode Loader,今有DNS Shellcode Loader
不少APT组织,使用了DNS技术传输Payload,或者建立通信隧道

DNS本应被用来域名查询服务,但被不少黑客拿来恶意利用建立通信隧道,或者隐藏Payload,大部分杀毒,防火墙对DNS流量不加以检测,以绕过

效果演示

右边界面为恶意DNS,脚本在下方(DNS报文原理详细参考这篇文章)

方便演示,这里恶意代码为弹出计算器

Xs小屋s

DNS报文原理详细参考这篇文章

原理实现

1. 通过在域名服务商那指定一条域名NS记录,NS记录就是该域名由那个DNS服务器解析
2. 把域名NS记录,指向到恶意得DNS服务器,这样查询域名返回得就是恶意内容
3. 那么我们就可以把Shellcode隐藏包含在其中,记录值里面,通过查询得到Shellcode

知识点

1. DNS协议走UDP通信,数据大小不超过512 byte,超过大小DNS协议会改用TCP进行传输。
2. A类型 解析返回一个ipv4,AAAA类型返回一个ipv6,TXT类型返回一段文本,那么我们就可以把Shellcode隐藏在几种类型其中,当然不止只有这几种类型解析

ipv4利用

1. 一个IPv4长这样:114.114.114.114
2. 使用10进制组成,最大值不超过 255.255.255.255
3. 一段16进制Shellcode代码长这样:0x55,0x8B,0xEC0,x83......省略
4. 那怎么隐藏在ipv4其中,我们可以把16进制得Shellcode代码转成10进制,然后组成一个ipv4地址
5. 例:(HEX Shellcode):55,8B,EC,83转成10进制>>(DEC):85,139,236,131
6. 然后取值组成一个 IP地址>>85.139.236.131,这样就把Shellcdoe隐藏在IP中了
7. 一个ipv4不超过4位,最大存储12字节,也就是说一个ipv4可以存放12 bytes数值,但一段Shellcode代码,可不止12个字节,怎么解决?
8. 我们可以把Shellcode,拆分转换组成多个IPv4地址,然后通过遍历不同域名得到不同ipv4值,最后把ipv4转换拼凑成一条完整Shellcode代码
9. 那么中间遍历多少次不同域名,就取决于Shellcode有多少字节大小了,比如得用一段16进制Shellcode字符有700个字节,一个ipv4转成16进制可以存放8个byte,那么可能要遍历域名,80+多次,最后拼凑得到一段完整Shellcode代码

ipv6利用

1. 一个ipv6地址长这样:2402:4e00:1020:1404:0:9227:71a3:83d2
2. ipv6用于缓解当今网络ipv4数量不足情况,使用16进制组成,可以看到比ipv4长了许多,那是不是就可以多存放点Shellcode了?原理还是跟如上ipv4一样,只不过ipv6使用16进制,如就需要16进制的Shellcode代码得话,可以不用转换直接传递,不用多说

TXT利用

在DNS记录里面有个名为TXT记录得类型,该类型直接返回得是字符串,该解析类型多用于系统配置信息存放,邮箱服务器配置信息,或者其他信息字符串存放,那我就可以把Shellcode存放其中,通过查询直接得到Shellcode代码。
DNS_TXT

开始实践

如上介绍了三种方法,我们目标是存放Shellcode在DNS中,可以看到后者TXT类型可以直接存放字符串,那直接用后者方法不就行了

方便测试我就不去添加NS记录,来指定该域名由那个DNS服务器解析了,我直接在域名服务商了添加了条TXT记录,记录值,直接把Shellcode填进去,结果发现报错,遇到一坑

不懂就问

了解太少,TXT记录也有限制

20220410180136.jpg

DNS TXT说明

20220410180432.jpg
**

看来还是得老样子了,DNS TXT一条记录只能存放255 bytes,那就把有700大小 bytes的Shellcode拆分成几段255大小,放置在不同域名TXT记录里面,然后通过查询这些域名最后拼凑成一条完整Shellcode

代码思路

1. 找资料,很好 Windows 直接提供了一API函数 用于DNS查询:DnsQuery_A,在Dnsapi.dll
2. 找资料 发现老工具 C2 里面DNS上线肉鸡也是用此API
3. 这个时候需要一定C++基础了
4. 利用该APi查询不同域名,取TXT记录值,拼凑成一条Shellcode,然后写入内存运行Shellcode
5. 这里我就不开源提供全部代码了,主要介绍思路,这里列出所需要API

关键API表单

API函数所在(头文件&链接库文件)描述
DnsQuery_AWinDNS.h && Dnsapi.lib用于查询DNS类型值
sscanfstdio.h转换char数值为int数值
strcatWindows.hchar 字符串拼凑
DnsRecordListFreeWinDNS.h && Dnsapi.lib函数获取的 DNS 记录分配的内存

有问题欢迎留言评论,学习交流

最后修改:2022 年 04 月 10 日
如果觉得我的文章对你有用,请随意赞赏