Перехват и модификация TCP / IP трафика на лету с помощью Trudy
Существует несколько отличных инструментов для перехвата сетевого трафика. Так, Scapy и Wireshark — прекрасные решения для организации пассивного сниффинга, а Scapy, к тому же, способен отправлять дополнительные пакеты.
В случае, если вам необходимо перехватить траффик в позиции посредника (Man-in-the-Middle), вы можете использовать такие популярные инструменты, как Fiddler, Burp Suite или OWASP ZAP. Это хорошие решения, однако, они ориентированы только на протоколы HTTP(S). Но какое программное обеспечение использовать, если вам нужно модифицировать общий не-HTTP-трафик?
Так, например, если вам необходимо проанализировать трафик системы обмена сообщениями Telegram, который использует свой собственный протокол MTProto, работающий прямо поверх TCP/IP-пакетов (другими словами, HTTP или HTTPS вообще не используется), то в данном случае упомянутые выше инструменты не подойдут.
Одним из инструментов со схожими функциональными возможностями является Ettercap. Он предоставляет простой интерфейс фильтрации, позволяющий изменять передаваемые данные. К сожалению, Ettercap требует, чтобы фильтры были написаны на его собственном языке, что существенно ограничивает количество пользователей, способных полноценно использовать его для своих нужд.
Двумя другими инструментами, на которые вы также можете обратить свое внимание, являются: Mallory и Trudy. Программное обеспечение Mallory можно найти на github ( https://github.com/intrepidusgroup/mallory ), и о нем упоминали еще в далеком 2010 году на конференции Black Hat USA ( https://www.youtube.com/watch?v=0ZquG1p0eKA ). С тех пор много воды утекло, и в настоящее время данный проект, похоже, заброшен. Поэтому в рамках данной статьи мы основное внимание уделим второму программному инструментарию — Trudy, автором которого является @kelbyludwig, а исходный код данного программного обеспечения также доступен на github ( https://github.com/praetorian-code/trudy ).
Перехват и модификация трафика с помощью Trudy
Программное обеспечение Trudy может перехватить и модифицировать любой трафик TCP, а его создатели, когда работали над реализацией проекта, скорее всего, были вдохновлены программным обеспечением Mallory, упомянутым чуть выше. Как говорится в документации, Trudy является «прозрачным прокси-сервером (transparent proxy), который может изменять и сбрасывать трафик для произвольных TCP-соединений». Весь трафик направляется через Trudy, который применяет так называемые модули для его модификации.
Модули Trudy представляют собой ориентированные на конкретную функциональность предварительно запрограммированные части кода, которые пользователь может модифицировать для получения необходимого ему результата. Также Trudy предоставляет интерфейсы для этих модулей ( https://github.com/praetorian-code/trudy/blob/master/module/module.go ). Поскольку Trudy написан на Go, то все модули и их интерфейсы также должны быть написаны на Go. Для маршрутизации трафика и правильной настройки среды доступна подготовленная виртуальная машина.
Настройка виртуальной машины для подмены трафика
Виртуальная машина устанавливает все необходимое программное обеспечение и сам Trudy. Затем она направляет весь трафик в Trudy и из него, используя утилиту iptables. Trudy получает весь трафик, модифицирует его на основе используемого модуля, а затем отправляет трафик обратно в Интернет (более детально смотрите на рисунке 1).
Рисунок 1. Trudy получает весь трафик, модифицирует его на основе используемого модуля, а затем отправляет трафик обратно в Интернет.
Модули Trudy
Использовать модули Trudy довольно просто. Trudy вызывает определенные методы в фиксированном порядке, каждый из которых предназначен для одного конкретного действия:
- Deserialize () — преобразует необработанную полезную нагрузку в известную структуру данных (например, HTTP).
- Drop () — если возвращено значение «true», весь пакет отбрасывается.
- DoMangle () — если возвращено значение «true», вызывается метод Mangle ().
- Mangle () — изменяет полезную нагрузку.
- DoIntercept () — если возвращено значение «true», данные отправляются в интерпретатор Trudy.
- DoPrint () — если возвращено значение «true», вызывается метод PrettyPrint().
- PrettyPrint () — печатает данные в формате, удобном для человеческого восприятия.
- Serialize () — преобразует данные обратно в необработанную полезную нагрузку, если они ранее были «десериализованы».
- BeforeWriteToClient (p pipe.Pipe) — функция, которая вызывается перед отправкой данных клиенту.
- BeforeWriteToServer (p pipe.Pipe) — функция, которая вызывается перед отправкой данных северу.
- AfterWriteToClient (p pipe.Pipe) — функция, которая вызывается после отправки данных клиенту.
- AfterWriteToServer (p pipe.Pipe) — функция, которая вызывается после отправки данных северу.
Пример изменения (подмены) трафика с помощью Trudy
Предлагаем вашему вниманию простой пример модуля, который искажает весь входящий трафик, полученный с IP-адреса «139.59.129.86» через порт 80. Он делает это путем перезаписи всей полезной нагрузки TCP / IP в нули. Основная часть модуля использует функции DoMangle () и Mangle () (более детально смотрите на рисунке 2).
Рисунок 2. Основная часть модуля Trudy, который подменяет на нули весь входящий трафик, полученный с IP-адреса «139.59.129.86» через порт 80, использует функции DoMangle () и Mangle ()
Так, как видно на примере, функция DoMangle () ограничивает подмену указанным IP-адресом, а Mangle () выполняет всю фактическую работу по превращению этого трафика в нули.
После настройки Trudy по этому примеру модуля, мы можем попытаться получить доступ к сайту с указанным IP-адресом через обычный браузер. Запрос будет отправляться нормально, но ответ будет перезаписан нулями. Браузер явно не сможет разобрать ответ и, в конечном итоге, истечет время ожидания.
Мы можем подтвердить это с помощью WireShark. На рисунке 3 показан измененный ответ. Зона, отмеченная синей линией, — полезная нагрузка TCP / IP, полная нулей, как и ожидалось. При этом заголовки TCP / IP (часть битов вне синей рамки), остались нетронутыми.
Рисунок 3. Проверка результатов работы модуля Trudy, выполненная с помощью WireShark.
Весь модуль вы можете найти здесь: https://bit.ly/3gdtqHW
В дополнение к описанной выше функциональности, он выводит информацию о событиях на консоль, чтобы вы имели представление о том, что происходит.
Подобным образом вы можете легко использовать Trudy для множества других задач по перехвату и модификации трафика TCP / IP в эфире.
Появились вопросы или нужна консультация? Обращайтесь!
Вечный параноик, Антон Кочуков.
См. также:
Авторизуйтесь для этого