Kwetsbaarheid in OpenSMTPD waardoor uitvoering van code op afstand met rootrechten mogelijk is

In de mailserver ontwikkeld door het OpenBSD-project OpenSMTPD geïdentificeerd kritische kwetsbaarheid (CVE-2020-7247), waarmee u op afstand shell-opdrachten op de server kunt uitvoeren met rootgebruikersrechten. De kwetsbaarheid werd geïdentificeerd tijdens een heraudit uitgevoerd door Qualys Security (eerdere OpenSMTPD-audit). werd gehouden in 2015, en de nieuwe kwetsbaarheid is sinds mei 2018 aanwezig). Probleem geëlimineerd in OpenSMTPD 6.6.2-release. Alle gebruikers wordt aangeraden de update onmiddellijk te installeren (voor OpenBSD kan de patch via syspatch worden geïnstalleerd).

Er worden twee aanvalsopties voorgesteld. De eerste optie werkt in de standaard OpenSMTPD-configuratie (accepteert alleen verzoeken van localhost) en stelt u in staat het probleem lokaal te exploiteren, wanneer de aanvaller toegang kan krijgen tot de lokale netwerkinterface (loopback) op de server (bijvoorbeeld op hostingsystemen). . De tweede optie doet zich voor wanneer OpenSMTPD is geconfigureerd om externe netwerkverzoeken te ontvangen (een mailserver die e-mail van derden accepteert). Onderzoekers hebben een prototype van een exploit voorbereid die succesvol werkt met zowel de OpenSMTPD-versie opgenomen in OpenBSD 6.6 als met een draagbare versie voor andere besturingssystemen (uitgevoerd in Debian Testing).

Het probleem wordt veroorzaakt door een fout in de functie smtp_mailaddr(), die wordt aangeroepen om de juistheid van de waarden in de velden “MAIL FROM” en “RCPT TO” te controleren die de afzender/ontvanger definiëren en die tijdens de verbinding worden doorgegeven met de mailserver. Om het deel van het e-mailadres dat vóór het “@”-symbool komt te controleren, wordt de functie smtp_mailaddr() aangeroepen
valid_localpart(), dat (MAILADDR_ALLOWED) de tekens "!#$%&'*/?^`{|}~+-=_" accepteert, zoals vereist door RFC 5322.

In dit geval wordt het direct ontsnappen van de tekenreeks uitgevoerd in de functie mda_expand_token(), die alleen de tekens “!#$%&'*?`{|}~” (MAILADDR_ESCAPE) vervangt. Vervolgens wordt de regel die is voorbereid in mda_expand_token() gebruikt bij het aanroepen van de bezorgingsagent (MDA) met behulp van het commando 'execle("/bin/sh", "/bin/sh", "-c", mda_command,...' In het geval van het plaatsen van letters in mbox via /bin/sh, wordt de regel “/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}” gestart, waar de waarde “% {mbox.from}” bevat ontsnapte gegevens uit de parameter "MAIL FROM".

De essentie van de kwetsbaarheid is dat smtp_mailaddr() een logische fout bevat, waardoor, als een leeg domein naar e-mail wordt gestuurd, de functie een succesvolle verificatiecode retourneert, zelfs als het deel van het adres vóór “@” ongeldige tekens bevat . Verder ontwijkt de functie mda_expand_token() bij het voorbereiden van een string niet alle mogelijke speciale shell-tekens, maar alleen de speciale tekens die zijn toegestaan ​​in het e-mailadres. Om uw opdracht uit te voeren, volstaat het dus om het symbool “;” in het lokale deel van de e-mail te gebruiken. en spatie, die niet zijn opgenomen in de MAILADDR_ESCAPE-set en niet zijn geëscaped. Bijvoorbeeld:

$nc 127.0.0.1 25

HELO professor.falken
MAIL VAN:<;slaap 66;>
RCPT AAN:
GEGEVENS
.
QUIT

Na deze sessie zal OpenSMTPD, wanneer afgeleverd bij mbox, de opdracht starten via de shell

/usr/libexec/mail.local -f;slaap 66; wortel

Tegelijkertijd worden de aanvalsmogelijkheden beperkt door het feit dat het lokale deel van het adres niet langer mag zijn dan 64 tekens, en de speciale tekens '$' en '|' worden bij het ontsnappen vervangen door : . Om deze beperking te omzeilen, gebruiken we het feit dat de hoofdtekst van de brief wordt verzonden nadat /usr/libexec/mail.local via de invoerstroom is uitgevoerd, d.w.z. Door het adres te manipuleren, kunt u alleen de sh-opdrachtinterpreter starten en de hoofdtekst van de brief als reeks instructies gebruiken. Omdat service-SMTP-headers aan het begin van de brief worden aangegeven, wordt voorgesteld om de leesopdracht in een lus te gebruiken om ze over te slaan. Een werkende exploit ziet er ongeveer zo uit:

$nc 192.168.56.143 25

HELO professor.falken
MAIL VAN:<;voor i in 0 1 2 3 4 5 6 7 8 9 abcd;lees r;klaar;sh;exit 0;>
RCPT NAAR:[e-mail beveiligd]>
GEGEVENS
#0
#1
...
#d
voor i in WOPR; Doen
echo -n "($i) " && id || pauze
klaar > /root/x."`id -u`.""$$"
.
QUIT

Bron: opennet.ru

Voeg een reactie