作者:Matt Hillman([email protected] - @sp1nl0ck)
公司:Countercept(@countercept)
一个利用 DOUBLEPULSAR 载荷中的用户态 shellcode,将任意 DLL 反射式加载到另一个进程中的实用工具,用于测试检测技术或进行其他安全研究。
Shadow Brokers 泄露的 DOUBLEPULSAR 载荷最初在内核态运行,并通过异步过程调用(APC)将 DLL 反射式加载到用户态进程中。DLL 的实际加载发生在用户态,本工具利用该用户态 shellcode 在指定进程中加载 DLL 并执行给定的序号。这有助于针对该载荷测试攻击检测和数字取证应急响应技术。
该加载器之所以值得关注,是因为它可以处理任意 DLL,而无需使用标准的 LoadLibrary 调用。避免使用 LoadLibrary 可以使加载过程更加隐蔽,因为它无需将 DLL 写入磁盘,可以避开任何监控 LoadLibrary 调用的机制,还可以避免在进程环境块(PEB)中留下条目——而 PEB 通常是获取已加载模块列表的方式。此类技术如今已相当普遍,但到目前为止,我们尚未发现任何公开代码能够以这种方式加载任意 DLL——现有代码要求 DLL 必须专门定制以支持被加载。DOUBLEPULSAR 的不同之处在于,它实现了一个更完整的加载器,可以加载几乎任何 DLL。该加载器在几乎所有 Windows 版本上均可直接使用。
虽然 DOUBLEPULSAR 本身使用从内核态排入用户态进程队列的 APC 调用,但本工具是从用户态排入 APC;这在实践上几乎没有区别。此外,本工具还可以改用 CreateRemoteThread 来触发 shellcode。
C:\>DOUBLEPULSAR-usermode-injector.exe
用法:<pid> <shellcode_file> <dll_to_inject> <ordinal_to_execute> [use_CreateRemoteProcess]
最后一个参数为可选参数,如果指定为 'true',则将使用 CreateRemoteProcess,而不是使用 APC 调用,
APC 调用是 Doublepulsar 的默认工作方式。这是为了让人们能够以不同方式进行测试。
默认使用 APC。这会将载荷注入目标进程中的所有线程,从而增加其中一个线程快速触发的可能性。
这仅适用于测试,因为多次调用载荷可能并非所愿。
例如,使用异步过程调用(APC)将 somelibrary.dll 注入进程 1234,并调用序号 1:
C:\>dopu-usermode-injector.exe 1234 dopu-64bit-usermode-shellcode.bin somelibrary.dll 1
正在使用线程:2456
正在使用线程:2032
正在使用线程:3876
或者与上述相同,但使用 CreateRemoteThread 代替 APC:
C:\>dopu-usermode-injector.exe 1234 dopu-64bit-usermode-shellcode.bin somelibrary.dll 1 true
对 DOUBLEPULSAR 用户态 shellcode 的完整分析:
关于 DOUBLEPULSAR 内核组件的先前研究:
https://www.countercept.com/our-thinking/analyzing-the-doublepulsar-kernel-dll-injection-technique/
https://zerosum0x0.blogspot.co.uk/2017/04/doublepulsar-initial-smb-backdoor-ring.html