天天看點

一次基于windows_xp--SLmail服務的緩沖區溢出實踐

一次基于windows_xp--SLmail服務的緩沖區溢出實踐

20191331lyx

一、基本概念

  • 緩沖區溢出:當緩沖區邊界限制不嚴格時,由于變量傳入畸形資料或程式運作錯誤,導緻緩沖區被填滿進而覆寫了相鄰記憶體區域的資料。可以修改記憶體資料,造成程序劫持,執行惡意代碼,擷取伺服器控制權限等。
在Windows XP或2k3 server中的SLMail 5.5.0 Mail Server程式的POP3 PASS指令存在緩沖區溢出漏洞,無需身份驗證實作遠端代碼執行。

Win7以上系統的防範機制可有效防止該緩沖區漏洞的利用:

  • DEP:阻止代碼從資料頁被執行;
  • ASLR:随機記憶體位址加載執行程式和DLL,每次重新開機位址變化。

二、實驗環境準備

(1)攻擊機:kali

(2)靶機:windows xp (關閉防火牆)

靶機環境準備:

郵件服務:SLMail 5.5.0 Mail Server

Debug工具:ImmunityDebugger_1_85_setup.exe

連結追蹤工具:mona.py

SLmail安裝:

一次基于windows_xp--SLmail服務的緩沖區溢出實踐
一次基于windows_xp--SLmail服務的緩沖區溢出實踐

将本地賬戶導入郵件伺服器:

一次基于windows_xp--SLmail服務的緩沖區溢出實踐

确認SLMail的端口是否正常開啟

一次基于windows_xp--SLmail服務的緩沖區溢出實踐

檢視郵件相關服務是否啟動

一次基于windows_xp--SLmail服務的緩沖區溢出實踐

将mona.py複制到Immunity Debugger的PyCommands目錄下

一次基于windows_xp--SLmail服務的緩沖區溢出實踐

連通性測試

一次基于windows_xp--SLmail服務的緩沖區溢出實踐

三、緩沖區溢出攻擊

使用nc驗證端口連接配接是否正常,測試pop3指令執行

一次基于windows_xp--SLmail服務的緩沖區溢出實踐
一次基于windows_xp--SLmail服務的緩沖區溢出實踐

測試 PASS 指令接收到大量資料時是否會溢出

EIP 寄存器:存放下一條指令的位址

pop3郵件服務偵聽的端口是110,程序ID是832.

一次基于windows_xp--SLmail服務的緩沖區溢出實踐

使用Immunity Debugger

file---attach---選中pid号為832的程序---attach調用

一次基于windows_xp--SLmail服務的緩沖區溢出實踐

監控程運作狀态

一次基于windows_xp--SLmail服務的緩沖區溢出實踐

明确思路

漏洞利用原理:“PASS”指令後,當一些特殊定制的指令輸入,會造成緩沖區溢出,上傳shellcode,可控制目标系統,則不需要經過身份驗證,獲得權限。

(1)編寫測試腳本,使用socket自動連接配接。

一次基于windows_xp--SLmail服務的緩沖區溢出實踐
一次基于windows_xp--SLmail服務的緩沖區溢出實踐

(2)增大資料發送量,通過Debug确定是否會溢出。

一次基于windows_xp--SLmail服務的緩沖區溢出實踐
一次基于windows_xp--SLmail服務的緩沖區溢出實踐

觀察EIP确認溢出

EIP中的41是十六進制數,轉換為字母就是A,也就是說此時EIP寄存器全部填滿了A,ESP寄存器也被填滿了A,每四個位元組為一個存儲單元進行存儲,EIP就是目前郵件伺服器SLmail下一個需要執行的指令的記憶體位址,所發送的A把下一條指令的記憶體位址給覆寫了,發生了緩沖區溢出。此時cpu會到EIP所在的記憶體位址中尋找指令代碼,而該指令記憶體已被A全部覆寫,此時程式就會奔潰無法繼續運作。

我們可以用shellcode填充EIP寄存器位址,這樣就可能控制目标機器。

一次基于windows_xp--SLmail服務的緩沖區溢出實踐

注意每次溢出都會導緻服務崩潰,是以需要每次實驗前重新開機SLmail服務。

一次基于windows_xp--SLmail服務的緩沖區溢出實踐

(3)精确定位溢出的四個位元組

使用唯一字元串法,可以在Kali Linux的/usr/share/metasploit-framework/tools/exploit/pattern_create.rb腳本中可以生成唯一字元串:

一次基于windows_xp--SLmail服務的緩沖區溢出實踐
一次基于windows_xp--SLmail服務的緩沖區溢出實踐
一次基于windows_xp--SLmail服務的緩沖區溢出實踐

在Debug中找到溢出位元組為8Di9

一次基于windows_xp--SLmail服務的緩沖區溢出實踐

計算偏移量

一次基于windows_xp--SLmail服務的緩沖區溢出實踐

精确的比對出來偏移量是2606,也就是它前面有2606個字元,即8Di9中的8是第2607個字元。

(4)進行确認驗證

buffer = 'A' * 2606+'LYXQ’+'C'*20

将前2606個字元替換為A,之後4個替換為B,再之後的20個字元替換為C,确認是否可以精确的把LYXQ寫入EIP寄存器。

一次基于windows_xp--SLmail服務的緩沖區溢出實踐

