cobaltstrike有一个blockdlls,该命令可以使产生的进程禁止加载非微软签名的dll,用来绕过一些注入DLL的edr有显著效果。
cs的实现方式是修改UpdateProcThreadAttribute属性
图来自@xpn大佬
修改该属性会使子线程拒绝非微软签名的dll注入。
开了blockdlls以后任务子线程会加上Signatures restricted (Microsoft only)标志
使用process hacker注入dll注入不进去。
自己代码实现
1// blockdlls.cpp : 定义控制台应用程序的入口点。
2//
3#include "stdafx.h"
4#include <iostream>
5#include <Windows.h>
6
7int main()
8{
9 PROCESS_INFORMATION pi = {};
10 STARTUPINFOEXA si = {};
11 SIZE_T attributeSize = 0;
12
13 InitializeProcThreadAttributeList(NULL, 1, 0, &attributeSize);
14 PPROC_THREAD_ATTRIBUTE_LIST attributes = (PPROC_THREAD_ATTRIBUTE_LIST)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, attributeSize);
15 InitializeProcThreadAttributeList(attributes, 1, 0, &attributeSize);
16
17 DWORD64 policy = PROCESS_CREATION_MITIGATION_POLICY_BLOCK_NON_MICROSOFT_BINARIES_ALWAYS_ON;
18 UpdateProcThreadAttribute(attributes, 0, PROC_THREAD_ATTRIBUTE_MITIGATION_POLICY, &policy, sizeof(DWORD64), NULL, NULL);
19 si.lpAttributeList = attributes;
20
21 CreateProcessA(NULL, (LPSTR)"notepad", NULL, NULL, TRUE, EXTENDED_STARTUPINFO_PRESENT, NULL, NULL, &si.StartupInfo, &pi);
22 HeapFree(GetProcessHeap(), HEAP_ZERO_MEMORY, attributes);
23
24 return 0;
25}
CreateProcessA的记事本注入不了第三方dll
这个api可以给当前线程添加 Signatures restricted (Microsoft only) 标识。
代码实现
1// blockdlls.cpp : 定义控制台应用程序的入口点。
2//
3#include "stdafx.h"
4#include <iostream>
5#include <Windows.h>
6
7int main()
8{
9 PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY sp = {};
10 sp.MicrosoftSignedOnly = 1;
11 SetProcessMitigationPolicy(ProcessSignaturePolicy, &sp, sizeof(sp));
12 system("PAUSE");
13 return 0;
14}
注入非微软签名的dll报错
注入微软的user32.dll
可以成功注入。
使用powershell可以看到当前MicrosoftSignedOnly标志的进程。
1get-process | select -exp processname -Unique | % { Get-ProcessMitigation -ErrorAction SilentlyContinue -RunningProcesses $_ | select processname, Id, @{l="Block non-MS Binaries"; e={$_.BinarySignature|select -exp MicrosoftSignedOnly} } }
文笔垃圾,措辞轻浮,内容浅显,操作生疏。不足之处欢迎大师傅们指点和纠正,感激不尽。