基于DNS的數據泄露開源測試工具篇(一)

2019-12-26 45377人圍觀 工具

免責聲明:本文作者竭力保證文章內容可靠,但對于任何錯誤、疏漏或不準確的內容,作者不負任何責任。文章部分內容來源于網絡是出于傳遞更多信息的目的,對此不負任何法律責任。本文僅用于技術分享與討論,嚴禁用于其他用途。

一、前言

隨著攻防對抗持續升級,攻擊者與防御者之間在各方面的較量逐漸擴大。從ATT&CKTM矩陣[1]我們可以發現,攻擊者完成攻擊活動戰術(Tatics,攻擊行為的技術目標)明確,且每個戰術下的可用技術(Technique,為實現戰術所使用的方法)眾多。在“假定失陷(Assume Breach)[2]”的現狀下,作為防御方我們必須深入分析攻擊者在實際攻擊活動中正在使用、可能使用的技術,然后從攻擊原理的角度指導防御策略制定、防御系統搭建,從而盡可能的在攻防博弈中占據主動地位。

正是在這一思想的指引下,本文將聚焦到基于DNS的數據竊取技術。本文所討論的該技術主要指:攻擊者惡意利用現有DNS服務來(隱蔽)竊取受害者主機上的高價值數據、重要文件等所使用的技術。參考近幾年的惡意組織/攻擊活動分析報告,可以發現這種隱蔽的攻擊活動不乏真實案例的曝光;如APT32使用的后門工具曾利用DNS完成數據竊取,CopyKittens所使用攻擊框架中的RAT也利用DNS竊取目標主機的重要文件數據。為了更好的理解基于DNS的數據竊取和隱蔽回傳的技術細節,以攻擊原理引導防御策略制定和防御能力提升。本次將選取DET(Data Exfiltration Toolki)、PyExfil、DNSExfiltrator——三個github上認可度較高的開源項目進行簡要分析,同時這些工具可以幫助管理員快速搭建測試模擬環境,測試其系統對抗DNS數據竊密的檢測能力。三個工具在github上收獲的“粉絲”情況如圖1。

圖1 DET、PyExfil、DNSExfiltrator的首頁展示

注:三個開源工具中DET、PyExfil為綜合性工具,即它們不僅僅實現了DNS竊密技術;但本文只摘取了其基于DNS的數據竊取、隱蔽回傳的相關部分進行梳理和簡要分析。

二、DET工具簡介

DET(Data Exfiltration Toolkit)是一個Github開源項目[3],該項目作者將它描述為一個用于數據泄露概念驗證的項目,其基本思想是建立一個通用工具箱,可以動態擴展實現對多種類型協議、服務的利用,用來測試和驗證利用不同協議或服務的數據泄露技術。

DET項目整體結構如圖2,從圖中可以看出,該工具通過插件形式實現擴展,支持使用不同協議、服務進行數據竊取,已實現協議、服務見表1。本文主要關注利用DNS進行數據竊取的相關部分(圖2中標星部分)。

圖2 DET項目整體情況

支持協議 DNS、HTTP、ICMP、TCP、UDP
支持服務 Gmail、Twitter、Slack、Google docs

表1 DET已實現的可利用服務、協議

三、基于DNS的數據竊取的源碼簡要分析

圖2表明,det.py文件為DET工具運行的主體框架,不同的協議或服務的具體細節則分別在對應插件目錄下實現。所以我們重點關注det.py、plugins/dns.py兩個源碼文件。

(一)det.py源碼簡要分析

對det.py代碼中的主要方法、類梳理如圖3。本文將重點關注用于關鍵類Exfiltration和類ExfiltrationFile。同時,在det.py中,也實現了一些通用方法,如:使用的加/解密方法為AES,具體實現是導入python的AES庫;使用MD5進行文件校驗,具體則采用python的hashlib庫實現。除此之外,det.py實現了插件管理的多個方法,實現在使用DET工具是可以動態啟用、停用特定協議或服務等。

圖3 det.py代碼概況

類Exfiltration主要包含服務端接收和恢復竊密文件的關鍵實現源碼,也對部分輔助函數進行了封裝。關鍵方法有register_file()、retrieve_file()、retrieve_data()等。

