Vulnerabilità in OpenSMTPD che consente l'esecuzione di codice remoto con privilegi di root

Nel server di posta sviluppato dal progetto OpenBSD Apri SMTPD identificato vulnerabilità critica (CVE-2020-7247), che consente di eseguire in remoto comandi shell sul server con diritti di utente root. La vulnerabilità è stata identificata durante un nuovo audit condotto da Qualys Security (precedente audit OpenSMTPD è stata effettuata nel 2015, e la nuova vulnerabilità è presente da maggio 2018). Problema eliminato nella versione OpenSMTPD 6.6.2. Si consiglia a tutti gli utenti di installare immediatamente l'aggiornamento (per OpenBSD, la patch può essere installata tramite syspatch).

Vengono proposte due opzioni di attacco. La prima opzione funziona nella configurazione predefinita di OpenSMTPD (accettando richieste solo da localhost) e consente di sfruttare il problema localmente, quando l'attaccante riesce ad accedere all'interfaccia di rete locale (loopback) sul server (ad esempio, sui sistemi hosting) . La seconda opzione si verifica quando OpenSMTPD è configurato per ricevere richieste di rete esterna (un server di posta che accetta posta di terze parti). I ricercatori hanno preparato un prototipo di un exploit che funziona con successo sia con la versione OpenSMTPD inclusa in OpenBSD 6.6 sia con una versione portatile per altri sistemi operativi (condotta in Debian Testing).

Il problema è causato da un errore nella funzione smtp_mailaddr(), che viene chiamata per verificare la correttezza dei valori nei campi “MAIL FROM” e “RCPT TO” che definiscono il mittente/destinatario e vengono passati durante la connessione con il server di posta. Per controllare la parte dell'indirizzo email che precede il simbolo “@”, viene chiamata la funzione smtp_mailaddr()
valid_localpart(), che accetta (MAILADDR_ALLOWED) i caratteri "!#$%&'*/?^`{|}~+-=_", come richiesto dalla RFC 5322.

In questo caso, l'escape diretto della stringa viene eseguito nella funzione mda_expand_token(), che sostituisce solo i caratteri “!#$%&'*?`{|}~” (MAILADDR_ESCAPE). Successivamente, la riga preparata in mda_expand_token() viene utilizzata quando si chiama l'agente di consegna (MDA) utilizzando il comando 'execle("/bin/sh", "/bin/sh", "-c", mda_command,...' In caso di inserimento di lettere in mbox tramite /bin/sh, viene avviata la riga "/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}", dove il valore "% {mbox.from}" include i dati di escape dal parametro "MAIL FROM".

L'essenza della vulnerabilità è che smtp_mailaddr() presenta un errore logico, a causa del quale, se un dominio vuoto viene inviato via email, la funzione restituisce un codice di verifica riuscita, anche se la parte dell'indirizzo prima di "@" contiene caratteri non validi . Inoltre, quando si prepara una stringa, la funzione mda_expand_token() non esegue l'escape di tutti i possibili caratteri speciali della shell, ma solo dei caratteri speciali consentiti nell'indirizzo email. Pertanto, per eseguire il comando, è sufficiente utilizzare il simbolo “;” nella parte locale dell'e-mail. e spazio, che non sono inclusi nel set MAILADDR_ESCAPE e non sono sottoposti a escape. Per esempio:

$nc 127.0.0.1 25

HELO professore.falken
MAIL DA:
RCPT TO:
DATA
.
SMETTERE

Dopo questa sessione, OpenSMTPD, una volta consegnato a mbox, avvierà il comando tramite la shell

/usr/libexec/mail.local -f ;sonno 66; radice

Allo stesso tempo, le possibilità di attacco sono limitate dal fatto che la parte locale dell’indirizzo non può superare i 64 caratteri e che i caratteri speciali “$” e “|” vengono sostituiti con “:” durante l’escape. Per aggirare questa limitazione, utilizziamo il fatto che il corpo della lettera viene trasmesso dopo aver eseguito /usr/libexec/mail.local attraverso il flusso di input, ovvero Manipolando l'indirizzo, puoi solo avviare l'interprete dei comandi sh e utilizzare il corpo della lettera come un insieme di istruzioni. Poiché le intestazioni del servizio SMTP sono indicate all'inizio della lettera, si consiglia di utilizzare il comando read in loop per saltarle. Un exploit funzionante assomiglia a questo:

$nc 192.168.56.143 25

HELO professore.falken
MAIL FROM:
RCPT A:[email protected]>
DATA
#0
#1
...
#d
per i in W O P R; Fare
echo -n "($i) " && id || rottura
fatto > /root/x."`id -u`.""$$"
.
SMETTERE

Fonte: opennet.ru

Aggiungi un commento