
Я пытаюсь создать лабораторную среду для экспериментов с атаками MiTM. Я также хочу изучить docker, поэтому я решил сделать это с docker. Я создал 2 образа (атакующий, жертва):
Жертва — на базе Alpine, с установленным curl.
Атакующий — на базе Ubuntu, с установленными iputils-ping iproute2 curl iptables vim ettercap-text-only dsniff и tshark.
Они оба находятся в мостовой сети, поэтому маршрутизатором здесь будет интерфейс docker0 (по умолчанию: 172.17.0.1).
Я запускаю контейнер атакующего с флагом --privileged, чтобы включить использование ettercap.
Итак, когда оба образа запущены, я запускаю ettercap (пробовал также с инструментом arpspoof, эффект тот же) из контейнера атакующего с помощью:
ettercap -T -i eth0 -M arp:remote //victim_ip/ //172.17.0.1/
Трафик жертвы проходит через атакующего, но есть проблема, что когда жертва пытается пинговать google.com, ответа нет. Атака MiTM работает, потому что я вижу этот трафик на контейнерах жертвы, но что-то его блокирует.
Я выяснил, в чем тут проблема. Я открыл 2 wireshark на своем хосте, один на интерфейсе docker0, другой на моем интерфейсе wifi по умолчанию. До атаки, когда я пингую что-то из глобальной сети, docker транслирует свой docker ip-адрес в мой host ip-адрес, и это работает нормально, но после arpspoofing это работает неправильно - хост отправляет пакеты с ip source docker-жертвы контейнера (172.17.0.3). Кроме того, странность заключается в том, что другой контейнер (атакующий) пингует внешнюю сеть без проблем (docker0 транслирует docker ip в host ip правильно). Изображение с обоих wireshark ниже.
Проверил iptables, и это правило (выбранное на рисунке ниже) преобразует мой IP-адрес docker в IP-адрес хоста, но после атаки это правило не работает (pkts не увеличиваются после атаки arp-spoofing). Я пытался добавить несколько дополнительных правил iptables, но безрезультатно. Я не мастер iptables, так что если у кого-то есть другие идеи, что также следует проверить, дайте мне подсказку.
Может быть, кто-то сможет объяснить мне или дать мне дополнительные источники о том, как именно docker транслирует свой IP-адрес в IP-адрес хоста в сети bridge и что я могу сделать, чтобы восстановить корректный перевод после атаки arp-spoofing. Любой совет будет оценен по достоинству.
решение1
- При установке Docker
docker0
для подключения каждого контейнера создается сетевой интерфейс с именем. - Когда Docker создает контейнер, по умолчанию ему присваивается виртуальный сетевой интерфейс с именем, начинающимся с
veth
. Затем Docker перенаправляет трафик сетевого интерфейса хоста на виртуальный сетевой интерфейс через правила iptables. - Если вы создадите контейнер с помощью команды
docker run --network=host ...
, вы заставите контейнер использовать сетевой интерфейс хоста. На этом этапе IP-адрес контейнера совпадает с IP-адресом хоста.