search
尋找貓咪~QQ 地點 桃園市桃園區 Taoyuan , Taoyuan

如何利用Windows默認內核調試配置實現代碼執行並獲取管理員許可權

一、前言

本文來自於很久以前我的一次現場滲透測試工作成果。在等待其他測試工作完成間隙,客戶對我能否在某個Windows工作站上執行代碼很感興趣(原因在這裡並不重要)。在測試現場,我擁有測試機的物理訪問許可權,因此這件事情不難完成。我最終的解決方案是利用Windows默認內核調試配置,在不對系統配置做出永久性修改的前提下實現了任意代碼執行。

這種技術的優點在於它所使用的工具集很小,可以在工作中隨身攜帶以防萬一。然而,它要求目標設備存在已啟用的COM1串口,且未使用TPM型Bitlocker或類似機制,這一條件不一定能得到滿足。

有人可能會對此不以為然,因為能夠物理訪問目標機器意味著攻擊目標已基本達成,這也是我為什麼認為這種方法是Windows設備中存在的末日型漏洞。然而,內核調試配置是系統的默認設置,管理員可能不知道如何修改。從客戶角度來看,這種方法讓我們這些人看起來像是那種混蛋黑客,畢竟使用命令行CDB比WinDBG看起來更酷一些。

為了避免讀者誤解本文初衷,在此強調:這並不是一個Windows漏洞!

現在,讓我們來看一下技術細節。

二、應用場景

你發現自己身處一個布滿Windows工作站的房間中(希望是個合法場景),你的任務是在其中一台機器上獲得代碼執行權。首先映入你腦海的有以下幾種辦法:

1、更改啟動設置,從CD/USB設備中啟動,修改HDD

2、打開機器外殼,拉出HDD,修改其中內容並重新插入

3、濫用Firewire DMA訪問來讀寫內存

4、濫用機箱後面的網路連接,嘗試進行PXE引導或者對本機的網路/域流量開展MitM(中間人)攻擊。

仔細觀察工作站,你發現機器引導順序第一位是硬碟硬碟引導,而BIOS密碼的存在使你無法修改此順序(假設本機BIOS不存在漏洞)。此外,此例中工作站機箱上有個物理鎖,你無法打開它的外殼。最後,工作站沒有Firewire或其他外部PCI匯流排來DMA攻擊。我沒有測試網路攻擊場景,但進行PXE啟動攻擊或MitM攻擊可能會遇到IPSec問題,導致攻擊難以奏效。

這些工作站存在一個經典的9針串列介面。藉此我想到了Windows在COM1上有個默認配置的內核調試介面,然而內核調試在本案例中並沒有啟用。那麼有沒有一種辦法使我們在不具備管理員許可權下啟用系統的內核調試功能呢?本文的答案是肯定的。接下來讓我們來研究如何在這種場景下完成這一任務。

三、環境準備

在開始工作前,首先你的手頭上需要具備以下幾樣東西:

1、測試機的串口(這是必要條件)。驅動安裝正常的串口轉接USB也行。

2、本地安裝的Windows。這麼要求主要是為了操作便利。現如今也許有工具可以在Linux/macOS上進行完整的Windows內核調試,但我對此表示懷疑。

3、一條數據機線纜。你需要這個東西來連接測試機器的串口與工作站的串口。

現在確保你的測試機上環境準備就緒,設置WinDBG使用本地COM口來進行內核調試。只需要打開WinDBG,在菜單中依次選擇「文件」、「內核調試」或者按下CTRL+K組合鍵。你可以看到如下對話框:

在Port一欄填入正確的COM口值(即你的USB轉串口值)你不需要修改波特率,保留Windows的默認值115200即可。你可以在另一個系統上以管理員運行「bcdedit /dbgsettings」命令來檢查這個值是否設置正確。

你也可以通過這個命令來完成同樣工作:

windbg -k com:port=COMX,baud=115200

四、在Windows 7上啟用的內核調試功能

在Windows 7上啟用內核調試功能十分簡單(Vista上也是如此,但現在應該沒多少人用了吧?)。重啟工作站,在BIOS屏幕載入完畢后按下F8鍵,順利的話你可以看到如下界面:

使用方向鍵,選擇調試模式並回車,Windows開始啟動。希望你轉到WinDBG界面時可以看到界面上顯示的系統啟動信息。

