一、前言
橫向滲透攻擊技術是複雜網絡攻擊中廣泛使用的一種技術,特别是在進階持續威脅(Advanced Persistent Threats,APT)中更加熱衷于使用這種攻擊方法。攻擊者可以利用這些技術,以被攻陷的系統為跳闆,通路其他主機,擷取包括郵箱、共享檔案夾或者憑證資訊在内的敏感資源。攻擊者可以利用這些敏感資訊,進一步控制其他系統、提升權限或竊取更多有價值的憑證。借助此類攻擊,攻擊者最終可能擷取域控的通路權限,完全控制基于Windows系統的基礎設施或與業務相關的關鍵賬戶。
在這份白皮書中,我們向大家介紹了如何在Windows Vista/7以及Server 2008系統中檢測基于NTLM和Kerberos協定的橫向滲透攻擊。Windows 10引入了許多額外的安全機制,是以我們準備單獨釋出另一份白皮書,介紹如何檢測Windows 10中的橫向滲透攻擊。
微軟釋出過一篇文章,文中介紹了憑證竊取攻擊的相關資料以及如何防範這類攻擊。除了本文介紹的防禦措施之外,我們強烈建議大家根據微軟給出的建議對系統進行加強。需要注意的是,這類攻擊不僅僅針對Windows系統,其他的基礎設施(如使用Kerberos的UNIX環境或單點登入環境)也會受到類似攻擊的影響。雖然本文僅僅針對Windows系統提出了檢測橫向滲透攻擊的方法,大家可以舉一反三,在儲存适當日志的其他環境中使用類似方式檢測橫向滲透攻擊。
此外,感謝微軟MSRC(Microsoft Security Response Center,微軟安全響應中心)對本文内容的校對和細節驗證。
二、背景
2.1 什麼是Windows橫向滲透攻擊
在本文中,橫向滲透攻擊指的是攻擊者以某台Windows主機為跳闆,利用已竊取的某個賬戶(如普通使用者或服務賬戶)的有效憑證,建立到目标Windows主機的連接配接。
源主機通常是目标Windows環境中的一台已被攻陷的主機。在大多數情況下,攻擊者會通過包含惡意附件的釣魚郵件或惡意網站連結,攻陷第一台主機作為跳闆。一旦攻擊成功,攻擊者通常會通過指令控制(Command-and-Control,C2)伺服器以及反彈的shell控制目标主機。權限提升成功後,攻擊者可以提取存儲在源主機中的憑證資訊,開展後續的橫向滲透攻擊,其中包括:
1、擷取源主機的憑證資訊
攻擊者可以通過定制工具,通路Windows憑證存儲區或記憶體,以擷取任何有效的憑證資訊(鍵盤記錄器也可以完成相同任務,但這不在本文的讨論範圍内)。本文隻讨論與NT哈希和Kerberos憑證有關的内容。
攻擊者可能會擷取到被攻陷源主機中儲存的任何憑證,比如那些正在使用的憑證、曾經使用過的憑證(比如已緩存的憑證)以及記憶體中尚未清除的憑證(未安裝更新時)。攻擊者最感興趣的是目标環境中的高權限賬戶憑證,比如幫助台(help-desk)賬戶、域管、高權限服務賬戶以及本地管理者賬戶,如果密碼被重複使用或者密碼生成算法是可預測的,那麼攻擊環境就更加理想。
2、通過竊取的憑證通路其他主機或資源
成功竊取憑證後,攻擊者可以使用這些憑證通路其他資源,比如其他主機或伺服器(例如Exchange郵箱賬戶)。攻擊者所使用的技術包括基于NT哈希的哈希傳遞(pass-the-hash,以下簡稱PtH)攻擊以及基于Kerberos票據的票據傳遞攻擊(pass-the-ticket,以下簡稱PtT)。讀者可以參考附錄B中的[1][2][3],了解這些攻擊的更多細節。
以下是有關憑證竊取和重播攻擊的一些說明:
1、任何使用者通路被攻陷的主機後,都可能在其記憶體中留下憑證資訊,在未及時安裝更新檔時,相關憑證會被攻擊者導出。Windows之是以在記憶體中緩存這些憑證,主要是為了提供諸如單點登入(single-sign-on)的功能,在這種場景下:
(1)在受限管理模式下使用Network Logon或RDP方式登入被控主機時,使用者賬戶憑證不會被洩露。
(2)其他登入方式會暴露賬戶憑證,包括本地賬戶、域賬戶以及服務賬戶在内的憑證都會受到影響。讀者可以參考本文2.3節内容了解更多細節。
2、受影響的憑證不僅僅包括明文的使用者名和密碼,還包括NT哈希、Kerberos票據以及Kerberos密鑰,這些憑證可以被攻擊者用來請求Kerberos TGTs(Ticket Granting Ticket),作為有效憑證開展橫向滲透攻擊。
3、攻擊者需要管理者權限以通路本地Windows憑證存儲區或記憶體中的憑證資訊(例如Windows安全賬戶管理器、憑證管理器或者本地安全授權子系統服務程序(及LSASS.exe)中存儲的憑證)。如果目前賬戶權限較低,攻擊者可以通過本地提權漏洞擷取高權限。
4、橫向滲透攻擊的目标不單單是另一個工作站,也可以是其他資源,比如Exchange伺服器上的郵箱或業務系統。
5、橫向滲透攻擊使用的是标準的協定,比如Kerberos和NTLM協定,這樣一來我們無法通過建立單條Windows事件或網絡入侵檢測系統(IDS)規則來檢測這類攻擊。
6、橫向滲透攻擊的一個優點就是攻擊者可以抓取憑證資訊并在後續攻擊中使用。
7、不僅僅隻有Windows會受到橫向滲透攻擊影響,其他使用單點登入的身份認證協定都會面臨相同問題。任何單點登入解決方案都需要以某種有效的方式儲存憑證資訊,以便在其他服務的認證過程中可以重複使用這些憑證。
2.2 使用橫向滲透攻擊的典型APT場景
通常情況下,APT攻擊會不斷從某個工作站連接配接到另一個工作站,以擷取越來越高的賬戶權限,直到他們得到域管賬戶的憑證為止。接下來攻擊者通常會通路域控,導出Windows域中的所有憑證。
APT中使用橫向滲透攻擊的典型場景如下圖所示:

