Пожалуйста, обратите внимание, что пользователь заблокирован
Всем снова здравствуйте на вновь ожившем, как и ожидалось, форуме. И хочу представить статью из будущей серии статей про возможности и трюки с различным ПО и посвященную безопасности сетевой передачи данных. Эта статья разбита на три относительно небольшие части. В первой части нашей статьи мы познакомимся со второй группой - утилитами сетевой связи, такими как Socat, netcat (nc), и опять же OpenSSL, а во второй рассмотрим и опишем используемые в статье группы инструментов, а точнее это первая группа - системы шифрования данных, такие как OpenSSL (openssl), GnuPG (pgp/gpg), Age (age), и да, как шифровальные утилиты тоже умеют транспортирование данных, так же в свою очередь и транспортные умеют шифрование. Третью часть мы посвятим набору релеватных обсуждаемой теме готовых к использованию примеров, приведем их для тех, кому в дальнешем они могут пригодиться в качестве полезной шпаргалки. Ведь ни для кого не секрет, что при передачи данных по сетям общего пользования их могут легко перехватить. Кто, как и зачем может это сделать-вопрос риторический и в статье не обсуждается, целью данной обзорной статьи, как мы уже говорили, является чисто технический аспект. А значит нам надо сделать так, чтобы данные защитить, в данном случае подвергнуть зашифровыванию. Кстати говоря, терминология имеет большое значение, а потому обращаю особое внимание читателя на то, что данные именно зашифровывают, а не кодируют и даже не просто шифруют, а так же расшифровывают, а не дешифруют, дешифрованием принято называть процесс взлома шифра, например методом перебора, для специалиста такое понимание и применение профессиональных обозначений является ключевым.
Наверное, давайте приступим.
Часть 1. Сетевое туннелирование.
Приступим к изучению относительно краткого введения в используемые в статье утилиты сетевой связи: Netcat (nc), socat, OpenSSL. Насколько это возможно разумеется для полноценного понимания их функционала.
Openssl - да, вы верно поняли, помимо ее основной функции работы с алгоритмами шифрования и цифровых подписей данная утилита имеет так же собственные возможности установления сетевых соединений и передачи по ним данных. Для этого используются ее внутренние функции s_client и s_server.
Netcat (nc) - Наверное самая известная программа для командной строки терминала для организации сетевых туннелей между двумя хостами. Умеет быть как сервером, принимающим соединения, так и клиентом, их устанавливающим, осуществляя связь как между экземплярами самой программы, так и между сокетами различных служб и сервисов.
Socat (socat) - Сильно расширенный, намного более мощный аналог вышеупомянутого netcat. Socat как и netcat действует по принципу точка-точка и реализует двустороннюю передачу данных между двумя различными каналами данных, но при этом в отличие от более примитивного аналога умеет связывать между собой такие объектами как сокеты udp, tcp, unix, ip обеих версий, raw-сокеты, терминалы и псевдотерминалы, файловые дескрипторы, в том числе в контексте приложений и других комбинаций, соединяя эти объекты между собой. Применяется он в основном для тунеллирования оконечных tcp и udp соединений между парой и более хостов, а в случае многозвенной архитектуры подключений через сети tcp/ip в том числе с целью проброса и перенаправления точек входа для сетевых сервисов, либо с целью использования их в качестве socks/proxy служб почти любых сетевых протоколов.
Для детального знакомства с данными решениями, как и в случае с инструментами шифрования, настоятельно рекомендую изучить официальную документацию и мануалы (man) по их использованию. Хотя, исходя из небольшого числа примеров, которые продемонстрированы в статье, основная суть работы и предназначение данных решений будет понятна уже после прочтения этой статьи.
И приступим уже к рассмотрению вариантов применения перечня упомянутых инструментов по отдельности. Для этого мы приведем по несколько практических рабочих примеров применения каждого из них на практике в различных вариантах с целью формирования у читателя общего представления того, какие невероятные мощь, гибкость и потенциал скрываются в некоторых малоизвестных, либо же малоизученных готовых продуктах и решениях.
Манипулируем данными при помощи socat:
Без применения шифрования:
Пример 1. Отправка файла по сети:
Необходимое пояснение: В данном примере мы приготовили к отправке файл на сервере через слушающее tcp соединение на порту 8000. Клиент, в свою очередь устанавливает связь с сервером и забирает файл, выдавая его содержимое на стандартный вывод. Из контекста приведенных команд все вполне очевидно. Единственное уточнение это параметр -u, означающий передачу данных только в одну сторону. Тоесть, в примере ниже STDIN умеет исключительно читать данные, в то время как STDOUT только пишет на стандарт вывод:
Пример 2. Делаем миним VPN:
Необходимое пояснение: Здесь мы видим что на обоих концах соединения, в случае его инициирования, создаются виртуальные tun интерфейсы и трафик между хостами бегает как и в случае реализации полноценного VPN, разве что без дальнейшей маршрутизации. Двойной патеметр -d -d включает режим отладки. Каждый -d увеличивает уровень отладки, что позволяет выводить больше информации о том, что происходит в процессе установления соеднения и передачи данных. В продакшене лучше эти параметры не использовать.
Пример 3. Перенаправляем ssh.
Необходимое пояснение: Конкретные параметры и направление трафика можно выбирать как угодно.
Пример 4. Прокси.
Необходимое пояснение: Функция проксификации у socat тоже имеется и возможности ее весьма обширны.
Пример 5. Используем socat для запуска удаленной оболочки и выполнения в ней команд:
С шифрованием:
Пример 1.
Необходимое пояснение: Отправка файла по сети без явного указания ключей и сертификатов. В данном случае симметричный механизм шифрования активируется автоматически. Параметр reuseaddr позволяет повторно использовать адрес, что полезно, если предыдущая сессия socat была завершена, но порт все еще считается занятым операционной системой. Это предотвращает ошибку повторного использования уже занятого адреса. А параметр fork заставляет socat создавать новый процесс для каждого входящего соединения, при этом основной процесс продолжает прослушивать нужный порт. Вобщем-то почти обычный форк сетевого фонового процесса-)
Пример 2.
Необходимое пояснение: Здесь уже перенаправляем стандартные потоки ввода-вывода, но с явным указанием ключа и сертификата слушающего хоста, который предварительно и генерируем на серверной стороне. Параметр verify=0 обозначает команду на отмену проверки сертификата клиента серверной стороной. Обойдемся и в этот раз без разбора алгоритмов шифрования. Все это можно изучить в документации к алгоритмам и применяемому инструменту. Да, кстати, параметр OPENSSL в данном случае фактически является аналогом OPENSSL-CONNECT.
Пример 3.
Необходимое пояснение: Из контекста вполне себе видно, что отдаем эхо с сервера на стандартный вывод подключающегося клиента. STDIO - поток стандартного ввода, соответственно Команда SYSTEM в socat запускает внешний процесс и в рассматриваемом примере при подключении клиента будет автоматически запущена команда echo на стороне сервера. В части защиты ассиметричное шифрование и взаимную аутентификацию оконечных точек. С ключами тут все по аналогии с примером выше, за исплючением того, что обмен ключами и сертификатами и взаимные проверки производятся в обе стороны. При необходимости или по желанию возможно использования параметра verify с более строгими установками на проверку ключей, подписей и сертификатов. Всего таких уровня четыре, от 0 до 3 включительно. Более подробную информацию можно узнать в документации.
Пример 4. Запускаем командную оболочку bash удаленно.
Необходимое пояснение: В данном примере применяем двухстороннее шифрование с аутентификацией и взаимной проверкой подписанных сертификатов с использованием собственного удостоверяющего центра CA. Как провернуть вопрос с созданием ключей, сертификатов и их последующим подписыванием, довольно подробно описано в разделе статьи, посвященному шифрованию.
Пример 5. Другой вариант запуска bash.
Необходимое пояснение: Делаем подключение к серверу по udp на порт 4455 сначала без шифрования, но с перенаправлением через tcp/ssl соединение на порт 4433 и уже с шифрованием. Затем производится вывод потоков выполнения посредством командной оболочки bash. Вобщем-то банальный аналог reverse shell(как и в предыдущем примере), но с целым рядом дополнительных возможностей и невероятной гибкостью различных настроек.
Пример 6.Тут просто зашифровываем файл а клиенте и переправляем на сервер через socat с использованием стандартного конвеера unix и затем на сервере расшифровываем.
Необходимое пояснение: Параметр --recipient user_of@key_id.com в gpg указывает пользователя ключа, который до этого должен быть сгенерирован в локальной системе GnuPG на машине клиента. Вспоминаем команду gpg --list-keys
Работаем с netcat для проброса соединений и пересылки данных:
Пример 1. Ведем обмен сообщениями открытым текстом. Без шифрования.
Необходимое пояснение: Это вероятно самый простой, всем известный и традиционный пример применения данной программы, понятный из контекста.
Пример 2. Традиционно переправляем файл с хоста на хост. Одна сторона слушает, другая подключается. Производится обмен с перенаправлением данных в файлы на обоих хостах. Так же ничего не шифруется:
Пример 3. Делаем простой get запрос на http порт любого web-сервера, в данном случае google:
Пример 4. Запускаем bash на стороне сервера и наслаждаемся. Интересный вариант, в очередной раз демонстрирующий огромную мощь unix-подобных операционных систем:
Делаем так, чтобы пробросить с сервера на клиент оболочку bash. Пробросить естественно можете практически все что угодно, любую команду либо ее поток данных.
Можно вот так, с добавлением шифрования через openssl(или gpg, при желании или возможностях):
Необходимое пояснение: В данном примере мы применяем возможность операционной системы инициировать сетевое соединение напрямую из представленных ядром в виде драйвера внутрь дерева файловой системы структур сетевой подсистемы ядра. Так же производим перенаправление потоков данных внутри системы посредством стандартных дескрипторов ввода и вывода. Классика.
Пример 4. Примерно то же самое что и в предыдущем случае, но здесь мы для перенаправления используем собственные дескрипторы конвеерного типа.
Пример 5. Проброс портов совместными усилиями netcat и ssh-)
Пример 6. Шифруем туннель с силами GnuPG(gpg):
Пример 7. Проброс соединения через прозрачный прокси к локальному web-серверу(на том же хосте что и прокси):
Необходимое пояснение: Так вполне удобно прятать сервер за прокси.
Пример 8. Примитивный сканер портов:
Поглядим ка что умеет делать openssl в области туннелирования:
Пример 1. Симметричное шифрование:
Необходимое пояснение: Openssl умеет быть статическим web-сервером. При использовании параметра -www OpenSSL создает простую HTML-страницу, которая содержит информацию о сервере и его состоянии.
Пример 2. Асимметричое шифрование с ключом и сертификатом:
Необходимое пояснение: Параметр quiet подавляет вывод служебной информации.
Пример 3. Обмен неинтерактивными данными.
Пример 4. Еще один вариант с подключением утилиты netcat для перенаправления трафика по цепочке.
Необходимое пояснение: В подобных комбинациях вместо netcat соответственно можно задействовать любые сетевые приложения. Выбор конкретной утилиты был сделан исключительно в качестве демнстрации возможностей и для примера, а так же потому как в статье рассматривается именно она как один из представленных инструментов взаимодействия.
Пример 5. OpenSSL позволяет точно настраивать алгоритмы шифрования и протоколы:
Необходимое пояснение: -cipher 'HIGH:!aNULL:!eNULL': Этот параметр задает список шифров, которые могут использоваться для установления соединения. - HIGH указывает на использование шифров исключительно с высоким уровнем безопасности. - !aNULL исключает шифры, которые не используют аутентификацию (не требуют проверки сертификатов). -!eNULL исключает применение шифров, которые не обеспечивают шифрование (т.е. передают данные в открытом виде). -tls1_2: указывает на то, что сервер должен использовать протокол tls версии 1.2
Еще несколько простеньких примеров для обзора возможностей:
На этом первая часть статьи подошла к концу, где мы кратенько изучили ряд распространенных систем шифрования и теперь пришло время приступить ко второй части, где мы точжно так же разберем туннелирование, приведя ряд практических примеров.
Часть 2. Шифрование данных и соединений.
Краткое введение в системы шифрования: OpenSSL (openssl), GnuPG (gpg), Age (age)
1. OpenSSL - библиотека, и одновременно программа/утилита для работы с командной строкой которая предназначена для выполнения работы по протоколу SSL. Программа Openssl используется для управления инфраструктурой PKI/SSL, поскольку протокол SSL, в свою очередь, и является реализацией PKI (Public Key Infrastructure, Инфраструктура Открытых Ключей) и как таковой работает непосредственно с сертификатами и в то же время является управляющей оболочкой для большого количества подпрограмм, например таких как enc, ciphers, ca, x509, и многих других. Подробный мануал, как уже говорилось выше не является целью статьи, а потому ограничимся лишь основными командами получения информации о программе.
Начнем с команд для получения сводной информации по подпрограммам и параметрам OpenSSL:
Теперь перейдем непосредственно к процессу шифрования:
Cимметричное шифрование:
Необходимое пояснение: Первая команда зашифровывает, вторая расшифровывает. -aes256-cbc указывает на применяемый алгоритм шифрования: aes256 с режимом работы шифра cbc. Это когда каждый блок данных шифруется с учетом предыдущего. -base64 указывает на то, что выходные данные будут закодированы в формате base64, что бывает полезно для передачи бинарных данных в текстовом формате, так как base64 представляет собой бинарные данные в виде asc-ii символов. -salt - это так называемая "соль", которая добавляется к паролю перед его хешированием, что помогает предотвратить некоторые вида атак непосредственно на алгоритмы шифрования.
Асимметриченое шифрование:
Для начала покажем несколько способов генерации ключей и сертификатов сторон взаимодействия, так как вариантов может быть несколько, в зависимости от задачи и результата который планируется получит.
Этап генерации ключей:
Вариант 1. Генерация простой пары ключей:
Необходимое пояснение: Параметр -rand /dev/urandom: указывает на источник случайных данных для генерации ключа. В данном конкретном случае мы используем системный файл linux: /dev/urandom, являющийся специальным файлом в юниксподобных системах, который предоставляет доступ к генератору случайных чисел на основе внутренней энтропии операционной системы, хотя и не стоит полагаться на внутренню энтропию в полной мере, поскольку они имеет ограничения и при определенных обстоятельствах вполне может быть точно так же перехвачена и расшифрована.
Вариант 2. Создание приватного ключа и на его основе самодписанного сертификата.
Необходимое пояснение: x509 - данный параметр указывает, что создается самоподписанный сертификат X.509.
Вариант 3. Создание ключей и сертификатов клиента, сервера и удостоверяющего центра с подписыванием клиентского сертификата удостоверяющим центром:
Необходимое пояснение: -newkey указывает, что вы хотите создать новый закрытый ключ. rsa:2048 означает что RSA-ключ должен быть длиной 2048 бит.
Зашифровывание и расшифровка:
Ну вот мы вкратце пробежались по основам функциональных возможностей наимощнейшей программы openssl, но настоящие ее возможности весьма широки и для полноценного понимания всех принципов ее работы нужно как следует изучить официальную документацию к данному решению. Кроме того, не стоит забывать о том, что openssl это далеко не только команда предназначенная для выполнения в терминале, но и библиотека функций шифрования, которая может выступать в качестве api интерфейса для применения этих функций ваших собственных приложений.
2. GnuPG, а конкретно в статье будет рассматриваться GPG - это еще один альтернативный OpenSSL программный криптографический пакет шифрования заменяющий более старую реализацию этого продукта под названием PGP. GnuPG точно так же как OpenSSL состоит из набора программ и библиотек, однако нас будет интересовать только консольная программа gpg. GnuPG реализует стандарты OpenPGP и предоставляет инструменты для шифрования и подписи данных. Пакет содержит почти все те же алгоритмы шифрования, что и OpenSSL, но имеет принципиально другую архитектурный шаблон.
Подробно описывать принцип работы и писать инструкцию по командам не буду, для этого есть большое количетсво документации и статей в публичной сети, но краткую справочную информацию по программному пакету все-таки приведу:
Как и в случае с OpenSSL, существует два варианта шифрования, симметричное и асимметричное.
Симметричное шифрование:
Необходимое пояснение: Симметричное шифрование использует один и тот же ключ для шифрования и расшифрования данных. OpenSSL поддерживает несколько алгоритмов симметричного шифрования, таких как AES, DES и Blowfish.
Асимметриченое шифрование:
Генерации ключей сторон взаимодействия:
Получаем информацию по имеющимся(созданным или импортированным) в системе gpg ключам, а так же их импорт и экспорт:
Непосредственно сам процесс шифрования:
Необходимое пояснение: В примерах выше все предельно просто и понятно, даже чисто интуитивно, но пояснения по некоторым параметрам все-таки придется дать. Например, при помощи --edit-key например можно временно активировать или деактивировать действие любого ключа либо изменить другие параметры. --no-symkey-cache указывает gpg не использовать кэш для симметричных ключей, что в некоторых случаях позволяет избежать попыток системы применить в операциях шифрования закешированных в памяти некорректных ключей, особенно когда нужно работать одновременно с различными ключами. --try-all-secrets указывает gpg попытаться использовать все доступные секретные ключи для расшифровки данных. Это может быть весьма полезно в том случае, если вы не уверены, какой именно ключ был использован для шифрования и о многих других интересных случаях, перечень которых ограничен лишь фантазией. Странный набор цифр и символов 65737003840E73FE9E279B32559198F2B489C808 указывает на идентификатор ключа, хотя чаще всего для идентификации используется тип записи в виде электронной почты.
3. Gpg вроде бы рассмотрели. Давайте перейдем к еще одной интересной утилите под названием age. Это максимально простой и удобный инструмент для шифрования, придуманный энтузиастами с целью упростить процесс использования в реализации простых операций по зашифровыванию и расшифрованию данных по сравнению с openssl и gpg.
И опять два варианта.
Симметричное шифрование:
Пояснение: Тут все предельно понятно и дополнительных пояснений не требуется.
Ассиметричное шифрование:
Необходимое пояснение: Тут так же все довольно просто. Первая команда создаст разом пару ключей при помощи одной операции. Вторая и третья команды зашифровывает и расшифровывает. Все выглядит стандартно и легко в использовании.
4. И наконец, маленький зверек под названием ccrypt - еще более простой вариант программы шифрования данных, вот правда умеет он только симметрию:
Необходимое пояснение: С данной утилитой все еще проще, но она по умолчанию не умеет ассиметричное шифрование, только симметрию.
На этом мы заканчиваем повествовение второй части нашей статьи и мы завершили рассмотрение нескольких распространенных систем шифрования данных и теперь пришло время приступить к третьей, заключительной части где покажем дополнительные примеры(в контексте нашей тематики) в чисто практических случаях применения, и которые, как я уже упоминял в самом начале - могут быть вам полезными в качестве шпаргалки в различных ситуациях. Хотя рассматриваемые утилиты и позиционируются изначально для применения в unix и описываются на примерах в рамках непосредственно linux, однако же почти все они имеют реализации или аналоги для работы в других системах, в том числе в macos и windows, при определных обстоятельствах конечно, например если будут установлены все необходимые программы и окружения.
Часть 3. Различные примеры обратные шеллы. Сборник-шпаргалка.
Тут мы с вами просто приведем сборник готовых к употреблению примеров обратных шеллов(сетевых) списоком в виде шпаргалки, разделив примеры по каждому из вариантов(видов) применяемых инструментов(технологий):
Реверсные соединения, настроенные при помощи PHP:
Варианты для командной строки терминала:
Помимо использование дескриптора 3, или если его применение в конкретном случае по какой-либо причине(например его занятости) не представляется возможным, - вы можете использовать другие идентификаторы, такие как 4, 5, итд.
Подходит для встраивания тегами в php-скрипты, там где это возможно и целесообразно:
Можно попробовать сгенерировать готовый вариант при помощи metasploit:
Юзаем Python:
Способы организации связи в Linux:
Варианты с использованием адресов протокола и формата IPv4 (стандартный, полный вариант с пробельными символами):
Варианты так же для IPv4 (стандартный, но уже без пробелов):
При необходимости вышеприведенный код можно значительно оптимизировать и сократить, например с целью более компактного размещения в шеллкодах или для других целей, но мы не станем растягивать текст статьи до бесконечности.
На этом мы закончим третью часть статьи, приведя список обратных шеллов с использованием лишь нескольких популярных скриптовых языков чисто для демонстрации их возможностей, а также возможностей операционных систем и сетевых протоколов, тогда как могли продолжать этот перечень и на другие широко известные инструменты, но оставим это на долю читателя, либо же сделаем это в будущих публикациях, если это будет целесообразно и если подходящим образом сложится общая ситуация.
Вот и пришло время подошло время подвести итог нашего обзора. В данной статье была произведена попытка описать серьезные и часто почти безграничные возможности(в определенном смысле) широко известных, но обычно мало изученных большинством пользователей инструментов. Таких как системы(и одновременно библиотеки) шифрования openssl и openpgp, или же утилиты связи socat и netcat, но помимо этого мы показали и архитектурный потенциал операционных систем семейства unix в части наличия большого количества альтернатив для решения узкоспециализированных задач при работе с такими системами. Отчасти все это является следствием уникальных, и в то же время логично выстроенных и лаконично структурированных системных архитектур семейства unix. Разумеется - совершенно невозможно уложить описание всего спектра возможностей в контекст одной статьи, но основные аспекты возможностей, я надеюсь, получилось с относительным успехом систематизировать и наглядно показать. Приведенные с статье примеры в большинстве случаев представляют из себя рабочие варианты выполнения задач, но при всем при этом и не стоит забывать о том, что от версии к версиям системного и прикладного ПО - нюансы их применения могут существенно меняться и может понадобиться дополнительная настройка конфигураций и параметров. И это необходимо обязательно учитывать в процессе ваших экспериментов.
Спасибо за чтение и заранее за потенциальную критику.
С большой надеждой на хорошее будущее.
Всех благ, и, надеюсь, до новых встреч.
Автор sysbot: /members/435655/Наверное, давайте приступим.
Часть 1. Сетевое туннелирование.
Приступим к изучению относительно краткого введения в используемые в статье утилиты сетевой связи: Netcat (nc), socat, OpenSSL. Насколько это возможно разумеется для полноценного понимания их функционала.
Openssl - да, вы верно поняли, помимо ее основной функции работы с алгоритмами шифрования и цифровых подписей данная утилита имеет так же собственные возможности установления сетевых соединений и передачи по ним данных. Для этого используются ее внутренние функции s_client и s_server.
Netcat (nc) - Наверное самая известная программа для командной строки терминала для организации сетевых туннелей между двумя хостами. Умеет быть как сервером, принимающим соединения, так и клиентом, их устанавливающим, осуществляя связь как между экземплярами самой программы, так и между сокетами различных служб и сервисов.
Socat (socat) - Сильно расширенный, намного более мощный аналог вышеупомянутого netcat. Socat как и netcat действует по принципу точка-точка и реализует двустороннюю передачу данных между двумя различными каналами данных, но при этом в отличие от более примитивного аналога умеет связывать между собой такие объектами как сокеты udp, tcp, unix, ip обеих версий, raw-сокеты, терминалы и псевдотерминалы, файловые дескрипторы, в том числе в контексте приложений и других комбинаций, соединяя эти объекты между собой. Применяется он в основном для тунеллирования оконечных tcp и udp соединений между парой и более хостов, а в случае многозвенной архитектуры подключений через сети tcp/ip в том числе с целью проброса и перенаправления точек входа для сетевых сервисов, либо с целью использования их в качестве socks/proxy служб почти любых сетевых протоколов.
Для детального знакомства с данными решениями, как и в случае с инструментами шифрования, настоятельно рекомендую изучить официальную документацию и мануалы (man) по их использованию. Хотя, исходя из небольшого числа примеров, которые продемонстрированы в статье, основная суть работы и предназначение данных решений будет понятна уже после прочтения этой статьи.
И приступим уже к рассмотрению вариантов применения перечня упомянутых инструментов по отдельности. Для этого мы приведем по несколько практических рабочих примеров применения каждого из них на практике в различных вариантах с целью формирования у читателя общего представления того, какие невероятные мощь, гибкость и потенциал скрываются в некоторых малоизвестных, либо же малоизученных готовых продуктах и решениях.
Манипулируем данными при помощи socat:
Без применения шифрования:
Пример 1. Отправка файла по сети:
Необходимое пояснение: В данном примере мы приготовили к отправке файл на сервере через слушающее tcp соединение на порту 8000. Клиент, в свою очередь устанавливает связь с сервером и забирает файл, выдавая его содержимое на стандартный вывод. Из контекста приведенных команд все вполне очевидно. Единственное уточнение это параметр -u, означающий передачу данных только в одну сторону. Тоесть, в примере ниже STDIN умеет исключительно читать данные, в то время как STDOUT только пишет на стандарт вывод:
Пример 2. Делаем миним VPN:
Необходимое пояснение: Здесь мы видим что на обоих концах соединения, в случае его инициирования, создаются виртуальные tun интерфейсы и трафик между хостами бегает как и в случае реализации полноценного VPN, разве что без дальнейшей маршрутизации. Двойной патеметр -d -d включает режим отладки. Каждый -d увеличивает уровень отладки, что позволяет выводить больше информации о том, что происходит в процессе установления соеднения и передачи данных. В продакшене лучше эти параметры не использовать.
Пример 3. Перенаправляем ssh.
Необходимое пояснение: Конкретные параметры и направление трафика можно выбирать как угодно.
Пример 4. Прокси.
Необходимое пояснение: Функция проксификации у socat тоже имеется и возможности ее весьма обширны.
Пример 5. Используем socat для запуска удаленной оболочки и выполнения в ней команд:
С шифрованием:
Пример 1.
Необходимое пояснение: Отправка файла по сети без явного указания ключей и сертификатов. В данном случае симметричный механизм шифрования активируется автоматически. Параметр reuseaddr позволяет повторно использовать адрес, что полезно, если предыдущая сессия socat была завершена, но порт все еще считается занятым операционной системой. Это предотвращает ошибку повторного использования уже занятого адреса. А параметр fork заставляет socat создавать новый процесс для каждого входящего соединения, при этом основной процесс продолжает прослушивать нужный порт. Вобщем-то почти обычный форк сетевого фонового процесса-)
Пример 2.
Необходимое пояснение: Здесь уже перенаправляем стандартные потоки ввода-вывода, но с явным указанием ключа и сертификата слушающего хоста, который предварительно и генерируем на серверной стороне. Параметр verify=0 обозначает команду на отмену проверки сертификата клиента серверной стороной. Обойдемся и в этот раз без разбора алгоритмов шифрования. Все это можно изучить в документации к алгоритмам и применяемому инструменту. Да, кстати, параметр OPENSSL в данном случае фактически является аналогом OPENSSL-CONNECT.
Пример 3.
Необходимое пояснение: Из контекста вполне себе видно, что отдаем эхо с сервера на стандартный вывод подключающегося клиента. STDIO - поток стандартного ввода, соответственно Команда SYSTEM в socat запускает внешний процесс и в рассматриваемом примере при подключении клиента будет автоматически запущена команда echo на стороне сервера. В части защиты ассиметричное шифрование и взаимную аутентификацию оконечных точек. С ключами тут все по аналогии с примером выше, за исплючением того, что обмен ключами и сертификатами и взаимные проверки производятся в обе стороны. При необходимости или по желанию возможно использования параметра verify с более строгими установками на проверку ключей, подписей и сертификатов. Всего таких уровня четыре, от 0 до 3 включительно. Более подробную информацию можно узнать в документации.
Пример 4. Запускаем командную оболочку bash удаленно.
Необходимое пояснение: В данном примере применяем двухстороннее шифрование с аутентификацией и взаимной проверкой подписанных сертификатов с использованием собственного удостоверяющего центра CA. Как провернуть вопрос с созданием ключей, сертификатов и их последующим подписыванием, довольно подробно описано в разделе статьи, посвященному шифрованию.
Пример 5. Другой вариант запуска bash.
Необходимое пояснение: Делаем подключение к серверу по udp на порт 4455 сначала без шифрования, но с перенаправлением через tcp/ssl соединение на порт 4433 и уже с шифрованием. Затем производится вывод потоков выполнения посредством командной оболочки bash. Вобщем-то банальный аналог reverse shell(как и в предыдущем примере), но с целым рядом дополнительных возможностей и невероятной гибкостью различных настроек.
Пример 6.Тут просто зашифровываем файл а клиенте и переправляем на сервер через socat с использованием стандартного конвеера unix и затем на сервере расшифровываем.
Необходимое пояснение: Параметр --recipient user_of@key_id.com в gpg указывает пользователя ключа, который до этого должен быть сгенерирован в локальной системе GnuPG на машине клиента. Вспоминаем команду gpg --list-keys
Работаем с netcat для проброса соединений и пересылки данных:
Пример 1. Ведем обмен сообщениями открытым текстом. Без шифрования.
Необходимое пояснение: Это вероятно самый простой, всем известный и традиционный пример применения данной программы, понятный из контекста.
Пример 2. Традиционно переправляем файл с хоста на хост. Одна сторона слушает, другая подключается. Производится обмен с перенаправлением данных в файлы на обоих хостах. Так же ничего не шифруется:
Пример 3. Делаем простой get запрос на http порт любого web-сервера, в данном случае google:
Пример 4. Запускаем bash на стороне сервера и наслаждаемся. Интересный вариант, в очередной раз демонстрирующий огромную мощь unix-подобных операционных систем:
Делаем так, чтобы пробросить с сервера на клиент оболочку bash. Пробросить естественно можете практически все что угодно, любую команду либо ее поток данных.
Можно вот так, с добавлением шифрования через openssl(или gpg, при желании или возможностях):
Необходимое пояснение: В данном примере мы применяем возможность операционной системы инициировать сетевое соединение напрямую из представленных ядром в виде драйвера внутрь дерева файловой системы структур сетевой подсистемы ядра. Так же производим перенаправление потоков данных внутри системы посредством стандартных дескрипторов ввода и вывода. Классика.
Пример 4. Примерно то же самое что и в предыдущем случае, но здесь мы для перенаправления используем собственные дескрипторы конвеерного типа.
Пример 5. Проброс портов совместными усилиями netcat и ssh-)
Пример 6. Шифруем туннель с силами GnuPG(gpg):
Пример 7. Проброс соединения через прозрачный прокси к локальному web-серверу(на том же хосте что и прокси):
Необходимое пояснение: Так вполне удобно прятать сервер за прокси.
Пример 8. Примитивный сканер портов:
Поглядим ка что умеет делать openssl в области туннелирования:
Пример 1. Симметричное шифрование:
Необходимое пояснение: Openssl умеет быть статическим web-сервером. При использовании параметра -www OpenSSL создает простую HTML-страницу, которая содержит информацию о сервере и его состоянии.
Пример 2. Асимметричое шифрование с ключом и сертификатом:
Необходимое пояснение: Параметр quiet подавляет вывод служебной информации.
Пример 3. Обмен неинтерактивными данными.
Пример 4. Еще один вариант с подключением утилиты netcat для перенаправления трафика по цепочке.
Необходимое пояснение: В подобных комбинациях вместо netcat соответственно можно задействовать любые сетевые приложения. Выбор конкретной утилиты был сделан исключительно в качестве демнстрации возможностей и для примера, а так же потому как в статье рассматривается именно она как один из представленных инструментов взаимодействия.
Пример 5. OpenSSL позволяет точно настраивать алгоритмы шифрования и протоколы:
Необходимое пояснение: -cipher 'HIGH:!aNULL:!eNULL': Этот параметр задает список шифров, которые могут использоваться для установления соединения. - HIGH указывает на использование шифров исключительно с высоким уровнем безопасности. - !aNULL исключает шифры, которые не используют аутентификацию (не требуют проверки сертификатов). -!eNULL исключает применение шифров, которые не обеспечивают шифрование (т.е. передают данные в открытом виде). -tls1_2: указывает на то, что сервер должен использовать протокол tls версии 1.2
Еще несколько простеньких примеров для обзора возможностей:
На этом первая часть статьи подошла к концу, где мы кратенько изучили ряд распространенных систем шифрования и теперь пришло время приступить ко второй части, где мы точжно так же разберем туннелирование, приведя ряд практических примеров.
Часть 2. Шифрование данных и соединений.
Краткое введение в системы шифрования: OpenSSL (openssl), GnuPG (gpg), Age (age)
1. OpenSSL - библиотека, и одновременно программа/утилита для работы с командной строкой которая предназначена для выполнения работы по протоколу SSL. Программа Openssl используется для управления инфраструктурой PKI/SSL, поскольку протокол SSL, в свою очередь, и является реализацией PKI (Public Key Infrastructure, Инфраструктура Открытых Ключей) и как таковой работает непосредственно с сертификатами и в то же время является управляющей оболочкой для большого количества подпрограмм, например таких как enc, ciphers, ca, x509, и многих других. Подробный мануал, как уже говорилось выше не является целью статьи, а потому ограничимся лишь основными командами получения информации о программе.
Начнем с команд для получения сводной информации по подпрограммам и параметрам OpenSSL:
Теперь перейдем непосредственно к процессу шифрования:
Cимметричное шифрование:
Необходимое пояснение: Первая команда зашифровывает, вторая расшифровывает. -aes256-cbc указывает на применяемый алгоритм шифрования: aes256 с режимом работы шифра cbc. Это когда каждый блок данных шифруется с учетом предыдущего. -base64 указывает на то, что выходные данные будут закодированы в формате base64, что бывает полезно для передачи бинарных данных в текстовом формате, так как base64 представляет собой бинарные данные в виде asc-ii символов. -salt - это так называемая "соль", которая добавляется к паролю перед его хешированием, что помогает предотвратить некоторые вида атак непосредственно на алгоритмы шифрования.
Асимметриченое шифрование:
Для начала покажем несколько способов генерации ключей и сертификатов сторон взаимодействия, так как вариантов может быть несколько, в зависимости от задачи и результата который планируется получит.
Этап генерации ключей:
Вариант 1. Генерация простой пары ключей:
Необходимое пояснение: Параметр -rand /dev/urandom: указывает на источник случайных данных для генерации ключа. В данном конкретном случае мы используем системный файл linux: /dev/urandom, являющийся специальным файлом в юниксподобных системах, который предоставляет доступ к генератору случайных чисел на основе внутренней энтропии операционной системы, хотя и не стоит полагаться на внутренню энтропию в полной мере, поскольку они имеет ограничения и при определенных обстоятельствах вполне может быть точно так же перехвачена и расшифрована.
Вариант 2. Создание приватного ключа и на его основе самодписанного сертификата.
Необходимое пояснение: x509 - данный параметр указывает, что создается самоподписанный сертификат X.509.
Вариант 3. Создание ключей и сертификатов клиента, сервера и удостоверяющего центра с подписыванием клиентского сертификата удостоверяющим центром:
Необходимое пояснение: -newkey указывает, что вы хотите создать новый закрытый ключ. rsa:2048 означает что RSA-ключ должен быть длиной 2048 бит.
Зашифровывание и расшифровка:
Ну вот мы вкратце пробежались по основам функциональных возможностей наимощнейшей программы openssl, но настоящие ее возможности весьма широки и для полноценного понимания всех принципов ее работы нужно как следует изучить официальную документацию к данному решению. Кроме того, не стоит забывать о том, что openssl это далеко не только команда предназначенная для выполнения в терминале, но и библиотека функций шифрования, которая может выступать в качестве api интерфейса для применения этих функций ваших собственных приложений.
2. GnuPG, а конкретно в статье будет рассматриваться GPG - это еще один альтернативный OpenSSL программный криптографический пакет шифрования заменяющий более старую реализацию этого продукта под названием PGP. GnuPG точно так же как OpenSSL состоит из набора программ и библиотек, однако нас будет интересовать только консольная программа gpg. GnuPG реализует стандарты OpenPGP и предоставляет инструменты для шифрования и подписи данных. Пакет содержит почти все те же алгоритмы шифрования, что и OpenSSL, но имеет принципиально другую архитектурный шаблон.
Подробно описывать принцип работы и писать инструкцию по командам не буду, для этого есть большое количетсво документации и статей в публичной сети, но краткую справочную информацию по программному пакету все-таки приведу:
Как и в случае с OpenSSL, существует два варианта шифрования, симметричное и асимметричное.
Симметричное шифрование:
Необходимое пояснение: Симметричное шифрование использует один и тот же ключ для шифрования и расшифрования данных. OpenSSL поддерживает несколько алгоритмов симметричного шифрования, таких как AES, DES и Blowfish.
Асимметриченое шифрование:
Генерации ключей сторон взаимодействия:
Получаем информацию по имеющимся(созданным или импортированным) в системе gpg ключам, а так же их импорт и экспорт:
Непосредственно сам процесс шифрования:
Необходимое пояснение: В примерах выше все предельно просто и понятно, даже чисто интуитивно, но пояснения по некоторым параметрам все-таки придется дать. Например, при помощи --edit-key например можно временно активировать или деактивировать действие любого ключа либо изменить другие параметры. --no-symkey-cache указывает gpg не использовать кэш для симметричных ключей, что в некоторых случаях позволяет избежать попыток системы применить в операциях шифрования закешированных в памяти некорректных ключей, особенно когда нужно работать одновременно с различными ключами. --try-all-secrets указывает gpg попытаться использовать все доступные секретные ключи для расшифровки данных. Это может быть весьма полезно в том случае, если вы не уверены, какой именно ключ был использован для шифрования и о многих других интересных случаях, перечень которых ограничен лишь фантазией. Странный набор цифр и символов 65737003840E73FE9E279B32559198F2B489C808 указывает на идентификатор ключа, хотя чаще всего для идентификации используется тип записи в виде электронной почты.
3. Gpg вроде бы рассмотрели. Давайте перейдем к еще одной интересной утилите под названием age. Это максимально простой и удобный инструмент для шифрования, придуманный энтузиастами с целью упростить процесс использования в реализации простых операций по зашифровыванию и расшифрованию данных по сравнению с openssl и gpg.
И опять два варианта.
Симметричное шифрование:
Пояснение: Тут все предельно понятно и дополнительных пояснений не требуется.
Ассиметричное шифрование:
Необходимое пояснение: Тут так же все довольно просто. Первая команда создаст разом пару ключей при помощи одной операции. Вторая и третья команды зашифровывает и расшифровывает. Все выглядит стандартно и легко в использовании.
4. И наконец, маленький зверек под названием ccrypt - еще более простой вариант программы шифрования данных, вот правда умеет он только симметрию:
Необходимое пояснение: С данной утилитой все еще проще, но она по умолчанию не умеет ассиметричное шифрование, только симметрию.
На этом мы заканчиваем повествовение второй части нашей статьи и мы завершили рассмотрение нескольких распространенных систем шифрования данных и теперь пришло время приступить к третьей, заключительной части где покажем дополнительные примеры(в контексте нашей тематики) в чисто практических случаях применения, и которые, как я уже упоминял в самом начале - могут быть вам полезными в качестве шпаргалки в различных ситуациях. Хотя рассматриваемые утилиты и позиционируются изначально для применения в unix и описываются на примерах в рамках непосредственно linux, однако же почти все они имеют реализации или аналоги для работы в других системах, в том числе в macos и windows, при определных обстоятельствах конечно, например если будут установлены все необходимые программы и окружения.
Часть 3. Различные примеры обратные шеллы. Сборник-шпаргалка.
Тут мы с вами просто приведем сборник готовых к употреблению примеров обратных шеллов(сетевых) списоком в виде шпаргалки, разделив примеры по каждому из вариантов(видов) применяемых инструментов(технологий):
Реверсные соединения, настроенные при помощи PHP:
Варианты для командной строки терминала:
Помимо использование дескриптора 3, или если его применение в конкретном случае по какой-либо причине(например его занятости) не представляется возможным, - вы можете использовать другие идентификаторы, такие как 4, 5, итд.
Подходит для встраивания тегами в php-скрипты, там где это возможно и целесообразно:
Можно попробовать сгенерировать готовый вариант при помощи metasploit:
Юзаем Python:
Способы организации связи в Linux:
Варианты с использованием адресов протокола и формата IPv4 (стандартный, полный вариант с пробельными символами):
Варианты так же для IPv4 (стандартный, но уже без пробелов):
При необходимости вышеприведенный код можно значительно оптимизировать и сократить, например с целью более компактного размещения в шеллкодах или для других целей, но мы не станем растягивать текст статьи до бесконечности.
На этом мы закончим третью часть статьи, приведя список обратных шеллов с использованием лишь нескольких популярных скриптовых языков чисто для демонстрации их возможностей, а также возможностей операционных систем и сетевых протоколов, тогда как могли продолжать этот перечень и на другие широко известные инструменты, но оставим это на долю читателя, либо же сделаем это в будущих публикациях, если это будет целесообразно и если подходящим образом сложится общая ситуация.
Вот и пришло время подошло время подвести итог нашего обзора. В данной статье была произведена попытка описать серьезные и часто почти безграничные возможности(в определенном смысле) широко известных, но обычно мало изученных большинством пользователей инструментов. Таких как системы(и одновременно библиотеки) шифрования openssl и openpgp, или же утилиты связи socat и netcat, но помимо этого мы показали и архитектурный потенциал операционных систем семейства unix в части наличия большого количества альтернатив для решения узкоспециализированных задач при работе с такими системами. Отчасти все это является следствием уникальных, и в то же время логично выстроенных и лаконично структурированных системных архитектур семейства unix. Разумеется - совершенно невозможно уложить описание всего спектра возможностей в контекст одной статьи, но основные аспекты возможностей, я надеюсь, получилось с относительным успехом систематизировать и наглядно показать. Приведенные с статье примеры в большинстве случаев представляют из себя рабочие варианты выполнения задач, но при всем при этом и не стоит забывать о том, что от версии к версиям системного и прикладного ПО - нюансы их применения могут существенно меняться и может понадобиться дополнительная настройка конфигураций и параметров. И это необходимо обязательно учитывать в процессе ваших экспериментов.
Спасибо за чтение и заранее за потенциальную критику.
С большой надеждой на хорошее будущее.
Всех благ, и, надеюсь, до новых встреч.
Написано специально для xss.
Вложения
Последнее редактирование:
