跳转到帖子

游客您好,欢迎来到黑客世界论坛!您可以在这里进行注册。

赤队小组-代号1949(原CHT攻防小组)在这个瞬息万变的网络时代,我们保持初心,创造最好的社区来共同交流网络技术。您可以在论坛获取黑客攻防技巧与知识,您也可以加入我们的Telegram交流群 共同实时探讨交流。论坛禁止各种广告,请注册用户查看我们的使用与隐私策略,谢谢您的配合。小组成员可以获取论坛隐藏内容!

TheHackerWorld官方

钴罢工的块动态链接库利用分析

精选回复

发布于

0x00 前言

钴罢工3.14添加了块动态链接库功能,限定子进程只能加载带有微软签名的dll。

这个功能可以阻止第三方安全软件向子进程注入dll,也就无法对子进程进行钩子,最终起到保护子进程的效果。

XPN在他的博客中也介绍了相关内容,地址如下:

https://blog.xpnsec.com/protecting-your-malware/

本文将要扩展块动态链接库的利用方法,分别介绍查看进程是否开启块动态链接库和修改当前进程开启块动态链接库的方法,比较Win8和Win10系统在使用上的区别,开源c代码,分享脚本编写的细节。

0x01 简介

本文将要介绍以下内容:

钴罢工中的块动态链接库

查看进程是否开启块动态链接库的方法

修改当前进程,开启块动态链接库的方法

Win8和Win10系统在使用上的区别

利用分析

0x02 Cobalt Strike中的blockdlls

钴罢工中的块动态链接库将会创建一个子进程并开启块动态链接库功能

XPN在博客中分享了实现同样功能的c代码,地址如下:

https://blog.xpnsec.com/protecting-your-malware/

代码如下:

#包括

int main()

{

STARTUPINFOEXA si

过程_信息pi;

SIZE _ T SIZE=0;

布尔ret

//对于STARTUPINFOEXA是必需的

ZeroMemory(si,sizeof(si));

是的启动信息。CB=sizeof(启动信息xa);

是的启动信息。dw flags=EXTENDED _ startup info _ PRESENT;

//获取要分配的进程线程属性列表的大小

InitializeProcThreadAttributeList(NULL,1,0,size);

//为进程线程属性列表分配内存

是的。lpattributelist=(LP proc _ THREAD _ ATTRIBUTE _ LIST)堆分配(

GetProcessHeap(),

0,

大小

);

//初始化我们的列表

InitializeProcThreadAttributeList(si。lpattributelist,1,0,size);

//允许阻止非微软签名的动态链接库

dword 64 POLICY=PROCESS _ CREATION _ remediation _ POLICY _ BLOCK _ NON _ MICROSOFT _ BINARIES _ ALWAYS _ ON;

//分配我们的属性

UpdateProcThreadAttribute(si。lpattributelist,0,PROC _ THREAD _ ATTRIBUTE _ remediation _ POLICY,POLICY,sizeof(policy),NULL,NULL);

//最后,创建流程

ret=CreateProcessA(

空,

(LPSTR)" C:\ \ Windows \ \ System32 \ \ cmd。exe”,

空,

空,

没错,

EXTENDED_STARTUPINFO_PRESENT,

空,

空,

重新解释_转换(si),

圆周率

);

}

通过STARTUPINFOEX结构体指定了要创建子进程的安全策略(开启进程_创建_缓解_策略_阻止_非_微软_二进制_总是_开),这个安全策略起到了阻止加载非微软签名动态链接库的作用

生成子进程后,使用过程黑客能够看到开启块动态链接库功能的提示,如下图

2-1.png

2-2.png

开启块动态链接库功能后,尝试对这个进程进行动态链接库注入,注入的代码可参考:

https://github。com/3g student/home-of-C-Language/blob/master/NtCreateThreadEx+ldrloaddll。卡片打印处理机(Card Print Processor的缩写)

注入时报错,提示如下图

3-1.png

成功复现钴罢工中块动态链接库的功能

接来下,需要找到这个功能相关的细节

经过一些搜索,找到了相关API GetProcessMitigationPolicy(),能够用来读取进程的安全策略

资料如下:

https://份文件。微软。com/en-us/windows/win32/API/processthreadsapi/nf-processthreadsapi-getprocessmitigationpolicy

签名策略对应的结构体为进程_缓解_二进制_签名_策略,资料如下

