Az OpenSMTPD biztonsági rése, amely távoli kódfuttatást tesz lehetővé root jogosultságokkal

Az OpenBSD projekt által fejlesztett levelezőszerverben Nyissa meg azSMTPD-t azonosított kritikus sebezhetőség (CVE-2020-7247), amely lehetővé teszi shell-parancsok távoli végrehajtását a kiszolgálón root felhasználói jogokkal. A sérülékenységet a Qualys Security által végzett újraellenőrzés során azonosították (korábbi OpenSMTPD audit tartottak 2015-ben, és az új sebezhetőség 2018 májusa óta van jelen). Probléma Eltüntetett OpenSMTPD 6.6.2 kiadásban. Minden felhasználónak ajánlott a frissítés azonnali telepítése (OpenBSD esetén a javítás a syspatch-en keresztül telepíthető).

Két támadási lehetőség javasolt. Az első opció az alapértelmezett OpenSMTPD konfigurációban működik (csak a localhosttól fogadja el a kéréseket), és lehetővé teszi a probléma helyi kihasználását, amikor a támadó hozzáfér a helyi hálózati interfészhez (loopback) a kiszolgálón (például hosting rendszereken). . A második lehetőség akkor fordul elő, ha az OpenSMTPD külső hálózati kérések fogadására van beállítva (egy olyan levelezőszerver, amely fogadja a harmadik féltől származó leveleket). A kutatók elkészítették egy kizsákmányolás prototípusát, amely sikeresen működik mind az OpenBSD 6.6-os OpenSMTPD-verziójával, mind a más operációs rendszerekhez készült hordozható verziókkal (a Debian tesztelése során).

A problémát az smtp_mailaddr() függvény hibája okozza, amely a „MAIL FROM” és „RCPT TO” mezőkben a feladót/címzettet meghatározó és a kapcsolat során átadott értékek helyességének ellenőrzésére szolgál. a levelezőszerverrel. Az e-mail cím „@” szimbólum előtti részének ellenőrzéséhez az smtp_mailaddr() függvényt hívjuk.
valid_localpart(), amely a "!#$%&'*/?^`{|}~+-=_" karaktereket tekinti érvényesnek (MAILADDR_ALLOWED), az RFC 5322 szerint.

Ebben az esetben a karakterlánc közvetlen kihagyása az mda_expand_token() függvényben történik, amely csak a „!#$%&’*?`{|}~” (MAILADDR_ESCAPE) karaktereket helyettesíti. Ezt követően az mda_expand_token()-ben elkészített sor kerül felhasználásra a kézbesítő ügynök (MDA) 'execle("/bin/sh", "/bin/sh", "-c", mda_command,...' paranccsal történő meghívásakor. Ha a /bin/sh-n keresztül írunk be betűket az mboxba, akkor a „/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}” sor indul, ahol a „% Az {mbox.from}” megtisztított adatokat tartalmaz a „MAIL FROM” paraméterből.

A sérülékenység lényege, hogy az smtp_mailaddr() logikai hibával rendelkezik, ami miatt ha üres domain kerül e-mailre, akkor a függvény sikeres ellenőrző kódot ad vissza, még akkor is, ha a cím „@” előtti része érvénytelen karaktereket tartalmaz. . Továbbá egy karakterlánc elkészítésekor az mda_expand_token() függvény nem hagyja ki az összes lehetséges shell speciális karaktert, hanem csak az e-mail címben engedélyezett speciális karaktereket. Így a parancs futtatásához elegendő a „;” szimbólum használata az e-mail helyi részében. és szóköz, amelyek nem szerepelnek a MAILADDR_ESCAPE készletben, és nincsenek megszakítva. Például:

$nc 127.0.0.1 25

HELO professzor.falken
LEVÉL FÓL:
RCPT TO:
ADATOK
.
QUIT

A munkamenet után az OpenSMTPD, amikor kézbesítik az mboxba, elindítja a parancsot a parancsértelmezőn keresztül

/usr/libexec/mail.local -f ;alvás 66; gyökér

A támadási lehetőségeket ugyanakkor korlátozza, hogy a cím lokális része nem haladhatja meg a 64 karaktert, a „$” és „|” speciális karaktereket pedig „:” helyettesíti a kilépéskor. Ennek a korlátozásnak a megkerülésére használjuk azt a tényt, hogy a levél törzse az /usr/libexec/mail.local futtatása után kerül továbbításra a bemeneti folyamon keresztül, azaz a levéltörzs. A cím manipulálásával csak az sh parancsértelmezőt indíthatja el, és a levél törzsét használhatja utasításkészletként. Mivel a szolgáltatási SMTP fejlécek a levél elején vannak feltüntetve, ajánlatos a read parancsot ciklusban használni, hogy kihagyjuk őket. Egy működő exploit valahogy így néz ki:

$nc 192.168.56.143 25

HELO professzor.falken
LEVÉL FELTŐL:
RCPT TO:[e-mail védett]>
ADATOK
#0
#1
...
#d
i-re a W O P R-ben; csináld
echo -n "($i) " && id || szünet
kész > /root/x."`id -u`.""$$"
.
QUIT

Forrás: opennet.ru

Hozzászólás