Фильтровать пакеты в сетевом стеке при анализе пакетов в Linux?

У меня есть вопрос к гуру низкоуровневых сетей/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.

7
задан jww 29 November 2019 в 05:33
поделиться