Skip to main content
  1. Comandi/

Openssl S_Client

·4 mins
Alessio Barnini
Author
Alessio Barnini
Table of Contents

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
#

ComandoFlagSignificato flagCosa fa
openssl s_client -connect localhost:30001Connessione TLS base, mostra tutto l'output del certificato
openssl s_client -connect host:porta -quiet-quietsilenzia output certificatoNasconde info certificato, abilita -ign_eof implicitamente
openssl s_client -connect host:porta -ign_eof-ign_eofignore end of fileNon chiude la connessione quando la pipe finisce — aspetta la risposta del server
echo "password" | openssl s_client -connect host:porta -quietManda 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:

ComandoCosa faNota
QChiude la connessione
RRinegozia la sessione TLSSolo TLS 1.2 e precedenti
keyupAggiorna le chiavi di cifraturaSolo TLS 1.3
keyup reqAggiorna le chiavi e chiede al server di fare lo stessoSolo TLS 1.3
keyup noreqAggiorna le chiavi senza richiedere aggiornamento al serverSolo 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 server

Perché -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 risposta

Combinazioni 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 -quiet

Pipeline 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 attiva

Scenario 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

Collegato a
#

  • crypto — categoria
  • openssl — tool genitore
  • netcat — alternativa plaintext, stessa logica senza cifratura
  • ssl-tls — il protocollo che s_client implementa
  • nmap — usato insieme per discovery porte SSL

Related