确認

下一步思路:将EIP修改為shellcode代碼的記憶體位址,将shellcode寫入到該位址空間,程式讀取EIP寄存器數值,将跳轉到shellcode代碼段并執行。

尋找可存放shellcode的記憶體空間(考慮ESP),修改EIP使其指向ESP所在的shellcode記憶體空間。

(5)修改字元C的填充量,判斷記憶體空間大小能否存放shellcode

buffer = 'A' * 2606+'LYXQ'+'C'*(3500-2606+4)

讓C去填滿ESP的記憶體空間,判斷C的個數。

一次基于windows_xp--SLmail服務的緩沖區溢出實踐

可以看到ESP起始位址為:01E7A154 終止位址為:01E7A2F4

使用結束位址01E7A2F4的後三位2F4減去開始位址01E7A154的後三位154,結果再轉化為十進制,得結果為416

意味着ESP空間大小為416位元組可以放下一個shellcode

(6)查找壞字元

由于不同類型的程式、協定、漏洞,會将某些字元認為是壞字元,這些字元有固定用途。如:

null byte (0x00)空字元,用于終止字元串的拷貝操作;return (0x0D)回車操作,表示POP3 PASS指令操作完畢。

而,傳回位址、shellcode、buffer都不能出現壞字元。

是以我們篩查壞字元,發送0x00-0xff 256個字元進行篩查。

一次基于windows_xp--SLmail服務的緩沖區溢出實踐

驗證得0A 為壞字元 ;0D為壞字元不出現,縮進一格,全部檢查,發現00也被過濾,則可發現該實驗中壞字元為:0x00 0x0D 0x0A

(7)重定向資料流

重定向資料流,用ESP的位址替換EIP的值,但是ESP的位址是變化的,不能使用寫死。在SLMali線程應用程式中,作業系統為每個線程配置設定一段的位址範圍,每個線程位址範圍不确定。

是以我們可以從記憶體位址中尋找固定的系統子產品,在子產品中尋找JMP ESP指令的位址跳轉,再由該指令間接跳轉到ESP,進而執行shellcode。

JMP ESP是彙編指令,需要使用kali将其轉換為二進制。

一次基于windows_xp--SLmail服務的緩沖區溢出實踐

!mona find -s "\xff\xe4" -m openc32.dll:在該程序子產品查找是否有執行JMP ESP的指令

通過檢查openc32.dll程序子產品中沒有可以執行JMP ESP的指令。

繼續查找發現SLMFC.DLL支援執行JMP ESP的指令,并且有20個記憶體位址可以執行。

一次基于windows_xp--SLmail服務的緩沖區溢出實踐

打開記憶體地圖,找到SLMFC子產品的基位址5F400000,可以看到該記憶體中存放的是一個pe檔案頭。位址5F401000存放code。

找到JMP ESP位址為5F4B41E3。

(8)生成shellcode

這裡為了繞過防火牆生成一個反彈shell

一次基于windows_xp--SLmail服務的緩沖區溢出實踐

過濾壞字元并重新編碼編碼(将病毒的特征字元沖編寫,可以在一定程度上實作免殺)

一次基于windows_xp--SLmail服務的緩沖區溢出實踐

(9)緩沖區溢出攻擊

将shellcode放入腳本。

一次基于windows_xp--SLmail服務的緩沖區溢出實踐

建立本地偵聽 nc -nvlp 8888

執行腳本發送shellcode

一次基于windows_xp--SLmail服務的緩沖區溢出實踐

緩沖區攻擊成功,成功拿到靶機shell。

一次基于windows_xp--SLmail服務的緩沖區溢出實踐

四、實踐體會:

緩沖區溢出攻擊,是利用“緩沖區溢出漏洞”所進行的攻擊行動。“緩沖區溢出”是一種非常普遍、非常危險的漏洞,在各種作業系統、應用軟體中廣泛存在。利用“緩沖區溢出”進行攻擊,可以導緻程式運作失敗、系統關機、重新啟動等後果。

緩沖區溢出,是指當計算機向緩沖區内填充資料位數時,超過了緩沖區本身的容量,溢出的資料覆寫在合法資料上。理想的情況是:程式會檢查資料長度,而且并不允許輸入超過緩沖區長度的字元。但是絕大多數程式都會假設資料長度,總是與所配置設定的儲存空間相比對,這就為“緩沖區溢出”埋下了隐患。

作業系統所使用的緩沖區,又被稱為“堆棧”,在各個操作程序之間,指令會被臨時儲存在“堆棧”當中,“堆棧”也會出現緩沖區溢出。

緩沖區溢出的危害非常大,通過植入并且執行攻擊代碼。攻擊者可以利用“堆棧溢出”,在函數傳回時,改變傳回程式的位址,讓其跳轉到任意位址。這帶來的危害,一種是程式崩潰導緻拒絕服務;另外一種就是跳轉并且執行一段惡意代碼,然後得到shell,為所欲為。

五、思考

在進行程式設計時,為了防範緩沖區溢出攻擊,可以采用哪些方法?

1、強制寫正确的代碼的方法

謹慎使用各種可能導緻緩沖區溢出的函數,系統調用等。增加代碼的健壯性,規範性,安全性。

2、通過作業系統使得緩沖區不可執行,進而阻止攻擊者植入攻擊代碼