用C/C++重写的EternalBlue工具套件,包括:MS17-010漏洞利用、EternalBlue漏洞检测器、DoublePulsar检测器以及DoublePulsar Shellcode和DLL上传器。
用 C/C++ 重写的 EternalBlue 套件,包括:



然后将 Recvbuff[18] 到 Recvbuff[22] 的值通过 DoublePulsar XOR 密钥计算函数处理,生成一个无符号整数 XOR 密钥,用于加密将上传到 DoublePulsar 的 shellcode 或 DLL 载荷。已在 Windows 7 x64 上测试。
示例截图:

来自 FUZZBUNCH 中原始 NSA 二进制文件的相同密钥

DoublePulsar_structure_ping.cpp — 此程序发送 4 个 SMB 数据包:1 个协商、1 个会话建立、1 个树连接和 Trans2 SESSION_SETUP 数据包。与 doublepulsar_check.cpp 的不同之处在于,它使用结构体而非从 WannaCry 样本中提取的硬编码 SMB 十六进制字符串来生成 Trans2 DoublePulsar PING 数据包。另一区别是动态生成 TreeConnect 数据包,而非使用 WannaCry 样本中的硬编码版本。此程序生成的 ping 数据包将告知远程机器上是否安装了 DoublePulsar。
DoublePulsar_structure_exec.cpp — 此程序发送 5 个 SMB 数据包:1 个 SMB 协商、1 个会话建立、1 个树连接、1 个 DoublePulsar Trans2 SESSION_SETUP Ping 数据包和 1 个 DoublePulsar Trans2 SESSION_SETUP 执行数据包。与 Doublepulsar_UploadShellcode.cpp 的不同之处在于,它使用结构体而非从 WannaCry 样本中提取的硬编码 SMB 十六进制字符串来生成 Trans2 DoublePulsar 执行数据包。
Doublepulsar_UploadDLL.cpp — 此程序专为 DLL 设计。它发送 4 个 SMB 数据包以及包含 DLL 数据的 SMB Trans2 数据包:1 个协商、1 个会话建立、1 个树连接、1 个 Ping Trans2 SESSION_SETUP 请求和 1 个执行 Trans2 SESSION_SETUP 数据包。发送 Ping Trans2 SESSION_SETUP 请求数据包以获取 Trans2 SESSION_SETUP 响应中的 SMB 签名。该签名通过 DoublePulsar XOR 密钥计算器处理。然后程序读取一个 DLL 文件,将其与 64 位内核和用户态 shellcode 合并以运行 DLL,并使用从 SMB 签名计算出的 DoublePulsar XOR 密钥对缓冲区进行 XOR 加密。通过分配内存、复制 Trans2 数据包、编辑 SMB 事务所需的值(UserID、TreeID、TotalDataCount、DataCount、ByteCount),然后将 XOR 后的数据(内核 shellcode + DLL)复制到末尾,并以每次 4096 字节的总包长度循环发送给 DoublePulsar。总包长度为 4178 字节。4096 字节用于 XOR 加密数据。未来版本将使用 SMB 和 TRANSACTION2 结构体。
Doublepulsar_UploadShellcode.cpp — 此程序发送 5 个 SMB 数据包:1 个协商、1 个会话建立、1 个树连接、1 个 Ping Trans2 SESSION_SETUP 数据包和 1 个执行 Trans2 SESSION_SETUP 数据包。发送 Trans2 SESSION_SETUP 请求数据包以获取 TRANS2 SESSION_SETUP 响应中的 SMB 签名。该签名通过 DoublePulsar XOR 密钥计算器处理。然后程序从缓冲区复制内核 shellcode 和示例 shellcode,使用从 SMB 签名计算出的 DoublePulsar XOR 密钥对缓冲区进行 XOR 加密。通过分配内存、复制 Trans2 执行数据包、编辑 SMB 事务所需的值(UserID、TreeID、TotalDataCount、DataCount、ByteCount),然后将 SESSION_SETUP 参数和 4096 字节的 XOR 加密 shellcode 数据复制到末尾,以总包长度 4178 字节发送给 DoublePulsar。总包长度为 4178 字节。NetBIOS 长度为 4174(因为 NetBIOS 头部不计算自身大小)。该数据包中的 12 字节用于 DoublePulsar SESSION_SETUP 参数,4096 字节用于 XOR 加密数据。未来版本将使用 SMB 和 TRANSACTION2 结构体。