圖1. APT攻擊中使用橫向滲透攻擊的典型場景
2.3 憑證緩存
就如上文所述,當使用者使用RDP方式連接配接工作站(RestrictedAdmin模式除外),或者在工作站中使用runas指令時,包括域使用者或者域管在内的憑證資訊都會緩存在工作站的記憶體中。
以某個典型場景為例,目前有某個user1賬戶已經登入到某台主機中,此時另一個user2賬戶(管理者)正在登陸同一台主機。在這種情況下,user2在主機中緩存的票據不僅對user1而言是可見的,對已經掌握該主機控制權的攻擊者而言也是可見的。user2在目前主機中緩存的Kerberos TGT票據情況如下表所示:
注:
[1] 如果user2正确登出,則遠端主機上不會儲存票據資訊。
[2] 如果遠端會話沒有被正确關閉,那麼user2的票據就會保留在遠端主機中。
[3] 右鍵菜單中以管理者身份(user2)運作cmd.exe.
[4] 使用的是已緩存的域密碼,比如沒有接入域環境的筆記本電腦就屬于這種場景。
[5] 在以user2身份運作的指令提示符中,使用“net use”指令。
[6] 使用“net use \\target\c$”指令,在彈出的對話框中輸入user2憑證資訊。
[7] 在域控的日志中會包含4768事件,但有趣的是user2的TGT票據并不會被緩存,相反的是,本地主機記憶體中會儲存user1的一個CIFS服務票據,以便通路共享檔案夾。
需要注意的是,我們并沒有測試所有的登入類型,但在某些場景下,高權限使用者(如user2)還是可以通路工作站主機。微軟給出了一份更詳盡的資料,梳理了哪些可複用的憑證資訊會暴露在目标主機中。
上表中,在Windows系統中,右鍵使用的“以管理者身份運作”功能時(會彈出UAC視窗),使用者會得到管理者所有的通路令牌。如果管理者使用runas指令運作某個應用程式(如cmd.exe),情況會有所不同,具體情況如下:
1、右鍵使用“以管理者身份運作”運作應用程式時,程式退出後,已緩存的NT哈希以及票據仍然會保留在記憶體中;
2、使用“runas /user:\\dom\user2”指令時,程式退出後,記憶體中的憑證會被清除。
有趣的是,在最後一種場景中(即互動式登入後,以管理者身份運作),netlogon服務并不需要重新輸入密碼!
對于上表的測試用例,有幾點情況需要說明:
1、所有的測試都基于非特權的互動式會話(即使用user1的控制台登入)。
2、網絡登入狀态沒有永久保持。
3、委派功能打開和關閉的情況下,我們都做了測試。
4、在登出測試中,不管登出過程中目标賬戶會話是被正确關閉還是被保留,測試結果都不變。
2.4 哈希傳遞與票據傳遞
橫向滲透測試中,使用哈希傳遞(Pass-the-Hash,以下簡稱PtH)或者票據傳遞(Pass-the-Ticket,以下簡稱PtT)時,情況會有所不同,具體如下表所示:
有幾個結論比較有趣,如:
1、攻擊者需要管理者權限以竊取憑證,但不需要管理者權限就能使用Kerberos票據。
2、密碼更改并不會導緻Kerberos票據失效。
三、檢測Windows中的橫向滲透攻擊
3.1 通用法則
合法的SMB連接配接與使用PtH和PtT攻擊建立的連接配接并沒有什麼不同。事實上,攻擊者發動這類攻擊時并沒有利用協定的漏洞,是以,我們沒有預先定義的規則來檢測此類攻擊。
然而,攻擊者的攻擊行為會存在某些異常特征。例如,如果某個域管賬戶(如my-admin)隻能在某台特定的工作站中使用,那麼在其他工作站中使用這個域管賬戶就顯得非常可疑,意味着域環境中可能存在橫向滲透攻擊。
是以,我們有可能能通過監控Windows事件檢測橫向滲透攻擊。
我們用來檢測攻擊的主要法則為:
“如果檢測到使用者賬戶來自于不正常或非授權系統,或者在不正常或非授權系統中使用,我們判斷這種情況下存在橫向滲透攻擊”。
我們需要注意以下幾點:
1、這條法則并不能覆寫所有的橫向滲透攻擊(某些特權賬戶的使用檢測起來比較困難)。是以,我們需要維護一張包含合法的“使用者/工作站/IP位址”三元組的清單,檢測不在此表中的賬戶使用情況。此外,單獨使用三元組清單并不能檢測所有的攻擊場景(比如,攻擊者發起的來自合法的使用者/工作站的資源通路請求)。
2、這些法則能否有效應用,主要由已有的政策、活動目錄結構以及網絡隔離機制共同決定。我們需要制定政策,監控專用主機(如專用OU、管理者工作站)上賬戶的使用情況。我們手頭上必須維護一份包含這類工作站的清單。如果這些賬戶和工作站所使用的政策非常明确,那麼我們在檢測橫向滲透攻擊時的效率也會越高,也能避免誤報。網絡隔離機制将有助于識别橫向滲透攻擊,特别是對于Kerberos而言,這種隔離機制更加有效,因為Kerberos并沒有在相關日志事件中提供具體的主機名資訊。
3、為了檢測使用本地賬戶(如本地管理者)的橫向滲透攻擊,我們需要收集所有可能成為目标的工作站中的日志(4624/4625事件),在某些情況下這個任務很難完成。但這對域賬戶來說不成問題,因為主要的Windows事件都存儲在域控上。微軟引入了兩個SID,通過設定GPO(Group Policy Object,組政策對象)規則,可以限制本地管理者賬戶在橫向滲透攻擊中的使用。
在本文後半部分中,我們會向讀者介紹使用PtH和PtT進行橫向滲透攻擊時所産生的日志事件,以及我們可以設定哪些規則來檢測這些攻擊。
3.2 約定及假設
在本文重點關注的橫向滲透攻擊場景中,攻擊者使用了某個管理者賬戶(如ADMIN),從其他工作站(而不是ADMIN所屬的ADMIN-WS工作站)開始橫向滲透。所使用的規則可以稍微調整,以檢測其他攻擊場景(如使用服務賬戶或者其他特權賬戶進行攻擊)。
在本文的案例中,我們有幾個假設條件,如:
1、我們可以通過查詢活動目錄識别域管賬戶(指令為:net group “Domain Admins” /domain);
2、ADMIN屬于管理者組,熟悉環境的攻擊者可以挑選其他合适的命名約定;
3、管理者工作站可以通過以下方式識别:
(1)通過工作站的主機名識别。比如通過域中維護的OU(Organizational Unit,組織單元)或主機清單,或者通過命名約定(如admin-ws-1、admin-ws-2等)加以識别。
(2)通過IP位址識别。比如這些工作站具有專用的(V)LAN位址,或這些工作站為跳轉伺服器,管理者在連接配接到其他系統前必須登入這些工作站。
4、ADMIN-WS為ADMIN所屬的工作站或跳轉伺服器。
3.3 檢測NTLM橫向滲透攻擊(PtH)
3.3.1 日志中的相關事件
使用NTLM憑證時,本地以及域控(如果使用的是域使用者的話)上生成的所有日志條目如圖2所示。詳細的日志事件可參考6.1節内容。
圖2. 與NTLM憑證有關的事件
被攻陷的工作站(infected-ws)中會生成4648事件:“試圖使用顯式憑據登入(A logon was attempted usingexplicit credentials)”。
所生成的日志事件與攻擊者的具體操作有關。在這種場景中,攻擊者已經事先将NT哈希注入到目标主機中,之後通過“psexec.exe \\Target cmd.exe”指令,打開目标主機上的指令提示符。讀者可以參考附錄C檢視更多細節。
被攻陷的工作站的日志對安全驗證來說非常有用,但對主動檢測PtH攻擊來說用處不大。在這種場景中,我們可以從日志中得知橫向滲透攻擊的目标主機(clean-ws)。
域控上的日志中會生成兩個4776事件:“域控試圖驗證某個使用者憑證的有效性(The domain controller attempted to validate the credentials for an account)”。
第一個4776事件與域控對目标主機(clean-ws$)的驗證過程有關。這個事件對檢測PtH來說用處不大。
第二個4776事件表明,域控正在驗證某個賬戶(my-admin)的有效性,此時該賬戶正在通路目标工作站(clean-ws$)。這個事件可以用作檢測橫向滲透攻擊是否存在的訓示器,也是監控整個環境的關鍵要素。
目标主機(clean-ws)的日志中會記錄4624事件:“成功登入帳戶(An account was successfully logged on)”。
這個事件表明,目标賬戶(my-admin)已經成功登入到目标工作站(clean-ws)。這個事件也可以用來檢測橫向滲透攻擊,但我們需要收集所有工作站上的所有特定日志。如果工作站或伺服器的數量不多,這個事件還是能發揮作用的。
無論如何,該事件與登入失敗事件(4625事件)對于安全驗證來說非常有用,因為我們可以通過這些事件了解登入的類型(本例中為網絡登入,Network logon),以及攻擊者從哪台主機(本例中為infected-ws)發起連接配接。
目标主機的日志中會記錄4634/4647事件:“賬戶被登出/使用者啟動登出過程(An account was/initiated logged off)”。
這個事件表明攻擊者的登出登入動作。對于安全驗證來說,這個事件非常有用,安全人員可以結合登入ID值、4624事件以及這個事件,檢測攻擊行動的會話全流程。
3.3.2 通用檢測方法
這部分的内容是介紹我們在檢測NTLM型橫向滲透攻擊時,需要在各個主機中收集的事件,以及所需要關心的具體值。正如上文所述,我們需要重點關注域控(DC)上的4776事件,其他關鍵系統中的4624(登入成功)以及4625(登入失敗)事件也值得關注。
注意:不要忽視工作站事件日志的重要性,特别是與敏感賬戶或者特權賬戶有關的那些事件日志。
3.4 檢測Kerberos橫向滲透攻擊(PtT)
3.4.1 日志中的相關事件
在Kerberos認證過程中,本地主機以及域控(如果使用的是域使用者的話)上生成的所有日志條目如圖3所示,詳細的事件資訊可以參考6.2節内容。
與PtH攻擊不同,PtT攻擊場景中并沒有生成4648事件。
域控的日志中會記錄4768事件,即:Kerberos身份驗證票證請求(A Kerberos authentication ticket (TGT) was requested)事件。
圖3. 與NTLM憑證使用有關的事件
攻擊者向域控申請Kerberos TGT票據時就會生成4768事件。在PtT攻擊中,我們可能不會在日志中找到這個事件,因為攻擊者在這之前已經竊取了TGT票據,不需要向Kerberos分發中心或者域控申請新的TGT票據,隻需要利用已竊取的票據即可完成PtH攻擊。
域控的日志中會記錄4769事件,即:Kerberos 服務票證請求(A Kerberos service ticket was requested)事件。
攻擊者請求通路目标系統或資源時(本例中為clean-ws$)會生成該事件。
這個事件可以用作檢測橫向滲透攻擊是否存在的訓示器,也是在整個環境中需要監控的主要事件。
目标主機(clean-ws)的日志中會記錄4624事件,即:成功登入帳戶(An account was successfully logged on)事件。
這個事件表明某個賬戶(my-admin)已成功登入到目标主機(clean-ws)。我們有可能利用這個事件主動檢測橫向滲透攻擊,但前提是需要收集所有工作站上的相關日志。如果工作站或伺服器的數量不多,這個事件也能夠發揮作用。
無論如何,這個事件和登入失敗(4625)事件對安全驗證來說非常有用,因為它提供了具體的登入類型(本例中為網絡登入)以及發起登入連接配接的來源主機(本例中為infected-ws)。
4634/4647事件的含義分别為:帳戶被登出/使用者啟動登出過程。
這兩個事件與攻擊者的登出過程有關。安全驗證工作中,可以利用這兩個事件,結合4624事件中的登入ID值,檢測攻擊行動的會話全流程。
3.4.2 通用檢測方法
這部分的内容是介紹我們在檢測PtT型橫向滲透攻擊時,需要在各個主機中收集的事件,以及需要關心的具體值。
正如上文所述,我們需要重點關注域控(DC)上的4769以及4768事件。需要注意的是,這一次我們隻能檢查其中的IP位址資訊,因為Kerberos事件中并沒有提供具體的主機名。在啟用DHCP的環境中,這個限制條件給我們帶來了不小的挑戰,如果DHCP租用時間較短,我們面臨的将會是一個動态變化的網絡環境。
關鍵系統中的4624事件以及4625(登入失敗)事件也值得我們關注。
我們使用這種方法可能會檢測出假陽性結果:
比如某個管理者(例如help desk)正在打開遠端主機上的應用(例如,在遠端通路中,通過cmd.exe運作”runas administrator”指令),這種情況下有可能會生成4768事件。
3.4.3 檢測黃金票據(Golden Ticket)
我們發表了一份白皮書,介紹了Kerberos黃金票據的相關知識,讀者可以查閱參考資料了解更多細節。
3.5 需要監控的主要賬戶
本文中描述的監控規則主要是基于域管賬戶,我們也可以監控其他重要賬戶,以快速檢測橫向滲透攻擊是否存在,這些賬戶包括:
1、服務賬戶(比如,備份賬戶);
2、很少使用的賬戶;
3、應急使用的賬戶;
4、關鍵業務賬戶。
3.6 需要注意的其他事件
我們建議大家可以參考NSA發表的一份參考資料,其中介紹了檢測潛在攻擊時可能有用的其他一些事件。這個參考資料不單單針對橫向滲透攻擊,同時也覆寫了許多日志事件以及攻擊類型。
詳見原文,附錄!!!