https://份文件。微软。com/zh-cn/windows/win32/API/win nt/ns-win nt-process _ remediation _二进制_签名_策略

资料显示该应用程序接口支持的最低系统为Win8,这里猜测API GetProcessMitigationPolicy()同块动态链接库支持的操作系统版本应该相同

经过测试,发现钴罢工中块动态链接库支持的系统最低为Win8

0x03 查看进程是否开启blockdlls的方法

开启块动态链接库等同于进程开启了安全策略ProcessSignaturePolicy(启用MicrosoftSignedOnly功能)

可以使用API GetProcessMitigationPolicy()获取进程的安全策略,判断是否开启块动态链接库功能

使用API GetProcessMitigationPolicy()查询一个进程的多个安全策略。参见参考资料:

https://docs . Microsoft . com/en-us/windows/win32/API/processthreadsapi/nf-processthreadsapi-getprocessmitigationpolicy

尝试按照API的调用格式写代码,代码已经上传到github,地址如下:

https://github . com/3g student/home-of-C-Language/blob/master/getprocessmitigationpolicyforwin 10 . CPP

该代码可以查询指定进程的所有安全策略。

Win10系统测试没有问题,如下图。

2-3.png

在Win8系统上测试(同Server2012)无法获取安全策略ProcessSignaturePolicy的信息,而ProcessHacker在Win8系统上没有这个问题。

通过查看ProcessHacker的源代码找到解决方案:

需要通过NtQueryInformationProcess()实现

Win8系统下可用的完整代码已上传至github,地址如下:

https://github . com/3g student/home-of-C-Language/blob/master/getprocessmitigationpolicyforwin 8 . CPP

该代码可以查询Win8系统下指定进程的所有安全策略。需要注意的是,Win8系统不支持以下安全策略:

控制流保护策略

FontDisablePolicy

ImageLoadPolicy

SystemCallFilterPolicy

PayloadRestrictionPolicy

ChildProcessPolicy

侧信道隔离策略

Win8系统测试没有问题,如下图所示

2-4.png

0x04 修改当前进程,开启blockdlls的方法

修改当前进程打开blockdlls相当于修改当前进程的安全策略ProcessSignaturePolicy(启用MicrosoftSignedOnly功能)。

可以使用API GetProcessMitigationPolicy()获取进程的安全策略,然后通过API SetProcessMitigationPolicy()修改安全策略ProcessSignaturePolicy来启用MicrosoftSignedOnly函数。

尝试按照API的调用格式写代码,代码已经上传到github,地址如下:

https://github . com/3g student/home-of-C-Language/blob/master/SetProcessMitigationPolicy(Signature)for win 10 _ current process . CPP

该代码可以修改当前进程的安全策略,并启用MicrosoftSignedOnly函数。

Win10系统测试没有问题

在Win8系统上测试(同Server2012),有问题,无法修改。

解决方法如上:

由NtSetInformationProcess()实现

Win8系统下可用的完整代码已上传至github,地址如下:

https://github . com/3g student/home-of-C-Language/blob/master/SetProcessMitigationPolicy(Signature)for win 8 _ current process . CPP

该代码可以修改Win8系统下当前进程的安全策略,打开blockdlls。

0x05 利用分析

打开blockdlls相当于打开进程中的安全策略ProcessSignaturePolicy,不仅可以应用于子进程,也可以应用于当前进程。

支持系统:Win8-Win10

当blockdlls开启时,可以阻止第三方安全软件向这个进程注入dll,使其无法挂接进程,最终保护了进程。

在Win8系统上,需要使用NtQueryInformationProcess()和NtSetInformationProcess()来查看和修改安全策略。

您不能使用NtSetInformationProcess()来修改远程进程的安全策略,并报告错误消息c 00000d(status _ illegal _ instruction)。

无法通过《Authenticode签名伪造——PE文件的签名伪造与签名验证劫持》。

和《Catalog签名伪造——Long UNC文件名欺骗》绕过blockdlls的保护。

0x06 小结

扩展了block dll的利用方法,分别介绍了检查进程是否打开block dll和修改当前进程打开block dll的方法,比较了Win8和Win10系统在使用中的差异,开放了源代码C,分享了脚本编写的细节,总结了利用思路。

留下回复

创建帐户或登录后发表意见

最近浏览 0

  • 没有会员查看此页面。