前言
針對Meterpreter的投遞流程和原理分析,網(wǎng)上已有一部分相關(guān)資料了
但是大多是基于Windows系統(tǒng),Linux下的分析資料好像并不全面。
為此,我從源碼入手,簡單的分析了Linux下Meterpreter的生成和執(zhí)行流程,以下記錄了部分過程
說明
研究對象: linux/x86/meterpreter/reverse_tcp
這種staged類型的payload,攻擊過程通常是先由服務(wù)端生成一段shellcode
接著可以選擇msf自帶的各種shellcode_loader,不過其特征都太明顯,通常都是自己去對shellcode做免殺
在我這篇博客中就提到過一種簡單的技巧 —— 記一則免殺技巧
Meterpreter的執(zhí)行流程主要分兩個階段,第一階段就是上述shellcode的執(zhí)行
這段shellcode也被稱作stager,其作用只是簡單的與服務(wù)端建立連接,然后開始接受第二階段服務(wù)端發(fā)送的stage并執(zhí)行
針對這段shellcode網(wǎng)上已經(jīng)有很多很詳細(xì)的分析資料了,感興趣的可以自行查閱
下面我主要從源碼分析第二階段的執(zhí)行流程
先簡單的提一下
Stage部分由兩個文件組成,一段shellcode和一份ELF格式的可執(zhí)行文件
后者是C編寫的跨平臺的meterpreter,在新版的msf中被稱作mettle,而該shellcode可以看成是mettel的加載器
開始
直接進(jìn)入相關(guān)代碼來看stage的生成過程


跟進(jìn)generate_stage函數(shù)

繼續(xù)跟進(jìn),在mettle.rb中找到payload生成的關(guān)鍵函數(shù)

發(fā)現(xiàn)是從現(xiàn)有文件中讀取得來,定位到目標(biāo)文件

可知,第二階段用到的主體文件就是這個mettle.bin
注意,此時還未發(fā)送該payload,回到前面接著往下看

對stage做編碼和加密等處理,暫時先不管,繼續(xù)往下看

可以看到,這里發(fā)送了midstager,這是第二階段發(fā)送的第一個shellcode
跟進(jìn)generate_intermediate_stage函數(shù),去看看它的生成過程


為了方便閱讀,我把源碼中兩函數(shù)上下調(diào)換了位置
可以看出,midstager是由一段固定的匯編代碼生成的shellcode,只是需要的payload長度和入口偏移地址等參數(shù)不同
shellcode.rb中的具體生成過程這里就不跟進(jìn)了
回到最開始的stager.rb繼續(xù)分析

最后就是一些信息的打印和stage的發(fā)送了
以上就是第二階段的一個大致流程
結(jié)語
后面的實踐中,我簡單地提取了幾條規(guī)則,然后復(fù)現(xiàn)了一波并在流量中捕獲到了相關(guān)特征,證實了我上述分析的正確性
這次針對Meterpreter的分析,原本是為了做惡意流量檢測
但是在實際場景中,深入理解其具體的執(zhí)行流程,可以做更多有意思的事
比如在之前的學(xué)習(xí)過程中,我看到很多大佬都重寫了一些加載器,有的甚至自寫了Meterpreter的服務(wù)端
到了真正的攻防對抗場景中,只有深入理解攻擊原理,才能激發(fā)更多有意義的idea
而只有具備扎實的基本功,才有能力將這些idea落地