
Suite EternalBlue rehecha en C/C++ que incluye: Exploit MS17-010, detector de vulnerabilidad EternalBlue, detector de DoublePulsar y cargador de Shellcode y DLL de DoublePulsar
Suite EternalBlue rehecha en C/C++ que incluye:



Estos valores de Recvbuff[18] -> Recvbuff[22] se procesan luego mediante la función calculadora de clave XOR de DoublePulsar, que genera una clave XOR entera sin signo que se puede usar para cifrar el shellcode o el payload DLL que se cargará en DoublePulsar. Probado en Windows 7 x64.
Captura de pantalla de ejemplo:

Misma clave del binario NSA original en FUZZBUNCH

DoublePulsar_structure_ping.cpp - Este programa envía 4 paquetes SMB: 1 de negociación, 1 de configuración de sesión, 1 de conexión de árbol y 1 paquete Trans2 SESSION_SETUP. La diferencia con doublepulsar_check.cpp es que este genera el paquete PING de DoublePulsar Trans2 usando una estructura en lugar de una cadena hexadecimal SMB fija que obtuve de una muestra de Wannacry. Otra diferencia es que este programa genera dinámicamente el paquete TreeConnect en lugar de usar el fijo presente en la muestra de Wannacry. El paquete ping generado en este programa te dirá si DoublePulsar está instalado en la máquina remota.
DoublePulsar_structure_exec.cpp - Este programa envía 5 paquetes SMB: 1 de negociación SMB, 1 de configuración de sesión, 1 de conexión de árbol, 1 paquete PING Trans2 SESSION_SETUP de Doublepulsar y 1 paquete de Ejecución Trans2 SESSION_SETUP de Doublepulsar. La diferencia con Doublepulsar_UploadShellcode.cpp es que este genera el paquete de Ejecución Trans2 DoublePulsar usando una estructura en lugar de una cadena hexadecimal SMB fija que obtuve de una muestra de Wannacry.
Doublepulsar_UploadDLL.cpp - Este programa está diseñado para DLLs. Envía 4 paquetes SMB junto con los datos de la DLL en paquetes Trans2 SMB: 1 de negociación, 1 de configuración de sesión, 1 de conexión de árbol, 1 solicitud PING Trans2 SESSION_SETUP y un paquete de Ejecución Trans2 SESSION_SETUP. El paquete de solicitud PING Trans2 SESSION_SETUP se envía para obtener la firma SMB en el paquete de respuesta Trans2 SESSION_SETUP. Esta firma se procesa mediante la calculadora de clave XOR de DoublePulsar. Luego, el programa lee un archivo DLL y lo combina con shellcode de kernel de 64 bits y espacio de usuario para ejecutar la DLL y aplica XOR al búfer con la clave XOR de DoublePulsar que calculamos a partir de la firma SMB. Se genera un paquete asignando memoria, copiando el paquete Trans2, editando los valores necesarios para que la transacción SMB funcione (UserID, TreeID, TotalDataCount, DataCount, ByteCount), luego copiando los datos con XOR (shellcode de kernel + DLL) al final y recorriéndolo enviándolo en fragmentos de 4096 bytes a DoublePulsar. Longitud total del paquete = 4178. 4096 son para los datos cifrados con XOR. También se implementará el uso de estructuras SMB y TRANSACTION2 en futuras versiones.
Doublepulsar_UploadShellcode.cpp - Este programa envía 5 paquetes SMB: 1 de negociación, 1 de configuración de sesión, 1 de conexión de árbol, 1 paquete PING Trans2 SESSION_SETUP y 1 paquete de ejecución Trans2 SESSION_SETUP. El paquete de solicitud Trans2 SESSION_SETUP se envía para obtener la firma SMB en el paquete de respuesta TRANS2 SESSION_SETUP. Esta firma se procesa mediante la calculadora de clave XOR de DoublePulsar. Luego, el programa copia shellcode de kernel y shellcode de muestra desde un búfer, aplica XOR al búfer con la clave XOR de DoublePulsar que calculamos a partir de la firma SMB. Se genera un paquete asignando memoria, copiando el paquete de ejecución Trans2, editando los valores necesarios para que la transacción SMB funcione (UserID, TreeID, TotalDataCount, DataCount, ByteCount), luego copiando los parámetros SESSION_SETUP y 4096 bytes de datos de shellcode con XOR al final y lo envía con una longitud total de paquete de 4178 bytes a DoublePulsar. Longitud total del paquete = 4178. La longitud NetBIOS será 4174 ya que el encabezado NetBIOS no se cuenta a sí mismo para el tamaño. 12 bytes de este paquete son para los parámetros SESSION_SETUP de Doublepulsar. 4096 son para los datos cifrados con XOR. En una versión futura, se usarán estructuras SMB y TRANSACTION2.

