使用香浓熵实现DNS Tunnel检测

菊花茶 发表于 2019/03/15 16:05:11 2019/03/15
【摘要】 最近抽了些时间研究了一下BIND(Linux DNS)日志,希望能通过DNS查询查询日志发现一些黑客入侵的蛛丝马迹。 黑客在入侵服务器之后,往往需要将目标系统中核心的信息资产传回,而传输往往会遇到防火墙、IDS等防护设备的阻拦,但通常再严密的防火墙至少也要放通DNS服务器的请求,在这个前提下,就有大牛想出通过DNS Tunnel传送数据,避过防火墙来外发数据。业界已经有很多此类工具,比如dn...

最近抽了些时间研究了一下BINDLinux 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 BINDDNS查询日志做异常检测,并发现隐藏信道。

0x01 什么是熵?

先说什么是熵?在计算机领域,熵的定义为“随机变量中的不确定度度量”。对于计算机科学中的大多数事物,熵是用香浓发明的香浓公式计算的:

shannon_equation

换句话说,字符串越随机,它对随机性的计算就越高(或者更确切地说是“熵”)。这种计算通常被称为熵的“分数”。为了说明这种“不确定度的度量”在现实中的样子,让我们计算以下域名的香农熵:

l  域名aaaaa.com的熵值为1.8

l  域名 google.com的熵值为2.6

l  A00wlkj—(-a.aslkn-C.a.2.sk.esasdfasf1111)-890209uC.4.com的熵值为3

从上面的例子可以看出来,随机程度低的域名(aaaaa.comgoogle.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

utshannonsubdomains


从查询的结果可以看到,ip-dns.info有一个非常可疑的子域名解析请求,熵值非常之高,从子域名本身的形式看也非常像DNS Tunnel


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。