Использование цепочек прокси серверов позволяет обойти различные ограничения при доступе к сетевым ресурсам. Для проксирования обычно используют 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 и несложных манипуляций можно построить цепочку прокси для обхода средств межсетевого экранирования.

Больше практических навыков по обеспечению информационной безопасности вы можете получить в рамках практических онлайн-курсов от экспертов отрасли.

Комментарии (1)


  1. MagnumMalum
    12.06.2024 21:09

    Спасибо, полезная утилита. Тот же kerbrute через proxychains не работает, но с graftcp завёлся