Статья Что такое CHISEL и как он работает?

Chisel - это быстрый туннель TCP/UDP, транспортируемый по HTTP, защищенный через SSH. Один исполняемый файл, включая как клиента, так и сервер. Написано на Go (golang). Chisel в основном полезен для прохождения через брандмауэры, хотя его также можно использовать для обеспечения безопасной конечной точки в вашей сети
1731048857549.png

Быстрые TCP-туннели от Chisel. Транспортировка по HTTP. Безопасность по SSH. Что еще нужно для счастья?
А если серьезно, то Chisel — это связка «клиент + сервер» в одном приложении, написанном на Go, которое позволяет прокладывать защищенные туннели в обход ограничений файрвола.

Итак мы уже знаем, что chisel использует TCP, HTTP и SSH, но давайте разберемся что для чего работает.

Основные понятия​

Сервер Chisel - это процесс, запущенный на компьютере с внешним (доступным) IP-адресом. Сервер прослушивает входящие подключения от клиентов по HTTP/HTTPS и управляет перенаправлением трафика.

Клиент Chisel - клиент запускается на удаленном хосте, который хочет туннелировать трафик через сервер Chisel. Он подключается к серверу Chisel по HTTP или HTTPS и передает запросы на нужные порты.

Туннелирование через HTTP - Chisel использует HTTP(S) для передачи данных, что позволяет ему обходить ограничения на уровень сети, такие как блокировка специфических портов. Весь TCP-трафик между клиентом и сервером идет через HTTP-канал, создавая туннель, который внешне выглядит как обычный HTTP-трафик.

WebSocket — это протокол, позволяющий устанавливать постоянное соединение между клиентом и сервером поверх TCP/IP. В отличие от традиционных HTTP-запросов, которые являются одноразовыми, WebSocket обеспечивает двустороннюю связь в реальном времени. Chisel использует WebSocket для создания постоянного туннеля, через который он пересылает данные между клиентом и сервером.

4a0b53ec-5d36-461f-b62f-13a13d066f7a.png

Пример работы WebSocket соединения

Туннелирование данных через WebSocket​

После установления WebSocket соединения, клиент может пересылать данные через этот туннель. Вся передача данных шифруется и инкапсулируется в WebSocket фреймы, что позволяет передавать трафик, используя стандартный порт 443 (или 80), который часто не блокируется межсетевыми экранами.

Chisel позволяет передавать не только HTTP-трафик, но и данные других протоколов, таких как TCP и UDP. Это значит, что можно туннелировать, например, SSH-сессии или любой другой TCP/UDP трафик.

Chisel не создает полноценный VPN, который работает на уровне IP (как это делает, например, OpenVPN или WireGuard). Вместо этого он работает на уровне TCP/UDP, инкапсулируя пакеты данных в WebSocket фреймы и пересылая их на сервер, который, в свою очередь, передает их дальше по целевому адресу (например, к SSH-серверу).

Этапы инкапсуляции​

1. Передача исходных данных:

Клиентское приложение генерирует сетевые данные. Это могут быть TCP/UDP-пакеты, например, при установлении SSH-сессии или другом сетевом взаимодействии.

2. Инкапсуляция в WebSocket фреймы:

Клиент Chisel принимает эти данные и оборачивает их в WebSocket фреймы. Каждый такой фрейм будет содержать небольшую часть оригинальных данных, которые разбиваются на сегменты.

4ab3cf93-b27d-4c7c-bc4c-c5c256c2b52b.png

3. Передача данных через WebSocket:

Эти фреймы передаются по установленному WebSocket-соединению между клиентом и сервером Chisel. Соединение обычно установлено через HTTP(S), что делает трафик похожим на обычные веб-запросы и затрудняет его блокировку.

4. Декодирование на сервере Chisel:

Сервер Chisel получает WebSocket фреймы, извлекает из них инкапсулированные данные и декодирует их, восстанавливая оригинальные TCP/UDP-пакеты.

5. Передача исходных данных к целевому серверу:

После декодирования сервер Chisel передает восстановленные данные по нужному адресу — это может быть удаленный SSH-сервер или любое другое приложение, с которым клиент хотел установить соединение.

