安全動(dòng)態(tài)

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

來源:聚銘網(wǎng)絡(luò)    發(fā)布時(shí)間:2020-01-10    瀏覽次數(shù):
 

信息來源:FreeBuf

一、前言

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

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

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

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

二、DET工具簡介

DET(Data Exfiltration Toolkit)是一個(gè)Github開源項(xiàng)目[3],該項(xiàng)目作者將它描述為一個(gè)用于數(shù)據(jù)泄露概念驗(yàn)證的項(xiàng)目,其基本思想是建立一個(gè)通用工具箱,可以動(dòng)態(tài)擴(kuò)展實(shí)現(xiàn)對(duì)多種類型協(xié)議、服務(wù)的利用,用來測試和驗(yàn)證利用不同協(xié)議或服務(wù)的數(shù)據(jù)泄露技術(shù)。

DET項(xiàng)目整體結(jié)構(gòu)如圖2,從圖中可以看出,該工具通過插件形式實(shí)現(xiàn)擴(kuò)展,支持使用不同協(xié)議、服務(wù)進(jìn)行數(shù)據(jù)竊取,已實(shí)現(xiàn)協(xié)議、服務(wù)見表1。本文主要關(guān)注利用DNS進(jìn)行數(shù)據(jù)竊取的相關(guān)部分(圖2中標(biāo)星部分)。

圖2 DET項(xiàng)目整體情況

三、基于DNS的數(shù)據(jù)竊取的源碼簡要分析

圖2表明,det.py文件為DET工具運(yùn)行的主體框架,不同的協(xié)議或服務(wù)的具體細(xì)節(jié)則分別在對(duì)應(yīng)插件目錄下實(shí)現(xiàn)。所以我們重點(diǎn)關(guān)注det.py、plugins/dns.py兩個(gè)源碼文件。

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

對(duì)det.py代碼中的主要方法、類梳理如圖3。本文將重點(diǎn)關(guān)注用于關(guān)鍵類Exfiltration和類ExfiltrationFile。同時(shí),在det.py中,也實(shí)現(xiàn)了一些通用方法,如:使用的加/解密方法為AES,具體實(shí)現(xiàn)是導(dǎo)入python的AES庫;使用MD5進(jìn)行文件校驗(yàn),具體則采用python的hashlib庫實(shí)現(xiàn)。除此之外,det.py實(shí)現(xiàn)了插件管理的多個(gè)方法,實(shí)現(xiàn)在使用DET工具是可以動(dòng)態(tài)啟用、停用特定協(xié)議或服務(wù)等。

圖3 det.py代碼概況

類Exfiltration主要包含服務(wù)端接收和恢復(fù)竊密文件的關(guān)鍵實(shí)現(xiàn)源碼,也對(duì)部分輔助函數(shù)進(jìn)行了封裝。關(guān)鍵方法有register_file()、retrieve_file()、retrieve_data()等。

register_file()方法的主要功能是:根據(jù)文件唯一標(biāo)識(shí)jobid(隨機(jī)生成的7為字符串,用來標(biāo)識(shí)哪些數(shù)據(jù)包屬于同一個(gè)文件),在服務(wù)端的全局字典files(暫存接收的文件數(shù)據(jù)塊)中初始化該文件的相關(guān)信息,主要包括添加該文件對(duì)應(yīng)的jobid到全局字典files、提取并存儲(chǔ)該文件的校驗(yàn)和文件名等信息;全局字典files中單個(gè)文件的存儲(chǔ)結(jié)構(gòu)如圖4。

圖4 單個(gè)文件在字典files中的形式化存儲(chǔ)

retrieve_file()方法主要負(fù)責(zé)將已竊取的文件數(shù)據(jù)寫入本地文件,該方法會(huì)首先計(jì)算文件數(shù)據(jù)的檢驗(yàn)和,然后與注冊(cè)包中傳送的校驗(yàn)和對(duì)比,只有在驗(yàn)證通過的情況下才執(zhí)行數(shù)據(jù)解密并寫入本地文件。

retrieve_data()方法的主要作用是根據(jù)監(jiān)聽端口所收到包的不同類型,采取對(duì)應(yīng)的預(yù)設(shè)處理方法;例如:當(dāng)收到的包為文件數(shù)據(jù)包時(shí),則從該包中提取文件數(shù)據(jù),并將數(shù)據(jù)按jobid和包序號(hào)存入files[jobid][data]中。其中,不同包類型及其結(jié)構(gòu)見表2。

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

1)計(jì)算欲發(fā)送文件數(shù)據(jù)的MD5值,用作文件校驗(yàn)。

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

3)構(gòu)造初始化(注冊(cè))塊,并啟用插件實(shí)現(xiàn)的方法發(fā)送。

4)每次讀取隨機(jī)大小的文件數(shù)據(jù)塊,編碼、添加包序號(hào)后逐個(gè)發(fā)送,直到文件數(shù)據(jù)發(fā)送完畢。

5)構(gòu)建結(jié)束塊,并啟動(dòng)插件實(shí)現(xiàn)的方法發(fā)送。

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

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

圖5 dns.py源碼概況

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

總結(jié)與思考:

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

圖6 DET工具的整體流程

通過對(duì)DET工具的實(shí)驗(yàn)測試,該項(xiàng)目作為測試項(xiàng)目在實(shí)際測試中存在一些問題,例如:

1)效率較低。如:使用Hex編碼使實(shí)際傳輸文件數(shù)據(jù)是原始文件數(shù)據(jù)的2倍,處理數(shù)據(jù)塊、構(gòu)造DNS包時(shí)重復(fù)添加文件標(biāo)識(shí)等。

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

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

 
 

上一篇:MITRE發(fā)布首個(gè)針對(duì)工業(yè)控制系統(tǒng)(ICS)的ATT&CK知識(shí)庫

下一篇:2020年01月10日 聚銘安全速遞