
EternalBlueC
Suite EternalBlue rehecha en C/C++ que incluye:
- Exploit MS17-010 (contiene DoublePulsar)
- Detector de vulnerabilidad EternalBlue/MS17-010
- Detector de DoublePulsar
- Carga de DLL con DoublePulsar
- Carga de shellcode con DoublePulsar
- Carga de DLL con DoublePulsar usando estructura SMB
- Carga de shellcode con DoublePulsar usando estructura SMB
- Carga de EXE dentro de una DLL con DoublePulsar
Logros del proyecto
- Carga de shellcode: completado y funcionando, inyecta tu shellcode en cualquier proceso que desees
- Carga de DLL: completado y funcionando, inyecta tu DLL en cualquier proceso que desees
- Carga de DLL con un EXE incrustado: completado, inyecta tu DLL en cualquier proceso que desees y extrae el ejecutable como "mssecsvc.exe"
Objetivos del proyecto
- Permitir que los paquetes de negociación, configuración de sesión, conexión de árbol, TransNamedPipe y Transaction2 de DoublePulsar se generen dinámicamente con estructuras SMB y capturas hexadecimales
- Permitir la edición del payload del exploit EternalBlue para eliminar el implante DoublePulsar y permitir el envío de shellcodes personalizados en su lugar
- Permitir que los paquetes de EternalBlue se generen dinámicamente
- Solicitar entrada del usuario para todas las direcciones IP, payloads como shellcode o rutas de archivos y autorización para continuar
- Ser más verboso
- Agregar la versión de Windows desde la respuesta SMB en la pantalla
- Agregar soporte para parámetros de línea de comandos (DoublepulsarExecute.exe -h 192.168.0.8 -f PopCalculatorShellcode.bin)
- Agregar más comprobaciones de errores, como tiempo de espera de socket
Suite EternalBlue y DoublePulsar
- ms17_vuln_status.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 de solicitud TransNamedPipe. Luego lee la respuesta NT_STATUS de la solicitud TransNamedPipe (solicitud PeekNamedPipe) y determina si NT_STATUS en el paquete SMB es 0xC0000205 (STATUS_INSUFF_SERVER_RESOURCES). Si es correcto, el objetivo es vulnerable a MS17-010. Probado en Windows 7 x64 sin parche.

- doublepulsar_check.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. Al enviar el paquete Trans2 SESSION_SETUP, el ID de multiplexación enviado se puede comparar en el paquete de respuesta Trans2 con el ID de multiplexación: 0x51 o 81. DoublePulsar lee el ID de multiplexación enviado y, si el comando ping es exitoso, devuelve un +10 en hexadecimal para el ID de multiplexación en la respuesta Trans2 SESSION_SETUP. Luego, se envían comandos para quemar la puerta trasera DoublePulsar. El comando de quema de DoublePulsar está en los parámetros de tiempo de espera del paquete SMB. Después de eso, DoublePulsar se vuelve inactivo y no se elimina del sistema. Probado en Windows 7 x64.

- DoublePulsarXORKeyCalculator.cpp - Este programa envía 4 paquetes SMB: 1 paquete de negociación y 3 solicitudes. La última solicitud es una solicitud Trans2 SESSION_SETUP. Se recibe una respuesta Trans2 SESSION_SETUP y se extrae la firma SMB en (Recvbuff[18] -> Recvbuff[22]). Recvbuff[22] indica el tipo de arquitectura. Si es 1, el objetivo es x64 bits; si es 0, el objetivo es x86/32 bits. La firma SMB se convierte de los caracteres unsigned char a un entero sin signo.

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.