register_file()方法的主要功能是:根據文件唯一標識jobid(隨機生成的7為字符串,用來標識哪些數據包屬于同一個文件),在服務端的全局字典files(暫存接收的文件數據塊)中初始化該文件的相關信息,主要包括添加該文件對應的jobid到全局字典files、提取并存儲該文件的校驗和文件名等信息;全局字典files中單個文件的存儲結構如圖4。

圖4 單個文件在字典files中的形式化存儲

retrieve_file()方法主要負責將已竊取的文件數據寫入本地文件,該方法會首先計算文件數據的檢驗和,然后與注冊包中傳送的校驗和對比,只有在驗證通過的情況下才執行數據解密并寫入本地文件。

retrieve_data()方法的主要作用是根據監聽端口所收到包的不同類型,采取對應的預設處理方法;例如:當收到的包為文件數據包時,則從該包中提取文件數據,并將數據按jobid和包序號存入files[jobid][data]中。其中,不同包類型及其結構見表2。

包類型 組成結構
初始化包 <jobid> |!| <filename> |!| <”REGISTER”> |!| <checksum>
竊密數據包 <jobid> |!| <packet_num> |!| <data>
結束包 <jobid> |!| <packet_num> |!| <”DONE”>

表2 DET包類型及其組成結構

ExfiltrationFile類主要作用于客戶端,負責處理欲竊取的文件數據,然后啟用指定協議或服務的插件來發送竊密文件數據塊。其工作主要流程如下:

1)計算欲發送文件數據的MD5值,用作文件校驗。

2)完成預處理工作,包括注冊使用指定協議/服務的插件、讀取其他定制參數、讀取文件數據、壓縮及加密等。

3)構造初始化(注冊)塊,并啟用插件實現的方法發送。

4)每次讀取隨機大小的文件數據塊,編碼、添加包序號后逐個發送,直到文件數據發送完畢。

5)構建結束塊,并啟動插件實現的方法發送。

注:不同包類型的構建格式參考表2

(二)插件plugins/dns.py簡要分析

dns.py文件包含客戶端發送、服務端接收處理單個DNS請求包的實現細節。例如:當客戶端啟用DET工具時指定利用協議為DNS時,det.py將通過插件管理啟用dns.py。該源碼文件主要負責將要傳送的數據塊二次拆分,并以符合DNS協議的形式編碼組合為指定域名的子域名,然后通過DNS查詢包發送。值得注意的是該文件與det.py文件協同工作,dns.py文件的處理對象是det.py輸入的單個數據塊,最終以一個或多個DNS查詢請求包發送到服務端;而det.py的處理對象則是欲竊取文件對象,輸出將作為dns.py的處理對象。梳理dns.py文件源碼結構如圖5。

圖5 dns.py源碼概況

圖5中的listen()方法通過sniff監聽在指定地址上接收數據,即用于服務端接收DNS請求數據,提出去子域名后作為handle_dns_packet()方法的處理對象。handle_dns_packet()方法將簡單處理收到的DNS包,提取、暫存編碼在子域名中的竊密數據;當檢測到數據塊傳輸完成,則解碼數據塊并交付給det.py做進一步處理。而send()方法則用于客戶端構造并發送嵌入了竊密數據的DNS查詢;它主要負責將det.py處理后的數據塊拼接組成給定域名的子域名(子域名的拼接規則見表2中的竊密數據包),并發送到指定竊密服務器的目標端口(默認53端口)。

總結與思考:

通過以上分析,整理總結DET工具的整體流程如下圖:

圖6 DET工具的整體流程

通過對DET工具的實驗測試,該項目作為測試項目在實際測試中存在一些問題,例如:

1)效率較低。如:使用Hex編碼使實際傳輸文件數據是原始文件數據的2倍,處理數據塊、構造DNS包時重復添加文件標識等。

2)抓包后的流量明顯異常。如:子域名、單個標簽過長,數字占比極高等。

3)服務端恢復成功率影響因素較多。如:DNS包的次序、文件數據大小等。

*本文作者:GZHU/asUwIll,轉載請注明來自FreeBuf.COM

相關推薦
取消
Loading...

特別推薦

活動預告

填寫個人信息

姓名
電話
郵箱
公司
行業
職位
css.php 微信上那些说赚钱是真的吗