
Wake up, Neo…
The Matrix has you…
Follow the white rabbit.
Knock, knock, Neo.
Начало фильма «Матрица» выглядело со всех сторон шикарно. У главного героя внезапно оживает экран и сообщает: жизнь не будет прежней. Томас Андерсон явно не ждал такого поворота событий и посчитал, что компьютер был взломан. На самом деле такое общение с помощью терминала, без централизованных серверов — повседневная реальность многих хакеров.
Прямое зашифрованное соединение — то, что нужно для передаваемых данных, которые следует держать в секрете. Есть, конечно, SSH, но сам по себе это только способ подключения, без интерфейса для общения. Конечно, можно создавать файлы и писать в них что-либо, но это неудобно. К тому же SSH подходит, если вы доверяете собеседнику. Для прочих случаев можно воспользоваться Cryptcat или его аналогами. О них и поговорим сегодня.
Netcat (aka Swiss army knife)

Древняя Unix-утилита, позволяющая устанавливать TCP/UDP-соединения, принимать и отправлять в них любые данные. Она удачно вписалась в экосистему ОС того времени, позволяя выполнять отладку сетевых соединений и протоколов, но при этом не стала стандартом. Хакеры полюбили ее за возможность сканировать порты, проверять службы на удаленных серверах и даже передавать файлы. Ну а системные администраторы часто делали на ее основе простые сервисы.
Последняя особенность позволяет использовать Netcat в качестве средства общения, установив прямое соединение между компьютерами. Без шифрования это выглядело следующим образом. На первом узле (для примера с адресом 192.168.88.2) выполнялась команда:
$ nc -lp 7777
Узел объявлял себя сервером и начинал ждать подключения на порту 7777. Любой другой компьютер брал роль клиента:
$ nc 192.168.88.2 7777
Теперь все, что вводилось в терминале, отображалось для обоих узлов. Вот только такое соединение было никак не защищено, поэтому клиенту имело смысл подключаться через SSH:
$ ssh -fN -L 7777:127.0.0.1:7777 user@192.168.88.2
Для закрытия туннеля можно найти SSH и завершить его:
$ pkill -f "ssh.*7777:127.0.0.1:7777"
Или действовать чуть иначе, прибив процесс, использующий порт 7777:
$ kill $(lsof -t -i:7777)

Socat
Чуть более продвинутым способом организовать чат между двумя Linux-машинами будет приложение socat. Для начала на первом узле сгенерируем самоподписанный сертификат SSL с помощью криптографического алгоритма RSA с длиной ключа 4096 бит и сроком действия 1 год:
$ openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
Объявляем себя сервером, ожидающим подключения на порту 7777, шифруя соединение при помощи SSL. Поскольку сертификат «самодельный», проверять его нет смысла, что мы и указываем опцией verify=0:
$ socat openssl-listen:7777,cert=cert.pem,key=key.pem,verify=0 -
На клиенте достаточно запустить команду:
$ socat - openssl-connect:192.168.88.2:7777,verify=0
Зашифрованный чат готов. Когда любой из узлов прервет выполнение socat, соединение будет закрыто.
Ncat

Тот же самый Netcat, но лучше, ведь поддерживает SSL. Его разработали для проекта Nmap, и в нем можно организовать приватное соединение без дополнительных телодвижений. На первом узле выполняете команду:
$ ncat --ssl -l 7777
Ncat сам сгенерирует самоподписанный сертификат и запустит сервер на указанном порту. Клиенту будет достаточно подключиться, также добавив опцию --ssl:
$ ncat --ssl 192.168.88.2 7777
Cryptcat
Еще одно полезное приложение, входящее в стандартную поставку Kali Linux. Оно позволяет без проблем установить зашифрованное соединение между двумя компьютерами, на которых оно запущено. При этом Cryptcat можно использовать и в качестве бэкенда для других приложений или скриптов.
По факту Cryptcat — это обычный Netcat c поддержкой шифрования Twofish «из коробки». Запуск на узле очень прост:
$ cryptcat -l -p 7777 -k verystrongpassword
Опция -l стартует сервис, -p 7777 указывает порт, а -k дает возможность задать пароль для шифрования соединения. Другая сторона должна его ввести, чтобы подключиться:
$ cryptcat 192.168.88.2 7777 -k verystrongpassword
Вышеперечисленные способы хороши тем, что их легко проверить с помощью сниффера. Если данные между узлами перехвачены, то их расшифровка будет нецелесообразна, ведь займет слишком много времени и ресурсов.
GnuPG

