تحليل مهام CTF

في أوائل ديسمبر ، عقدنا منافسة جماعية في مجال أمن المعلومات. بالإضافة إلى OTUS ، كان منظمو الحدث لـ "المتسللين البيض" هم Volga CTF و CTF.Moscow . ربما حان الوقت لتلخيص المهام والتحدث فيها بالتفصيل.

أولاً ، نجح الحدث:

  • تم إعداد 9 مهام في ثلاثة مجالات: Pentest و Reverse Engineering و Linux Security و Secure Development ؛
  • شارك 217 فريق.
  • تم تسجيل أكثر من 800 محاولة لتمرير الأعلام ؛
  • تم تسجيل أكثر من 300 علامة مرت.



ثانياً ، كانت المهام مختلفة في التعقيد ، بحيث لا يستطيع الجميع حل المشكلة:



ثالثًا ، بعد الانتهاء من سباق الماراثون عبر الإنترنت مباشرة ، عقدنا ثلاثة ندوات عبر الإنترنت حيث تحدثنا عن الفائزين ، وقدمنا ​​الإجابات الصحيحة وأعلننا عن النتائج النهائية:

- نتائج CTF: "Linux Linux and Secure Development" ؛


- نتائج CTF: Pentest.


- نتائج CTF: "الهندسة العكسية".


رابعا ، نحن نقدم لك شروط المهام والأوصاف النصية لحلولها . يرجى ملاحظة أن بعض المهام شملت الملفات.

الاتجاه 1: بنتست


المهمة 1 - قواعد البيانات

100

الموقع يستخدم بنشاط قواعد البيانات. حاول أن تفعل حقن SQL.
رابط إلى الموقع: http://193.41.142.9:8001/shop/login

الحل:

نذهب إلى القسم الرئيسي من المتجر / متجر / المنتجات / ، بعد أن علقنا في مجال البحث ، نجد حقن sql.

أدخل 1 "OR" 1 "=" 1 "- ، قم بالتمرير لأسفل وشاهد منتجًا مفقودًا سابقًا ، العلم في وصفه.

إشارة: إشارة {5ql_1nject10n_15_t00_51mpl3_f0r_y0u}

المهمة 2 - ملفات تعريف الارتباط

150

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

رابط إلى الموقع: http://193.41.142.9:8001/shop/login

الحل:

سجّل الدخول ، وانظر إلى ملفات تعريف الارتباط وشاهد ملفات تعريف الارتباط السرية:

«MTExMTAxMSAxMDAwMTAgMTExMDEwMSAxMTEwMDExIDExMDAxMDEgMTExMDAxMCAxMTAxMTEwIDExMDAwMDEgMTEwMTEwMSAxMTAwMTAxIDEwMDAxMCAxMTEwMTAgMTAwMDEwIDExMTAxMDEgMTExMDAxMSAxMTAwMTAxIDExMTAwMTAgMTAwMDEwIDEwMTEwMCAxMDAwMDAgMTAwMDEwIDExMDEwMDEgMTExMDAxMSAxMDExMTExIDExMDAwMDEgMTEwMDEwMCAxMTAxMTAxIDExMDEwMDEgMTEwMTExMCAxMDAwMTAgMTExMDEwIDEwMDAxMCAxMDAwMTEwIDExMDAwMDEgMTEwMTEwMCAxMTEwMDExIDExMDAxMDEgMTAwMDEwIDExMTExMDE =»

base64 في فك شفرة، نحصل على البيانات الثنائية: 100010 1110101 1110011 1111011 1100101 1110010 1101110 1100001 1101101 1100101 100010 111010 100010 1110101 1110011 1100101 1110010 100010 101100 100000 100010 1101001 1110011 1011111 1100001 1100100 1101101 1101001 1101110 100010 111010 100010 1000110 1100001 1101100 1110011 1100101 100010 1111101

نترجم إلى نص ونحصل على: {"username":"user", "is_admin":"False"} ، {"username":"user", "is_admin":"False"} False إلى True {"username":"user", "is_admin":"False"} مرة أخرى:

