
Набор EternalBlue, переписанный на C/C++, который включает: эксплойт MS17-010, детектор уязвимости EternalBlue, детектор DoublePulsar и загрузчик Shellcode и DLL для DoublePulsar
Набор инструментов EternalBlue, переписанный на C/C++, включающий:



Затем эти значения (Recvbuff[18] -> Recvbuff[22]) передаются через функцию калькулятора XOR-ключа DoublePulsar, которая генерирует беззнаковый целочисленный XOR-ключ, используемый для шифрования шеллкода или DLL-нагрузки, которая будет загружена в DoublePulsar. Протестировано на Windows 7 x64.
Пример скриншота:

Тот же ключ из оригинального бинарника АНБ в FUZZBUNCH

DoublePulsar_structure_ping.cpp — Эта программа отправляет 4 SMB-пакета: 1 согласование, 1 установка сессии, 1 подключение к дереву и пакет Trans2 SESSION_SETUP. Отличие от doublepulsar_check.cpp в том, что здесь пакет Ping DoublePulsar Trans2 генерируется с использованием структуры, а не жёстко заданной SMB-шестнадцатеричной строки, взятой из образца WannaCry. Ещё одно отличие: эта программа динамически генерирует пакет TreeConnect, а не использует жёстко заданный из образца WannaCry. Сгенерированный пакет ping сообщит, установлен ли DoublePulsar на удалённой машине.
DoublePulsar_structure_exec.cpp — Эта программа отправляет 5 SMB-пакетов: 1 согласование SMB, 1 установка сессии, 1 подключение к дереву, 1 пакет Ping DoublePulsar Trans2 SESSION_SETUP и 1 пакет выполнения DoublePulsar Trans2 SESSION_SETUP. Отличие от Doublepulsar_UploadShellcode.cpp в том, что здесь пакет выполнения DoublePulsar Trans2 генерируется с использованием структуры, а не жёстко заданной SMB-шестнадцатеричной строки из образца WannaCry.
Doublepulsar_UploadDLL.cpp — Эта программа предназначена для DLL. Она отправляет 4 SMB-пакета вместе с данными DLL в пакетах SMB Trans2: 1 согласование, 1 установка сессии, 1 подключение к дереву, 1 запрос Ping Trans2 SESSION_SETUP и пакет выполнения Trans2 SESSION_SETUP. Пакет запроса Ping Trans2 SESSION_SETUP отправляется для получения SMB-подписи в ответном пакете Trans2 SESSION_SETUP. Эта подпись обрабатывается через калькулятор XOR-ключа DoublePulsar. Затем программа читает DLL-файл и объединяет его с 64-битным шеллкодом ядра и пользовательского пространства для запуска DLL, а затем выполняет XOR буфера с вычисленным XOR-ключом DoublePulsar. Пакет генерируется путём выделения памяти, копирования пакета Trans2, редактирования значений, необходимых для работы SMB-транзакции (UserID, TreeID, TotalDataCount, DataCount, ByteCount), затем копирования XOR-данных (шеллкод ядра + 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 отправляется для получения SMB-подписи в ответном пакете TRANS2 SESSION_SETUP. Эта подпись обрабатывается через калькулятор XOR-ключа DoublePulsar. Затем программа копирует шеллкод ядра и пример шеллкода из буфера, выполняет XOR буфера с вычисленным XOR-ключом DoublePulsar. Пакет генерируется путём выделения памяти, копирования пакета выполнения Trans2, редактирования значений, необходимых для работы SMB-транзакции (UserID, TreeID, TotalDataCount, DataCount, ByteCount), затем копирования параметров SESSION_SETUP и 4096 байт XOR-шеллкода в конец и отправки в DoublePulsar общей длиной 4178 байт. Длина NetBIOS будет 4174, поскольку заголовок NetBIOS не учитывает себя. 12 байт этого пакета — параметры SESSION_SETUP DoublePulsar; 4096 байт — XOR-зашифрованные данные. В будущем релизе будут использоваться структуры SMB и TRANSACTION2.

Шеллкод, сгенерированный из — zerosum0x0 написал пользовательский шеллкод для ETERNALBLUE, который можно адаптировать для DOUBLEPULSAR с небольшим изменением. Поскольку перезапись системного вызова в скопированном шеллкоде не была нужна для этого случая использования, мы отключили её:
;%define SYSCALL_OVERWRITE ; to run at process IRQL in syscall
перекомпилируйте с: 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 —
Эта программа предназначена для исполняемых файлов. Исполняемый файл считывается в память и помещается в DLL-загрузчик WannaCry, а затем отправляется через DoublePulsar: 1 согласование, 1 установка сессии, 1 подключение к дереву, 1 пакет Trans2 Ping и несколько пакетов Trans2 exec SESSION_SETUP. Пакет запроса Trans2 Ping отправляется для получения SMB-подписи в ответном пакете Trans2. Эта подпись обрабатывается через калькулятор XOR-ключа DoublePulsar. Затем программа читает EXE-файл и объединяет его с 64-битным шеллкодом ядра и пользовательского пространства, а также с DLL-каркасом, затем выполняет XOR буфера с вычисленным XOR-ключом DoublePulsar. Пакет генерируется путём выделения памяти, копирования пакета выполнения Trans2, редактирования значений, необходимых для работы SMB-транзакции (UserID, TreeID, TotalDataCount, DataCount, ByteCount), затем копирования XOR-данных (шеллкод ядра + DLL + исполняемый файл) в конец и циклической отправки частями по 4096 байт за раз в DoublePulsar. Общая длина пакета = 4178; длина NetBIOS будет 4174, поскольку заголовок NetBIOS не учитывает себя. 12 байт этого пакета — параметры SESSION_SETUP DoublePulsar; 4096 байт — XOR-зашифрованные данные.
Создан пользовательский модуль Metasploit, который я сделал работоспособным, используя открытый модуль DoublePulsar RCE из Metasploit.
Я изменил логику, чтобы можно было сгенерировать DLL, объединить её с x64 шеллкодом ядра (добавленным в начало), взятым из WannaCry, чтобы DoublePulsar мог запустить DLL.

Репозиторий также содержит следующее в образовательных целях, и оно НЕ поддерживается мной:
Скрипт на Python для загрузки DLL DoublePulsar x86/x64
Бинарный файл EternalBlue «всё в одном»
Ассемблерный код multi arch kernel queue apc и код ядра Windows x86/x64 Multi-Arch Kernel Ring 0 to Ring 3 via Queued APC
Шеллкод полезной нагрузки ядра EternalBlue x64/x86 от worawit
Файл воспроизведения Eternalblue
EternalBlue.cpp — Эта программа отправляет несколько SMB-пакетов: согласование, SessionSetup, TreeConnect и несколько пакетов NT trans и Trans2. Эти пакеты NT trans являются некорректными, что подготавливает эксплойт в памяти целевого компьютера. Дополнительные пустые SMB-пакеты отправляются на цель через несколько сокетов на тот же порт. Большая часть полезной нагрузки EternalBlue в base64 отправляется через сокет 1, где были отправлены пакеты Negotiation, SessionSetup и TreeConnect. Затем создаются ещё 20 сокетов, и данные отправляются на эти сокеты (сокет 3 — сокет 21). После этого DoublePulsar отправляется на сокеты 3–21. Затем программа закрывает сокеты, что приводит к детонации EternalBlue и DoublePulsar на целевом компьютере. Затем отправляется запрос на отключение SMB и выход из системы, и соединение закрывается. Этот эксплойт работает и был протестирован на Windows 7 x64. Для полной активации бэкдора требовалось около 5 секунд, как уже сообщалось в статьях об EternalBlue. Может потребоваться несколько попыток эксплуатации. Однако в настоящее время есть ошибка с неправильной установкой TreeID и UserID в пакетах, которая будет исправлена в более позднем релизе. Эксплойт будет работать против недавно включённых машин, так как TreeID и UserID установлены в значения по умолчанию. Эти пакеты должны иметь обновлённые значения TreeID и UserID, но пока они установлены в значения по умолчанию "08 00".
