У меня есть вопрос к гуру сетей низкого уровня/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.
iptables
- сообщить ядру, что вы хотите получать пакеты для назначенного IP-адреса. - person Borealid   schedule 17.03.2012iptables
— это пользовательский инструмент, который взаимодействует с ядром. Фактическое решение о маршрутизации пакетов принимается полностью в пространстве ядра. - person Borealid   schedule 17.03.2012