【自動化滲透】DeepExploit框架深度分析

語言: CN / TW / HK

敏感資訊自查表

R 公眾號內容不包含公司產品資訊

R 公眾號內容不包含計劃落地的產品資訊

R 公眾號內容不包含計劃申請的智慧財產權

專題:自動化滲透 標籤:DeepExploit

摘要:

DeepExploit 是一種基於強化學習的自動化滲透框架,能夠進行高效滲透,本文對該工具進行了分析並給出改進方向

一、背景知識介紹

本部分對DE(將DeepExploit簡稱為DE)利用到的核心工具做簡單介紹,分為metasploit介紹和強化學習演算法介紹,均為入門介紹,熟悉的讀者可自行忽略。

1.1 metasploit簡介

Metasploit是一款非常流行的滲透測試框架,裡面包含了大量知名軟體漏洞利用工具,其payload利用效率非常高效,並且還支援使用者自定義開發漏洞利用模組。在使用metasploit時需要設定一些比較重要的引數:

漏洞利用模組(exploit模組),不同的漏洞需要選擇不同的模組進行利用,而同一服務,往往存在多種漏洞,為了驗證漏洞存在,往往需要設定不同漏洞利用模組進行測試。

target,每個exploit模組都需要設定很多引數,其中target為比較重要的引數(metasploit會設定一個預設值),代表不同的作業系統型別,如圖1所示,target值為0代表設定目標的作業系統為 Windows 2000 SP4。

圖1、metasploit中exploit模組下target引數含義樣例[3]

payload, 該引數為exploit模組中需要設定的另一個重要引數(也會有預設值),意為攻擊進入目標主機後需要在遠端系統中執行的惡意程式碼,其中,Shellcode是payload中的精髓部分,攻擊者可以通過shellcode建立與目標系統的shell連線,方便地控制目標機。圖2為payload樣例

圖2、metasploit中exploit模組下payload引數含義樣例[3]

以上3個引數為DE框架在運用強化學習演算法進行滲透測試時所需選擇的重要引數。

1.2 強化學習演算法簡介

強化學習是機器學習中的一個領域,強調如何基於環境而行動,以取得最大化的預期利益,是除了監督學習和非監督學習之外的第三種基本的機器學習方法。其基本框架如圖3所示,基本流程為:智慧體(agent)通過觀察環境(Environment)的狀態(State)做出行動(action),該行動會作用於環境,改變環境的狀態,並且產生相關聯的獎勵(reward),智慧體通過觀察新的狀態和獎勵來進行下一步動作,由此迴圈。在這個過程中,智慧體會不斷得到獎勵(有好的有壞的),從而不斷進化,最終能以利益最大的目標實施行動。

圖3、強化學習基本框架[4]

強化學習有幾大要素,這些要素的定義至關重要,不同場景下,要素的定於也不盡相同,而這些要素的合理定義往往也決定這強化學習演算法能否生效。具體來說,想要使用強化學習來求解一個問題,首先需要定義如下3大要素:

  • State(狀態空間),state通常是演算法的輸入,包含agent作出action所需要的所有資訊,需要滿足馬爾科夫性質,即agent可以僅根據當前做出動作,無需考慮過去的狀態。
  • Action(動作空間),action一般就是演算法的輸出,action是agent能夠對環境產生影響的手段,所以一個任務的action設定的最基本要求是能夠對environment產生有效影響。
  • Reward(收益),reward是演算法學習的指導,reward的設定往往決定了演算法的最終效果是否理想,因此如何有效的設定reward也成為了強化學習應用的一個重要問題。

在對以上3大要素進行合理定義後,演算法(如A3C演算法)才算有使用的基礎。由於強化學習演算法眾多,也不是本文的關鍵,筆者將不再展開論述。總之,強化學習任務中,3大要素的定義至關重要,定義越合理,問題的解決程度就越高。

溫馨提示:讀者可以通過對DE框架對3大要素的定義,判斷其合理性。

二、自動化滲透測試與DeepExploit框架

  • 自動化滲透測試

