Cython: Advanced Todo List Challenge (Writeup)

· 341 كلمة · 2 دقائق للقراءة

بسم الله القوي العزيز

ضمن تحديات Cython CTF 2 كان تحدي Advanced Todo List احد التحديات المستعصية على الحل، لذلك ارتأيت كتابة هذا المقال شرحًا للتحدي وآلية الحل بمنهجية صارمة!

meme

إن اول ما يلاحظ أن source code معطى ضمن التحدي ثم إن ذلك احتث المبرمج بداخلي على تفحص تلكمُ الملفات بحثًا عن العلم الذي هو بُغيتي ومُناي.

ls

العرب عَرفت القيافة وعُرفت بها، فرحت اقتاف اثر bugs للوصول إلى العلم. بعد اطلاع سريع على ملف server.js تستطيع جازمًا القول بأنه يخلو من ثغرات SQLi لأن معظم الإستعلامات على قواعد البيانات كانت ب prepared statements وذلك ادعى للحماية.

لا اخفيك بدأ يساورني شك في صحة التحدي، وأنه ممكنٌ حلّه، إذ لا ذكر لكلمة “flag” في كل صفحات البرنامج غير أنه موجود في filesystem في هذا المسار:

/app/flag.txt

وهذا اوضح لي أن الثغرة لابد أنها RCE إذ لا سبيل للعَلم غيرها.

رحت ابحث في صفحات ال views عن ثغرة SSTI بلا فائدة، ثم رجعت إلى server.js وإذا بي انتبه إلى سطر مريب.

line

النظرة الأولية قد تخدعك بأن هذا السطر لا ريب فيه إلا أن البرنامج كتب بلغة javascript وهنا مربط الفرس، حيث أن في javascript كل شيء يرجع في أصله إلى كونه object وكل object يرث بالضرورة أُمورًا قد تضره ويُعرف هذا ب prototype pollution.

لذلك فإنني رحت ابحث عن طريق إلى prototype pollution to RCE حيث يكمن حل التحدي.

بعد محاولات عديدة لإيجاد طريقة لكتابة exploit كلها باءت بالفشل تسربت الوساوس إلى نفسي من قبيل “مو كالفنك يا مسلم” وقبل أن اترك التحدي تذكرت قول الشاعر:

إن الوساوسَ إن رامَت مسارِبَها
سدَّ الطريقَ عليها الحازمُ الحذِرُ

فعدت احتث الخطى إلى source code لكن بطريقة مختلفة، وذهبت انظر في ملف package.json ورحت اقلّص الإحتمالات إلى أمرين اثنين كما هو موضح ادناه:

packages

ابشر بالفرج بعد طول انتظار…

ضاقَت فَلَمّا اِستَحكَمَت حَلَقاتُها
فُرِجَت وَكُنتُ أَظُنُّها لا تُفرَجُ

بعد بحث بسيط، لاح بارق الأمل في الأفق:

cve

لذلك وبناء على ما سبق فإنني بدأت مستعينًا بالله اولًا ثم ب CVE في كتابة exploit يحقق المطلوب:

local

ولتجربة exploit والتثبت من الحل فإني عزمت على تشغيله محليًا على جهازي ابتداء ثم الإنتقال الى server المسابقة:

exploit

flag

وعلى الله قصد السبيل، والسلام.