Вопрос или проблема
Я работаю над проектом для хобби, который реализует модем OpenWrt в качестве устройства MITM, которое может скрываться от маршрутизаторов и межсетевых экранов.
Сценарий:
Устройство (PC): Система пользователя, которая уже существует и подключена к сети
Модем: Маршрутизатор, на котором работает DHCP сервер
MITM: Модем OpenWrt, работающий как устройство MITM
- Устройство подключается к
eth0
- Модем подключается к
eth1
- Порты br-lan это
eth2
иeth3
- IP адрес LAN установлен на что-то необычное, например
200.200.200.0/24
для LAN устройств, подключающихся к MITM устройству
Устройство и Модем уже объединены в мост, и MITM устройство может перехватывать пакеты и собирать IP и MAC адреса из них.
Цель:
Моя цель заключается в том, чтобы, если Устройство хочет взаимодействовать с Модемом, мне не нужно ничего делать, потому что они находятся в мосту, но когда устройство MITM хочет отправить запрос ping или даже начать TCP-соединение, я должен заменить все исходные адреса, такие как MAC и IP, на MAC и IP Устройства, чтобы Модем подумал, что это Устройство отправляет эти пакеты и пропустило их.
Я уже пытался реализовать эту идею с помощью arptables
, ebtables
, iptables
и nft
, но ни одно из них не работает.
Скрипт:
#!/bin/sh
# Настройка окружения
BRIDGE_INTERFACE="${BRIDGE_INTERFACE:-br-net}" # Мост между модемом и устройством
LOCAL_INTERFACE="lo" # LAN интерфейс для мониторинга
LAN_INTERFACE="br-lan" # LAN интерфейс для мониторинга
MODEM_INTERFACE="eth1" # Интерфейс, подключенный к модему
DEVICE_INTERFACE="eth0" # Интерфейс, подключенный к устройству
# ---------------------------------------------------------------
# Этап 1: Обнаружение DHCPACK и настройка переменных
# ---------------------------------------------------------------
tcpdump -i "$BRIDGE_INTERFACE" -l -n -e \
'udp and (port 67 or port 68) and udp[0xF8] = 0x35 and udp[0xFA] = 0x05 and len > 340' 2>/dev/null | \
awk '
/BOOTP\/DHCP/ && /Reply/ && /ethertype IPv4/ {
# Извлечение MAC адресов
split($2, src_mac, ",")
split($4, dest_mac, ",")
# Извлечение IP адресов
split($10, s, /[.:]/)
split($12, d, /[.:]/)
printf "MODEM_IP=%s MODEM_MAC=%s DEVICE_IP=%s DEVICE_MAC=%s\n",
s[1]"."s[2]"."s[3]"."s[4], src_mac[1],
d[1]"."d[2]"."d[3]"."d[4], dest_mac[1]
fflush() # Незамедлительный вывод для канала
}' | while read -r dhcp_vars; do
# Установка переменных окружения
eval "$dhcp_vars"
# ---------------------------------------------------------------
# Этап 2: Правила динамической обработки пакетов (исправленные)
# ---------------------------------------------------------------
# Очистка существующих правил
arptables -t filter -F
ebtables -t nat -F
iptables -t nat -F
iptables -t mangle -F
#ip link set arp off $DEVICE_INTERFACE
#ip link set arp off $MODEM_INTERFACE
# Подмена ответов ARP для IP модема
# ebtables -t nat -A PREROUTING -i $LAN_INTERFACE -p ARP --arp-opcode request --arp-ip-dst $MODEM_IP -j arpreply --arpreply-mac $MODEM_MAC
arptables -A OUTPUT -o $MODEM_INTERFACE --opcode request -s 200.200.200.0/24 -j MARK --set-mark 0x100
arptables -A OUTPUT -o $MODEM_INTERFACE --opcode request -s 200.200.200.0/24 -j mangle --mangle-ip-s $DEVICE_IP --mangle-mac-s $DEVICE_MAC
# Маркировка трафика на основании назначения
iptables -t mangle -A PREROUTING -i $LAN_INTERFACE ! -d $DEVICE_IP -j MARK --set-mark 0x100 # Направляется к модему
iptables -t mangle -A PREROUTING -i $LAN_INTERFACE -d $DEVICE_IP -j MARK --set-mark 0x101 # Направляется к устройству
# Перевод MAC связан с исходящими интерфейсами
ebtables -t nat -A POSTROUTING -o $MODEM_INTERFACE --mark 0x100 -j snat --to-src $DEVICE_MAC
ebtables -t nat -A POSTROUTING -o $DEVICE_INTERFACE --mark 0x101 -j snat --to-src $MODEM_MAC
# Подмена IP
iptables -t nat -A POSTROUTING -o $MODEM_INTERFACE -m mark --mark 0x100 -j SNAT --to-source $DEVICE_IP
iptables -t nat -A POSTROUTING -o $DEVICE_INTERFACE -m mark --mark 0x101 -j SNAT --to-source $MODEM_IP
# Таблицы маршрутизации
ip route flush table 100
ip route add default dev $MODEM_INTERFACE table 100
ip route flush table 101
ip route add $DEVICE_IP dev $DEVICE_INTERFACE table 101
ip rule add fwmark 0x100 lookup 100
ip rule add fwmark 0x101 lookup 101
echo "-----------------------------------------------------------"
echo "Активные правила перевода:"
echo "MODEM_IP=$MODEM_IP MODEM_MAC=$MODEM_MAC (через $MODEM_INTERFACE)"
echo "DEVICE_IP=$DEVICE_IP DEVICE_MAC=$DEVICE_MAC (через $DEVICE_INTERFACE)"
echo "-----------------------------------------------------------"
done
Мне действительно нужно знать, с чего начать снова, или даже возможен ли этот сценарий?
.
Ответ или решение
Теория
Прежде чем углубиться в ваш проект, важно сначала понять, что такое атака "человек посередине" (Man-in-the-Middle, MITM). Это форма кибератаки, при которой атакующий незаметно перехватывает и, иногда, модифицирует коммуникации между двумя сторонами, которые полагают, что общаются друг с другом напрямую. Цель такой атаки может варьироваться от простого наблюдения до более активных действий, таких как подмена данных.
В случае с настройкой MITM в контексте вашего проекта, OpenWrt-модем действует как устройство, которое перехватывает пакеты данных между вашим ПК (Device) и роутером (Modem). Цель: возможность доступа к данным, проходящим через это соединение, а также скрытая подмена исходных IP и MAC-адресов для достижения максимально незаметного присоединения к сети.
Пример
Вы описали сценарий, в котором OpenWrt-модем настроен как промежуточное устройство, через него проходят все пакеты, и целью которого является подмена исходных адресов, чтобы трафик выглядел, как будто он исходит непосредственно от ПК. Это довольно амбициозная задача, учитывая возможные сложности с настройкой различных таблиц и правил, таких как arptables
, ebtables
, и iptables
.
Применение
Теперь перейдём к приложению этой теории на практике, т.е. к подробному обсуждению вашего скрипта и конкретных моментов, где могли возникнуть проблемы.
Анализ вашего скрипта
-
Настройка интерфейсов: Важно убедиться, что интерфейсы (
eth0
,eth1
,br-lan
и т.д.) правильно настроены и связаны между собой. В вашем случаеbr-lan
объединяетeth2
иeth3
, но всегда проверяйте, чтобы эти конфигурации отражали вашу физическую настройку. -
Захват пакетов: Вы используете
tcpdump
для перехвата DHCP-пакетов с целью сбора данных об адресах IP и MAC. Это отличный первый шаг, чтобы динамически адаптировать правила. Убедитесь, что параметры фильтрации соответствуют действительности вашей сети. Тестируйте их и вносьте правки при необходимости. -
Динамическая подмена адресов:
arptables
иebtables
: Эти средства используются для управления ARP-трафиком (позволяя подмену MAC-адресов) и Ethernet-трафиком соответственно. Обратите внимание на то, поддерживается ли вашим ядром эти утилиты достаточно хорошо, и убедитесь, что правильно выставлены права на выполнение скриптов и команд.iptables
: Используется для подмены IP-адресов. Важно: для успешной подмены нужно правильно маркировать пакеты. Обратите внимание, что использованиеmangle
иnat
таблиц требует особой осторожности в порядке применения правил.
-
Правила маршрутизации: Убедитесь, что для маркированных пакетов созданы и активны таблицы маршрутизации, как показано в вашем скрипте. Ошибки в маршрутизации могут привести к отказу в доступе или неправильной маршрутизации пакетов.
Советы по устранению неполадок:
-
Диагностика пакетов: Используйте инструменты вроде
tcpdump
илиwireshark
для мониторинга пакетов и убедитесь, что правила работают как ожидалось. Это поможет выделить этапы, на которых что-то может пойти не так. -
Проверка надежности проводных подключений: Параметры мостов и правил фильтрации могут корректно применяться только на надежной физической сети. Убедитесь в правильности подключений и качества кабелей.
-
Обновление прошивки и софта: Убедитесь, что OpenWrt и все используемые модули установлены в последней стабильной версии. Ошибки в старом софте могут влиять на результат вашей работы.
-
Логирование ошибок и предупреждений: Настройте максимально подробное логирование на всех этапах, чтобы в случае ошибки можно было быстро отследить причину.
Надеюсь, эти рекомендации помогут вам диагностировать и устранить проблемы в вашем проекте. Вам нужно уделить особое внимание тестированию на каждом этапе изменения трафика, чтобы убедиться в корректности работы всех правил.