导语:我们使用了字符串替换方法和其他技术来构建自定义的Mimikatz二进制文件,研究发现,通过对最常用的字符串进行检测,将Mimikatz的检测率降低到了杀毒软件供应商的1/3左右,但是可以通过添加越来越多的字符串来进一步减少这种检测。
这篇文章将介绍如何通过修改源代码来获得过去的AV/EDR软件,从而构建自定义的Mimikatz二进制文件。
介绍
目前已经有很多关于如何混淆Mimikatz的文章,但是,它们大多数都集中在如何通过Invoke-Mimikatz的AMSI或在Powershell版本中使用混淆处理工具。但在几个月前Gist的一篇文章启发了我,让我知道如何构建未经杀毒软件标记的自定义版本:
# This script downloads and slightly "obfuscates" the mimikatz project. # Most AV solutions block mimikatz based on certain keywords in the binary like "mimikatz", "gentilkiwi", "[email protected]" ..., # so removing them from the project before compiling gets us past most of the AV solutions. # We can even go further and change some functionality keywords like "sekurlsa", "logonpasswords", "lsadump", "minidump", "pth" ....,# but this needs adapting to the doc, so it has not been done, try it if your victim's AV still detects mimikatz after this program. 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/[email protected]/[email protected]/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
启用了杀毒软件的Mimikatz版本
如果你曾尝试下载启用了杀毒软件的Mimikatz版本,则会注意到这是不可能的,因为每个单独的版本都已标记。这是完全合理的,因为如今的攻击者在现实世界的事件中使用Mimikatz和许多其他开源项目。我非常确定Mimikatz是从lsass进程或sam数据库中提取凭证、执行哈希攻击、解密DPAPI 数据加密保护等的最常用软件。你可以在ADSecurity.org或Mimikatz Wiki中找到有关函数的完整概述,但到目前为止还不够全面。DPAPI是Windows系统级对数据进行加解密的一种接口,无需自实现加解密代码,微软已经提供了经过验证的高质量加解密算法,提供了用户态的接口,对密钥的推导,存储,数据加解密实现透明,并提供较高的安全保证。
许多人显然不知道为什么这些开源项目以及如何标记这些开源项目:
但是,具有专有技术的真实攻击者或渗透测试人员不会使用发布版本,而是构建自己的版本。通常,仅使用Mimikatz的部分源代码。在这种情况下,我们不会遗漏任何函数,而是修改源代码以评估检测率,在backyard有一个自定义二进制文件总是很好。
基本签名
我们已经从上面的要点介绍了一些常见的Mimikatz签名。首先,必须替换以下字符串:
· mimikatz,MIMIKATZ和Mimikatz;
· DELPY, Benjamin, [email protected]
· 知识共享
· gentilkiwi
· KIWI, Kiwi和 kiwi
将自己置于杀毒软件供应商的位置,首先要标记的是二进制文件中包含的明显字符串。如果打开Mimikatz菜单,则会看到以下内容:
菜单中包含的所有字符串都是Mimikatz正在运行的指示符,因此我们将以下签名添加到脚本中以进行替换:
· “A La Vie, A L’Amour”
· http://blog.gentilkiwi.com/mimikatz
· Vincent LE TOUX
· http://pingcastle.com
· http://mysmartlogon.com
我们也可以打开mimikatz.c 并将横幅替换为其他内容或将其删除。
如上所述,我们可以通过替换函数关键字来走得更远,撰写本文时,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
也许我需要一些Mimikatz基础教程,但是维基百科并未告诉你如何列出所有模块。你仍然可以通过输入无效的模块名称(如:: )来实现:
我们在这里有两个选择,要么只更改所有函数名称的大小写,要么完全更改名称。在第一个选择中,熟悉的命令保持不变,在第二个选择中,我们必须记住新的函数名。目前,我们将继续使用熟悉的函数名称。我没有添加用于替换的短函数名,因为这些字符串也可能存在于代码中,这可能会破坏函数。为了为每个新版本构建自定义二进制文件,我们将与函数名称无关的字符串替换为随机名称。
另一个需要替换的重要东西是二进制文件的图标。因此,在修改后的gist中,我们将现有的图标替换为一些随机下载的图标。
主菜单中的每个函数都有子函数,例如,可能最知名的函数sekurlsa具有以下子函数:
msv, wdigest, kerberos, tspkg
livessp, cloudap, ssp, logonpasswords
process, minidump, bootkey, pth
krbtgt, dpapisystem, trust, backupkeys
tickets, ekeys, dpapi, credman
为确保最著名的Mimikatz指示符已更改,我们在替换脚本中包含了大多数子函数名称,这将产生一些脚本。
通过执行bash脚本,编译代码并将其上传到VirusTotal,我们得到以下结果:
netapi32.dll
要查找更多签名,可以使用head -c byteLength mimikatz.exe > split.exe将文件拆分为多个部分。如果删除生成的文件,则存在签名。如果不是,则文件的这一部分是干净的。你也可以使用Matt Hands DefenderCheck工具自动执行此任务。它就是这样做的,将文件分成多个部分,将它们复制到C\temp\,然后使用Windows Defender进行扫描,让我们检查一下生成的二进制文件:
Windows Defender标记了以下三个netapi32.dll库函数:
· I_NetServerAuthenticate2
· I_NetServerReqChallenge
· I_NetServerTrustPasswordsGet
通过搜索网络,我找到了以下文章,该文章解释了如何构建具有不同结构的新netapi32.min.lib。如本文所述,我们可以通过创建具有以下内容的.def文件来构建自定义netapi32.min.lib:
之后,我们通过发出以下命令在Visual Studio开发人员控制台中构建netapi32.min.lib文件:
我们将此新文件嵌入lib \ x64 \目录中并重新编译,再次运行DefenderCheck,将导致更多结果:
这意味着我们绕过了Windows Defender的“实时保护”函数。但是,如果我们启用云保护并将文件复制到另一个位置,它将再次被杀死:
替换更多的字符串
还有更多需要替换的东西,首先,我们留在明显的字符串上。 Mimikatz菜单包含每个函数的说明,例如,特权子函数具有以下描述:
为了删除明显的字符串,我们将通过将它们添加为要替换的字符串作为bash脚本来删除几乎所有描述。一些函数和描述不是关键任务,但仍然很酷,因此将他们原样保持:
answer - Answer to the Ultimate Question of Life, the Universe, and Everything
coffee - Please, make me a coffee!
许多AV供应商标记二进制文件中与函数相关的DLL文件已加载的部分。 Mimikatz从.DLL文件加载许多函数。要在Mimikatz源代码中找到所有相关的DLL文件,我们可以打开Visual Studio,按STRG + SHIFT +F。这将打开对整个项目的搜索。搜索.dll将为我们提供项目中使用的所有DLL文件名。我们还将在bash脚本中添加DLL名称,并使用不同的大写和小写字母进行替换。
带有子函数登录密码的sekurlsa是最常用的函数,它几乎可以转储所有凭据。因此,此函数的某些部分最多被标记。因此,请看一下kuhl_m_sekurlsa.c,看看哪些kprintf()语句包含可能被标记的单词。我们一直在寻找误报率较低的单词,因为杀毒软件供应商不想意外地标记其他二进制文件。我们最终得到的是以theese字符串结尾:
切换到MINIDUMP,切换到PROCESS
UndefinedLogonType,NetworkCleartext,NewCredentials,RemoteInteractive,CachedInteractive,CachedRemoteInteractive,CachedUnlock
DPAPI_SYSTEM,替换会话中的NTLM/RC4密钥,令牌模拟,UsernameForPacked,LSA隔离数据
如果我们查看默认函数标准kuhl_m_standard.c,我们可能还会标记其他字符串:
isBase64InterceptInput,isBase64InterceptOutput
Credential Guard可能正在运行,SecureKernel正在运行
该技术也可以应用于所有其他源代码文件,我不会在这里介绍所有内容,因为这个损耗太大了。但是,如果你替换字符串,检测率将下降。
文件夹和文件结构
我也查看了整个项目的结构,看看哪些部分一次又一次以同样的方式出现,有一件事直接引起了我的注意。所有变量和函数名称都以kuhl_或KULL_开头的名称声明:
完全替换所有这些事件非常容易,这也可能会大大改变生成文件的签名。因此,我们还将以下行添加到脚本中:
将以上提到的所有字符串添加到我们的bash脚本中,就可以了。
执行bash脚本,编译并上传到Virustotal:
看起来我们没有更多的隐形能力,但是在撰写本文时,此状态足以使启用了云保护的防御方案失效:
如果你仍然想进一步尝试获得FUD,则可以做更多的事情。你可以替换函数名称,而不必使用大写和小写字母。你可以遍历所有其他C文件和库文件来搜索低误报Mimikatz指标并替换它们,或者只是删除不需要的函数。
至于错误消息,它们也可以包含Mimikatz指标。对错误进行故障诊断并不总是很有意义,或者没有足够的时间。因此,如果你不需要详细的错误消息,则可以将其删除。使用键盘快捷键STRG + SHIFT + H,你可以搜索并替换整个项目中的字符串。搜索并替换以下内容以删除所有错误消息:
AV/EDR供应商还可以使用API导入的检测方法,关于混淆C/C ++源代码以隐藏Plowsec的API导入,有两篇非常好的文章。它们是Engineering antivirus evasion 和Engineering antivirus evasion (Part II) 。 Mimikatz利用了许多Windows API。例如,要隐藏LSAOpenSecret,可以在Mimikatz中使用以下代码:
通过隐藏SamEnumerateUserDomain,SamOpenUser,LsaSetSecret,I_NetServerTrustPasswordsGet等与以上技术结合使用,应该可以对FUD进行源代码修改。
但是修改源代码只是达到目标的一种方法,通过有关Phzor的Phras文章激发你的灵感:设计和实现开源PE Packer PEzor 。具有Syscall内联函数的Shellcode注入,User-Land挂钩移除等。
总结
我们使用了字符串替换方法和其他技术来构建自定义的Mimikatz二进制文件,研究发现,通过对最常用的字符串进行检测,将Mimikatz的检测率降低到了杀毒软件供应商的1/3左右,但是可以通过添加越来越多的字符串来进一步减少这种检测。 API导入隐藏之类的其他技术会进一步降低检测率。
顺便说一下,本文的bash脚本不再提供针对Base64编码的Mimikatz二进制文件的AMSI触发器。因此,有可能将该二进制文件包含在你选择的任何PE-Loader中,以在不接触磁盘的情况下加载它。
本文翻译自:https://s3cur3th1ssh1t.github.io/Building-a-custom-Mimikatz-binary/如若转载,请注明原文地址: