حل غرفة: [Upload Vulnerabilities] في منصة [TryHackMe]
هذه التدوينة حل لغرفة في منصة مختصة بتوفير أجهزة لممارسة وتعليم اختبار الاختراق، ومؤلفها يُخلي مسؤوليته إن تم تطبيق هذه الأساليب في بيئة غير مصرّحة؛ إذ إنّ الاختراق -لأجهزة لا تملكها أو تملك تصريحًا لها- يُعدّ جريمة يعاقب عليها القانون.
هذه تدوينة حل غرفة ثغرات رفع الملفات في منصة «TryHackMe». استخدمت توزيعة كالي لينكس المعروفة وملف الـVPN التابع للمنصة لأتمكن من الدخول على الشبكة الداخلية.
في البداية، شغّلت الآلة، ومن ثم نسخت الأمر هذا؛ ليتم استبدال عنوان الآي بي الخاصة بها بأسماء مواقع لنتمكن من الدخول عليها.
ومن ثمّ ثبّت أداة gobuster؛ لأنها مطلوبة. هذه الأداة تحاول أن تكتشف المجلدات والملفات الخفيّة الموجودة في الموقع. على سبيل المثال، موقع test.com تستطيع أن تكشف لنا أسماء المجلدات مثل test.com/signin وهكذا. باستخدام هذا الأمر:
الأقسام الثلاثة الأولى مجرد مقدمة إذ لا توجد أسئلة.
القسم الرابع: الكتابة على الملفات الموجودة
[Overwriting Existing Files]
دخلت على هذا الموقع [overwrite.uploadvulns.thm]
تسمح لنا هذه الثغرة باستبدال الملفات الموجودة على الموقع برفع ملف شبيه في الاسم والصيغة. لمعرفة هذَين الشيئَين، علينا أن نذهب لمصدر الصفحة.
نرى بأن:
اسم الملف: mountains
صيغة الملف: jpg
نستطيع البحث في الإنترنت عن صورة بصيغة [jpg] وتسميتها [mountains] ومن ثم رفع الملف.
اضطررت هنا لتحويل الصيغة من [jpeg] إلى [jpg].
نرفع الملف، ثم نحدّث الصفحة لنرى إن كان هناك تغيير.
استطعنا أن نستبدل الصورة، وحصلنا على العلم!
ونستطيع الآن الإجابة على الأسئلة.
What is the name of the image file which can be overwritten?
mountains.jpg
Overwrite the image. What is the flag you receive?
THM{OTBiODQ3YmNjYWZhM2UyMmYzZDNiZjI5}
القسم الخامس: تنفيذ التعليمات البرمجية عن بعد
[Remote Code Execution]
دخلت على هذا الموقع [shell.uploadvulns.thm]
تسمح لنا هذه الثغرة الخطيرة برفع باب خلفي [reverse shell أو backdoor] على الموقع يسمح لنا بالتحكم بالحواسيب عن بعد.
في البداية، أردت معرفة ما الصيغ الذي يقبلها الموقع، ومكان حفظها بعد الرفع.
ومن ثم استخدمت أداة gobuster الذي ذكرتها سابقًا لأعثر على مجلدات مخفية لعلها واحدًا منها يكون مكان التخزين.
وجدت هذا المجلد. سأتصفح إليه.
ممتاز. نستطيع الآن رفع باب خلفي وتشغيله. استخدمت أداة weevely، مع أنّ مؤلف الغرفة ينصح بتحميل باب خلفي بلغة php والتعديل عليه، إلا أنني أردت فعلها بطريقتي الخاصة. برمجنا باب خلفي اسمه rev_shell.php، ورفعناه بنجاح.
وما علينا الآن إلا أن نتصل بالباب الخلفي والتحكم بالجهاز.
استطعنا الاتصال به، واستخراج العلم. الآن نجيب على الأسئلة:
Run a Gobuster scan on the website using the syntax from the screenshot above. What directory looks like it might be used for uploads?
/resources
Get either a web shell or a reverse shell on the machine.
What's the flag in the /var/www/ directory of the server?THM{YWFhY2U3ZGI4N2QxNmQzZjk0YjgzZDZk}
القسم السادس: الفلترة
[Filtering]
والمقصود بالفلترة: تنقيح المدخلات لما يتم رفعه للسيرفر من عدة جوانب، وأشهرها تنقيح الصيغ. ما مكننا في القسم السابق من الاختراق أن ما يدخل السيرفر لا يتم تنقيحه بل تخزينه على الفور، وهذا خطير وسهل الاختراق. يجب على المطوّر أن يضع بالحسبان أن هذه العملية مهمة لسلامة وأمن المعلومات والأجهزة التي تُخزّن عليها. هذا القسم لا يحتوي على أجهزة للاختراق بل ثلاثة أسئلة فقط، ويمكن الاستعانة بگوگل للإجابة عليها.
What is the traditionally predominant server-side scripting language?
PHP
When validating by file extension, what would you call a list of accepted extensions (whereby the server rejects any extension not in the list)?
Whitelist
[Research] What MIME type would you expect to see when uploading a CSV file?
text/csv
القسم السابع: تخطّي فلترة المستخدم
[Bypassing Client-Side Filtering]
دخلت على هذا الموقع [java.uploadvulns.thm]
تنتج هذه الثغرة من التطوير الرديء لتطبيقات الويب؛ إذ يستطيع المهاجم من تخطي خطوط الدفاع الركيكة ورفع الملفات التي يريد.
في البداية، أريد التأكد من أنّ صيغة php ممنوعة. صنعتُ بابًا خلفيًا وأسميته file.
تأكدت شكوكي.
لأعترض الملف أثناء رفعه، يجب استعمال أداة تعمل كوسيط (بروكسي) تمكّننا من التلاعب في المراسلات بين السيرفر والمتصفح. استعملت أداة Burp Suite، وثبتّ إضافة foxyproxy لتسهيل عملية تشغيل الأداة. هذه هي الطريقة في ربط الاثنين:
نضيف بروكسي جديد. ثم نحدد اسمه وعنوان الآي بي ورقم المنفذ. الآي بي محلّي، أي: 127.0.0.1، والمنفذ 8080.
نتأكد من أن Burp Suite على نفس الإعداد.
ثم نتوجه إلى صفحة البروكسي؛ لتحميل X.509.
ونضيف الشهادة في المتصفح، ومن ثم نشغّل البروكسي وخيار اعتراض المراسلات في Burp Suite.
نرى من مصدر الصفحة أن الصيغة المسموحة png.
الخطة أن نتخطاه بأن نحوّل صيغة الملف إلى png في البداية ومن ثم أثناء الرفع نتلاعب في الملف والصيغة ونرجعه إلى php.
نتأكد من أن خيار الاعتراض شغّال، وبعدها نرجع الصيغ.
ومن ثمّ نُمرِر الحزمة. نرى بأن الرفع نجح وعملية التخطّي نجحت. علينا الآن معرفة المجلد التي رُفع له الملف باستخدام أداة gobuster. العملية مشابهة للقسم الماضي، فلا داعي لأن أعرضها. اسم المجلد [images].
ثم نلتقط العلم.
What is the flag in /var/www/?
THM{NDllZDQxNjJjOTE0YWNhZGY3YjljNmE2}
القسم الثامن: تخطّي صيغ الملفات من جهة السيرفر
[Bypassing Server-Side Filtering: File Extensions]
دخلت على هذا الموقع [annex.uploadvulns.thm]
نكتب أمر help لاستكشاف الخيارات المتاحة.
بعد استكشاف بسيط، تبيّن أن السيرفر يمنع صيغة php لكنه لا يمنع صيغ أخرى مثل php5. من الممارسات الخاطئة في تطوير تطبيقات الويب أن يتم صنع قائمة حظر [blacklist] للعديد من الصيغ. من المحمود أن يتم صنع قائمة سماح [whitelist] لقلّة من الصيغ بما يتناسب مع أهداف تطبيق الويب واستعمالاته. صنعت بابًا خلفيًا بصيغة [php5].
ثم رفعته.
وتم رفعه بنجاح. نفعّل الباب الخلفي عن طريق weevely.
ثم نلتقط العلم.
What is the flag in /var/www/?
THM{MGEyYzJiYmI3ODIyM2FlNTNkNjZjYjFl}
القسم التاسع: تخطّي أختام الملفات من جهة السيرفر
[Bypassing Server-Side Filtering: Magic Numbers]
دخلت على هذا الموقع [magic.uploadvulns.thm]
في أحايين كثيرة، يفحص السيرفر أختام الملفات على صعيد الترقيم السداسي العشري حيث لكل صيغة ختم معيّن تُعرف بها. على سبيل المثال، صيغة jpeg تبدأ بهذا الختم السداسي العشري: FF D8 FF DB. حتى لو غيرنا اسم الملف والصيغة من التيرمنال تبقى الصيغة الفعلية، فلا تتغير -نظريًّا- إلا مع تغيير ختم الملف وضبطه إلى الصيغة المرغوبة.
أردت في البداية معرفة ما الصيغ المقبولة للرفع في هذا الموقع.
يتبيّن أنه لا يقبل سوى صيغة gif في نوع من قائمة السماح، وهذا جيّد مقارنة بالقسم السابق إلا أنه يُمكن تخطّيه.
سنضيف سطرًا في بداية هذا الملف باستخدام أي أداة لتحرير النصوص.
السطر: ;GIF89a
عند فحص هذا الملف من قبل السيرفر، يخبره هذا السطر بشرعيّته وأنه بصيغة gif.
سأجرّب رفعه؛ لأرى إن كانت الطريقة نافعة.
تم رفع الملف بنجاح!
نفعّل أداة weevely.
ثم نلتقط العلم!
What is the flag in /var/www/?
THM{MWY5ZGU4NzE0ZDlhNjE1NGM4ZThjZDJh}
القسم العاشر: منهج اكتشاف ثغرات الرفع
[Example Methodology]
يحتوي هذا القسم على نصائح عامة في اكتشاف هذا النوع من الثغرات. وهي اختصار لما تم ذكره وتطبيقه آنفًا.
القسم الحادي عشر: تحدّي
[Challenge]
هذا التحدّي خليط من الأقسام السابقة مع إضافة تحدٍّ ممتع.
لا توجد أي معلومات سوى هذا الموقع [jewel.uploadvulns.thm] وقائمة حروف من AAA إلى ZZZ.
بعد الدخول على الموقع، نجد هذه الواجهة.
سنتبع نهجنا في معرفة الصيغة المقبولة.
بعد محاولات كثيرة، تبيّن أن الصيغة المقبولة هي jpg.
سنحاول الآن معرفة أين تم رفع الملف باستخدام gobuster.
نعرف من اسم المجلد [content] أن المرفوعات تُحفظ فيه، إلا أن لا يمكننا الدخول إليه.
بعد محاولات -نسيت تصويرها- مع أداة Burp Suite، يتبيّن أن ما يشغل الموقع: Node.js. بعد بحث بسيط، نجد بابًا خلفيًا له.
نغير المعطيات إلى عنوان الآي بي التابع لجهازي، ورقم منفذ من اختياري. ثم نحفظه على صيغة jpeg.
يقوم الموقع بحفظ الصور من ثلاثة أحرف عشوائية على صيغة jpg. بمعنى أننا إن استطعنا تخطّي المنع، سيُحفظ الباب الخلفي بثلاثة حروف عشوائية، ومن ثم نستطيع تشغيله والحصول على شيل [shell].
ولكننا قبل هذا، نريد أن نعترض ملف الجافاسكريبت الذي فيه المنع.
من إعدادت المنع من جهة المتصفح، نحذف المشار له.
ثم نعيد تحديث الموقع بالضغط على [ctrl + F5] ليتحدّث بكامله ليس من المخزّن مسبقًا.
نرى ملفًا باسم [upload.js] لربما يحتوي على أكواد المنع. نعترض هذه الملف لنرى ما يحتويه.
نرى ثلاث دوالّ منع.
تتفقد حجم الملف.
تتفقد ختمه.
تتفقد صيغته إن كانت إحدى هاتَين [jpeg OR jpg].
نقوم بحذفهم ثم إرساله للسيرفر لنتمكن من رفع الملف.
نرجع صيغة الملف إلى js. ثم نرفعه.
تم رفعه بنجاح. نعرف الآن أن الملف تم تخزينه في مجلد [content] بثلاثة أحرف عشوائية بصيغة jpg. لكن كيف نعرف هذا الملف تحديدًا؟ باستخدام أداة gobuster مع تحديد الصيغة لـjpg مع القائمة التي ضمن التحدي.
نتأكد من تشغيل المستمع [listener] لالتقاط الشيل [shell].
بعد محاولات فاشلة تخطت العشرة. نجد أن الملف تم تحويله إلى VUE.jpg. يمكننا تمييزه من حجمه أو الذهاب إلى الرابط الفعلي في المتصفح. ولكنّه لا يتفعّل.
بعد المراجعة، هناك مجلد بعنوان admin تفعّل الصور في نموذج إدخال.
نضع مسار الصورة (أو الباب الخلفي) الذي أنشأناه:
حيث .. تعني التراجع إلى المجلد الأعلى والباقي هو مسار الملف.
بعد تطبيقه تمكنّا من الحصول على شيل.
Hack the machine and grab the flag from /var/www/
THM{NzRlYTUwNTIzODMwMWZhMzBiY2JlZWU2}
لا ننسى أن نرجع ملف hosts كما كان، باستخدام هذا الأمر.
استمتعت في هذه التجربة الأولى بنقل معرفتي المتواضعة التي لم تتخطّى سنة واحدة في عالم اختبار الاختراق. بالإضافة إلى إثراء المحتوى العربي بإنتاج مقالات مرتبة بلغة عربية شبه فصيحة في مجال أمن المعلومات ومشتقّاته. أعتذر عن الهفوات والأخطاء، وأتمنى مستقبلًا الاستمرار في الكتابة بنفس الشغف والدافع.
محمد السعيد