如果啟動信息沒有顯示,可能是COM口被禁用、內核調試配置發生改變或者你的USB轉串口適配器工作不正常。

五、在Windows 8-10上啟用內核調試功能

接下來看新版本的Windows上如何操作,你會發現按下F8時沒有發生任何變化。這是因為微軟自Windows 8以後對引導過程做的一個修改。隨著SSD的流行以及Windows啟動過程機制的更改,微軟已逐漸摒棄F8鍵功能。此功能依然存在,但你需要在類似UEFI的菜單中進行配置。

現在有個問題,之前我們假設我們無法訪問BIOS配置,因此我們也無法訪問UEFI配置選項,你能做到的只是進入設置界面,選擇重啟後進入高級啟動模式選項,或者在命令行中利用shutdown命令配合/r /o參數完成這一任務。

這些方法對我們來說都不適用。幸運的是有個文檔中描述了另一種方法:在開始菜單中選擇重啟的同時按住Shift鍵,這樣系統將在重啟時進入高級啟動選項模式。聽起來此方法也不怎麼有效,因為你還是得進入系統才能選擇菜單。幸運的是在那台工作站的登錄界面有個重啟選項,而按住Shift這個技巧在這個界面還是可以正常工作。在登錄界面右下角點擊電源選項,按住Shift同時選擇重啟,一切順利的話你可以看到如下界面:

選擇「故障排除」選項,進入下一界面。

在這裡選擇「高級選項」,進入下一界面。

在此界面中,選擇「啟動設置」選項,進入如下界面。前面那個界面中你第一反應可能認為應該選擇「命令行」選項以獲取系統命令提示符,但這種情況下你還是需要一個本地管理員用戶的密碼。

選擇「重啟」后工作站將會重啟,你可以看到如下提示界面。

最後,按下F1啟動內核調試功能。現在,F8的功能又回來了,一切按照計劃進行的話,你可以在WinDBG中看到熟悉的啟動信息。 六、代碼執行 現在你擁有了附加到工作站的一個內核調試器,最後一個工作就是繞過登錄界面。使用Firewire DMA攻擊時的一個常見技巧是在內存中搜索與LSASS的密碼檢查相對應的對應模塊(Pattern)並將其終止,然後任何登錄密碼都可以進入系統。這是一個辦法,但並不完美(比如你會在系統日誌中留下登錄記錄)。此外,很有可能本地管理員賬號已經重命名過,那麼你還需要知道一個可用的用戶名。 與此相反,我們準備發起一個更有針對性的攻擊。我們擁有的是系統可用的內核視圖,而不是物理內存視圖,因此還是有希望的。登錄界面中有個輔助工具選項,使用這個選項會以SYSTEM許可權創建一個新進程。我們可以劫持該進程創建過程以獲得命令提示符,來完成攻擊任務。

首先,我們要對目標主機配置符號鏈接。沒有符號鏈接我們無法通過枚舉必要的內核結構以查找要攻擊的系統數據。確保符號鏈接配置正確的最簡單的一個方法是在命令調試窗口中輸入「!symfix+」然後輸入「!reload」即可。輸入「 !process 0 0 winlogon.exe」命令,查找負責登錄窗口顯示的進程。一個成功的輸出如下所示:

上圖標紅部分值即為EPROCESS結構的內核地址。複製該值,使用「.process /i EPROCESS」命令獲得一個互動式調試會話。輸入「g」,按下F5或回車,你可以看到以下信息:

現在,通過這個互動式會話,輸入「 !reload -user」,我們可以枚舉用戶模塊並載入他們的符號鏈接。我們可以在CreateProcessInternalW上設置斷點,這個函數在每次創建新進程時都會用到。不同系統版本中該函數所處位置不一樣,在Windows 7上它位於kernel32 DLL中,在Windows 8以上它位於kernelbase DLL中。因此,根據系統版本,使用「bp MODULE!CreateProcessInternalW」命令對相應模塊進行替換。 設置斷點后,點擊登錄屏幕上的輕鬆訪問按鈕,此時斷點條件被觸發。現在依次輸入「r」和「k」命令,導出當前寄存器值,顯示返回地址信息。如下所示:

