【网络安全】红队基础免杀

news2024/11/17 18:09:24

引言

本文主要介绍“反射型 dll 注入”及“柔性加载”技术。

反射型 dll 注入

为什么需要反射型 dll 注入

常规的 dll 注入代码如下:

int main(int argc, char *argv[]) {HANDLE processHandle;PVOID remoteBuffer;wchar_t dllPath[] = TEXT("C:\\experiments\\evilm64.dll");
printf("Injecting DLL to PID: %i\n", atoi(argv[1]));processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, DWORD(atoi(argv[1])));remoteBuffer = VirtualAllocEx(processHandle, NULL, sizeof dllPath, MEM_COMMIT, PAGE_READWRITE);        WriteProcessMemory(processHandle, remoteBuffer, (LPVOID)dllPath, sizeof dllPath, NULL);PTHREAD_START_ROUTINE threatStartRoutineAddress = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryW");CreateRemoteThread(processHandle, NULL, 0, threatStartRoutineAddress, remoteBuffer, 0, NULL);CloseHandle(processHandle); 
return 0;}

主要做了几件事情:

  1. 从磁盘读取 dll 到 wchar_t 数组

  2. 将该 payload 数组写入目标内存

  3. 在目标内存中找到 LoadLibraryW 函数

  4. 通过 CreateRemoteThread 调用 LoadLibraryW 函数,参数为 dll 在内存中的地址。

这样的操作模式有几个很高危的点。首先,从磁盘读取 dll 需要考虑 dll 的静态免杀,对此我们可以直接写在装载器中并加密。

其次,在目标内存中找到 LoadLibraryW 函数,需要 GetProcAddress LoadLibraryW,这种调用属于很有特征的调用模式,容易被 AV/EDR 归类。对此我们的解决措施就是接下来要提及的反射型 dll 注入技术。

最后,CreateRemoteThread 进行远程线程注入 行为本身就很高危,同时参数是 LoadLibraryW 的地址,一眼 malware。

对此我们优化调用,不再使用 CreateRemoteThread 进而使用创建新进程的方式结合反射型 dll 注入技术改变 dll 注入技术的调用模式。

实现思路

早期的 dll 注入实现原理:

上图比较清楚的写了反射型 dll 注入的原理,1,2,3 步由 A 向 B 线程写入 dll。第四步调用 B 线程中的 embedded bootstrapper code。最后通过 bootstrapper shellcode 调用 dll 的导出函数 reflective loader。

reflective loader 实际上是一个自己实现的 LoadLibraryW 函数,从内存中找到我们写入的 dll 并修复使其成为可以被正常使用的 pe 文件,最后调用 DLLmain 实现我们的恶意功能。

我们的具体实现和上面早期的思路有所区别,首先我们不使用远程进程/线程注入的方式,其次我们不需要 bootstrapper shellcode 这个部分,我们可以直接在加载器部分算出 reflective loader 在内存中的地址,直接调用即可。

【一一帮助安全学习,所有资源获取处一一】

①网络安全学习路线

②20 份渗透测试电子书

③安全攻防 357 页笔记

④50 份安全攻防面试指南

⑤安全红队渗透工具包

⑥网络安全必备书籍

⑦100 个漏洞实战案例

⑧安全大厂内部视频资源

⑨历年 CTF 夺旗赛题解析

具体实现

加载器部分

首先 shellcode 使用 AES 解密,这部分添加了一些 c 的代码加密

后来发现原本项目的 release 目录下有 python 的加密脚本:

解密载入内存后,使用 GetReflectiveLoaderOffset 计算出 ReflectLoader 函数的偏移:

最后创建线程调用 ReflectLoader 函数。

dll 部分

ReflectiveLoader 一共做了 5 件事:

一、 解析加载 DLL 所需 kernel32.dll WINAPI 的地址(例如 VirtualAlloc, LoadLibraryA 等),通过关键函数的 hash 在内存中搜索,函数 hash:

遍历内存进行搜索:

二、 将 DLL 及其相应的节写入内存中:

三、 建立 DLL 导入表,以便 DLL 可以调用 ntdll.dll 和 kernel32.dll WINAPI

四、 修复重定位表:

五、 调用 DLL 的入口点:

最终我们的恶意代码位于 dllmain 中,项目还是采用加载 shellcode 的方式上线 cs。

柔性加载

限制使用具有 RWX 标记的内存,cs 在 4+可以直接进行相关配置。

推荐配置:

set startrwx        "false";set userwx          "false";set cleanup         "true";set stomppe         "true";set obfuscate       "true";set sleep_mask      "true";set smartinject     "true";

牛刀小试

360

使用 base64+xor 混淆 shellcode:

成功 bypass:

火绒

和上述方法相同:

definder

加强 shellcode 的混淆:

std::string rest2_reference = "xxx@@";std::string rest3_reference = replace(rest2_reference, "@@", "==");

依旧报毒,但是类型发生改变了,说明静态的混淆有效果:

异或的操作,比较可疑,经过测试发现是 cs 的 shellcode 出现在数组里就报毒,应该是对内存进行的扫描。

