У меня проблема с сетевым стеком Linux при перехвате пакетов - PullRequest
7 голосов
/ 17 марта 2012

У меня вопрос к гуру низкоуровневых сетей / Linux:

Мне нужно создать два инструмента для проекта безопасности в моем университете.Первым инструментом является злоумышленник ARP Poisonning, который отравляет кэш ARP с удаленного хоста, чтобы извлечь данные, которые он отправляет на другой хост.Я написал этот инструмент на C, используя RAW-сокеты, и он отлично работает, я могу перехватывать данные, передаваемые с хоста A на хост B и с хоста B обратно на хост A.

Проблема возникаетпри написании второго инструмента, который является анализатором, целью которого является чтение / редактирование / удаление пакетов, поступающих с хоста A или хоста B. Я представил систему, в которой, когда я обнаруживаю пакет, поступающий с одного из этих хостов, моя программа спросит меня,Я хочу, чтобы этот пакет прошел, если я хочу изменить его или просто хочу отбросить его.Я активировал IP-пересылку в Linux, используя

sysctl -w net.ipv4.ip_forward=1

, и я могу читать все данные, передаваемые между двумя хостами.Но я не знаю, как редактировать / отбрасывать эти пакеты, так как сетевой стек Linux играет роль для управления вводом и выводом пакетов, поступающих из моего сетевого интерфейса.Я действую как пассивный злоумышленник, если хотите.

Моей первой идеей было отключить пересылку ip и самостоятельно управлять маршрутизацией пакетов.Но когда я отключаю переадресацию ip, я просто не могу получить данные, поступающие из A или B, потому что сетевой стек linux автоматически отбрасывает пакеты в режиме ядра, IP-адрес которых не предназначен для моего компьютера.

Затем я попытался активировать случайный режим, но это было излишним, поскольку этот режим работает только на физическом уровне (проверяет, соответствует ли целевой MAC-адрес в полученном пакете Ethernet MAC-адресу на локальном интерфейсе).Таким образом, случайный режим помогает нам избежать физического фильтра стека linux, но не логического (целевого IP-адреса в пакете, который я получаю).Это IP-адрес B, а не мой, поэтому сетевой стек linux просто отбрасывает пакет)хочу.Я знаю, что это сложный вопрос, я провел некоторое исследование, чтобы найти решение самостоятельно, но я не нашел удовлетворительного ответа.

Я знаю, что есть решение с iptables Мы можем попросить его пропустить некоторые пакеты с определенного IP-адреса, но я не хочу, чтобы решение включало сторонний инструмент, я хочу инкапсулировать все в моей программе.

Для информации,Средой разработки является Linux / Ubuntu Kernel 3.0.0-16, и все сделано с использованием языка C.

Ответы [ 3 ]

1 голос
/ 18 марта 2012

Я выяснил, почему я не получал никаких пакетов, когда отключил ip_forwarding.Я запустил много тестов после публикации моего вопроса здесь и понял, что когда ip_forwarding был отключен, удаленный хост отправлял мне очень странные TCP-пакеты каждые ~ 10 секунд.

На самом деле эти TCP-пакеты были помечены Wireshark как «ретрансляция TCP» пакетов, потому что удаленный хост отправлял мне первоначальный TCP-пакет, и я не перенаправилэто к правильному шлюзу, чтобы он не получил никакого ответа.

Поведение по умолчанию в этом случае для удаленного хоста было повторно посылать этот пакет в различный интервал времени, это - фактически нормальный способ, которым стек TCP долженвести себя.Но я не знал, что до тех пор, пока удаленный хост не получит ответ на свой первоначальный TCP-пакет, он не будет отправлять другие (только для того же приложения).Поэтому, когда я нажимал «F5» в браузере удаленного хоста, я думал, что он будет генерировать трафик TCP, хотя он не получит никакого ответа, и я не знал об этом конкретном поведении стека TCP, поэтому я просто подумал, что не получаюлюбой ответ.Другой хост (шлюз) действовал точно так же, поэтому я могу сказать, что был неправ, полагая, что стек Linux блокирует пакеты удаленного хоста.

Теперь мне нужно просто правильно перенаправить к шлюзу данные, которые я хочу пропустить, и игнорировать остальные.Спасибо за вашу помощь, надеюсь, это когда-нибудь кому-нибудь поможет.

1 голос
/ 18 марта 2012

Похоже, вам нужно написать свой собственный модуль Netfilter, который будет либо обрабатывать поведение, которое вы хотите в ядре, либо передавать его в пользовательское пространство для обработки.

Для получения дополнительной информации по этой теме см. Следующие ресурсы:

0 голосов
/ 17 марта 2012

Вы вообще используете libpcap?От твоего вопроса это не похоже на тебя, что интересно, так как это самая известная и используемая библиотека для всего, что связано с тем, что ты делаешь?Вы не используете его, потому что это часть условий назначения, чтобы не использовать его?

Если вы можете использовать его, я бы пошел с ним и проверил проект ettercap, который имеет поддержку для перезаписи живых пакетов.

http://ettercap.sourceforge.net/

РЕДАКТИРОВАТЬ: Проверьте модуль фильтра ettercap в

https://github.com/drizztbsd/ettercap/blob/master/src/ec_filter.c

, особенно посмотрите на func_inject

...