Shellcode generado de - zerosum0x0 escribió shellcode personalizado para ETERNALBLUE que podría reutilizarse para DOUBLEPULSAR, aunque con una pequeña modificación. Dado que la sobrescritura de syscall en el shellcode copiado no era necesaria para este caso de uso, la indefinimos:
;%define SYSCALL_OVERWRITE ; to run at process IRQL in syscall
recompilar con: 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 -
Este programa está diseñado para ejecutables. El ejecutable se leerá en memoria y se colocará en una DLL lanzadora de Wannacry y se enviará a través de DoublePulsar: 1 de negociación, 1 de configuración de sesión, 1 de conexión de árbol, 1 paquete Trans2 Ping y múltiples paquetes exec Trans2 SESSION_SETUP. El paquete de solicitud Trans2 Ping se envía para obtener la firma SMB en el paquete de respuesta Trans2. Esta firma se procesa mediante la calculadora de clave XOR de DoublePulsar. Luego, el programa lee un archivo EXE y lo combina con shellcode de kernel de 64 bits y espacio de usuario y un archivo DLL esqueleto y aplica XOR al búfer con la clave XOR de DoublePulsar que calculamos a partir de la firma SMB. Se genera un paquete asignando memoria, copiando el paquete de ejecución Trans2, editando los valores necesarios para que la transacción SMB funcione (UserID, TreeID, TotalDataCount, DataCount, ByteCount), luego copiando los datos con XOR (shellcode de kernel + DLL + Ejecutable) al final y recorriéndolo enviándolo en fragmentos de 4096 bytes a DoublePulsar. Longitud total del paquete = 4178. La longitud NetBIOS será 4174 ya que el encabezado NetBIOS no se cuenta a sí mismo para el tamaño. 12 bytes de este paquete son para los parámetros SESSION_SETUP de Doublepulsar. 4096 son para los datos cifrados con XOR.
Creé un módulo personalizado de Metasploit que hice funcional usando el módulo RCE de DoublePulsar de código abierto de Metasploit.
Cambié la lógica para permitir generar una DLL, fusionarla con el shellcode de kernel x64 (antepuesto) que tomé de Wannacry, para permitir que DoublePulsar ejecute la DLL.

El repositorio también contiene lo siguiente con fines educativos y NO tienen soporte por mi parte:
Script de Python de carga de DLL DoublePulsar x86/x64
Binario EternalBlue todo en uno
Código ensamblador multiarquitectura de cola APC de kernel y código de kernel Windows x86/x64 Multi-Arch Kernel Ring 0 a Ring 3 mediante Queued APC
Shellcode de payload de kernel EternalBlue x64/x86 de worawit
Archivo de reproducción Eternalblue
EternalBlue.cpp - Este programa envía múltiples paquetes SMB: Negotiation, SessionSetup, TreeConnect y múltiples paquetes NT trans y Trans2. Estos paquetes NT trans están malformados, lo que prepara el exploit en la memoria de la computadora víctima. Se envían más paquetes SMB de espacio en blanco o vacíos a la víctima a través de múltiples sockets al mismo puerto en la víctima. La mayor parte del payload base64 de EternalBlue se envía a través del socket 1, donde se enviaron los paquetes Negotiation, SessionSetup y TreeConnect. Luego, se crean otros 20 sockets y se envían datos a esos sockets (Socket 3 a Socket 21). Posteriormente, se envía DoublePulsar en los sockets 3 a 21. Luego, el programa cierra los sockets, lo que detona EternalBlue y DoublePulsar en la computadora víctima. Luego se envía una solicitud de desconexión SMB y cierre de sesión SMB y la conexión se cierra. Este exploit funciona y se probó en Windows 7 x64. Tomó alrededor de 5 segundos para que la puerta trasera estuviera completamente operativa, como ya se informó en los análisis de EternalBlue en Internet. Pueden ser necesarios más intentos de explotación. Sin embargo, actualmente hay un error con TreeID y UserID que no se configuran correctamente en los paquetes, lo que se corregirá en una versión posterior. Esto funcionará contra máquinas recién encendidas, ya que TreeID y UserID están configurados con los valores predeterminados. Estos paquetes deberán tener sus valores TreeID y UserID actualizados, ya que actualmente están configurados con los valores predeterminados "08 00".
