Black Hat EU 2001- Third Generation Exploits on NT/Win2k Platforms pt2
三句話摘要
Windows系統緩衝區溢位與格式字串漏洞的利用技術及可靠性提升方法。 在NT系統上,透過利用可預測的TEB地址和SEH連結串列、配合精心控制的多執行緒環境,能夠將基於緩衝區溢位的漏洞利用成功率提升到80-90%;而格式字串漏洞因其通用性和隱蔽性,已成為比緩衝區溢位更普遍的威脅,且可透過自動化工具在二進位制層面快速定位。 緩衝區溢位的可靠性困境:在NT系統中,返回地址會隨著Service Pack、熱修復程式及程式語言版本變化而改變,且多執行緒應用無法預測堆疊位置,標準Unix跳轉堆疊技術完全失效。講者強調,單靠堆疊溢位在NT上已不可行。
重點整理
重點- 1
緩衝區溢位的可靠性困境:在NT系統中,返回地址會隨著Service Pack、熱修復程式及程式語言版本變化而改變,且多執行緒應用無法預測堆疊位置,標準Unix跳轉堆疊技術完全失效。講者強調,單靠堆疊溢位在NT上已不可行。
- 2
Windows異常處理鏈的可利用性:NT系統的SEH機制比Unix訊號處理更強大,允許程式註冊多層異常處理器。透過覆寫執行緒環境區塊(fs:0x00)中的異常處理器指標,攻擊者能夠劫持程式流程,只需在異常觸發後獲得控制權。
- 3
TEB記憶體佈局的可預測性:第一個執行緒的TEB始終位於0x7ffde000,後續執行緒按遞減順序分配,地址高度可預測。雖然執行緒終止會導致記憶體碎片化,但透過製造高負載讓目標執行緒排隊靠前,再配合垃圾執行緒填補空隙,可將利用成功率穩定在80-90%以上。
- 4
格式字串漏洞的通用性:`printf(user_data)`這種模式普遍存在於程式碼中,源於程式設計師懶惰或不瞭解規範。單個格式字串漏洞可實現任意記憶體讀寫,利用方式比緩衝區溢位靈活,且在二進位制層面可透過棧修正指令自動檢測。
實用技巧與重點
乾貨- 關鍵資料與發現:
- 第一執行緒TEB地址:0x7ffde000
- 第12個執行緒TEB地址:0x7ffd0000
- 測試執行緒數量:500個
- 利用成功率:80-90%(多執行緒、無Service Pack資訊情況下)
- Microsoft FTP伺服器中發現的格式字串漏洞需啟用除錯標誌才能觸發
- 工具與技術:
- IDA反彙編器:可編寫指令碼自動檢測格式字串漏洞
- 檢測引數:棧修正量、格式字串長度、引數個數
- sprintf最小棧修正值:12位元組;printf最小值:8位元組
- 格式字元應用:`%x`(讀記憶體)、`%n`(寫記憶體)、`%s`(讀字串)
- 關鍵概念:
- 引數缺陷錯誤(Parameter Insufficiency Error):缺少格式字串引數導致的漏洞
- 棧修正(Stack Correction):函式呼叫後恢復棧指標的操作
- 執行緒環境區塊碎片化(TEB Fragmentation):執行緒終止導致記憶體地址空隙
- 實際案例:
- Checkpoint管理客戶端:存在可利用的版本
- 微軟FTP伺服器:DNS查詢中的格式字串漏洞
- Apache模組:格式字串漏洞自動檢測工具可發現
結論
結論“在NT系統上,透過利用可預測的TEB地址和SEH連結串列、配合精心控制的多執行緒環境,能夠將基於緩衝區溢位的漏洞利用成功率提升到80-90%;而格式字串漏洞因其通用性和隱蔽性,已成為比緩衝區溢位更普遍的威脅,且可透過自動化工具在二進位制層面快速定位。”
完整解析
詳細演講從緩衝區溢位的根本難題開始。在Unix系統中,攻擊者可以預測堆疊位置並跳轉到那裡執行shell code,但Windows NT完全改變了規則。首先,大多數NT編譯器將全域性偏移表(GOT)設為只讀,寫入會觸發訪問違例異常(SE_ACCESS_VIOLATION)。其次,NT本質上是多執行緒架構,每個執行緒的堆疊位置不同且隨Service Pack版本變化,使得盲目跳轉極其不可靠。
針對這一困局,講者介紹了Windows的結構化異常處理(SEH)機制。每個執行緒透過fs:0x00指向一個異常處理器連結串列,連結串列中每個節點包含指向下一個處理器的指標和處理器程式碼的地址。當異常發生時,系統依次呼叫連結串列中的處理器。透過緩衝區溢位或格式字串漏洞覆寫這個指標,攻擊者可以指向惡意結構體,觸發異常後就能獲得程式碼執行權。
然而SEH位於fs段中,跨段任意寫入看似不可能。講者的突破性發現是:TEB(執行緒環境區塊)雖然官方不公開支援,但被對映到使用者地址空間。透過測試發現,第一個執行緒的TEB始終在0x7ffde000,第二個在0x7fddc000,依此類推,每個遞減0x2000位元組。這種高度可預測性使得直接覆寫fs:0x00成為可能。
但多執行緒系統還有另一重難題:執行緒碎片化。當執行緒建立後又快速終止,TEB地址空間會產生空隙,導致按順序溢位時可能跳過目標執行緒。講者的對策是先對伺服器施加高併發壓力,迫使大量執行緒建立;然後讓它們全部快速終止,造成地址空間最前面空出來;接著立即連線攻擊執行緒,使其排在前面;最後建立大量垃圾執行緒填補空隙。這個精心編排的流程將利用成功率提升到80-90%,即使在完全不知道作業系統版本、Service Pack號和程式語言的情況下。
後半部分講者轉向格式字串漏洞。`printf(user_data)`這一模式源於程式設計師的懶惰,完全省略了格式字串引數。格式字元如`%x`會從棧中讀取引數並列印,`%s`會讀取指標指向的字串,`%n`會將已寫入位元組數寫入引數地址。透過精心構造輸入,攻擊者可以從棧上讀取自己輸入的緩衝區地址,然後利用`%n`在任意地址寫入任意值,完成從記憶體讀寫到程式碼執行的全鏈路利用。
講者演示了在IDA中編寫指令碼自動檢測這些漏洞的方法。透過分析棧修正指令的大小和格式字串是否被雙引號括起,指令碼能自動定位可疑函式。在Microsoft FTP伺服器中,他實際發現了一個透過DNS查詢觸發的格式字串漏洞。雖然需要啟用除錯標誌才能觸發,但這充分說明了自動化檢測的價值——無需人工逐一審計,指令碼能在數秒內掃描數百個函式。
關鍵時刻
Pipeline v2帶時間戳的重點,會在逐字稿層級分析上線後產生。目前請先透過原始影片觀看。
事實查核
Pipeline v2說法查證是下一次管線升級的一部分。KeyFrame 只會顯示它真正能驗證的內容。

