1. 程式人生 > 其它 >一次基於windows_xp--SLmail服務的緩衝區溢位實踐

一次基於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安裝:

將本地賬戶匯入郵件伺服器:

確認SLMail的埠是否正常開啟

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

將mona.py複製到Immunity Debugger的PyCommands目錄下

連通性測試

三、緩衝區溢位攻擊

使用nc驗證埠連線是否正常,測試pop3命令執行

測試 PASS 命令接收到大量資料時是否會溢位
EIP 暫存器:存放下一條指令的地址
pop3郵件服務偵聽的埠是110,程序ID是832.

使用Immunity Debugger
file---attach---選中pid號為832的程序---attach呼叫

監控程執行狀態

明確思路

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

(1)編寫測試指令碼,使用socket自動連線。

(2)增大資料傳送量,通過Debug確定是否會溢位。

觀察EIP確認溢位

EIP中的41是十六進位制數,轉換為字母就是A,也就是說此時EIP暫存器全部填滿了AESP暫存器也被填滿了A,每四個位元組為一個儲存單元進行儲存,EIP就是當前郵件伺服器SLmail下一個需要執行的指令的記憶體地址,所傳送的A把下一條指令的記憶體地址給覆蓋了

,發生了緩衝區溢位。此時cpu會到EIP所在的記憶體地址中尋找指令程式碼,而該指令記憶體已被A全部覆蓋,此時程式就會奔潰無法繼續執行。

我們可以用shellcode填充EIP暫存器地址,這樣就可能控制目標機器

注意每次溢位都會導致服務崩潰,因此需要每次實驗前重啟SLmail服務。

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

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

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

計算偏移量

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

(4)進行確認驗證

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

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

確認

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

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

(5)修改字元C的填充量,判斷記憶體空間大小能否存放shellcode
buffer = 'A' * 2606+'LYXQ'+'C'*(3500-2606+4) 讓C去填滿ESP的記憶體空間,判斷C的個數。

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

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

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

(6)查詢壞字元

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

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

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

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

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

(7)重定向資料流
重定向資料流,用ESP的地址替換EIP的值,但是ESP的地址是變化的,不能使用硬編碼。在SLMali執行緒應用程式中,作業系統為每個執行緒分配一段的地址範圍,每個執行緒地址範圍不確定。
所以我們可以從記憶體地址中尋找固定的系統模組,在模組中尋找JMP ESP指令的地址跳轉,再由該指令間接跳轉到ESP從而執行shellcode

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

!mona find -s "\xff\xe4" -m openc32.dll:在該程序模組查詢是否有執行JMP ESP的命令
通過檢查openc32.dll程序模組中沒有可以執行JMP ESP的命令。

繼續查詢發現SLMFC.DLL支援執行JMP ESP的命令,並且有20個記憶體地址可以執行。

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

找到JMP ESP地址為5F4B41E3。

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

過濾壞字元並重新編碼編碼(將病毒的特徵字元衝編寫,可以在一定程度上實現免殺)

(9)緩衝區溢位攻擊
將shellcode放入指令碼。

建立本地偵聽 nc -nvlp 8888
執行指令碼傳送shellcode

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

四、實踐體會:

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

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

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

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

五、思考

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

1、強制寫正確的程式碼的方法
謹慎使用各種可能導致緩衝區溢位的函式,系統呼叫等。增加程式碼的健壯性,規範性,安全性。

2、通過作業系統使得緩衝區不可執行,從而阻止攻擊者植入攻擊程式碼

3、利用編譯器的邊界檢查,來實現緩衝區的保護

4、在程式指標失效前進行完整性檢查

5、定時檢查你的計算機,關閉不必要的系統服務,並監控好已開啟的服務