Как можно защититься от атаки MITM ARP-spoofing? С одной стороны, если ваши маршрутизаторы не имеют защиты от данного вида атак, то практически никак. Потому, что даже обнаружение данного вида атаки довольно сложно с той точки зрения, что атакованная машина, а равно как и ее пользователь не будут даже подозревать о том, что что-то происходит. Но, обнаружить данную атаку вполне возможно. И в этом нам снова поможет Python и библиотека scapy.
Что понадобится?
Данный скрипт должен работать как в Windows, так и в Linux. Для установки необходимых библиотек для Linux, а в данном случае нужна библиотека
scapy, воспользуемся командой:
Код:
pip install --pre scapy[basic]
Для Windows понадобиться выполнить немного больше установок. Для начала установим
scapy, точно такой же командой как и в Linux. Затем, для отображения всплывающего уведомления нужно будет установить библиотеку
win10toast. Для этого в командной строке выполните команду:
Код:
pip install win10toast
Теперь, чтобы была возможность работать с библиотекой
scapy, нужно установить
Npcap, который можно загрузить по этой ссылке. После того, как все будет установлено, можно импортировать нужные библиотеки и приступать к написанию кода. Вот что нужно будет импортировать в основном блоке импорта:
Python:
Код:
from
os
import
system
from
platform
import
system
as
psys
from
scapy
.
all
import
sniff
Все остальное будет импортироваться по мере необходимости, непосредственно в функциях.
Создаем обработчик
Для начала создадим словарь, в который будем помещать нашу собственную
ARP-таблицу. Это необходимо для того, чтобы выполнять сравнение данных, которые получены в пакете со значениями таблицы.
Давайте создадим функцию
packet_sniff(packet), которая на входе будет принимать пакеты переданные сниффером, сравнивать с ARP-таблицей, которую мы создали в словаре
ip_mac_dict.
Получаем ip и mac адреса из пакета.
Python:
Код:
ip_sourse
=
packet
[
'ARP'
]
.
psrc
mac_source
=
packet
[
'Ether'
]
.
src
Прогоняем по ключам словаря. И если полученное значение не совпадает, значит начинаем бить тревогу. Также получим ip адрес, откуда и пришел поддельный пакет.
Python:
Код:
if
mac_source
in
ip_mac_dict
.
keys
(
)
:
if
ip_mac_dict
[
mac_source
]
!=
ip_sourse
:
try
:
ip_reference
=
ip_mac_dict
[
mac_source
]
except
:
ip_reference
=
"unknown"
А теперь бьем тревогу. Для начала проверяем, какая ОС у нас установлена. Так как вывод всплывающего сообщения в разных ОС отличается. Потому, если у нас Windows, импортируем библиотеку
win10toast и создаем объект
ToastNotifier. А затем выводим сообщение на экран. Параметры, которые нужно указать в выводе сообщения:
Заголовок,
Тело сообщения, и в данном случае
duration, время в секундах, которое будет показываться данное сообщение. Тут надо больше поэкспериментировать. Но я пока остановился на 4 секундах. Так как если поставить меньше, то сообщения начинают сыпаться с интервалом секунды в две. Больше — есть вероятность пропустить сообщения. Но, тем не менее, этого достаточно для того, чтобы обнаружить атаку.
Python:
Код:
if
psys
(
)
==
"Windows"
:
print
(
f'\n[+] Обнаружена возможная ARP-атака\n- Возможно, что машина с адресом\n-{ip_reference}'
f'притворяется{ip_sourse}\n'
)
from
win10toast
import
ToastNotifier
toast
=
ToastNotifier
(
)
toast
.
show_toast
(
'Обнаружена возможная ARP-атака'
,
f'Машина{ip_reference}притворяется{ip_sourse}'
,
duration
=
4
)
Так же и для Linux. Только тут с выводом сообщения попроще.
Python:
Код:
elif
psys
(
)
==
"Linux"
:
print
(
f'\n[+] Обнаружена возможная ARP-атака\n- Возможно, что машина с адресом\n-{ip_reference}'
f'притворяется{ip_sourse}\n'
)
command
=
f'''notify-send "Обнаружена возможная ARP-атака" "Машина{ip_reference}притворяется{ip_sourse}"'''
system
(
command
)
Перехватываем пакеты
А теперь нужно запустить перехватчик пакетов, который мы импортировали из библиотеки
scapy,
sniff. Сделаем мы это в функции
main(). А также проведем еще несколько необходимых проверок.
Итак, при старте скрипта, для начала проверяем, является ли рабочая операционная система Linux. Если да, проверяем с какими правами запущен скрипт. Если это не суперпользователь, то выводим сообщение и прерываем работу скрипта. Если же суперпользователь на месте, то выводим сообщение о том, что анализ пакетов запущен и запускаем функцию
sniff.
Код:
sniff(count=0, filter="arp", store=0, prn=packet_sniff)
Полный код функции
main() будет чуть ниже. А пока немного пояснений по параметрам, с которыми запущена функция.
count в значении 0 указывает на то, что нужно анализировать пакеты непрерывно. Данный параметр указывает функции на то, сколько пакетов подлежат анализу. А значит, если мы укажем число отличное от 0, то работа данной функции в ключе обнаружения атак не будет иметь смысла.
filter — здесь указывается тип пакета для перехвата. В данном случае нас интересуют именно arp-пакеты.
store указывает на количество пакетов, которое нам нужно сохранять. Здесь же указан 0, что означает, что память на сохранение пакетов мы тратить не будем. Так как они будут просто анализироваться. И наконец параметр
prn указывает на функцию, которая будет вызываться при получении пакета, для последующей его передачи и обработки в этой функции.
Вот и все. Теперь можно потестировать данную заготовку. Итак, запустим для начала Windows-машину. На ней установим все то, о чем писалось в начале, после чего запустим сниффер, а на атакующей машине спуфер. И вот, посыпались сообщения:
Теперь перенесем скрипт в Kali, для примера и запустим там. А также запустим спуфер на машину с ней. И вот также посыпались сообщения:
Как только атака прекращается, поток сообщений так же не выводиться на экран. Для чего я добавил сюда всплывающие сообщения? Дело в том, что окно с терминалом или командной строкой перед глазами у вас постоянно не будут. Да и проверять вы атаки тоже не будете. Потому, лучше вывести сообщение, чтобы пользователь точно заметил происходящее событие.
Спасибо за внимание. Надеюсь, что данная информация будет кому-нибудь полезна