所以我们可以使用《文章二》中提及的技术“规避常见的恶意 API 调用模式”,将 shellcode 分片直接写入连续内存。

在测试的过程中发现莫名其妙的过了查杀:

很神奇,这段并没有实现内存的切片写入,因为 shellcode 的大小没有达到 4096,实际上相当于直接分配了个大小为 4096 的数组,写入了 shellcode。

而且把这段代码相同的格式放外面就不行,个人感觉 definder 还是没有去检查内存。

可能是有语义分析的引擎,这次刚好绕过了语义分析。

macfee

同上方法可以成功 bypass:

正常执行命令:

kasperky Endpoint 11 for windows

用过 macfee 和 definder 的 demo2 测试失败,注释掉代码加载部分不报毒,改用 apc 和创建进程的的方式加载内存:

SIZE_T shellSize = 4096;STARTUPINFOA si = { 0 };PROCESS_INFORMATION pi = { 0 };
CreateProcessA("C:\\Windows\\System32\\calc.exe", NULL, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi);HANDLE victimProcess = pi.hProcess;HANDLE threadHandle = pi.hThread;
LPVOID shellAddress = VirtualAllocEx(victimProcess, NULL, shellSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);PTHREAD_START_ROUTINE apcRoutine = (PTHREAD_START_ROUTINE)shellAddress;
WriteProcessMemory(victimProcess, shellAddress, exec, shellSize, NULL);QueueUserAPC((PAPCFUNC)apcRoutine, threadHandle, NULL);ResumeThread(threadHandle);

依旧不行:

使用 syscall 调用 NtCreateThreadEx。这里被坑了,WaitForSingleObject 要使用,不然会异步,没法上线:

ANtCTE(    &hThread,    THREAD_ALL_ACCESS,    NULL,    GetCurrentProcess(),    (LPTHREAD_START_ROUTINE)exec,    NULL,    NULL,    0,    0,    0,    nullptr);WaitForSingleObject(hThread, INFINITE);

能看到效果,行为检测依旧有问题:

但漏洞利用防御已经没有相关报警:

怀疑是 cs 本身流量特征的问题,为了验证我使用卡巴斯基本身的功能禁用了网络请求:

确实不杀也不报警了,确定是 cs 通信的问题。

ESET Endpoint Security

demo3 报警,并且明显检测到网络连接行为

静态没有问题

主要应该还是在对内存的检测,而且感觉已经执行到了发包

下面根据《三》中的“beacon 的内存加密”对 demo3 进行优化,使用 RefleXXion 工具的第二种将内存设为 NO_ACCESS 并通过注册异常处理还原的方式进行免杀。

设置流量的白名单:

关闭 web 控制后成功并上线

eset 在持续在扫描内存,但一直没有权限,一直触发异常,无法进入正常的后门逻辑

能绕过内存的检测,但无法正常使用

感觉 ESET 一直在我程序里进行内存操作,访问到了不可访问的内存段。

可能 ESET 的机制是一直在扫描程序内存,也可能是想要做一些 hook。

我尝试使用 RefleXXion 的第一种方法,将 shellcode 加密并使属性为 RW 或 RX 的方式加载 shellcode:

可以成功上线,并且正常使用:

总结

该系列文章所有的 bypass edr 方法都只在用户态进行操作,已经能规避大多数 AV/EDR 的检测。但不乏一些 edr 进行了比较多的内核层面的限制,如炭黑、fireeye 等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/463532.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从源码全面解析LinkedBlockingQueue的来龙去脉

一、引言 并发编程在互联网技术使用如此广泛,几乎所有的后端技术面试官都要在并发编程的使用和原理方面对小伙伴们进行 360 的刁难。 二、使用 对于阻塞队列,想必大家应该都不陌生,我们这里简单的介绍一下,对于 Java 里面的阻塞…

【 SpringBoot 统⼀功能处理 】

文章目录 引言一、⽤户登录权限效验Spring 拦截器拦截器实现原理扩展:统⼀访问前缀添加 二、统⼀异常处理三、统⼀数据返回格式四、ControllerAdvice 源码分析 引言 接下来是 Spring Boot 统⼀功能处理模块,是 AOP 的实战环节,要实现的课程⽬…

轨道交通信号系统的可靠性与安全性

01.引言 城市轨道交通系统作为大容量公共交通工具,其安全性直接关系到广大乘客的生命安全,所以要求城市轨道交通系统在如此高的运行密度下,还要保证安全和高效率的运行。而信号系统作为保证列车安全、正点、便捷、舒适、高密度不间断运行的重…

Filter 过滤器基本内容及案例改进

举个例子 假设在Web资源中,A资源要写5行代码,而B资源也要写一模一样的5行代码,这时就把这些代码都提取出来, 在过滤器里写这些代码,因为访问任何资源都要经过过滤器,在过滤器走一遍就可以,而不用…

性能优化之20个 Linux 服务器性能调优技巧

Linux是一种开源操作系统,它支持各种硬件平台,Linux服务器全球知名,它和Windows之间最主要的差异在于,Linux服务器默认情况下一般不提供GUI(图形用户界面),而是命令行界面,它的主要目的是高效处理非交互式进…

