使用香濃熵實現DNS Tunnel檢測

2021-09-24 20:32:55 字數 2131 閱讀 8170

最近抽了些時間研究了一下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。

python實現最大熵模型

encoding utf 8 created on 2017 8 7 根據李航 統計學習方法 實現 from collections import defaultdict import math class maxent object def init self self.feats default...

最大熵模型python實現

本文參考nltk maxentclassifier實現了乙個簡單的最大熵模型,主要用於理解最大熵模型中一些數學公式的實際含義。最大熵模型 pw y x zw x 1 zw x exp i 1nwi fi x y ye xp i 1n wifi x,y 這裡fi x,y 代表特徵函式,wi 代表每個特...

python實現最大熵模型

本文參考nltk maxentclassifier實現了乙個簡單的最大熵模型,主要用於理解最大熵模型中一些數學公式的實際含義。最大熵模型 pw y x zw x 1zw x exp i 1nwifi x,y yexp i 1nwifi x,y pw y x 1zw x exp i 1nwifi x,...