Использование цепочек прокси серверов позволяет обойти различные ограничения при доступе к сетевым ресурсам. Для проксирования обычно используют SOCKS или HTTP прокси. Сетевой протокол сеансового уровня SOCKS позволяет пересылать пакеты от клиента к серверу через прокси-сервер прозрачно (незаметно для них) и таким образом использовать сервисы за межсетевыми экранами.
Клиенты за межсетевым экраном, нуждающиеся в доступе к внешним серверам, могут быть соединены с SOCKS-прокси-сервером. Такой прокси-сервер позволяет клиенту подключаться к внешним ресурсам. SOCKS может использоваться и противоположным способом, осуществляя управление правами внешних клиентов при соединении с внутренними серверами, находящимися за межсетевым экраном.
В отличие от HTTP-прокси-серверов, SOCKS передаёт все данные от клиента, ничего не добавляя от себя, то есть, с точки зрения конечного сервера, данные, полученные им от SOCKS-прокси, идентичны данным, которые клиент передал бы напрямую, без проксирования. SOCKS более универсален, он не зависит от конкретных протоколов уровня приложений и оперирует на уровне TCP-соединений. Зато HTTP-прокси кэширует данные и может более тщательно фильтровать содержимое передаваемых данных.
Таким образом, мы можем использовать для обхода сетевых ограничений как SOCKS так и HTTP прокси.
Дежурный дисклеймер: Информация, представленная в этой статье, приводится исключительно в ознакомительных целях. Автор не несет никакой ответственности за использование данных материалов в противозаконных целях.
Утилита graftcp
Существует множество различных инструментов, предназначенных для перенаправления трафика и проксирования. Утилита graftcp может перенаправлять TCP-соединение, установленное клиентской программой (браузером, приложением, скриптом, оболочкой и т.д.), на SOCKS5 или HTTP-прокси.
В отличии от других аналогичных утилит, таких как tsocks или proxychains, graftcp не использует взаимодействие с переменной окружения LD_PRELOAD, применение которой позволяет загрузить вашу библиотеку до загрузки остальных. Однако, данный трюк работает только для динамически подключаемых программ, и к примеру, приложения, созданные с помощью Go, не могут быть подключены с помощью proxychains-ng. Утилита graftcp лишена этих недостатков и может отслеживать или изменять подключение любой конкретной программы с помощью системного вызова ptrace, поэтому ее можно использовать совместно с любым клиентским приложением.
Принцип работы
Итак, наша основная цель это перенаправление TCP-соединения приложения на другой адрес назначения, о котором само приложение не знает, то есть прозрачно для клиента.
Выполнить это мы можем запустив новый процесс и отследив его запуск с помощью системных вызовов ptrace и execve. В процессе работы приложение будет осуществлять системные вызовы connect, каждый из которых будет перехвачен, и из него будет извлечен аргумент адреса назначения и передан в graftcp-local через pipe.
Далее уже graftcp-local изменит аргумент адреса назначения в параметре connect на нужный адрес и перезапустит остановленный системный вызов. После успешного завершения системного вызова приложение будет считать, что успешно подключило исходный адрес назначения, но на самом деле оно подключено к адресу, подставленному graftcp-local.
Далее graftcp-local устанавливает соединение с SOCKS5 на основе информации об исходном адресе назначения приложения, затем перенаправляет запросы из приложения на прокси-сервер SOCKS5.
Может показаться, что проще изменять информацию об адресе назначения непосредственно в буфере данных. Однако по факту это может привести к переполнению буфера при модификации. И кроме того, поскольку системный вызов execve отсоединяет и размонтирует всю общую память, мы также не можем добавить дополнительные данные в буфер записи отслеживаемого приложения, используя общую память, поэтому мы отправляем исходный адрес назначения через pipe.
Более-менее разобравшись с тем, как работает утилита graftcp-local давайте рассмотрим ее установку и настройку для использования.
Установка
Прежде всего нам потребуется установленный Go. В случае, если он у вас еще не установлен выполните следующие действия:
sudo apt update
sudo apt install golang-go
Далее можно переходить к установке самого средства проксирования:
git clone https://github.com/hmgle/graftcp.git
cd graftcp
make
После завершения установки вы сможете использовать инструменты local/graftcp-local и ./graftcp. При желании их также можно прописать в загрузку системы:
sudo make install
# Install systemed unit
sudo make install_systemd
# Activate systemd service
sudo make enable_systemd
В случае проблем с установкой, можно также установить из готовых двоичных файлов, которые можно загрузить из репозитория проекта https://github.com/hmgle/graftcp/releases.
Настройка
Нашими основными инструментами будут утилиты graftcp, graftcp-local и mgraftcp. Они ищут конфигурационные файлы, указанные в качестве аргумента с параметром –config. Также, мы можем указать $(путь к исполняемому файлу)/graftcp-local.conf или же /etc/graftcp-local/graftcp-local.conf. Примеры конфигурационных файлов можно найти в том каталоге, куда установлена утилита.
Предположим, вы используете прокси-сервер SOCKS5 с IP-адресом по умолчанию: "localhost:1080". Сначала запустите graftcp-local:
local/graftcp-local
Далее установим пакет Go
./graftcp go get -v golang.org/x/net/proxy
Далее откройте браузер через graftcp, и все запросы из этого браузера будут перенаправляться на прокси-сервер SOCKS5:
./graftcp chromium-browser
Также можно использовать Bash для подключения через прокси:
% ./graftcp bash
$ wget https://www.google.com
Заключение
В этой небольшой статье мы показали, как с помощью утилиты graftcp и несложных манипуляций можно построить цепочку прокси для обхода средств межсетевого экранирования.
Больше практических навыков по обеспечению информационной безопасности вы можете получить в рамках практических онлайн-курсов от экспертов отрасли.