01111011 00100010 01110101 01110011 01100101 01110010 01101110 01100001 01101101 01100101 00100010 00111010 00100010 01110101 01110011 01100101 01110010 00100010 00101100 00100000 00100010 01101001 01110011 01011111 01100001 01100100 01101101 01101001 01101110 00100010 00111010 00100010 01010100 01110010 01110101 01100101 00100010 01111101

«MDExMTEwMTEgMDAxMDAwMTAgMDExMTAxMDEgMDExMTAwMTEgMDExMDAxMDEgMDExMTAwMTAgMDExMDExMTAgMDExMDAwMDEgMDExMDExMDEgMDExMDAxMDEgMDAxMDAwMTAgMDAxMTEwMTAgMDAxMDAwMTAgMDExMTAxMDEgMDExMTAwMTEgMDExMDAxMDEgMDExMTAwMTAgMDAxMDAwMTAgMDAxMDExMDAgMDAxMDAwMDAgMDAxMDAwMTAgMDExMDEwMDEgMDExMTAwMTEgMDEwMTExMTEgMDExMDAwMDEgMDExMDAxMDAgMDExMDExMDEgMDExMDEwMDEgMDExMDExMTAgMDAxMDAwMTAgMDAxMTEwMTAgMDAxMDAwMTAgMDEwMTAxMDAgMDExMTAwMTAgMDExMTAxMDEgMDExMDAxMDEgMDAxMDAwMTAgMDExMTExMDE =»

قم بتغيير قيمة ملفات تعريف الارتباط إلى واحدة جديدة وانتقل إلى ملف تعريف المستخدم.
العلامة: العلامة {d0_y0u_l1k3_c00k13s}

المهمة 3 - قراءة الملف

200

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

رابط إلى الموقع: http://193.41.142.9:8001/shop/login

الحل:

نبدأ تشغيل dirb (عادة ما تكون common.txt كافية) ، ونجد الصفحات /shop/_source/ و /shop/files/ .

بعد _source المصدر _source نحن نتفهم أن لدينا مشكلة عدم حصانة Path Traversal + بعض المرشحات البسيطة.

للحصول على العلامة ، تحتاج إلى تقديم طلب POST إلى /shop/files/ باستخدام المعلمة "file" ، التي يجب أن تكون قيمتها %2E%2E/%2E%2E/flag .

استجابة للطلب سيكون هناك علم.

العلامة: العلم {y0u_g0t_0ur_s3cr3t}

الاتجاه 2: "أمن Linux والتنمية الآمنة"


المهمة 1 - VCS

50

لكن هل أعطانا العميل شيئًا لا لزوم له؟
يحتوي الأرشيف على الكود المصدري لجزء من الموقع.
رابط إلى الموقع: http://193.41.142.9:8002/
المرفقات: task.7z

الحل:

لدينا الوصول إلى شفرة المصدر. كما اتضح فيما بعد ، قام المطورون أيضًا بوضع مستودع بوابة. نحن ننظر إلى سجل بوابة ، ونحن نرى ارتكاب مع الإصلاحات. نستخدم git show <hash ارتكاب> ، ونحن نرى الملفات المعدلة ومحتوياتها ، يتم تخزين علامة في أحد الخطوط.

إشارة {22717297f6a3603608d260c9e5f69e0a}

المهمة 2 - ألغو

50

لدينا تحد جديد. إجراء فحص التنمية الآمنة. قدم العميل أرشيفًا مع الجزء المفتوح من الموقع الجاري تطويره. لاختبار خوارزمية التجزئة الخاصة به ، قدم علامة تجزئة: 666c61677b32646733326473323334327d. تحقق من الخوارزمية لاحتمال التحول العكسي.

يحتوي الأرشيف على الكود المصدري لجزء من الموقع.
رابط إلى الموقع: http://193.41.142.9:8002/
المرفقات: task.7z

الحل:

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

نستخدم بايثون:

 import binascii binascii.unhexlify("666c61677b32646733326473323334327d") 

نحصل على العلم: flag {2dg32ds2342}

المهمة 3 - ملفات الملفات

150