我們可以在堆棧軌跡中看到與輕鬆訪問貌似有關的調用,如WlAccessibilityStartShortcutTool等。CreateProcessInternalW需要很多參數,但我們真正感興趣的只有第三個參數,它是一個指向NUL結尾的命令行字元串指針。我們可以修改該指針指向命令提示符以執行命令。首先,使用「dU」命令確保我們已獲取正確的字元串,對於x64系統,我們需要使用「dU r8」命令,因為第三個參數存儲在r8寄存器中,對於x86系統我們使用的是「dU poi(@esp+c)」命令,因為32位系統上所有的參數都在堆棧上進行傳遞。如下所示:可知WinLogon正在試圖創建一個utilman.exe的運行實例。現在這個字元串處於可寫狀態(如果不可寫,系統就會崩潰,這是CreateProcess的一個愚蠢行為),我們直接覆蓋它即可。使用ezu r8 "cmd"或者ezu poi(@esp+c) "cmd"命令,輸入g,回車,命令提示符就會出現在你的眼前。

七、缺點分析 該方法存在多個不足,如: 1、工作站必須有個串口,串口必須配置為COM1,現如今這種情況已不常見。 2、操作中工作站必須重啟,這意味著你無法獲得任何已登錄用戶的憑證或內存中的敏感信息。另外如果工作站有個啟動密碼,你也無法對它採取重啟操作。 3、內核調試配置必須處於默認設置狀態。 4、在配置了TPM型Bitlocker機器上,你無法在忽略Bitlocker引導條件下改變調試器配置。 最後我想說明的是這種方法的配置成本較低,你只需要隨身攜帶一個USB轉串口適配器以及一根閑置數據機線纜即可,這並不麻煩。 八、防禦措施 有以下一些方法可以防禦此類攻擊: 1、將默認調試配置改為本地內核調試。這種模式意味著只有以管理員許可權運行的本地調試器能夠調試內核(且調試功能必須啟用)你可以通過啟動管理員命令行,輸入「bcdedit /dbgsettings LOCAL」更改配置。你也可以通過登錄腳本或GPO選項實現自動配置。 2、不要購買帶有串口的工作站。聽上去不是個好主意,因為很多時候你沒法掌握購買權。但仍然不要購買帶有無意義介面的設備,據我所知有些供應商仍然生產具有該介面的工作站。 3、如果你的電腦帶有串口,請在BIOS中禁用它們。如果無法禁用,請將它們的默認I/O口設置為除0X3F8的其他值。老式COM口不能即插即用,Windows使用了顯式I/O口與COM1通信。如果你的COM口未配置為COM1,Windows將無法正確使用它們。如果你安裝的是二手市場的COM口設備,同樣需要對此項進行修改。4、最後請使用TPM型Bitlocker。即使之後別人沒辦法對你的硬碟進行離線修改,這樣做也是值得的。Bitlocker結合TPM可以阻止別人在不知道Bitlocker恢復密鑰前提下啟動系統的調試功能。在Windows 8以上進入系統設置選項前需要對啟動選項進行臨時修改配置,這會導致TPM引導失敗。我沒有在Windows 7上測試此項功能,因為啟動菜單位於winload.exe啟動進程中,此時Bitlocker的密鑰已經解密,因此我認為使用F8可能無法修改啟動選項。讀者可以在配置Bitlocker及TPM的Windows 7機器上進行測試。 另一個有趣的事情是,我在寫這篇文章時,最新版的Windows 10(1607周年版)已經將內核調試默認設置為本地調試狀態。然而如果你從老系統升級而來,這個選項可能在升級期間未發生改變,你需要核實一下。 九、總結 根據前文分析,這個方法不是一個特別嚴重的系統缺陷。如果已經有人能夠物理訪問你的機器,他已經可以採用一些常見手段進行攻擊(如HDD訪問、BIOS、Firewaire等)。物理攻擊法是個好方法,為此你也需要在物理層面對你的機器進行防護。此外你還可以考慮部署Bitlocker,這樣別人就難以通過攻擊啟動過程來危害機器,同時也可以防止電腦被竊后的敏感信息泄露。



熱門推薦

本文由 yidianzixun 提供 原文連結

寵物協尋 相信 終究能找到回家的路
寫了7763篇文章,獲得2次喜歡
留言回覆
回覆
精彩推薦