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

news2024/10/6 8:40:45

引言

本文主要介绍“反射型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注入实现原理:
图片.png

上图比较清楚的写了反射型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夺旗赛题解析

具体实现

加载器部分

图片.png

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

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

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

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

dll部分

ReflectiveLoader一共做了5件事:

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

遍历内存进行搜索:
图片.png

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

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

图片.png

四、 修复重定位表:

图片.png

五、 调用DLL的入口点:
图片.png

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

柔性加载

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

推荐配置:

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:
图片.png

成功bypass:
图片.png

火绒

和上述方法相同:
图片.png
图片.png

definder

加强shellcode的混淆:

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

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

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

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

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

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

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

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

macfee

同上方法可以成功bypass:
图片.png

正常执行命令:
图片.png

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);

依旧不行:
图片.png

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

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

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

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

图片.png

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

图片.png

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

ESET Endpoint Security

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

图片.png

静态没有问题
图片.png

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

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

设置流量的白名单:
图片.png

关闭web控制后成功并上线
图片.png

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

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

图片.png

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

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

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

可以成功上线,并且正常使用:
图片.png

总结

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

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

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

相关文章

Go语言学习笔记

1. 普通函数声明/定义 函数声明包括函数名、形式参数列表、返回值列表(可省略)以及函数体 func 函数名(形式参数列表) (返回值列表){函数体 }2. 接口定义及实现 接口定义,注意和上述函数声明作区分 type 接口名 interface{method1(参数列…

【语音去噪】谱减法+维纳滤波+卡尔曼滤波语音去噪【含Matlab源码 1881期】

⛄一、谱减法维纳滤波卡尔曼滤波语音去噪简介 1 维纳滤波算法 在传统的去噪算法中,维纳滤波因其操作简单、去噪效果好,被公认为一种经典的去噪算法。语音信号在时域的表示为: yi( t) si( t) ni( t) ,其中si( t) 、ni( t) 和yi( t) 分别是第i帧原始语音信号、噪声和被噪声污染…

springboot反射执行private方法@Autowired字段为空

springboot反射执行private方法Autowired字段为空描述错误复现controllerserviceReflectServiceImplReflectCallServiceservice 层切面debug 结果图调用 reflectTest 方法(public反射)调用 reflectTest1方法(private反射)分析参考描述 业务代码写完之后,懒得写mock代…

Python基础(四):Python必需掌握基础注释、变量、输出

文章目录 Python必需掌握基础注释、变量、输出 一、注释 1、作用 2、分类及语法 3、快速体验 4、总结 二、变量 1、作用 2、定义变量 三、输出 1、格式化符号 2、体验 3、转义字符 4、结束符 Python必需掌握基础注释、变量、输出 14天学习训练营导师课程&#xf…

[附源码]计算机毕业设计JAVA汽车租赁系统

[附源码]计算机毕业设计JAVA汽车租赁系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis M…

自动化运维CICD

目录 概述 为什么持续集成和发布可以提高效率 如何实现 1、在linux服务器安装部署代码仓库 2、安装jenkins 使用shell脚本实现CICD 使用pipeline实现CICD 使用Blue Ocean实现CICD 概述 持续集成(Continuous Integration,CI)和持续发布&#xff0…

C/C++编译器配置——MinGW下载安装

一. 前言 由于重装Win11系统,所有配置环境需要重装,对于C/C编译器MinGW配置做一个简单记录。 VS code等软件只提供编辑器,不提供编译器,因此windows系统上的C/C编译器需要通过安装MinGW实现。 二. 安装过程 在MinGW官网下载安装…

元宇宙产业委风语筑董事长李晖:到更多城市探索元宇宙“虚实结合”

导语:近期李晖和风语筑团队在深度探索“虚实结合”,布局元宇宙,谋求更多的创新。他受中国移动通信联合会元宇宙产业委员会委托,参与研究编撰《元宇宙十大技术》,并为该书做序《元宇宙:数字技术构建美好生活…

(十)延迟队列

延迟队列1. 延迟队列概念2. 延迟队列使用场景3. 整合Springboot4. TTL队列1. 代码架构图2.MQ组件配置文件类代码3. 消息生产者代码4. 消息消费者代码5. 延时队列优化1. 代码架构图2. 配置文件类代码3. 消息生产者代码6. Rabbitmq插件实现延迟队列1.安装延时队列插件2.代码实现7…

强强联合:OpenFeign 整合 Sentinel

书接前文: 微服务间的远程接口调用:OpenFeign 的使用 当项目中使用了 OpenFeign 后,可以很方便的进行远程服务调用,现在有个问题,假如远程服务出现故障了,调不了远程的接口,这边又着急等着返回…

系统启动其实就2个步骤BIOS和MBR(和之后的init/systemd的关系)

1.让计算机知道系统被放在哪个设备上了(BIOS) 计算机启动先启动bios,再去读MBR,MBR动了才会启动操作系统 2.让计算机知道哪里的分区是活动分区(MBR),找出来把系统引导到这里来 这两部类似于早先游戏里的红色警报和星…

springcloud20:springcloudalibaba之Nacos

为什么会出现spring alibaba 整个Netflix项目进入维护模式(不会添加新功能) springcloud: Nerflix:eureka ribbon feign ruul config springcloud一些小技术和其整合 此时内部出问题 SpringCloud 吸收了springcloud alibaba 此时springcloud带了了什么呢…

【笔试强训】Day 3

🌈欢迎来到笔试强训专栏 (꒪ꇴ꒪(꒪ꇴ꒪ )🐣,我是Scort目前状态:大三非科班啃C中🌍博客主页:张小姐的猫~江湖背景快上车🚘,握好方向盘跟我有一起打天下嘞!送给自己的一句鸡汤&#x…

python中pytest库用法详解

Pytest 是用于测试 Python 应用的 Python 库。 官方文档:Full pytest documentation — pytest documentation 安装: pip install pytest pytest 测试发现约定规范 如果未指定任何参数,则在testpaths(如果已配置)或…

智慧水利数字孪生案例分享:数字孪生水利,助力三峡科学防洪防汛

长江是我国第一大河流,长江流域在我国经济发展中,占据举足轻重的地位。与此同时,长江流域频繁的洪涝、气象灾害,严重影响危害着流域内经济社会发展和生态环境,因此长江流域防汛管理被作为我国防洪体系中的关键工程。水…

阿里大咖纯手写的微服务入门笔记,从基础到进阶直接封神

前言 学习是一种基础性的能力。然而,“吾生也有涯,而知也无涯。”,如果学习不注意方法,则会“以有涯随无涯,殆矣”。 学习就像吃饭睡觉一样,是人的一种本能,人人都有学习的能力。我们在刚出生的…

通讯/服务器公司 测试|测试开发 面试真题|面经 汇总

浪潮 测试开发 一面 8.24 三个面试官。一个HR,两个技术官。 1 为什么选择测开?意向工作地点。 2 软件质量模型 3 测试要做哪些测试 4 集成测试和验收测试的区别? 5 黑盒测试和白盒测试的理解 6 知道哪些黑盒测试和白盒测试的方法 7 手工测试…

【观察】“中国算力网”向全社会开放,意味着什么?

今天,算力的重要性已被提升到全新的高度,这是因为算力作为数字经济时代新的生产力,对推动科技进步、行业数字化转型以及经济社会发展都发挥着至关重要的作用。根据中国信通院发布《中国算力发展指数白皮书(2022年)》显…

AE插件:流体渐变着色特效动画生成 Potok mac

Potok是After Effects的流体渐变插件。它会产生噪波并使用渐变对其进行着色。可以从UI Gradient Control或任何图层设置渐变。噪波可以用任何层掩盖。 Noise噪波:Potok 插件有一个内置的噪音发生器,有四种噪音类型。噪声动画可以无缝循环。此外&#xf…

ASM3142 USB 3.1控制芯片_ ASM3242 USB 3.2 2x2 控制器

一、ASM3142 USB 3.1控制芯片 ASM3142 USB 3.1控制芯片将成为通过USB进行快速数据传输的新标准。是全球最快的USB解决方案, 可提高性能并实现更高的功效,节省高达50%的功耗。 与ASM 2142 USB控制芯片相比,新的ASM 3142超高速USB控…