我們在使用機器學習做DNS隱蔽通道檢測的過程中,不得不面臨樣本收集的問題,沒辦法,機器學習沒有樣本真是“巧婦難為無米之炊”啊!
本文簡單介紹了DNS隱蔽通道傳輸工具iodine,並介紹如何從iodine的網絡流量中抓取DNS報文生成pcap包,並將其轉化為機器學習檢測算法所能夠識別的文本文件。
1、環境准備和iodine安裝
DNS隱蔽通道工具iodine分為服務器端程序iodined和客戶端程序iodine。服務器端程序iodined提供特定域名的DNS解析服務。當客戶端請求該域名的解析,就可以建立通道連接。iodine支持NULL,TXT,SRV,MX,CNAME,A等多種查詢請求類型,並且支持EDNS,支持base32,base64,base128等多種編碼規范,更多使用方法和功能特性請參考官方文檔。
iodine支持直接轉發和中繼兩種模式。客戶端和服務端建立通信后,可以看到客戶機上多出一塊名為dns0的虛擬網卡。本文使用iodine直連模式建立DNS通道。
在安裝DNS 通道工具iodine之前,你需要准備2台linux機器,其中一台作為DNS隱蔽通道的Client,另外一台作為目標DNS Server。接下來在兩台linux機器上安裝iodine。
DNS 通道工具iodine的主頁在http://code.kryo.se/iodine/,視你使用的操作系統版本而定,安裝過程詳見官方文檔。安裝成功以后,輸入iodined --help應該輸出類似圖3的結果。
圖 1 iodined --help幫助文檔
2、捕獲iodine收發的DNS報文
在iodine的Server機器上,執行:sudo iodined -P passwd -f -DD 192.168.0.1 abc.com
其中,abc.com域名是自定義的傳輸DNS隱蔽通道數據的主域名,192.168.0.1是自定義輸入的虛擬IP,passwd是自定義的密碼。
在iodine的Client機器上,開啟tcpdump DNS抓包,執行:sudo tcpdump -i <eth0> port 53 -w iodine direct.pcap即可,記得將<eth0>換成你的網卡名。然后執行:sudo iodine -P passwd -f -r -T TXT <your iodine server ip> abc.com
其中,<your iodine server ip> 需要替換成iodine server端機器的IP(兩台機器在同一個內網里的話,填寫內網IP即可)。
上述步驟操作成功后,在Client和Server機器控制台上可以看到如下輸出:
圖2 iodine Client端輸出
圖3 iodine Server端輸出
從圖3可以看出,iodine在建立DNS通道連接的過程中,使用了大量的特殊字符子域名。而在DNS報文中包含大量的不符域名規范的子域名是DNS隱蔽通道的檢測特征之一。
查看Server和Client端的網卡配置,可以看到兩台機器都多出了dns0的虛擬網卡。
圖4 Client端在建立iodine DNS通道后多出了dns0虛擬網卡
圖5 Server端在建立iodine DNS通道后多出了dns0虛擬網卡
實際上,訪問server端設定的192.168.0.1 IP地址和直接訪問iodine server機器IP是一樣的,例如你可以通過ssh root@192.168.0.1來實現對server端機器的遠程登錄,使用scp來傳輸文件,甚至使用shadowsocks來反向代理來上網等。
接下來使用wireshark查看tcpdump剛剛抓到的包:
圖6 wireshark查看tcpdump抓包
如圖6所示,可以看到針對abc.om這個主域名,包含了大量的子域名請求,而這些子域名負責攜帶外發數據。
由於機器學習的檢測算法並不認pcap這種特殊的文件格式,因此需將其轉化為檢測算法所能夠識別的文本文件。我們暫且稱這種文本文件為pcap metadata文件吧。
3、從pcap報文生成pcap metadata
pcap metadata文件是由“^”分割的描述網絡傳輸報文的文本文件,其示意格式如下(包含了3條報文):
^^10.0.2.15^45.77.39.243^40812^53^17^^^^^1513249151.379262000^1513249151.573115000^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^0^dnscat.21.nmosubth.6d76676c.3.fegigfcaenejfecaemgjgdgfgohdgfcacienejfecjakakedgphahjhcgjghgi.hecacigdcjcadcdadbdgcaeogjgdglcaengdedgmhfhcgfakedgphahjhcgjgh.gihecacigdcjcadcdadbdgcafagbgdglhecafahfgcgmgjhdgigjgogh.cdcp.directdns^5^0x00000001^193853.139877^1^10.0.2.15;45.77.39.243^^^^^^^^^^^^^^^^^^^^^c56d0100000100000000000006646e73636174023231086e6d6f737562746808366437363637366301333e6665676967666361656e656a66656361656d676a67646766676f6864676663616369656e656a6665636a616b616b656467706861686a6863676a676867693e6865636163696764636a636164636461646264676361656f676a6764676c6361656e67646564676d686668636766616b656467706861686a6863676a67683867696865636163696764636a636164636461646264676361666167626764676c68656361666168666763676d676a68646769676a676f6768046364637009646972656374646e730000050001^^^^^^^^^46^^^^^^^^^^^ |
使用github上的generate_metadata_from_pcap.py 腳本文件將pcap文件轉換為metadata文件。值得注意的是在使用該腳本前,需要安裝wireshark以便使用tshark命令,否則腳本會抱怨找不到tshark路徑。
圖7 使用generate_metadata_from_pcap.py 腳本前需要先安裝wireshark
接下來,使用:python generate_metadata_from_pcap.py <your pcap file path> <metadata save dir> 即可生成metadata文件了,成功操作后的效果如圖8所示。
圖8 由pcap文件成功生成metadata文件
最后,就可以將該metadata文件作為樣本,用機器學習來進行DNS 隱蔽通道檢測了。