使用香浓熵实现DNS Tunnel检测
最近抽了些时间研究了一下BIND(Linux DNS)日志,希望能通过DNS查询查询日志发现一些黑客入侵的蛛丝马迹。
黑客在入侵服务器之后,往往需要将目标系统中核心的信息资产传回,而传输往往会遇到防火墙、IDS等防护设备的阻拦,但通常再严密的防火墙至少也要放通DNS服务器的请求,在这个前提下,就有大牛想出通过DNS Tunnel传送数据,避过防火墙来外发数据。业界已经有很多此类工具,比如dnscat2,可以将信息加密封装在DNS协议中与C&C建立信道。
DNS Tunnel是隐蔽信道的一种,通过将其他协议封装在DNS协议中传输建立通信。对DNS载荷的编码是DNS Tunnel的另一个核心技术。从高层来看,载荷只是客户端和服务器通信的正常流量。例如客户端发送一个A记录请求给服务器,查询的主机名为2roAUwBaCGRuc3R1bm5lbGluZwo.test.domain.com,其中2roAUwBaCGRuc3R1bm5lbGluZwo则是客户端传递给服务器的信息,这串字符解码后的信息便是dns tunnel。
相信对于DNS Tunnel的检测手段应该有很多种,本文就基于Splunk平台对ISC BIND的DNS查询日志做异常检测,并发现隐藏信道。
0x01 什么是熵?
先说什么是熵?在计算机领域,熵的定义为“随机变量中的不确定度度量”。对于计算机科学中的大多数事物,熵是用香浓发明的香浓公式计算的:
换句话说,字符串越随机,它对随机性的计算就越高(或者更确切地说是“熵”)。这种计算通常被称为熵的“分数”。为了说明这种“不确定度的度量”在现实中的样子,让我们计算以下域名的香农熵:
l 域名aaaaa.com的熵值为1.8
l 域名 google.com的熵值为2.6
l A00wlkj—(-a.aslkn-C.a.2.sk.esasdfasf1111)-890209uC.4.com的熵值为3
从上面的例子可以看出来,随机程度低的域名(aaaaa.com和google.com)比随机程度高的域名(A00wlkj—(-a.aslkn-C.a.2.sk.esasdfasf1111)-890209uC.4.com)的熵值要低
0x02 为什么用熵?
基于前面提到的原因,很多恶意软件会使用DNS作为由内向外传输信息的通道,而在传输信息的时候大多会使用一种DGA (domain generation algorithm)算法,将加密信息写在域名或者子域名里面,这些域名从形式上看就像是随机生成的域名一样,比如说比较有名的蠕虫病毒Conficker 或者web爆破工具Blackhole Exploit Kit。因为这些具名都是在短时内生成的,传统的防护手段,如配置**,难以产生有效的防护。
0x03 如何实现?
基于Splunk平台我们不需要自己实现香浓熵算法,在Splunk Add-on “URL Toolbox”中包含了一套开箱即用的熵算法,我们可以将Splunk从日志中提取到的URL或者DNS域名作为算法的输入,计算字符串的熵从而找到随机程度较大的输入,进而分析出潜在的恶意软件传输通道。
URL Toolbox中基于Python实现的熵算法:
def shannon(word): entropy = 0.0 length = len(word) occ = {} for c in word : if not c in occ: occ[ c ] = 0 occ += 1 for (k,v) in occ.iteritems(): p = float( v ) / float(length) entropy -= p * math.log(p, 2) # Log base 2 return entropy
接下来看一个例子,首先请确保你的Splunk平台已经安装了URL Toolbox。
从子域名中找到DNS Tunnel:
sourcetype="isc:bind:query" | eval list="mozilla" | `ut_parse(query, list)` | `ut_shannon(ut_subdomain)` | table ut_shannon, query | sort ut_shannon desc
从查询的结果可以看到,ip-dns.info有一个非常可疑的子域名解析请求,熵值非常之高,从子域名本身的形式看也非常像DNS Tunnel。
- 点赞
- 收藏
- 关注作者
评论(0)