這篇文章將為大家詳細(xì)講解有關(guān)從剖析CS木馬生成到開發(fā)免殺工具的過程是怎樣的,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
創(chuàng)新互聯(lián)公司基于成都重慶香港及美國等地區(qū)分布式IDC機(jī)房數(shù)據(jù)中心構(gòu)建的電信大帶寬,聯(lián)通大帶寬,移動(dòng)大帶寬,多線BGP大帶寬租用,是為眾多客戶提供專業(yè)成都服務(wù)器托管報(bào)價(jià),主機(jī)托管價(jià)格性價(jià)比高,為金融證券行業(yè)服務(wù)器托管,ai人工智能服務(wù)器托管提供bgp線路100M獨(dú)享,G口帶寬及機(jī)柜租用的專業(yè)成都idc公司。
木馬是黑客實(shí)施網(wǎng)絡(luò)攻擊的常用兵器之一,有些木馬可以通過免殺技術(shù)的加持躲過殺毒軟件的查殺。本文旨在通過剖析CS木馬生成過程以及開發(fā)免殺工具,幫助大家更好地理解CS木馬的Artifact生成機(jī)制。
Cobaltstrike是用于紅隊(duì)行動(dòng)、APT攻擊模擬的軟件,它具備很強(qiáng)大的協(xié)同能力和難以置信的可擴(kuò)展性。
無論是編寫 shellcode,創(chuàng)建自定義的 C2二進(jìn)制可執(zhí)行文件,還是修改代碼來隱藏惡意程序,它們都是紅隊(duì)日常工作的一部分,閱讀和理解成熟的C2框架代碼也是理所當(dāng)然的事情。
CS是使用Swing進(jìn)行UI開發(fā)的,代碼中直接找對(duì)話框?qū)?yīng)操作類。
+ `aggressor\dialogs\WindowsExecutableDialog.class`
可以看到很清晰的生成邏輯。
protected byte[] stager; @Override public void dialogAction(final ActionEvent actionEvent, final Map options) { this.options = options; this.stager = DialogUtils.getStager(options); if (this.stager.length == 0) { return; } final String string = options.get("output") + ""; String s = ""; if (string.indexOf("EXE") > -1) { s = "artifact.exe"; } else if (string.indexOf("DLL") > -1) { s = "artifact.dll"; } SafeDialogs.saveFile(null, s, this); }
通過 DialogUtils.getStager() 獲得生成的 stager 然后通過 saveFile 保存文件。
getStager() 方法調(diào)用了 aggressor\DataUtils.shellcode() ,而這里其實(shí)是Stagers的接口。
return Stagers.shellcode(s, "x86", b);
最終在 stagers\Stagers.shellcode() 根據(jù)監(jiān)聽器類型,
實(shí)例化了繼承自的 GenericStager 的 stagers\GenericHTTPStager 類,并由 generate() 生成shellcode
shellcode生成時(shí),讀取了resources/httpstager.bin,并根據(jù)監(jiān)聽器的host和port等值組合為Packer
最終替換到多個(gè)X、Y占位的bin文件中,最后返回bytes[] 類型的shellcode
shellcode生成完成后,回到原點(diǎn),可以看到根據(jù)用戶的選擇,對(duì)不同的 artifact 模板進(jìn)行 patch ,以 x86 的模板為例,
繼續(xù)跟進(jìn) patchArtifact
new ArtifactUtils(this.client).patchArtifact(this.stager, "artifact32.exe", s);
+ `common\BaseArtifactUtils.class`
public byte[] patchArtifact(final byte[] array, final String s) { final Stackstack = new Stack (); stack.push(SleepUtils.getScalar(array)); stack.push(SleepUtils.getScalar(s)); final String format = this.client.getScriptEngine().format("EXECUTABLE_ARTIFACT_GENERATOR", stack); if (format == null) { return this.fixChecksum(this._patchArtifact(array, s)); } return this.fixChecksum(CommonUtils.toBytes(format)); }
稍微看一下 fixChecksum ,是通過 PE 編輯器修復(fù)了校驗(yàn)碼。
這里不贅述了,對(duì)編輯器實(shí)現(xiàn)感興趣的可以去看看 pe\PEEditor.class
final PEEditor peEditor = new PEEditor(array); peEditor.updateChecksum(); return peEditor.getImage();
注意看這里 this._patchArtifact(array, s) ,調(diào)用了同名方法,PS:差點(diǎn)以為在看Python
讀取了 resources 文件夾下的 artifact32.exe 作為模板文件,根據(jù)重復(fù)的1024個(gè) A 來定位shellcode 位置。
與生成shellcode時(shí)類似,使用common/CommonUtils.replaceAt()對(duì)bytes流轉(zhuǎn)為的字符串進(jìn)行編輯替換。
public static String replaceAt(final String s, final String s2, final int n) { final StringBuffer sb = new StringBuffer(s); sb.delete(n, n + s2.length()); sb.insert(n, s2); return sb.toString(); }
使用16進(jìn)制編輯器可以直接看到用于標(biāo)志存放 shellcode 的位置。
值得一提的是,替換shellcode之后的pe文件,因?yàn)閟hellcode長度沒有完全覆蓋到標(biāo)識(shí)的1024個(gè)A,一般生成的exe都會(huì)殘留部分字符,當(dāng)然這并不會(huì)影響shellcode的執(zhí)行。
利用加載器遠(yuǎn)程回連獲取下一階段 payload 加載到內(nèi)存中執(zhí)行以規(guī)避殺軟的探測(cè),這種 VirtualAlloc到 WriteProcessMemory 的分配內(nèi)存模式早已被眾多遠(yuǎn)控木馬軟件廣泛利用。
CS開發(fā)者在其最新的介紹視頻中披露了部分 artifact 的源碼,并演示了如何通過修改加載器繞過了Defender 的查殺。
他通過用 HeapAlloc 來代替 VitualAlloc ,躲避了大部分的殺軟。
在這個(gè)基礎(chǔ)上,我們添加了對(duì)shellcode進(jìn)行異或加密的功能,顯然一個(gè)非常精簡的基于c++的shellcode加載器就成形了。
然后參考CS的方式,在本應(yīng)放置shellcode的buf中,置入大量重復(fù)的占位符作為定位。
python -c "print(1024*'A')"
用VisualStudio或MingW將其編譯為 template.exe
然后新建一個(gè) JavaFx 的項(xiàng)目,樣式與部分代碼參考某chaos免殺小助手。
捋下流程,首先需要對(duì)CS或MSF的shellcode進(jìn)行預(yù)處理,然后進(jìn)行異或加密,讀取模板文件,定位到shellcode位置,進(jìn)行覆蓋,最后保存。
有很多類直接可以從CS復(fù)制過來就能用。
重點(diǎn)看下xor,為了跟launcher解密一致,需要先轉(zhuǎn)換為int類型進(jìn)行異或,然后再轉(zhuǎn)回hex,最終打包為 jar
生成veil類型的payload,復(fù)制粘貼,生成, 保存。
最終免殺效果取決于Launcher模板,作為一個(gè)非常精簡、沒什么改動(dòng)的模板,效果已經(jīng)出乎意料了。
畢竟目的并非追求免殺效果,而應(yīng)注重于理解CS木馬的Artifact生成機(jī)制。
關(guān)于從剖析CS木馬生成到開發(fā)免殺工具的過程是怎樣的就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。