Методы обнаружения ARP-spoofing'а

Лабораторная работа посвящена инсталляции и настройке arpwatch – программы, позволяющей обнаруживать манипуляции с протоколом ARP. Кроме того, в этой работе попутно решаются задачи обнаружения в сети новых компьютеров и поиска по известному MAC-адресу устройства порта коммутатора, к которому подключено это устройство.

Наблюдение за ARP-протоколом с помощью arpwatch

Установить программу arpwatch с целью отслеживания появление новых MAC-адресов и смены соответствия IP-адреса и MAC-адреса.

  1. Инсталляция arpwatch

    Установите arpwatch так, как это делается в вашей операционной системе.

  2. Конфигурирование arpwatch

    Сонфигурируйте arpwatch следующим образом. Укажите, какой интерфейс, является для arpwatch рабочим:

  3. Добавление arpwatch в загрузку

    Сделайте добавление arpwatch в загрузку вот так:

    # vi /etc/rc.conf
    

    arpwatch_enable="YES"
    

  4. Просмотр информации в журналах

    Просмотрите журналы системы. В одном из них должны быть сообщения arpwatch о том, что обнаружены новые сетевые устройства.

  5. Проверка

    Удостоверьтесь в том, что выполненные действия привели к требуемому результату, и arpwatch отслеживает смену адресов и появление новых сетевых устройств.

    Для этого обратитесь с какого-либо хоста к хосту с arpwatch, затем измените на этом хосте MAC-адрес и обратитесь повторно. Смена MAC-адреса должна быть зафиксирована.

Поиск порта коммутатора по MAC-адресу

Создать и проверить работу скрипта, который выполняет поиск порта коммутатора, к которому подключено устройство с заданным MAC-адресом

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

Если база данных MAC-адресов сетевых карт не ведётся, простейший способ найти сетевую карту – опросить коммутатор. В том случае, если существует база данных MAC-адресов сетевых карт, с информацией о том, к какому порту коммутатора они подключены, можно попробовать найти сетевую карту с её помощью. Однако, MAC-адрес устройства могу быть подменён, и тогда поиск по базе данных не увенчается успехом. В этом случае также может помочь опрос коммутатора.

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

Может быть и такое, что ни один MAC-адрес не соответствует порту, даже если к порту и подключён компьютер – это может произойти в том случае, если компьютер давно не отправлял пакеты, и информация о нём уже удалена из памяти коммутатора. По этой же причине, описываемый метод может не найти компьютер с определённым адресом.

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

Если коммутатор не один, и все они управляемые, то можно опросить все коммутаторы, и определить точно, какой порт какого коммутатора находится наиболее близко к искомой сетевой карте.

  1. Создание скрипта.

    Создайте скрипт опроса коммутаторов, представленный ниже.

    # vi /usr/local/bin/get-port-by-mac
    

    #!/usr/bin/perl -w
    
    # (c) igor chubin, 2005
    
    my $SNMP_switch="192.168.15.200 192.168.15.121";  1
    my $SNMP_community="public";                      2
    
    my $snmpwalk="/usr/local/bin/snmpwalk";           3
    my $snmpget="/usr/local/bin/snmpget";           
    
    my $SNMP_FdbAddress	=".1.3.6.1.2.1.17.4.3.1.1";
    my $SNMP_FdbPort	=".1.3.6.1.2.1.17.4.3.1.2";
    my $SNMP_FdbIfIndex	=".1.3.6.1.2.1.17.1.4.1.2";
    my $SNMP_FdbIfName	=".1.3.6.1.2.1.31.1.1.1.1"; 
    
    my %mac_table;
    
    sub get_index_by_port_id
    {
    	my $port_id = shift;
    	my $switch = shift;
    	my $result = `$snmpget -OnQ -v1 -c $SNMP_community $switch SNMP_FdbIfIndex.port_id`;
    	$result =~ s/.*= //;	
    	chomp $result;
    	return $result;
    }
    
    sub get_name_by_port_index
    {
    	my $port_id = shift;
    	my $switch = shift;
    	$result = `$snmpget -OnQ -v1 -c $SNMP_community $switch SNMP_FdbIfName.port_id`;
    	$result =~ s/.*= //;	
    	chomp $result;
    	return $result;
    }
    
    
    my $mac_to_find = $ARGV[0]? $ARGV[0] : "";
    
    my @switches = split /\s+/, $SNMP_switch;
    
    for my $switch (@switches) {
    open (SNMP, "$snmpwalk -OnQ -v1 -c $SNMP_community $switch $SNMP_FdbAddress|");
    while(<SNMP>) {
            s/"//g;
            s/^\s*//g;
            s/\s*$//g;
            next if /^$/;
            my ($oid, $mac) = split /\s*=\s*/;
            $oid =~ s/^$SNMP_FdbAddress//;
            $mac =~ s/\ /:/g;
            $mac =~ s/([A-Z])/\l$1/g;
            mac_table{mac} = `$snmpwalk -OvnQ -v1 -c $SNMP_community $switch SNMP_FdbPortoid`;
            chomp $mac_table{$mac};
    #        $mac_table{$mac} .= "(switch $switch)";
    
            if (!$mac_to_find) {
                    print $mac," -> ",$mac_table{$mac}," ",
    		get_name_by_port_index(get_index_by_port_id($mac_table{$mac}, $switch), $switch),
    		"($switch)","\n";
            }
    }
    close(SNMP);
    if ($mac_to_find && defined($mac_table{$mac_to_find})) {
    	$mac = $mac_to_find;
    	print $mac," -> ",$mac_table{$mac}," ",
    		get_name_by_port_index(get_index_by_port_id($mac_table{$mac}, $switch), $switch),
    		"($switch)","\n";
    }
    }
    
    
    
    
    

    При создании скрипта обратите внимание на значения:

    1

    Список IP-адресов коммутаторов, которые должны быть опрошены в поисках указанного MAC-адреса. IP-адреса разделены пробелами.

    2

    Имя сообщества (community), которому предоставляется доступ на чтение по SNMP.

    3

    Путь к программе snmpwalk, с помощью которой выполнятся получение информации с устройства.

  2. Запуск скрипта на исполнение.

    Запустите скрипт на исполнение. Укажите в качестве параметра MAC-адрес устройства, которое нужно найти (здесь 00:01:02:03:04:05):

    # get-port-by-mac 00:01:02:03:04:05
    

    Используйте в качестве MAC-адреса адрес одной из сетевых плат хостов, присутствующих в сети.

