異常處理程序覆蓋曾經是利用堆棧緩沖區溢出的一種非常流行的技術,但在新程序中不再那么常見,因為它們很可能是用SafeSEH編譯的。有一點,即使在啟用了SafeSEH的情況下,仍然有可能通過堆噴來濫用異常處理程序,但是當然,內存保護并不止于此。DEP/ASLR最終來拯救,所以幾乎結束了SEH漏洞的輝煌歲月。您可能仍然可以找到不利用SafeSEH編譯的易受攻擊的應用程序,但是該應用程序可能已經過時,不再維護,或者它更像是開發人員的學習實驗。哦,這可能已經是一個漏洞了。盡管如此,利用異常處理來利用堆棧緩沖區溢出還是有趣的,所以如果你遇到它,使用`Seh` mixin
### 要求
為了能夠使用SEH mixin,必須滿足一些可利用的需求:
* 易受攻擊的程序沒有SafeSEH
* 沒有DEP(數據執行保護)。mixin使用短暫的跳轉來執行有效載荷,這意味著內存必須是可執行的。正如名字所暗示的,DEP阻止了這一點。
### 示例
首先,確保你在你的模塊的`Metasploit3`類的范圍內包含了 `Seh` mixin
~~~
include Msf::Exploit::Seh
~~~
接下來,您需要`Ret`來為SE處理程序設置一個地址。這個地址應該放在你的模塊的元數據中,具體在下面的`Targets`。在Metasploit中,每個目標實際上是一個由兩個元素組成的數組。第一個元素只是目標的名稱(目前沒有嚴格的命名風格),第二個元素實際上是一個字典,其中包含特定于該目標的信息,例如目標地址。以下是設置Ret地址的示例:
~~~
'Targets' =>
[
[ 'Windows XP', {'Ret' => 0x75022ac4 } ] # p/p/r in ws2help.dll
]
~~~
正如你所看到的,記錄Ret地址的作用以及指向那個DLL 也是一個好習慣。
Ret實際上是一種特殊的key,因為它可以通過`target.ret`在模塊中使用。在我們的下一個例子中,你會看到`target.ret`被用來代替原始目標地址的編碼。
如果您需要一個工具來為ret地址 查找POP/POP/RET,你能使用metasploit的`msfbinscan`工具,它位于tools目錄下.
好的,現在我們來看看這些方法。`Seh` mixin 提供了兩種方法:
* `generate_seh_payload` - 生成一個虛假的SEH記錄,并在之后附上有效載荷。這是一個例子:
~~~
buffer = ''
buffer << "A" * 1024 # 1024 bytes of padding
buffer << generate_seh_payload(target.ret) # SE record overwritten after 1024 bytes
~~~
buffer內存中的實際布局應該是這樣的:
~~~
[ 1024 bytes of 'A' ][ A short jump ][ target.ret ][ Payload ]
~~~
* `generate_seh_record` - 在沒有有效載荷的情況下生成假SEH記錄,以防您想將有效載荷放置在其他地方。代碼示例:
~~~
buffer = ''
buffer << "A" * 1024 # 1024 bytes of padding
buffer << generate_seh_payload(target.ret)
buffer << "B" * 1024 # More padding
~~~
內存布局應該是這樣的:
~~~
[ 1024 bytes of 'A' ][ A short jump ][ target.ret ][ Padding ]
~~~
### 參考
https://www.corelan.be/index.php/2009/07/25/writing-buffer-overflow-exploits-a-quick-and-basic-tutorial-part-3-seh/
https://github.com/rapid7/metasploit-framework/blob/master/lib/rex/exploitation/seh.rb
https://github.com/rapid7/metasploit-framework/blob/master/lib/msf/core/exploit/seh.rb
- Home
- 開始使用
- 安裝metasploit開發環境
- 使用metasploit
- 使用git
- 報告一個bug
- 貢獻代碼
- 貢獻給metasploit
- 創建一個loginscans Metasploit模塊
- 接受模塊和增強功能的指導
- 常見的Metasploit模塊代碼錯誤
- 樣式提示
- metasploit提交者
- metasploit開發
- 為什么是ruby
- 樣式提示
- 如何開始寫一個exploit
- 如何開始寫一個輔助模塊
- 如何開始寫一個post模塊
- 如何開始寫一個Meterpreter腳本
- 載入外部模塊
- exploit rank
- Metasploit模塊引用標識符
- 怎么在你的exploit中確認window補丁程序級別
- 如何使用filedropper清理文件
- 如何棄用metasploit模塊
- 如何在模塊開發中報告或儲存數據
- 在metasploit如何使用日志
- 如何在metasploit對JavaScript進行混淆
- 如何解析一個http響應
- 如何使用HTTPClient發送HTTP請求
- 如何使用命令階段
- 如何使用數據儲存選項
- 如何在window后期開發中使用railgun
- 如何在exploit中使用powershell
- 如何使用PhpEXE來利用任意文件上傳漏洞
- 如何使用FILEFORMAT mixin創建一個文件格式exploit
- 如何使用BrowserExploitServer編寫一個瀏覽器exploit
- 如何使用HttpServer編寫瀏覽器exploit
- 如何編寫一個check()方法
- 如何使用Seh mixin來利用異常處理程序
- 如何在Windows上使用WbemExec進行寫入權限攻擊
- 如何使用httpserver和httpclient編寫一個模塊
- payloads如何工作
- 如何免殺
- 如何正確使用metasploit模塊