← retour aux outils back to tools

# 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.html

## Overview

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