Метод оценки низкоуровневых сетевых студенческих программ без отправки реальных данных

Чего я хочу достичь / Контекст
В настоящее время я пытаюсь найти метод оценки (автоматически) программ учеников здесь, в нашей школе. Студенты должны написать на C низкоуровневые сетевые программы, которые выполняют сетевые атаки (без использования библиотек, только необработанные сокеты). Некоторые из этих проектов включают в себя: ARP_spoofing, IDLE_port_scanning и программу network_analyser. Мне известно, что, оценивая некоторые из этих проектов, мы можем случайно нарушить работу служб и / или выполнить нежелательные атаки в тех сегментах сети, где у нас нет полномочий, и мы действительно не хотим, чтобы это произошло. Поэтому наша цель состоит в том, чтобы найти метод, позволяющий оценивать эти проекты безопасным образом, в то же время блокируя исходящий трафик, который потенциально может нанести ущерб другим системам.

Однако следует отметить, что не все программы действуют как network_analyser, и что некоторые из этих программ могут отправлять кадр, анализировать ответ и, соответственно, отправлять обратно другой конкретный кадр на основе этого ответа. Простым примером может служить программа ARP_spoofing, где в начале она передает сообщение с запросом MAC-адреса жертвы, чтобы позже отправить правильные поддельные пакеты. Поэтому в большинстве этих проектов нам нужно иметь какое-то взаимодействие с хостом / сущностью, которое (потенциально проверяет фрейм) и отвечает обратно, избегая при этом отправки реальных данных в сеть и, в конечном итоге, ломая вещи.

Что я пробовал
Я пытался найти решение этой проблемы, принимая во внимание существующую архитектуру, которую мы используем для оценки других проектов. Текущая "архитектура" состоит из одного компьютера Fedora 28, который работает внутри док-контейнера, и вся оценка проекта происходит на этом компьютере.

Поэтому решение, которое я сразу подумал об этой проблеме, состоит в том, чтобы порождать 2 программы в пространстве пользователя этой машины и заставить их обмениваться данными между ними через ядро. Первой будет программа студента (например, ARP_spoofing); давайте назовем этот процесс "X". Второй процесс, назовем его "респондент / валидатор", - это программа, которая пытается "имитировать" сетевой стек или, если быть точнее, программа, которая просто отвечает на определенные пакеты, которые она получает. Связь (конечно) должна идти от одной программы к другой программе и наоборот, но никогда не отправлять данные в один и тот же процесс. Эти программы могут связываться между ними через интерфейс ядра виртуальной сети L2 (TUN). Используя такой интерфейс, я могу копировать данные из необработанного сокета в интерфейс TUN и видеть содержимое пакета, который я отправляю (из пространства пользователя) обратно в пространство пользователя (и, не связанные, но также и случайные сетевые пакеты, которые приходят в эту розетку). Я протестировал аналогичную реализацию этой сущности https://gist.github.com/vi/3629756, и похоже, что она работает.

Следует отметить, что мы не можем просто заставить эти 2 процесса взаимодействовать между собой. Программа студента должна работать и быть способной правильно реализовать атаку, когда тестирование не проводится в нашей тестовой среде (то есть порождает сырой сокет и правильно записывает в него). Идея состояла в том, чтобы сделать половину проверки Ядром, а другую половину - Пространством Пользователей без необходимости фактически отправлять пакеты (и вызывать повреждения).

Помимо копирования данных (которые поступают из пространства пользователей) из необработанного интерфейса в интерфейс TUN (для передачи их обратно в пространство пользователей), я также пытался заблокировать эти исходящие пакеты перед копированием их в интерфейс TUN с помощью iptables, но сделал не повезло. Если не ошибаюсь, необработанные сокеты работают на более низком уровне, чем iptables внутри Ядра, поэтому (в отношении необработанных сокетов) мы могли бы применять правила для входящего трафика, но не для исходящего трафика.

Эта проблема
Проблема, которая возникла с этим решением до сих пор (кроме того факта, что я до сих пор не заблокировал исходящий трафик), кажется, что я не могу различить в пространстве пользователя, если это "X" или "респондент / валидатор", что отправил пакет ранее из пространства пользователя. Я полагаю, что если бы у меня была такая возможность, я мог бы отбросить этот пакет в одном из двух процессов, а затем проанализировать / проанализировать его в другом / правильном. Таким образом, я смогу отправлять сообщения от одного процесса другому, проходя мимо Ядра. На данный момент, надеясь исправить это, я подумал о том, чтобы, возможно, добавить персонализированный заголовок перед пакетом, каждый раз перед отправкой его в "цикл" (userspace->raw socket->TUN interface->userspace). Но я боюсь, что это решение может не сработать, так как пакет не будет действительным, и необработанный сокет в какой-то момент отбросит этот пакет. Или, возможно, это могло бы помочь моей проблеме: иметь возможность различать в пользовательском пространстве, чья очередь получать и отправлять обратно другому процессу, а также отбрасывать исходящий трафик (так как кадр Ethernet будет разрушен)?

Я действительно смущен в этом пункте. Я не совсем уверен, может ли вышеуказанный метод, который я пытаюсь применить, действительно работать. Могу ли я достичь более или менее такого же результата с более простым решением? Я иду в неправильном направлении? Если у вас есть совершенно иные решения, чем то, которое я пробовал для этой проблемы, вам будет очень приятно (даже если это не соответствует нашей нынешней "архитектуре" тестирования).

0 ответов

Другие вопросы по тегам