Sårbarhet i OpenSMTPD som tillater ekstern kjøring av kode med root-privilegier

I e-postserveren utviklet av OpenBSD-prosjektet Åpne SMTPD identifisert kritisk sårbarhet (CVE-2020-7247), som lar deg eksternt utføre skallkommandoer på serveren med root-brukerrettigheter. Sårbarheten ble identifisert under en ny revisjon utført av Qualys Security (tidligere OpenSMTPD-revisjon Ble båret ut i 2015, og den nye sårbarheten har vært til stede siden mai 2018). Problem eliminert i OpenSMTPD 6.6.2-utgivelsen. Alle brukere anbefales å installere oppdateringen umiddelbart (for OpenBSD kan oppdateringen installeres via syspatch).

To angrepsalternativer er foreslått. Det første alternativet fungerer i standard OpenSMTPD-konfigurasjon (godtar kun forespørsler fra localhost) og lar deg utnytte problemet lokalt når angriperen er i stand til å få tilgang til det lokale nettverksgrensesnittet (loopback) på serveren (for eksempel på vertssystemer) . Det andre alternativet oppstår når OpenSMTPD er konfigurert til å motta eksterne nettverksforespørsler (en e-postserver som aksepterer tredjeparts e-post). Forskere har utarbeidet en prototype av en utnyttelse som fungerer vellykket både med OpenSMTPD-versjonen inkludert i OpenBSD 6.6 og med en bærbar versjon for andre operativsystemer (gjennomført i Debian Testing).

Problemet er forårsaket av en feil i smtp_mailaddr()-funksjonen, som kalles for å kontrollere riktigheten av verdiene i "MAIL FROM" og "RCPT TO"-feltene som definerer avsender/mottaker og sendes under tilkoblingen med e-postserveren. For å sjekke delen av e-postadressen som kommer før "@"-symbolet, kalles smtp_mailaddr()-funksjonen
valid_localpart(), som godtar (MAILADDR_ALLOWED) tegnene "!#$%&'*/?^`{|}~+-=_", som kreves av RFC 5322.

I dette tilfellet utføres direkte escape av strengen i mda_expand_token()-funksjonen, som bare erstatter tegnene "!#$%&'*?`{|}~" (MAILADDR_ESCAPE). Deretter brukes linjen klargjort i mda_expand_token() når du ringer leveringsagenten (MDA) ved å bruke kommandoen 'execle("/bin/sh", "/bin/sh", "-c", mda_command,...' . Ved plassering av bokstaver til mbox via /bin/sh, startes linjen "/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}", der verdien "% {mbox.from}» inkluderer escaped data fra «MAIL FROM»-parameteren.

Essensen av sårbarheten er at smtp_mailaddr() har en logisk feil, på grunn av at hvis et tomt domene sendes til e-post, returnerer funksjonen en vellykket bekreftelseskode, selv om delen av adressen før "@" inneholder ugyldige tegn . Videre, når du forbereder en streng, unnslipper ikke mda_expand_token()-funksjonen alle mulige skallspesialtegn, men bare spesialtegn som er tillatt i e-postadressen. Derfor, for å kjøre kommandoen din, er det nok å bruke ";"-symbolet i den lokale delen av e-posten. og plass, som ikke er inkludert i MAILADDR_ESCAPE-settet og ikke er escaped. For eksempel:

$nc 127.0.0.1 25

HELO professor.falken
POST FRA:
RCPT TIL:
DATA
.
SLUTTE

Etter denne økten vil OpenSMTPD, når den leveres til mbox, starte kommandoen gjennom skallet

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

Samtidig begrenses angrepsmulighetene av at den lokale delen av adressen ikke kan overstige 64 tegn, og spesialtegnene ‘$’ og ‘|’ erstattes med “:” ved escape. For å omgå denne begrensningen bruker vi det faktum at brødteksten i brevet overføres etter å ha kjørt /usr/libexec/mail.local gjennom inndatastrømmen, dvs. Ved å manipulere adressen kan du bare starte sh-kommandotolken og bruke hoveddelen av brevet som et sett med instruksjoner. Siden tjeneste SMTP-overskrifter er angitt i begynnelsen av bokstaven, foreslås det å bruke lesekommandoen i en løkke for å hoppe over dem. En fungerende utnyttelse ser omtrent slik ut:

$nc 192.168.56.143 25

HELO professor.falken
MAIL FRA:
RCPT TIL:<[e-postbeskyttet]>
DATA
#0
#1
...
#d
for i i W O P R; gjøre
echo -n "($i) " && id || gå i stykker
ferdig > /root/x."`id -u`.""$$"
.
SLUTTE

Kilde: opennet.ru

Legg til en kommentar