Даже с помощью публичных сервисов можно достичь высокого уровня приватности, используя GnuPG. Зашифрованные сообщения могут быть переданы в открытом виде, но прочитать содержимое сможет только его адресат. Сначала потребуется обменяться с собеседником публичными ключами.
Нужно создать собственную пару ключей. Приватный храните в тайне. Публичный может быть передан другим пользователям:
$ gpg --gen-key
Введите желаемое имя, адрес электронной почты и создайте парольную фразу. Приложение сгенерирует нужную пару. Экспортируйте публичный ключ и поделитесь им с собеседником:
$ gpg --armor --export mail@example.com > public.key
Тот, в свою очередь, полученный ключ импортирует себе в систему:
$ gpg --import public.key
Теперь он должен выполнить ту же самую операцию и уже вам предоставить свой публичный ключ. Как только вы импортируете его, появится возможность обмена зашифрованными сообщениями.
$ echo "Привет, Хабр" | gpg --encrypt --armor -r mail@example.com > encrypted.txt
Где mail@example.com — адрес электронной почты получателя. На выходе будет файл с содержимым вроде:
-----BEGIN PGP MESSAGE-----
hQGMAxuUBJBl8hA7AQv+N058MF7CBkoA+SLXip29UdbnSrU2ahYeJpgUsp6RdxbU
WDx7bnMyAt4Bg5qtnsc0pnsqg4cnpyh7ywp0GDaSONB0mJ0TOyQUYoG6yrWODL/z
acbSE9neoyWlfp1IkcAM3sSsxNJ/h7NrQ22JohMpO1eYW1O1fW+Of1ekK2QiPffg
3JB5fWa5m9N5dKtKKXZHOI+XJisxIzsizpPwQJ47372ly6Jn/9QLIOYbGny2I3AP
vlvg2kdOsPRkJCRKJjxzNJuvR4kTW8oxhve/AATzhIFWr4ut8PVbgoL8U3OtTTTC
U8iKlFN9YRysLx5YCzA73LA7MWNAdNuKmi/OEoTcq2mctYW7o+t2DedA6iB7eUs8
36me1aWziinQ8BTKWvAEDJmq4ji8MgjtW4kwSQAKk6u1M80EE2CWlYThVgUeRrvO
4q5WAlIdGJU6cuC52Psptlfk72ZbF9/wu9pbSx+J2iIirjuLZR9zRtjVqfZ5klPT
JNqN+CaVvJiGXHwFGlJV0lYBaZ98c1BUw9dtfy6PR9fZzkecB3tM3w6G8QTg2DAH
xURBG4pQN3Mfko0hA3Vx0ys5zMtLgEId8Lpum34byTM0Z05IqONMJWHzxX/FjpiK
6Sfs+ySYrQ==
=2xiq
-----END PGP MESSAGE-----
Его можно передать в виде файла или открытым текстом в любом мессенджере. Другая сторона для расшифровки должна будет выполнить команду и указать парольную фразу.
Если собеседник прислал файл encrypted.txt, то:
$ gpg --decrypt encrypted.txt
Ну а если текстом, то:
$ echo "Полученный зашифрованный текст" | gpg --decrypt
Результатом будет сообщение:
gpg: encrypted with 3072-bit RSA key, ID 1B94149065F2103B, created 2025-04-06
"Vasya Pupkin <vasya@gmail.com>"
Привет, Хабр!
С одной стороны, такая система кажется сложной и неудобной. С другой — она может гарантировать то, что никто посторонний не расшифрует сообщение за разумные сроки.
А как из этого сделать чат? Предположим, вы с собеседником подключены к одному XMPP-серверу. Часть консольных клиентов, таких как Profanity, MCabber или CenterIM «из коробки», умеют использовать GPG/PGP-шифрование, убирая необходимость вручную вызывать соответствующую утилиту.
Правда, следует помнить: содержимое сообщений останется приватным, но вот метаданные (такие как время, получатель и отправитель) будут видимыми для сервера. В некоторых случаях есть смысл поднять собственный XMPP таким образом, чтобы он не вел логи, и предпринять иные меры по сохранению анонимности пользователей.
Что выбрать?
Каждый из описанных выше способов имеет свои преимущества. Netcat прост в использовании и чаще всего не требует установки. Если вы пользуетесь любым современным дистрибутивом Linux, то он у вас уже есть. Socat может работать с SSL-соединениями и умеет на деле значительно больше.
Ncat возводит простоту использования в абсолют, обеспечивая безопасность и удобство. Cryptcat уже давно применяется пентестерами и хакерами разных стран мира. Ну а GnuPG позволяет спокойно обмениваться конфиденциальными данными прямо по открытым каналам связи.
А каким способом безопасного обмена сообщениями пользуетесь вы?