6. Ответный трафик:

Когда целевой сервер отвечает, процесс повторяется в обратном порядке: данные инкапсулируются сервером Chisel, передаются через WebSocket туннель обратно на клиента, где данные декодируются и передаются исходному приложению.

Почему CHISEL трудно обнаружить?​

Использование стандартных портов​

Многие межсетевые экраны настраиваются так, чтобы разрешать трафик только на определенные порты, такие как:
- Порт 80 — для HTTP.
- Порт 443 — для HTTPS.

Эти порты используются для веб-трафика, и их обычно не блокируют, чтобы не ограничить доступ пользователей к сайтам в интернете. Chisel использует WebSocket поверх HTTP(S), что позволяет ему работать через эти порты.

Почему это важно:
- Поскольку Chisel работает через стандартные веб-порты (80 или 443), межсетевые экраны часто пропускают такой трафик, не проверяя его содержимое. Даже если на стороне сервера или клиента идет передача данных, не связанных с HTTP, межсетевые экраны видят лишь "обычные" соединения через разрешенные порты.

WebSocket поверх HTTPS​

Chisel использует WebSocket поверх HTTPS (на порту 443). Это делает трафик Chisel практически неотличимым от обычного HTTPS-трафика. Многие firewalls и системы глубокого анализа пакетов (DPI — Deep Packet Inspection) могут проверять содержимое HTTP-сессий, но HTTPS трафик часто не может быть детально проанализирован из-за шифрования.

Почему это работает:
HTTPS шифрование (через TLS/SSL) защищает данные от перехвата и анализа. Поскольку межсетевые экраны не могут расшифровать содержимое HTTPS-сессии, они не видят, что внутри идет туннелированный трафик Chisel. Соединение выглядит как обычная HTTPS сессия, которая зашифрована, и firewall не может отличить его от веб-серфинга.

Маскирование трафика

Chisel по сути маскирует любые передаваемые через него данные (будь то SSH, HTTP или любой другой TCP/UDP трафик) под обычный веб-трафик. Поскольку межсетевой экран ожидает увидеть стандартные запросы HTTP/HTTPS на портах 80 и 443, он не всегда проверяет, что именно передается внутри этих сессий.

Работа в условиях NAT и прокси-серверов​

Chisel может работать даже в тех случаях, когда клиент находится за NAT (Network Address Translation) или через прокси-сервер. Поскольку WebSocket работает поверх HTTP/HTTPS, а сами HTTP запросы и ответы могут свободно проходить через NAT или прокси, трафик Chisel может легко обойти такие сетевые ограничения.

Пробуем на практике​

Для того, что бы посмотреть как именно работает данная утилита сделаем небольшую лабораторию, которая будет состоять из Linux Server (Ubuntu) и Linux Client'a (Kali linux)

Настройка Chisel Server​

Скачиваем и собираем последнюю версию утилиты

Bash:
root@kali:~# sudo apt install golang-go
root@kali:~# git clone http://github.com/jpillora/chisel && cd chisel
root@kali:~/chisel# go build
Теперь перенесем chisel в контейнер и создадим туннель. Первым действием поднимаем сервер на Kali, который слушает активность на 8000-м порту (-p 8000) и разрешает создавать обратные подключения (-reverse).

root@kali:~/chisel# ./chisel server -v -reverse -p 8000
c33e048d-68c8-43ac-8359-7d6d51ffe18c.png

Настройка Chisel Client​

Аналогично делаем сборку

Bash:
root@kali:~# sudo apt install golang-go
root@kali:~# git clone http://github.com/jpillora/chisel && cd chisel
root@kali:~/chisel# go build
Далподключаемся к нашему серверу

root@ubuntu:/tmp# ./chisel client <ip адрес сервера>:8000R:127.0.0.1:8890:<ip адрес клента>:80 &
5e24a7f2-d249-4138-8736-10ec6e1692a8.png

Анализ трафика​

В итоге мы видим общение между двумя хостами в зашифрованном в виде с помощью L7 фреймов

e4d39934-20a4-4d54-891d-f53ce3d1adde.png
 
  • Нравится
Реакции: BAO, mcfly и N1GGA
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!