دعونا ننهي التدقيق. هل ترى هذه الثغرة أيضًا؟ ممتاز. لذا ، فإن الحصول على ملف سري أمر سهل بالنسبة لك.
يحتوي الأرشيف على الكود المصدري لجزء من الموقع.
رابط إلى الموقع: http://193.41.142.9:8002/
المرفقات: task.7z

الحل:

في الكود المصدري للوحدة الرئيسية للبرنامج ، يمكنك ملاحظة قارئ الملفات (هذا هو التطبيق الرئيسي لهذه الخدمة). لا تقوم وظيفة التحقق من وجود ملف بالتحقق من وجود أحرف خاصة بأي شكل من الأشكال ، وتقوم ببساطة بسَلسَلة سطرين => ثغرة اجتياز المسار.

أيضًا في Dockerfile ، docker-compose.yml ، يمكنك رؤية تعيينات الملفات وهيكل التحميل في الحاوية. باستخدام هذه المعرفة ، نقوم بإنشاء حمولة:

 http://193.41.142.9:8002/files?password=qgzc6!78zxcbkj123fdgd234&filename=../../../../../../src/secret_files/flag.txt 

إشارة {a0a7c3fff21f2aea3cfa1d0316dd816c}

الاتجاه 3: "الهندسة العكسية"


المهمة 1 - الأفعى
100

تحاول شركتنا دائمًا التحايل على أي حماية للبرامج. ساعدنا في التعامل مع بايثون هذه المرة.
الملف المرفق: task.pyc

الحل:

نحن نستخدم شفرة بايثون التي تم فك شفرتها بواسطة وحدة uncompyle6:
uncompyle6 task.pyc.
نحن فك ، نحصل على العلم:

إشارة {w3l1_pyth0n}

المهمة 2 - روبوت
150

هذه المرة واجهنا تطبيقًا غريبًا ، ساعدني في العثور على كلمة المرور لإدخالها.
المرفقات: app.apk

الحل:

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

 (String)paramFunction1.invoke(Boolean.valueOf(Arrays.equals(paramString, h)));  invoke: ((StringBuilder)localObject).append("flag{"); ((StringBuilder)localObject).append(this.$m); ((StringBuilder)localObject).append('}'); 

المتغير ح: {102 ، 97 ، 50 ، 98 ، 102 ، 54 ، 52 ، 54 ، 101 ، 52 ، 57 ، 97 ، 98 ، 53 ، 101 ، 53 ، 54 ، 102 ، 50 ، 98 ، 55 ، 52 ، 52 ، 56 ، 48 ، 98 ، 97 ، 54 ، 49 ، 48 ، 49 ، 55} ؛

نرى أنه يشبه الأحرف المطبوعة المشفرة. نستخدم بايثون:

'' .وين (chr (x) لـ x في [102 ، 97 ، 50 ، 98 ، 102 ، 54 ، 52 ، 54 ، 101 ، 52 ، 57 ، 97 ، 98 ، 53 ، 101 ، 53 ، 54 ، 102 ، 50 ، 98 ، 55 ، 52 ، 52 ، 56 ، 48 ، 98 ، 97 ، 54 ، 49 ، 48 ، 49 ، 55])

نحصل على العلم:

إشارة {fa2bf646e49ab5e56f2b74480ba61017}

السعي 3 - بن

200

هذه المرة وصلنا عبر ملف ثنائي. المهمة هي نفسها ، احصل على كلمة المرور السرية.
المرفقات: المهمة

الحل:
ويرد ملف ثنائي. نقوم بالتحميل في أداة فك الشفرة ونرى ست وظائف تحقق مكتوبة بلغة C ++.

يتم تنفيذها بشكل مماثل ويتم استدعاؤها في بعضها البعض ، والتحقق من العلم في أجزاء من 5 عناصر.

نستعيده على مراحل باستخدام المعلومات من المفكك. نحصل على العلم في أجزاء:

0) فحص طول
1) العلم {
2)
3) _172a
4) k14sc
5)

الجمع واحصل على العلم:

إشارة {feefa_172ak14sc_eee}

هذا كل شيء ، الزملاء! شكرا لكم جميعا على المشاركة ، تعتني بنفسك ، أحبائك وبياناتك! سنة جديدة سعيدة!

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


All Articles