Cosa fa#
Implementa un client SSL/TLS generico che stabilisce una connessione sicura con un server remoto. È essenzialmente un "netcat con i superpoteri della cifratura".
Sintassi#
openssl s_client -connect [host]:[porta] [opzioni]
Comandi essenziali#
| Comando | Flag | Significato flag | Cosa fa |
|---|---|---|---|
openssl s_client -connect localhost:30001 | — | — | Connessione TLS base, mostra tutto l'output del certificato |
openssl s_client -connect host:porta -quiet | -quiet | silenzia output certificato | Nasconde info certificato, abilita -ign_eof implicitamente |
openssl s_client -connect host:porta -ign_eof | -ign_eof | ignore end of file | Non chiude la connessione quando la pipe finisce — aspetta la risposta del server |
echo "password" | openssl s_client -connect host:porta -quiet | — | — | Manda la password via pipe e aspetta la risposta |
Visual Flow (ASCII)#
[ Tuo Client ] [ Server SSL ]
| |
|--- 1. Client Hello (proposta cifratura) -->|
|<-- 2. Server Hello + Certificato ----------|
|--- 3. Scambio chiavi (cifrato) ----------->|
| |
|======== TUNNEL CIFRATO STABILITO ==========|
| |
|--- "mia_password" ------------------------>|
|<-- "next_level_password" -----------------|CONNECTED COMMANDS — comandi interattivi#
Quando sei già connesso, puoi digitare questi comandi direttamente nel terminale:
| Comando | Cosa fa | Nota |
|---|---|---|
Q | Chiude la connessione | — |
R | Rinegozia la sessione TLS | Solo TLS 1.2 e precedenti |
keyup | Aggiorna le chiavi di cifratura | Solo TLS 1.3 |
keyup req | Aggiorna le chiavi e chiede al server di fare lo stesso | Solo TLS 1.3 |
keyup noreq | Aggiorna le chiavi senza richiedere aggiornamento al server | Solo TLS 1.3 |
Messaggi comuni e cosa significano#
read R BLOCK → openssl sta aspettando dati dal server
appare dopo che hai mandato la password
KEYUPDATE → TLS 1.3 sta aggiornando le chiavi di cifratura
se lo vedi invece della risposta → usa -quiet o -ign_eof
RENEGOTIATING → il server sta rinegoziando la sessione TLS (TLS 1.2)
stessa soluzione → -quiet o -ign_eof
DONE → connessione chiusa dal serverPerché -quiet risolve KEYUPDATE#
Senza -quiet:
password mandata → server risponde → openssl intercetta
messaggio KEYUPDATE
e lo gestisce internamente
→ tu non vedi la risposta
Con -quiet (include -ign_eof):
password mandata → server risponde → output passa direttamente
al tuo terminale
→ vedi la rispostaCombinazioni utili#
# Pipe con -quiet — manda password e aspetta risposta
echo "password" | openssl s_client -connect localhost:31790 -quiet
# Solo -ign_eof — stesso effetto, più verboso sull'output certificato
echo "password" | openssl s_client -connect localhost:31790 -ign_eof
# Interattivo — scrivi la password a mano
openssl s_client -connect localhost:31790 -quietPipeline complete#
# Solo la data di scadenza
echo | openssl s_client -connect github.com:443 2>/dev/null \
| openssl x509 -noout -dates
# Subject + Issuer + scadenza
openssl s_client -connect github.com:443 </dev/null 2>/dev/null \
| openssl x509 -noout -text \
| grep -E "Subject|Issuer|Not After"
# Catena CA completa
openssl s_client -connect github.com:443 -showcerts
# Verifica PFS — cerca "New" o "Reused"
echo | openssl s_client -connect github.com:443 2>/dev/null \
| grep -E "^New|^Reused"Come leggere l'output — campi chiave:
depth=2 → Root CA
depth=1 → Intermediate CA
depth=0 → Certificato del sito
s: → subject (chi è)
i: → issuer (chi l'ha firmato)
pattern: i: di ogni livello = s: del livello sopra
New, TLSv1.3 → chiavi effimere, PFS attiva
Reused, TLSv1.3 → chiavi riciclate, PFS non attivaScenario Reale#
Un analista SOC verifica che un servizio interno esponga TLS correttamente e non accetti connessioni plaintext. Usa openssl s_client -connect server.interno:443 per ispezionare il certificato, la versione TLS negoziata e la cipher suite. Se il server risponde con TLS 1.0 o 1.1 — versioni deprecate — è una vulnerabilità da segnalare.
Dove l'ho usato#
- bandit-15 — invio password su connessione SSL a localhost:30001
- bandit-16 — discovery porta SSL corretta nel range 31000-32000