【22】核心易中期刊推荐——人工智能与识别图像处理与应用

🚀🚀🚀NEW!!!核心易中期刊推荐栏目来啦 ~ 📚🍀 核心期刊在国内的应用范围非常广,核心期刊发表论文是国内很多作者晋升的硬性要求,并且在国内属于顶尖论文发表,具有很高的学术价值。在中文核心目录体系中,权威代表有CSSCI、CSCD和北大核心。其中,中文期刊的数…

网络编程代码实例:多进程版

文章目录 前言代码仓库内容代码(有详细注释)server.cclient.cMakefile 结果总结参考资料作者的话 前言 网络编程代码实例:多进程版。 代码仓库 yezhening/Environment-and-network-programming-examples: 环境和网络编程实例 (github.com)E…

商品如果要在美国商超出售,那么如何申请美国条形码呢?

美国条码注册是指向美国条码协会提出条码申请,通过条码协会的审核批准后,条码可以印在产品上使用。条码是进入各大商场,超市的身份证,企业有条形码,一是可以提高企业产品的知名度;二是增加产品的防伪力度&a…

TypeScript与JavaScript

目录 一、什么是javascript 二、TypeScript:静态类型检查器 1、类型化的 JavaScript 超集 1.1、句法 1.2、类型 1.3、运行时行为 1.4、擦除类型 2、学习 JavaScript 还是 TypeScript 一、什么是javascript JavaScript(也称为 ECMAScript&#xf…

为何电商这么难做…...你是否忽略了这个问题?

物流时效是影响买家体验的重要环节,物流服务优劣也是买家网上购物时的重要参考依据。但电商企业对于快递公司的时效承诺、服务质量基本处于被动接受的状况,直到买家投诉才知道快递公司服务缺失,若买家不投诉也没法主动知道大量的订单是否按约…

Notes/Domino 11.0.1FP7以及在NAS上安装Domino等

大家好,才是真的好。 目前HCL在还是支持更新的Notes/Domino主要是三个版本,V10、11和12,这不,上周HCL Notes/Domino 11.0.1居然推出了FP7补丁包程序。 从V10.0.1开始,Domino的FP补丁包程序主要是用来修复对应主要版本中的一些问…

TCP FACK 与 RACK

3 个 dupacks 触发 fast retransmit 是一个经典启发算法,但在引入 SACK 之后仍然计数 SACKed 数量 > 3 触发 fast retransmit 似乎就没理由了。即使把 reordering 算进去,一个距离 una 很远的 seg 被 SACKed,也足以判定丢包了,…

2022公考经验分享

一、写在前面 2017南京邮电毕业后,5年来一直就职事业单位。单位解决北京户口,也赶上了一两年的忙碌期,存款加上公积金大概40万。期间经历过几段感情,2020年通过相亲认识现在的老婆。2020年12月瑞泽家园签位排名7000多,…

本地spingboot配置Promethus+granfana监控

记录如何配置与启动 1.在搭建好的应用加上依赖 <!-- 实现对 Actuator 的自动化配置 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!-- Micr…

超火爆的ChatGPT课,送ChatGPT账号啦~~

HOT! HOT! HOT! &#x1f525; &#x1f525; &#x1f525; 上周&#xff0c;ChatGPT全栈开发课程一经推出&#xff0c;就在程序员圈子中引起了广泛关注。这两天 都被挤爆了&#xff0c;纷纷表示对课程内容很是期待呢。 明天就要开班直播啦&#xff0c;还未报名的同学&…

npm 打包发布一个公用的组件包

1&#xff0c;首先创建一个需要发包发布的组件 2.3使用Vue插件模式 这一步是封装组件中的重点&#xff0c;用到了Vue提供的一个公开方法&#xff1a;install。这个方法会在你使用Vue.use(plugin)时被调用&#xff0c;这样使得我们的插件注册到了全局&#xff0c;在子组件的任何…

AI在网络安全中的应用:机器学习如何帮助我们更好地保护网络

章节一&#xff1a;引言 随着信息技术的飞速发展&#xff0c;网络攻击的手段也在不断地演变。传统的网络安全技术已经难以应对日益复杂的网络安全威胁。AI技术&#xff0c;特别是机器学习技术&#xff0c;为网络安全提供了一种新的解决方案。本文将介绍AI在网络安全中的应用&am…

打造高性能的视频和弹幕系统(一): 对象存储服务

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

一文综述:自然语言处理技术NLP

自然语言处理技术综述1-到2020年 写在最前面摘要NLP简介Preprocessing预处理Tokenization令牌化、标记化Stop Words 停用词Stemming and Lemmatization词干提取和词形还原&#xff08;英文单词&#xff09;Parts-of-Speech Tagging词性标记Bag of Words and N-Grams词袋模型、N…

Redis数据库的安装(Windows10)

Redis数据库的安装 前言安装启动命令简单的几条语句 前言 本节开始学习Redis数据库。 Redis数据库的优势如下&#xff1a; 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ord…