Chisel - это быстрый туннель TCP/UDP, транспортируемый по HTTP, защищенный через SSH. Один исполняемый файл, включая как клиента, так и сервер. Написано на Go (golang). Chisel в основном полезен для прохождения через брандмауэры, хотя его также можно использовать для обеспечения безопасной конечной точки в вашей сети
А если серьезно, то Chisel — это связка «клиент + сервер» в одном приложении, написанном на Go, которое позволяет прокладывать защищенные туннели в обход ограничений файрвола.Быстрые TCP-туннели от Chisel. Транспортировка по HTTP. Безопасность по SSH. Что еще нужно для счастья?
Итак мы уже знаем, что 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 для создания постоянного туннеля, через который он пересылает данные между клиентом и сервером.
Пример работы 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 фреймы. Каждый такой фрейм будет содержать небольшую часть оригинальных данных, которые разбиваются на сегменты.
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
root@kali:~/chisel# ./chisel server -v -reverse -p 8000
Настройка 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 &