sslh
Démultiplexeur de protocole qui permet à SSH, HTTPS, OpenVPN et d'autres protocoles TCP de partager un seul port d'écoute pour contourner les filtres de sortie. Protocol demultiplexer that lets SSH, HTTPS, OpenVPN and other TCP protocols share a single listening port for egress-filter evasion.
↗ https://www.rutschle.net/tech/sslh/README.htmlOverview
sslh inspects the first bytes of an incoming TCP connection and forwards it to the right backend service based on protocol signature — so SSH, HTTPS, OpenVPN, and other protocols can all sit behind the same port (typically 443). For a pentester or red-teamer, this is a handy way to smuggle SSH or a C2 channel through restrictive egress firewalls that only permit outbound 443.
Common Usage
Run in foreground with verbose logging, share port 443 between sshd and an HTTPS server
sslh -F -f -p 0.0.0.0:443 \
--ssh 127.0.0.1:22 \
--tls 127.0.0.1:8443
Config-file driven (preferred for persistent setups)
sslh -F /etc/sslh/sslh.cfg
Foreground, verbose, useful while testing
sslh -f -v -p 0.0.0.0:443 --ssh 127.0.0.1:22 --tls 127.0.0.1:8443
Example config file
# /etc/sslh/sslh.cfg
listen = ( { host = "0.0.0.0"; port = "443"; } );
protocols = (
{ name = "ssh"; host = "localhost"; port = "22"; },
{ name = "tls"; host = "localhost"; port = "8443"; }
);
Red Team Use Case
On a redirector: make SSH C2 pivot and a decoy HTTPS site both reachable on 443, indistinguishable to a passive observer
sslh -F -p 0.0.0.0:443 --ssh 127.0.0.1:22 --tls 127.0.0.1:443
Client connects normally — sslh routes based on the ClientHello / SSH banner
ssh -p 443 user@redirector.example.com
Tips
- sslh must bind the shared port itself; move the real HTTPS daemon to an internal port (e.g. 8443).
- Works by peeking at the first packet, so it also supports OpenVPN, tinc, XMPP and a generic “anyprot” fallback.
- Combine with a legitimate-looking decoy site on the TLS branch to blend in with normal 443 traffic during red team ops.
Help / Man page
sslh [-t <n>] [-T] [-p <addr>[:<port>]]... -- protocol <addr>:<port>...
-f, --foreground Run in foreground (default: daemonize)
-F, --config=file Use configuration file
-p, --listen=addr Address and port to listen on (repeatable)
-u, --user=username Setuid to username after binding
--ssh=addr:port Forward SSH connections
--tls=addr:port Forward TLS/HTTPS connections
--openvpn=addr:port Forward OpenVPN connections
--anyprot=addr:port Default fallback for unrecognized protocols
-v, --verbose Increase verbosity
-V, --version Print version
--pidfile=file Write PID to file
Vue d’ensemble
sslh inspecte les premiers octets d’une connexion TCP entrante et la transmet au bon service backend selon la signature de protocole : ainsi SSH, HTTPS, OpenVPN et d’autres protocoles peuvent tous se trouver derrière le même port (typiquement 443). Pour un pentester ou un red teamer, c’est un moyen pratique de faire passer un SSH ou un canal C2 à travers des pare-feux de sortie restrictifs qui n’autorisent que le port 443 en sortant.
Utilisation courante
# Lancer au premier plan avec logs verbeux, partager le port 443 entre sshd et un serveur HTTPS
sslh -F -f -p 0.0.0.0:443 \
--ssh 127.0.0.1:22 \
--tls 127.0.0.1:8443
# Piloté par fichier de config (préféré pour les configurations persistantes)
sslh -F /etc/sslh/sslh.cfg
# Premier plan, verbeux, utile pendant les tests
sslh -f -v -p 0.0.0.0:443 --ssh 127.0.0.1:22 --tls 127.0.0.1:8443
Exemple de fichier de configuration
# /etc/sslh/sslh.cfg
listen = ( { host = "0.0.0.0"; port = "443"; } );
protocols = (
{ name = "ssh"; host = "localhost"; port = "22"; },
{ name = "tls"; host = "localhost"; port = "8443"; }
);
Cas d’usage red team
# Sur un redirecteur : rendre le pivot C2 SSH et un site HTTPS leurre tous deux accessibles sur le 443, indiscernables pour un observateur passif
sslh -F -p 0.0.0.0:443 --ssh 127.0.0.1:22 --tls 127.0.0.1:443
# Le client se connecte normalement : sslh route selon le ClientHello / la bannière SSH
ssh -p 443 user@redirector.example.com
Conseils
- sslh doit lui-même se lier au port partagé ; déplacer le vrai daemon HTTPS vers un port interne (ex. 8443)
- Fonctionne en regardant le premier paquet, donc il supporte aussi OpenVPN, tinc, XMPP et un fallback générique “anyprot”
- Combiner avec un site leurre à l’apparence légitime sur la branche TLS pour se fondre dans le trafic 443 normal pendant des opérations red team
Aide / Page de manuel
sslh [-t <n>] [-T] [-p <addr>[:<port>]]... -- protocol <addr>:<port>...
-f, --foreground Run in foreground (default: daemonize)
-F, --config=file Use configuration file
-p, --listen=addr Address and port to listen on (repeatable)
-u, --user=username Setuid to username after binding
--ssh=addr:port Forward SSH connections
--tls=addr:port Forward TLS/HTTPS connections
--openvpn=addr:port Forward OpenVPN connections
--anyprot=addr:port Default fallback for unrecognized protocols
-v, --verbose Increase verbosity
-V, --version Print version
--pidfile=file Write PID to file