隨著安全市場的不斷擴大,滲透測試的需求也在不斷增長,有研究預估到2025年,全球滲透測試的市場份額將會達到45億美元(2020年17億美元),相應的,滲透人才也極度短缺 [1],在這種背景下,國內外很多很多公司都有研發自動化滲透測試工具來滿足市場需求、緩解人才短缺的壓力。

自動化滲透測試,顧名思義,即自動化完成滲透測試的過程。從內容上講,一般來說人工滲透測試需要包含:資訊收集、漏洞探測、漏洞利用、許可權維持、後滲透、生成報告等常規步驟,一般市面上自動化滲透測試產品也都包含這些功能,從能力上講,自動化工具需要回答兩個核心問題:1. 自動化工具能發現多少風險點;2. 自動化工具對滲透測試的效率提升有多大。這兩個問題的解決程度決定了自動化工具的優劣。

在滲透測試的過程中,“漏洞探測”往往是最耗時的一步。為了發現目標系統的安全問題,滲透測試工程師一般先用漏掃工具對目標系統進行掃描測試,若未發現問題,則需要進行長期的人工滲透過程。理論上講,為了提升滲透效率,那麼自動化滲透的核心價值應體現於現實中最耗時耗力的部分(漏洞探測)上,將上述長期的人工滲透過程進行自動化。但是就目前來講,大部分自動化滲透產品的做法是簡單地將漏掃的結果與相關的利用工具相結合,從而達到自動化滲透的效果,而“人工滲透的過程”並未有效實現自動化。

自動化滲透工具能多大程度解決上述問題呢?我們通過一個開源的自動化滲透框架DeepExploit來分析自動化滲透測試領域當前的前沿進展(DeepExploit應該具有代表性)。

  • DeepExploit框架簡介

DeepExploit是一種基於強化學習的自動化滲透框架,由日本的一家名為MBSD的公司研發,在自動化滲透方向為大眾所熟知,在github上的star數量高達1600+,其開發人員曾在很多知名大會上介紹過該工具,如:DEFCON 2018,Black Hat 2018等,這些演講進一步拓展了該工具的知名度。

DeepExploit底層使用Metasploit進行滲透,使用強化學習技術來提升滲透效率,可以達到“給定目標IP,輸出反彈shell”的效果,除了“許可權維持”功能外,其他步驟均已實現全自動,根據github頁面介紹,特點如下:

  1. 高效滲透。利用機器學習,最佳情況下,只需一次利用便可成功getshell;
  2. 深度滲透。可以內網擴散;
  3. 自學習。利用強化學習進行自學習,無需準備資料;
  4. 學習時間快。利用A3C演算法加速學習;
  5. 強大的情報收集能力;包含:埠掃描,服務及版本識別(包含nmap識別,機器學習識別,爬蟲識別)

針對這些特點,本文將給出詳細的分析,以向讀者展現該工具的適用性與實用性。

三、DeepExploit框架深度分析

本小節中,我們首先介紹DE框架的整體執行流程,然後對照原始碼,說明每部分原始碼的作用,最後總結DE框架的優缺點,提出改進方向。

3.1 DeepExploit框架流程分析

我們先來通過官網[1]的架構圖(圖4)來了解DE的核心流程,從圖中我們可以看到DE通過RPC協議與metasploit進行通訊,呼叫metasploit進行滲透,其核心在於強化學習演算法(A3C演算法)的使用,該演算法整體上分為兩個步驟:訓練(testing)和測試(training),在訓練階段,會利用框架對靶標進行滲透測試,並儲存訓練資料,訓練好A3C模型,在測試階段,根據訓練好的強化學習模型,對目標進行高效的滲透(以足夠少的嘗試次數完成對目標的滲透)。

圖4、DeepExploit核心架構圖

整體上該框架圖看似符合其宣稱的“利用強化學習演算法進行高效滲透測試”,接下來我們通過對其原始碼的分析畫出詳細的框架流程圖(圖5),其中綠色方框為框架內建的支撐資料,藍色方框代表主要流程,黃色方框為判斷邏輯。框架整體上包含滲透測試過程的:資訊收集、漏洞探測、漏洞利用、後滲透、生成報告的幾個步驟。

