Как стать автором
Обновить
2390.03
МТС
Про жизнь и развитие в IT

Чат в терминале Linux: почти «Матрица» в реальной жизни

Время на прочтение5 мин
Количество просмотров16K

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 позволяет спокойно обмениваться конфиденциальными данными прямо по открытым каналам связи.

А каким способом безопасного обмена сообщениями пользуетесь вы?

Теги:
Хабы:
+55
Комментарии28

Полезные ссылки

Обходим подводные камни работы с UDA в коде на Lua для ScyllaDB: дружим Java-драйвер и пустые значения

Уровень сложностиСредний
Время на прочтение5 мин
Количество просмотров248
Всего голосов 5: ↑5 и ↓0+10
Комментарии0

Пайплайн распознавания номеров транспортных средств: как это устроено

Время на прочтение7 мин
Количество просмотров1.8K
Всего голосов 23: ↑22 и ↓1+25
Комментарии1

Интеграция виджета обратного звонка МТС Exolve в документацию на MkDocs

Время на прочтение8 мин
Количество просмотров385
Всего голосов 5: ↑5 и ↓0+7
Комментарии0

Путь видео в онлайн-кинотеатрах от «стекла до стекла». Middleware — ядро, подписки, сервисы, витрина

Уровень сложностиПростой
Время на прочтение7 мин
Количество просмотров703
Всего голосов 4: ↑3 и ↓1+4
Комментарии0

Приручая хаос: как структурировать процессы в эксплуатационных командах. Кейс МТС

Время на прочтение6 мин
Количество просмотров681
Всего голосов 3: ↑3 и ↓0+4
Комментарии0

Информация

Сайт
www.mts.ru
Дата регистрации
Дата основания
Численность
свыше 10 000 человек
Местоположение
Россия