Автоматическое обнаружение новых компьютеров в сети

С помощью скрипта, представленного ниже, организовать автоматическое обнаружение новых компьютеров в сети.

Как только в сети появляется новый компьютер, информация об этом должна сразу же появляется в файле /tmp/arp.log (или приходить по почте пользователю, имя которого указанно в переменной $mail_to)

# vi /usr/local/bin/watch-for-new-devices

#!/usr/bin/perl -w

# (c) igor chubin, 2005

my $mail_to = "root";
my $known_mac_addresses = "/var/known_mac_list";
my $nbtscan = "/usr/local/bin/nbtscan";
my $getport = "/usr/local/bin/get-port-by-mac";


my $arg1 = join " ", @ARGV;
$arg1 =~ /([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/;
my $ip = defined($1) ? $1 : "";
$arg1 =~ /([0-9a-f]+:[0-9a-f]+:[0-9a-f]+:[0-9a-f]+:[0-9a-f]+:[0-9a-f]+)/i;
my $mac = defined($1) ? $1 : "";
$arg1 =~ /arpwatch:\s+([^0-9]*)\s+[0-9]/i;
my $reason = defined($1) ? $1 : "";


1 while $mac =~ s/:(.):/:0$1:/g;
$mac =~ s/^(.):/0$1:/g;


if ($ip) {

	if (!`grep -i $mac $known_mac_addresses` or 
		$reason eq 'changed ethernet address' or 
		$reason eq 'flip flop' 
		) {

		my $nbtscan_output;
		open (NBTSCAN, "$nbtscan $ip|")
			or $nbtscan_output="cant run nbtscan $!";
		my @nbtscan = <NBTSCAN>;
		close(NBTSCAN);
		$nbtscan_output = join "", @nbtscan 
			unless $nbtscan_output;

		my $port="";
		$port = `$getport $mac` if $getport;

# Uncoment this line if you want to write messages to file 
# instead of mailing to user
#open (LOG, ">>/tmp/arp.log");

		open (LOG, "| mail -s 'ARPWatch Logger' $mail_to");
		print LOG "$arg1\n";
		print LOG "ip=$ip\n";
		print LOG "mac=$mac\n";
		print LOG "reason=$reason\n";
		print LOG "switch port=$port\n" if $port;
		print LOG "% nbtscan $ip\n${nbtscan_output}\n";
		close(LOG);

	}
}

© 2002-2005 Игорь Чубин
Учебный центр Сетевые Технологии, ug-ids, 2006-06-25
Слушатель отсутствует, ДЕМО-ВЕРСИЯ