圖5、 DeepExploit框架詳細流程圖

在資訊收集過程中,主要目標是獲取目標系統上執行的服務及其版本號,為了實現這一目標,DE首先使用nmap工具進行簡單的服務識別,當遇到web服務時,會啟動爬蟲,爬取目標頁面(預設只爬到第二層頁面),通過內建的指紋庫1和機器學習模型識別出頁面背後的服務,並且為了避免爬蟲的遺漏,會通過內建的指紋庫2訪問主流服務的路徑,若路徑存在則代表服務存在,從而得到目標機器完整的服務及其版本資訊。框架只支援一些特定服務的滲透,會過濾掉不支援的服務型別,最終得到要進行滲透測試的服務列表。該部分為官網所說的特點5(強大的情報收集能力)。

圖5所示的“測試模式過程”和“訓練模式過程”為DE的核心部分,也是使用強化學習演算法的部分。為了使用強化學習,DE框架將強化學習的3大要素中定義如下:

  • 狀態空間。 DE用5個狀態表示其狀態空間,在程式碼中表示為(ST_OS_TYPE,ST_SERV_NAME,ST_SERV_VER,ST_MODULE,ST_TARGET),分別代表:作業系統版本,埠上服務名稱,服務版本,要利用msf的模組名稱編號,模組中的target引數。
  • 動作空間。DE的動作空間為metasploit模組中所有payload集合。筆者使用的metasploit版本為1.9,payload總數為593個。
  • 收益。DE將收益定義為3種:R_GREAT=100,R_GOOD = 1,R_BAD = -1,R_GREAT代表可以進行後滲透測試(返回的shell型別為meterpreter,而DE利用meterpreter進行後滲透),R_GOOD代表能返回shell但是不能獲得meterpreter shell(意指無法利用該機器進行後滲透),R_BAD代表漏洞利用失敗。實際上,在DE中,後滲透模組沒有開發完善,只要能返回shell,都會被賦予最大收益GREAT。

在訓練模式中,DE首先進行狀態空間初始化,其中ST_OS_TYPE是固定不變的,ST_SERV_NAME和ST_SERV_VER會在隨機選擇資訊收集階段中識別到的裝置上的服務和版本,確定ST_SERV_NAME後,在metasploit中根據語句“search name: + ST_SERV_NAME type:exploit app:server”返回的可利用模組列表,隨機選擇一個模組確定ST_MODULE,ST_TARGET在模組可選的target列表中隨機選擇;確定狀態後,A3C演算法會計算每個payload的概率,選擇一個概率最高的payload後,利用以上資訊呼叫metasploit進行漏洞利用;當滲透失敗時,會隨機更換target,由於不用target對應的可利用payload不一樣,此時需要重新利用A3C演算法計算概率最大的payload進行利用,當該步驟到一定次數還未成功,會再次進行狀態空間初始化,對其他的服務、模組進行嘗試。整個訓練過程採用多執行緒併發的方式進行,執行緒之間沒有任何通訊機制,以此方式進行演算法的並行化。

測試模式為在實際環境中使用的模式,相比於訓練模式多了後滲透這一步。測試模式首先計算每種狀態空間下,payload的概率,根據該概率由大到小的順序呼叫metasploit進行滲透,一旦滲透成功,則進行後滲透;在後滲透的過程中,首先利用arp協議進行內網存活主機識別,然後呼叫metasploit框架中自帶的代理模組“auxiliary/server/socks4a”搭建代理,對新識別的到的主機進行下一步滲透,直到沒有新的主機出現。

在訓練模式或測試模式結束後,會生成報告,內容包含滲透成功的主機上所有漏洞資訊和相關metasploit的利用引數。

3.2 DeepExploit框架點評

不可否認,DeepExploit框架確實能夠進行自動化滲透,但是通過對強化學習的介紹和DE框架詳細流程的介紹,對於其號稱的“高效”滲透,仍需打個問號。

