OpenSMTPD:n haavoittuvuus, joka sallii koodin etäsuorittamisen pääkäyttäjänä

OpenBSD-projektin kehittämässä sähköpostipalvelimessa AvaaSMTPD tunnistettu kriittinen haavoittuvuus (CVE-2020-7247), jonka avulla voit suorittaa komentotulkkikomentoja etänä palvelimella, jolla on pääkäyttäjän oikeudet. Haavoittuvuus tunnistettiin Qualys Securityn suorittamassa uudelleentarkastuksessa (aiempi OpenSMTPD-tarkastus pidettiin vuonna 2015, ja uusi haavoittuvuus on ollut olemassa toukokuusta 2018 lähtien). Ongelma eliminoitu OpenSMTPD 6.6.2:n julkaisussa. Kaikkia käyttäjiä kehotetaan asentamaan päivitys pikaisesti (OpenBSD:lle korjaustiedoston voi asentaa syspatchin kautta).

Hyökkäyksiä on ehdotettu kahta tyyppiä. Ensimmäinen vaihtoehto toimii OpenSMTPD-oletuskokoonpanossa (vastaanottaa pyyntöjä vain localhostilta) ja mahdollistaa ongelman hyödyntämisen paikallisesti, kun hyökkääjä pääsee käsiksi palvelimen paikalliseen verkkoliitäntään (palautettu silmukka) (esimerkiksi isännöintijärjestelmissä). . Toinen vaihtoehto tulee näkyviin, kun OpenSMTPD on määritetty hyväksymään ulkoiset verkkopyynnöt (postipalvelin, joka hyväksyy kolmannen osapuolen postin). Tutkijat ovat valmistaneet prototyyppihyödynnyksen, joka toimii onnistuneesti sekä OpenBSD 6.6:n OpenSMTPD-version että muiden käyttöjärjestelmien kannettavan version kanssa (suoritettu Debianin testauksessa).

Ongelma johtuu virheestä smtp_mailaddr()-funktiossa, jota kutsutaan tarkistamaan "MAIL FROM"- ja "RCPT TO"-kenttien arvojen oikeellisuus, jotka määrittävät lähettäjän / vastaanottajan ja lähetetään yhteyden aikana. postipalvelimelle. Funktio smtp_mailaddr() kutsutaan smtp_mailaddr() -funktiossa tarkistamaan, onko sähköpostiosoitteessa se osa, joka tulee ennen @-merkkiä.
valid_localpart(), joka pitää "!#$%&'*/?^`{|}~+-=_"-merkkejä sallittuina (MAILADDR_ALLOWED), kuten RFC 5322 vaatii.

Tässä tapauksessa merkkijono pakotetaan suoraan mda_expand_token()-funktiossa, joka korvaa vain merkit "!#$%&'*?`{|}~" (MAILADDR_ESCAPE). Lisäksi mda_expand_token() -komennolla valmistettua merkkijonoa käytetään kutsuttaessa toimitusagenttia (MDA) komennolla 'execle("/bin/sh", "/bin/sh", "-c", mda_command,…'. mail mboxiin /bin/sh:n kautta ajetaan rivi "/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}", jossa arvo "%{mbox.from}" sisältää "MAIL FROM" -parametrin pakotetut tiedot.

Haavoittuvuuden ydin on, että smtp_mailaddr() sisältää loogisen virheen, jonka vuoksi jos sähköpostiin välitetään tyhjä verkkotunnus, funktio palauttaa onnistuneen vahvistuskoodin, vaikka osoitteen @-merkkiä edeltävä osa sisältää virheellisiä merkkejä. Lisäksi, kun valmistellaan merkkijonoa mda_expand_token()-funktiolla, kaikkia mahdollisia komentotulkin erikoismerkkejä ei ohiteta, vaan vain sähköpostiosoitteessa sallitut erikoismerkit. Siten komentosi suorittamiseksi riittää, että käytät symbolia ";" sähköpostin paikallisessa osassa. ja välilyönti, jotka eivät ole MAILADDR_ESCAPE-joukossa ja joita ei ole pakotettu. Esimerkiksi:

$nc 127.0.0.1 25

HELO professori.falken
POSTIT LÄHETTÄJÄ:<;sleep 66;>
RCPT TO:
DONNEES
.
PALUU

Tämän istunnon jälkeen OpenSMTPD, kun se toimitetaan mboxiin, suorittaa komennon komentotulkin kautta

/usr/libexec/mail.local -f ;sleep 66; juuri

Samaan aikaan hyökkäysmahdollisuuksia rajoittaa se, että osoitteen paikallinen osa ei saa ylittää 64 merkkiä ja erikoismerkit '$' ja '|' korvataan ":"-merkillä, kun poistutaan. Tämän rajoituksen kiertämiseksi se tosiasia, että viestin runko lähetetään tiedoston /usr/libexec/mail.local suorittamisen jälkeen syöttövirran kautta, ts. manipuloimalla osoitetta, voit käynnistää vain sh-komentotulkin ja käyttää kirjeen runkoa ohjeiden joukkona. Koska palvelun SMTP-otsikot on määritetty kirjeen alussa, on suositeltavaa käyttää lukukomentokutsua silmukassa niiden ohittamiseksi. Työhyökkäys näyttää suunnilleen tältä:

$nc 192.168.56.143 25

HELO professori.falken
MAIL FROM:<;for i in 0 1 2 3 4 5 6 7 8 9 abcd;do read r;done;sh;exit 0;>
RCPT TO:[sähköposti suojattu]>
DONNEES
#0
#1
...
#d
i:lle WOPR:ssa; tehdä
echo -n "($i) " && id || tauko
valmis > /root/x."`id -u`"."$$"
.
PALUU

Lähde: opennet.ru

Lisää kommentti