由以下来源生成的 Shellcode — zerosum0x0 为 ETERNALBLUE 编写了自定义 shellcode,可稍作修改后用于 DOUBLEPULSAR。由于复制 shellcode 中的系统调用覆盖对该用例不必要,我们将其取消定义:
;%define SYSCALL_OVERWRITE ; 在系统调用中以内核 IRQL 运行
重新编译:nasm -w-other -o >(xxd -p -c 16 | sed 's/../\x&/g') external/source/shellcode/windows/multi_arch_kernel_queue_apc.asm
https://github.com/rapid7/metasploit-framework/blob/master/external/source/shellcode/windows/multi_arch_kernel_queue_apc.asm
https://raw.githubusercontent.com/ninp0/eternalblue/master/eternalblue_kshellcode_x64.asm
https://raw.githubusercontent.com/ninp0/eternalblue/master/eternalblue_kshellcode_x86.asm
https://www.rapid7.com/blog/post/2019/10/02/open-source-command-and-control-of-the-doublepulsar-implant/
DoublePulsar_UploadExe.cpp — 此程序专为可执行文件设计。将可执行文件读入内存,放入 WannaCry 启动器 DLL 中,通过 DoublePulsar 发送:1 个协商、1 个会话建立、1 个树连接、1 个 Trans2 Ping 数据包和多个 Trans2 exec SESSION_SETUP 数据包。发送 Trans2 Ping 请求数据包以获取 Trans2 响应中的 SMB 签名。该签名通过 DoublePulsar XOR 密钥计算器处理。然后程序读取一个 EXE 文件,将其与 64 位内核和用户态 shellcode 及一个骨架 DLL 文件合并,使用从 SMB 签名计算出的 DoublePulsar XOR 密钥对缓冲区进行 XOR 加密。通过分配内存、复制 Trans2 执行数据包、编辑 SMB 事务所需的值(UserID、TreeID、TotalDataCount、DataCount、ByteCount),然后将 XOR 后的数据(内核 shellcode + DLL + 可执行文件)复制到末尾,并以每次 4096 字节的总包长度循环发送给 DoublePulsar。总包长度为 4178 字节。NetBIOS 长度为 4174(因为 NetBIOS 头部不计算自身大小)。该数据包中的 12 字节用于 DoublePulsar SESSION_SETUP 参数,4096 字节用于 XOR 加密数据。
EternalBlue.cpp — 此程序发送多个 SMB 数据包:协商、会话建立、树连接以及多个 NT trans 和 Trans2 数据包。这些 NT trans 数据包是畸形构造的,用于在目标计算机内存中准备漏洞利用。通过多个套接字向目标同一端口发送更多空白或空的 SMB 数据包。EternalBlue 的大部分 base64 载荷通过套接字 1(发送协商、会话建立和树连接数据包的套接字)发送。然后创建 20 个其他套接字(套接字 3 到 21),并向这些套接字发送数据。之后在套接字 3 到 21 上发送 DoublePulsar。程序随后关闭这些套接字,触发 EternalBlue 和 DoublePulsar 在目标计算机上执行。然后发送 SMB 断开和 SMB 注销请求,连接关闭。该漏洞利用可行,已在 Windows 7 x64 上测试。后门完全运行大约需要 5 秒,这与互联网上 EternalBlue 相关文章报告的一致。可能需要多次利用尝试。然而当前存在一个错误:数据包中的 TreeID 和 UserID 未正确设置,将在后续版本中修复。对于刚启动的机器,由于 TreeID 和 UserID 为默认值,该工具可以正常工作。这些数据包需要更新 TreeID 和 UserID 值,当前设置为默认值“08 00”。

利用 Metasploit 的开源 DoublePulsar RCE 模块,创建了一个可用的自定义 Metasploit 模块。
我修改了逻辑,允许生成一个 DLL,将其与从 WannaCry 获取的 x64 内核 shellcode(前置)合并,使 DoublePulsar 能够运行该 DLL。

仓库中还包含以下用于学习目的的内容,但本人不提供支持:
DoublePulsar x86/x64 上传 DLL 的 Python 脚本
EternalBlue 一体化二进制文件
多架构内核队列 APC 汇编代码及 Windows x86/x64 多架构内核 Ring 0 到 Ring 3(通过队列 APC)的内核代码
来自 worawit 的 EternalBlue x64/x86 内核载荷 shellcode
Eternalblue 重放文件