筆者認為DE框架最大問題在於使用的是偽強化學習,雖然整個框架看起來是強化學習環境+智慧演算法+反饋 這樣的路線,但是在問題定義上出現了根本性的問題:動作和狀態之間完全割裂。在背景知識中我們提到,強化學習中,動作需要對環境產生有效影響,從而產生環境狀態的改變,但是DE框架的狀態轉移完全是隨機的,跟動作無關。這一點不僅與強化學習的概念相左,也無法契合滲透測試的流程,滲透測試中,滲透人員會根據上一步的執行情況來決定下一步要執行的動作,而DE框架的狀態轉移是隨機的,意味著執行的動作也是隨機的。

該問題也說明了DE框架對於狀態空間和動作空間的定義是有問題的,在該定義下,強化學習演算法並不能有效發揮作用。

除了該核心問題,DE框架在設計上仍然有些瑕疵,筆者將之列舉,使用該框架的讀者朋友可以關注。

1. 服務支援問題。DE框架的“config.ini”檔案中限定了DE只支援如下服務的滲透:[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@upnp。一方面,metasploit所支援的服務遠遠不止這些,筆者不理解DE為什麼需要限定服務,因為DE呼叫metasploit的介面進行滲透,對於所有metasploit支援的服務,DE理論上也可以支援;另一方面,DE沒有做不同軟體對同一服務在名稱上的對映,具體來說,DE使用nmap進行服務識別,將服務名稱在metasploit中搜索可以利用的滲透模組,可nmap和metasploit對於同一服務往往使用不同名稱進行表示,不同版本之間也有差異,如smb服務:在metasploit搜尋關鍵詞“smb”即可,而nmap對smb服務的識別結果為“microsoft-ds” ,該關鍵詞在metasploit中無效。經過筆者的手動測試,大多數流行服務在兩個軟體中都存在服務名稱不一致的問題,這也直接導致了DE框架可用性的大幅下降,甚至連傳播甚廣的“MS17-010”永恆之藍漏洞都無法利用。

  1. 服務識別問題。DE框架在遇到web服務時,會開啟爬蟲,預設只爬到第二層頁面,按照:匹配指紋庫1,機器學習識別,訪問指紋庫2的流程進行服務識別。整個流程特別耗時,並且機器學習演算法(樸素貝葉斯)在筆者使用過程中幾乎是0貢獻,該流程與一般漏掃的服務流程基本一致, “強大的情報收集能力”能力(特點5)並未體現。
  2. 演算法邏輯問題。除了上述演算法使用不符合強化學習的邏輯外,DE還有一些邏輯問題會影響滲透效果:第一,DE會隨機選擇target嘗試進行滲透,但是根據前文介紹,target代表的是作業系統,而作業系統DE在資訊收集階段已經識別了,並且作為狀態中的一個變數ST_OS_TYPE,那麼還有什麼必要進行所有target的嘗試呢?第二,DE將“是否返回metepreter shell”作為漏洞是否利用成功的標誌從而進行後滲透,既然如此為什麼要嘗試其他型別的payload呢?筆者使用metasploit中的payload共計593種,meterpreter shell共計167種。因為這兩種邏輯問題,保守估計,DE起碼進行了至少10倍以上的無效嘗試;除卻無效嘗試,DE還存在“漏嘗試”的情況,有些payload始終未被嘗試,如圖5所示,在訓練模式下,A3C演算法對每個payload計算概率,對利用成功率最大的payload進行嘗試,這種方式直接導致,在同一模型、同一狀態下,始終測試同一個payload,雖然模型在訓練的時候會動態更新,但是這種設計思路仍會存在某些payload未曾測試的情況,遺漏有可能利用成功的payload。總結來說,DE的演算法邏輯增加了大量的無效嘗試,並且還有可能會漏掉能夠利用成功的嘗試。
  3. 程式設計問題。DE在訓練模式中使用了多執行緒進行加速,但是執行緒之間完全獨立,metasploit滲透的各個引數(服務+模組+target)又都是隨機的,這種設計機制會導致:同一執行緒內出現重複的嘗試,不同執行緒直接出現重複的嘗試。在一次使用情況中,筆者至少遇到了完全相同的利用嘗試20次(預設開的20執行緒),這種大量的重複嘗試極大降低了滲透效率。
  4. 滲透目標問題。DE框架判定滲透成功的標誌為“返回了meterpreter shell”,計算的是在“服務,模組,target”確定的情況下,不同payload的成功概率,但是在一般滲透測試過程中,需要判斷的往往是“某種漏洞能否利用成功”,換句話說,即metasploit中的某個模組能否利用成功,至於利用成功後的動作(payload)不是重點。若能改變滲透目標,計算每個模組的成功概率,會更加符合實際需求。

上述問題會直接導致DE的可用性下降,所幸這些問題並不難解決,優化後可大幅提升漏洞利用效率。

最後,筆者對於官網所說特點2(深度滲透)和特點3(自學習)做一些補充說明:特點2中所說的深度滲透屬於後滲透,DE框架並沒有完全實現,功能尚不能順利使用;自學習並不是說真的不需要訓練資料,需要自己搭建靶場,程式執行過程中會自動產生所需資料。

3.3 DeepExploit改進方向

若需要基於DeepExploit進行自動化滲透,筆者認為可以按照如下順序進行優化,進一步提升滲透效率。

  1. 解決上小節中所述的“瑕疵”,如無效嘗試、重複嘗試、遺漏嘗試、服務支援問題等等,其中服務支援問題可能難度較大,不同軟體之間對同一服務的命名往往存在一定差異,可以考慮機器學習的方式進行識別。
  2. 重新定義強化學習的3大要素。目前的定義方式不適合使用強化學習演算法,需要對狀態空間、動作空間,甚至收益做重新定義,從而使用強化學習演算法。對於強化學習演算法使用必要性,筆者認為強化學習演算法與滲透測試的過程天然吻合,都需要根據當前狀態來判斷下一步的動作,且每一個動作是否成功、最終目標都相對明確,因此可以考慮進行周密設計。
  3. 使用傳統機器學習演算法。按照DE框架對狀態和動作的定義(動作對狀態不起作用),可以使用傳統機器學習演算法,計算每種狀態下,不同動作的成功概率。相較於強化學習演算法,傳統機器學習演算法更適用於DE框架。

3.4 小節

本小節詳細介紹了DeepExploit框架的核心邏輯,並且分析了其優劣,給出了改進方向。總結來說DeepExploit在功能上能夠實現自動化滲透,但其宣稱的強化學習演算法並沒有被有效使用,框架整體上也有一些待完善的地方。從核心功能看,DeepExploit目前僅比傳統漏掃多了漏洞利用這一步,並未將第一節所述的“長期的人工滲透過程”進行自動化,對滲透測試整體效率提升不大。

四、總結

本文介紹了自動化滲透領域廣為大眾所知的DeepExploit框架,並詳細分析了其內部原理,通過對其原始碼的分析,筆者發現DeepExploit並不能實現其宣稱的高效滲透,或者說有諸多待改進之處。對於影響滲透效率的非核心問題,如:服務支援問題,各種邏輯問題等等,筆者將其列出,這些問題不難解決,對於核心的演算法問題,筆者給出可能的改進方向。而滲透測試最耗時的“人工滲透”部分,DeepExploit並未將其自動化,自動化滲透領域還有很長的路要走。

參考文獻

[1] MarketsandMarkets. Penetration testing market by component. 2020

[2] https://github.com/13o-bbr-bbq/machine_learning_security/tree/623c97a69c47972c9b2788f6a6c19eda24b7fa74/DeepExploit

[3] https://paper.seebug.org/papers/old_sebug_paper/other/metasploit_users_guide_chinese.pdf

[4] https://zh.wikipedia.org/wiki/%E5%BC%BA%E5%8C%96%E5%AD%A6%E4%B9%A0