- Протокол ARP и «с чем его едят» (дополнено)
- View IP Addresses of LAN Devices from Command Line in Mac OS
- Find Local Device IP Addresses with arp
- How to Find IP Addresses of Devices on a Local Network with ping & arp
- How do I find IP addresses of all other computers on my network?
- Заметки сисадмина о интересных вещах из мира IT, инструкции и рецензии. Настраиваем Компьютеры/Сервера/1С/SIP-телефонию в Москве
- Замена MAC адреса
- Нестандартное использование ARP
Протокол ARP и «с чем его едят» (дополнено)
Спасибо хабраюзеру hardex за публикацию первоначальной статьи, а также всем, кто плюсанул в карму для возможности моей собственноручной публикации. Теперь дополненная версия с учетом пожеланий и дополнений. Добро пожаловать под кат.
Доброго времени суток, дорогие хабраюзеры. Этой статьей я хочу начать цикл повествования о протоколах, которые помогают нам прозрачно, быстро и надежно обмениваться информацией. И начать с протокола ARP.
Как известно, адресация в сети Internet представляет собой 32-битовую последовательность 0 и 1, называющихся IP-адресами. Но непосредственно связь между двумя устройствами в сети осуществляется по адресам канального уровня (MAC-адресам).
Так вот, для определения соответствия между логическим адресом сетевого уровня (IP) и физическим адресом устройства (MAC) используется описанный в RFC 826 протокол ARP (Address Resolution Protocol, протокол разрешения адресов).
ARP состоит из двух частей. Первая – определяет физический адрес при посылке пакета, вторая – отвечает на запросы других станций.
Протокол имеет буферную память (ARP-таблицу), в которой хранятся пары адресов (IP-адрес, MAC-адрес) с целью уменьшения количества посылаемых запросов, следовательно, экономии трафика и ресурсов.
Пример ARP-таблицы.
192.168.1.1 08:10:29:00:2F:C3
192.168.1.2 08:30:39:00:2F:C4
Слева – IP-адреса, справа – MAC-адреса.
Прежде, чем подключиться к одному из устройств, IP-протокол проверяет, есть ли в его ARP-таблице запись о соответствующем устройстве. Если такая запись имеется, то происходит непосредственно подключение и передача пакетов. Если же нет, то посылается широковещательный ARP-запрос, который выясняет, какому из устройств принадлежит IP-адрес. Идентифицировав себя, устройство посылает в ответ свой MAC-адрес, а в ARP-таблицу отправителя заносится соответствующая запись.
Записи ARP-таблицы бывают двух вид видов: статические и динамические. Статические добавляются самим пользователем, динамические же – создаются и удаляются автоматически. При этом в ARP-таблице всегда хранится широковещательный физический адрес FF:FF:FF:FF:FF:FF (в Linux и Windows).
Создать запись в ARP-таблице просто (через командную строку):
Вывести записи ARP-таблицы:
После добавления записи в таблицу ей присваивается таймер. При этом, если запись не используется первые 2 минуты, то удаляется, а если используется, то время ее жизни продлевается еще на 2 минуты, при этом максимально – 10 минут для Windows и Linux (FreeBSD – 20 минут, Cisco IOS – 4 часа), после чего производится новый широковещательный ARP-запрос.
Сообщения ARP не имеют фиксированного формата заголовка и при передаче по сети инкапсулируются в поле данных канального уровня
Формат сообщения ARP.
- тип сети (16 бит): для Ethernet – 1;
- тип протокола (16 бит): h0800 для IP;
- длина аппаратного адреса (8 бит);
- длина сетевого адреса (8 бит);
- тип операции (16 бит): 1 – запрос, 2 — ответ;
- аппаратный адрес отправителя (переменная длина);
- сетевой адрес отправителя (переменная длина);
- аппаратный адрес получателя (переменная длина);
- сетевой адрес получателя (переменная длина).
А вот как происходит определение маршрута с участием протокола ARP.
Пусть отправитель A и получатель B имеют свои адреса с указанием маски подсети.
- Если адреса находятся в одной подсети, то вызывается протокол ARP и определяется физический адрес получателя, после чего IP-пакет инкапсулируется в кадр канального уровня и отправляется по указанному физическому адресу, соответствующему IP-адресу назначения.
- Если нет – начинается просмотр таблицы в поисках прямого маршрута.
- Если маршрут найден, то вызывается протокол ARP и определяется физический адрес соответствующего маршрутизатора, после чего пакет инкапсулируется в кадр канального уровня и отправляется по указанному физическому адресу.
- В противном случае, вызывается протокол ARP и определяется физический адрес маршрутизатора по умолчанию, после чего пакет инкапсулируется в кадр канального уровня и отправляется по указанному физическому адресу.
Главным достоинством проткола ARP является его простота, что порождает в себе и главный его недостаток – абсолютную незащищенность, так как протокол не проверяет подлинность пакетов, и, в результате, можно осуществить подмену записей в ARP-таблице (материал для отдельной статьи), вклинившись между отправителем и получателем.
Бороться с этим недостатком можно, вручную вбивая записи в ARP-таблицу, что добавляет много рутинной работы как при формировании таблицы, так и последующем ее сопровождении в ходе модификации сети.
Существуют еще протоколы InARP (Inverse ARP), который выполняет обратную функцую: по заданному физическому адресу ищется логический получателя, и RARP (Reverse ARP), который схож с InARP, только он ищет логический адрес отправителя.
В целом, протокол ARP универсален для любых сетей, но используется только в IP и широковещательных (Ethernet, WiFi, WiMax и т.д.) сетях, как наиболее широко распространенных, что делает его незаменимым при поиске соответствий между логическими и физическими адресами.
Источник
View IP Addresses of LAN Devices from Command Line in Mac OS
If you need to view the IP addresses of other hardware on the same LAN (Local Area Network) as a Mac, the command line arp tool works quite well. You’ll quickly find other devices IP and accompanying MAC addresses, which can make direct network connections easier and be helpful for many other network and troubleshooting purposes.
Find Local Device IP Addresses with arp
To get started, launch the Terminal app from /Applications/Utilities/ (or accessed with Spotlight and Command+Spacebar). The arp tool is uses ARP (Address Resolution Protocol) to display and control network address resolution functions. For the purposes we want to achieve here, the most simple use of arp is with an -a flag attached:
This will return devices found on the local network, including other Macs, PCs, routers, iPhones, and iPads, displaying both their LAN IP address as well as their individual MAC address. (For the latter, you can help distinguish hardware by matching them up to the MAC address found in MacOS X or in iOS).
An example of arp -a output looks like this:
% arp -a
? (192.168.0.1) at 0:0:ca:1:2:3 on en0 ifscope [ethernet]
? (192.168.0.2) at 68:b8:3d:22:1c:42 on en0 ifscope [ethernet]
? (192.168.0.11) at b4:12:23:5a:d3:6f on en0 ifscope [ethernet]
? (192.168.0.255) at ff:ff:ff:ff:ff:ff on en0 ifscope [ethernet]
How to Find IP Addresses of Devices on a Local Network with ping & arp
If the output doesn’t look up to date, or if it’s missing an IP you believe should be there, ping the broadcast IP (typically the last result of arp -a ending with “.255”), then run arp -a again like so.
First ping the broadcast IP:
Terminal% ping 192.168.0.255
PING 192.168.0.255 (192.168.0.255): 56 data bytes
64 bytes from 192.168.0.6: icmp_seq=0 ttl=64 time=0.079 ms
64 bytes from 192.168.0.1: icmp_seq=0 ttl=64 time=1.922 ms
— 192.168.0.255 ping statistics —
2 packets transmitted, 2 packets received, +6 duplicates, 0.0% packet loss
round-trip min/avg/max/stddev = 0.079/39.404/303.510/75.738 ms
Then run arp -a command again:
Terminal% arp -a
? (192.168.0.1) at 0:0:ca:1:2:3 on en0 ifscope [ethernet]
? (192.168.0.2) at 68:b8:3d:22:1c:42 on en0 ifscope [ethernet]
? (192.168.0.10) at 22:12:bb:a0:3d:fd on en0 ifscope [ethernet]
? (192.168.0.11) at b4:12:23:5a:d3:6f on en0 ifscope [ethernet]
? (192.168.0.255) at ff:ff:ff:ff:ff:ff on en0 ifscope [ethernet]
Note in this example that 192.168.0.10 is a fresh IP compared to the prior results, as that machine just joined the network.
You can ignore the protocol suggestion at the end of the arp results, in this example despite the devices showing as “ethernet”, they’re actually all on a wireless network with wi-fi on the en0 interface.
Do note that you will not see the Macs own IP address or MAC address in this list. If need be, you can find your own IP address through Terminal, System Preferences, or by using an outside service if you’re looking for the external address.
While arp works well enough for most cases, and it has the advantage of being built into all versions of Mac OS X, it may not be sufficient for everyone. For more advanced users, nmap is an even better option for a network discovery tool, but nmap requires installing either directly, compiling through source, or through something like homebrew.
How do I find IP addresses of all other computers on my network?
The above ping and arp trick will find and list all IP addresses of any devices or computers on the network. This means the IP address of any same network connected Mac computers, Windows PC, Linux machines, iOS devices like iPhone and iPad, Android phones and tablets on the same network, even set-top IP enabled boxes like an Apple TV or Playstation will be found, assuming those devices and computers are connected to the same local network as the computer doing the searching.
Do you know of another helpful way to to find, locate, and list network connected devices and computers on the same network? Share it with us in the comments!
Источник
Заметки сисадмина о интересных вещах из мира IT, инструкции и рецензии. Настраиваем Компьютеры/Сервера/1С/SIP-телефонию в Москве
Замена MAC адреса
Нестандартное использование ARP
В данной статье описывается для чего нужен и как можно использовать ARP протокол.
Прежде всего мне хотелось бы немного рассказать о том, как в локальной сети пакеты передаются от одного интерфейса к другому. В соответствии с семиуровневой моделью OSI уровень связи данных (Data link layer) организует данные в кадры (frame). Иногда ее называют канальным уровнем. Каждый кадр имеет заголовок (header), содержащий адрес и управляющую информацию, а завершающая секция кадра (trailer) используется для исправления ошибок (иногда ее называют хвостом кадра). Кадр доставляется на сетевой адаптер, физический адрес которого совпадает с физическим адресом назначения из заголовка кадра. Заголовок кадра содержит физический адрес интерфейса назначения, часто называемый MAC-адресом (от Media Access Control – управление доступом к носителю). Система с указанным адресом принимает посланное сообщение и обрабатывает его.
Структура MAC кадра для DIX | ||
MAC – кадр | IP датагарамма | FCS (контрольная сумма MAC кадра) |
Поля MAC кадра для DIX Ethernet | |||||||||||||
00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 0A | 0B | 0C | 0D |
Dst MAC | Src MAC | Tp |
Обозначения:
Dst MAC – Destination Hardware Address
Src MAC – Source Hardware Address
Tp – Protocol Type
Таким образом, для доставки датаграммы в локальной сети нужно определить физический адрес узла назначения. Именно для этого существует процедура автоматического определения физических адресов. Протокол разрешения адресов (Address Resolution Protocol – ARP) обеспечивает метод динамической трансляции между IP-адресом и соответствующим физическим адресом на основе широковещательных рассылок.
Система локальной сети самостоятельно использует ARP для исследования информации о физических адресах (хотя есть возможность при необходимости вручную ввести ARP-таблицу). Когда хосту нужно начать коммуникацию с другим хостом в локальной сети, он ищет IP-адрес получателя в ARP-таблице, которая обычно располагается в оперативной памяти. Если для нужного IP-адреса не находится требуемого элемента таблицы, хост посылает широковещательный запрос ARP, содержащий искомый IP-адрес назначения. Отметим что MAC адрес для широковещательной рассылки FF:FF:FF:FF:FF:FF.
Целевой хост узнает свой IP-адрес и обрабатывает запрос. После этого он изменяет собственную таблицу трансляции соответствия IP и MAC адресов, включая в нее IP-адрес и физический адрес отправителя широковещательного ARP-пакета и посылает ответ, содержащий аппаратный адрес своего интерфейса. Когда система, пославшая запрос, получает такой ответ, она обновляет свою таблицу ARP и становится готовой к пересылке данных по локальной сети.
Формат сообщений ARP | |
Количество октетов | Поле |
2 | Тип аппаратного адреса |
2 | Протокол адресации высокого уровня |
1 | Длина аппаратного адреса |
1 | Длина адреса высокого уровня |
2 | Тип сообщения: 00 01 – запрос, 00 02 – ответ |
* | Аппаратный адрес источника |
* | Адрес высокого уровня источника |
* | Аппаратный адрес приемника |
* | Адрес высокого уровня приемника |
Пример кадра с ARP запросом | ||||||||||||||||
Offset | 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 0A | 0B | 0C | 0D | 0E | 0F |
0000: | FF | FF | FF | FF | FF | FF | 00 | 40 | 95 | 01 | 59 | 01 | 08 | 06 | 00 | 01 |
0010: | 08 | 00 | 06 | 04 | 00 | 01 | 00 | 40 | 95 | 01 | 59 | 01 | 0A | 00 | 00 | 06 |
0020: | 00 | 00 | 00 | 00 | 00 | 00 | 0A | 00 | 00 | 01 |
Расшифровка пакета полученная с помощью сниффера NetXRay | ||
Ethernet Version II | ||
Address | 00-40-95-01-59-01 | FF-FF-FF-FF-FF-FF |
Ethernet II Protocol Type | ARP (08 06) | |
Address Resolution Protocol | ||
Hardware Type | Ethernet (00 01) | |
Protocol Type | IP Protocol (08 00) | |
Hardware Address Length | 6 bytes (06) | |
Protocol Address Length | 4 bytes (04) | |
Operations | ARP Request (00 01) | |
Source Hardware Address | 00-40-95-01-59-01 | |
IP Source Address | 10.0.0.6 (0A 00 00 06) | |
Destination Hardware Address | 00-00-00-00-00-00 | |
IP Destination Address | 10.0.0.1 (0A 00 00 01) | |
Calculate CRC: 0x6ffd5fa9 |
Данный ARP-запрос был “пойман” после того как была запущена программа ping 10.0.0.1. В ARP-таблице не было данного IP-адреса – поэтому был послан запрос. Отметим что поле Destination Hardware Address неизвестно – поэтому заполнено нулями (00:00:00:00:00:00).
Как уже говорилось выше, данные о соответствии IP адреса и физического адреса хранятся в ARP-таблице. Просмотреть ее содержимое можно командой ARP.
> ARP -a выводит список всех закешированных элементов
> ARP -a [IA] выведет соответствие MAC для указанного для интерфейса IA
> ARP -d [IA] удаляет существующий элемент с из таблицы для интерфейса IA
> ARP -s [IA] добавляет элемент для интерфейса IA
Как можно нестандартно использовать ARP протокол? Ответ прост – дело в том, что большинство операционных систем ARP-ответ заносят сразу же без проверки (посылала ли система запрос) в ARP таблицу (исключением является Solaris, который игнорирует ARP ответы, если не посылался ARP запрос). Почему в остальных ОС не применен такой же метод, остается загадкой.
Чем грозит такая ситуация? Если интерфейс получит данные о том, что какому-то IP соответствует MAC, который на самом деле не существует, то IP-датаграммы к данному хосту будут вкладываться в кадр с фальшивым MAC. Это приведет к тому, что ни один сетевой интерфейс в локальной сети не будет воспринимать этот пакет. Таким образом, все данные уйдут в “никуда”. Для реализации подобной атаки необходимо периодически (интервал зависит от операционной системы) посылать ложные ARP ответы. В результате атакуемый хост не сможет установить соединение с хостом, IP адрес которого указан в ложном ARP ответе. Данная атака применима даже если уже установлено соединение между двумя хостами. После посылки даже одного ложного ARP ответа соединение будет разорвано по таймауту. Для того чтобы два хоста не смогли обмениваться пакетами друг с другом, необходимо направить ложные ARP ответы на один из хостов. Если же ставить целью полностью отключить хост от сети, то необходимо периодически посылать ложные ARP ответы от всех хостов в сети. Тогда на атакуемом хосте сложится впечатление, что поврежден кабель или вышла из строя сетевая карта. Однако это впечатление легко рассеять, достаточно лишь запустить сниффер и убедиться что интерфейс работает, и пакеты отправляются и получаются.
Демострация атаки:
на атакаемом хосте запускаем ping с ключом -t (до прерывания пользователем). Через некоторое время посылается ложный ARP-ответ, а затем ARP ответ с правильным MAC-адресом. Посылать ARP-ответ можно либо с помощью сниффера NetXRay, либо специально написанными для этого программами. Вот что будет результатом:
Обмен пакетами с 10.0.0.1 по 32 байт:
Ответ от 10.0.0.1: число байт=32 время MAC3(IP1->IP2) сменить в этом пакете MAC3->MAC2(IP1->IP2) и отправить пакет;
получив (Ethernet) пакет с MAC2->MAC3(IP2->IP1) сменить в этом пакете MAC3->MAC1(IP2->IP1) и отправить пакет.
Кроме того, необходимо периодически посылать ложные ARP-ответы хостам хост1 и хост2 – для чтобы созданные записи в ARP-таблице не “устаревали”.
При выполнении указанных действий через хост3 будут проходить все пакеты между хост1 и хост2. Достаточно будет запустить сниффер и поставить его в режим записи всего траффика, с целью последующего анализа соединений между хостами, для выявления нужной информации. Хочется добавить, что каждый пакет, проходящий через хост3, будет повторяться дважды – один раз – когда он приходит от хоста-отправителя, и второй – когда он будет отправлен по месту назначения.
Как защитить себя и свою сеть, а также вовремя обнаружить данную атаку? Необходимо статически прописать элементы ARP-таблицы к тем хостам, куда передаются важные данные (POP3-пароли, telnet сессия и т.д.), чаще всего в локальной сети это default gateway, а также хосты, куда вы заходите telnet’ом (опять же это не спасет положения на Windows-платформах). Также можно жестко прописать соответствия ARP-IP в таблице на коммутаторе и запретить ее обновление во время работы. Обнаружить атаку можно просмотрев закешированные данные ARP-таблицы и сравнить их с реальными данными. При обнаружении несовпадения с реальными данными, к примеру, у вас в таблице хост имеет MACx, а на самом деле у него MACs. Это значит, что вас атакуют с хоста, имеющего MACx. Обнаружить атакующего не составляет труда.
Очень часто в локальных сетях при необходимости ограничить доступ к определенному хосту или для идентификации хоста администраторы использует именно MAC-адрес сетевого адаптера. IP-адрес изменить не составляет труда (при наличии прав администратора на Windows NT), а вот решение проблемы свободного изменения MAC адреса для Windows NT (универсального метода, рабатающего на абсолютно всех адаптерах) автор еще не встречал. Естественно, вы можете возразить, что поменять MAC-адрес можно непосредственно в настройках сетевой карты (или ключа в реестре). Да, действительно, существуют подобные сетевые карты, к которым прилагаются такие драйвера, но это возможно не на всех сетевых адаптерах. К примеру, на сетевых картах Realtek8029, WinBond, 3Com можно изменять MAC-адрес, устанавливая соответствующие ключи в реестре:
Для win9x:
[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Class\Net000] – здесь необходимо создать 2 строковые переменные (string):
где xx-xx-xx-xx-xx-хх – любой MAC-адрес, который будет душе угоден.
Для winNT:
Во всех остальных случаях, когда имеется сетевая карта, на которой таким образом не удается изменить MAC-адрес – как поменять на ней “жестко” зашитые данные? Оказывается и на ней подменить собственный MAC-адрес все же можно.
Автору известны два метода. Начнем с наиболее трудного.
Идея первого очень похожа на создание ложного ARP-сервера. Только на этот раз мы будем обманывать собственный интерфейс. Для реализации необходимо иметь два интерфейса. Пакеты, приходящие на первый интерфейс мы будем “укладывать” в желаемый MAC-адрес и отправлять его с другого интерфейса.
Дальше у нас есть выбор как это реализовать. Во-первых, мы можем установить дополнительный интерфейс, установить маршрутизацию пакетов и использовать этот интерфейс для подключения нескольких или одного хостов. Все пакеты, приходящие от них, будут “перекладываться” на уже имеющийся интерфейс и отправляться с него с желаемым MAC-адресом.
Во втором варианте мы можем создать виртуальный интерфейс или выделив реальный интерфейс в отдельную подсеть и установив маршрутизацию пакетов, либо оставить все как есть и настроить только роутинговую таблицу. Этот метод проще, поэтому на нем и остановимся. Поняв его, можно будет с легкостью подменить MAC-адрес и с помощью двух реальных интерфейсов.
Установить виртуальный интерфейс в Windows NT не составляет труда. Он называется Адаптер MS loopback и устанавливается как обычный адаптер.
При его конфигурации необходимо настроить его также как имеющийся интерфейс, только надо присвоить ему любой неиспользуемый IP-адрес.
Теперь необходимо настроить таблицу роутинга. Смотрим имеющуюся схему маршрутизации пакетов:
Список интерфейсов | ||
0x1 | MS TCP Loopback interface | |
0x2 | 20 4c 4f 4f 50 20 | MS LoopBack Driver |
0x3 | 00 40 95 01 59 01 | Winbond W89C940 PCI Network Adapter |
Активные маршруты: | ||||
Сетевой адрес | Маска | Шлюз | Интерфейс | Метрика |
0.0.0.0 | 0.0.0.0 | 10.0.0.7 | 10.0.0.6 | 1 |
0.0.0.0 | 0.0.0.0 | 10.0.0.250 | 10.0.0.7 | 1 |
10.0.0.0 | 255.255.255.0 | 10.0.0.6 | 10.0.0.6 | 1 |
10.0.0.0 | 255.255.255.0 | 10.0.0.7 | 10.0.0.7 | 1 |
10.0.0.6 | 255.255.255.0 | 127.0.0.1 | 127.0.0.1 | 1 |
10.0.0.7 | 255.255.255.0 | 127.0.0.1 | 127.0.0.1 | 1 |
10.255.255.255 | 255.255.255.255 | 10.0.0.7 | 10.0.0.7 | 1 |
127.0.0.0 | 255.0.0.0 | 127.0.0.1 | 127.0.0.1 | 1 |
224.0.0.0 | 224.0.0.0 | 10.0.0.6 | 10.0.0.6 | 1 |
224.0.0.0 | 224.0.0.0 | 10.0.0.7 | 10.0.0.7 | 1 |
где:
0x1:MS TCP Loopback interface
0x2:20 4c 4f 4f 50 20 (10.0.0.7):MS LoopBack Driver
0x3:00 40 95 01 59 01 (10.0.0.6):Winbond W89C940 PCI Network Adapter
Что имеем? Расшифровка построчно
default gateway для интерфейса 3 – 10.0.0.7
default gateway для интерфейса 2 – 10.0.0.250 route delete 10.0.0.0 if 3
Что необходимо для подмены MAC-адреса? Обозначим для удобства:
10.0.0.6 | IPr |
00 40 95 01 59 01 | MACr |
10.0.0.7 | IPv |
20 4c 4f 4f 50 20 | MACv |
MACn/IPn – MAC/IP хоста с которым будет устанавливаться соединение
MACw – желаемый MAC
пакеты отправленные с интерфейса 3 будут иметь следующий вид
MAC-кадр | Src MAC: MACr |
Dst MAC: MACv | |
IP-датаграмма | Src IP: IPr |
Dst IP: IPn | |
Data |
Необходимо получив виртуальным интерфейсом пакет с таким кадром переложить IP-датаграму в MAC-кадр и отправить с интерфейса 3:
MAC-кадр | Src MAC : MACw |
Dst MAC : MACn | |
IP-датаграмма | Src IP : IPr |
Dst IP : IPn | |
Data |
а получив на интерфейс 3 такой MAC-кадр:
MAC-кадр | Src MAC : MACw |
Dst MAC : MACn | |
IP-датаграмма: | Src IP : IPn |
Dst IP : IPr | |
Data |
переложить в следующий MAC-кадр и отправить с виртуального интерфейса:
MAC-кадр | Src MAC : MACv |
Dst MAC : MACr | |
IP-датаграмма | Src IP : IPn |
Dst IP : IPr | |
Data |
Отправлять такие пакеты можно при условии что хост, от “имени” (MAC) которого будут отправляться пакеты должен быть неактивным. Для того, чтобы имитация другого хоста была полной, необходимо также сменить имя компьютера.
Все выглядит сложным, но, разобравшись написать такую программу, не составило труда.
Второй метод смены MAC-адреса намного проще. Первый способ требует написания программы работающей на низком уровне, в то время как сменить MAC-адрес можно используя лишь отладчик SoftIce. Дело в том, что драйвер сетевой карты считывает MAC-адрес через стандартные порты ввода-вывода только на этапе инициализации. Перехватив этот момент и подменив реальные данные на желаемые, можно добиться желаемого результата. Использовать данный метод, во-первых, удобнее, а во вторых это не требует затрат времени на подмену (драйвер будет просто работать как и обычно). В первом способе каждый принятый/отправленный пакет, должен обработаться еще программой, что не дает возможным использование его в 100 мега-битной сети (пакеты не будут успевать обрабатываваться).
Что нужно для этого метода? Как уже говорилось необходимо иметь отладчик SoftIce или любой другой, который будет загружаться до загрузки системы и позволяющий отлаживать драйвера устройств. В SoftIce это режим “Boot”. Теперь необходимо определить диапазон ввода-вывода сетевой карты. К примеру, на Winbond W89C940 это E400-E41F. Чтение MAC-адреса происходит через порт E410h (начало диапазона плюс 10h). Именно этот порт и нужно контролировать. Запоминаем собственный MAC-адрес (так как через порт может считываться не только он – передается также и служебная информация, к примеру название чипсета).
Устанавливаем режим отладчика “Boot” и перезагружаемся. После загрузки SoftIce, входим в его консоль (по умолчанию комбинация ctrl-D) и устанавливаем точку останова при попытке чтения из порта E410h:
и даем системе грузиться дальше. После того как происходит попытка чтения из указанного порта (при инициализации драйвера сетевой карты) попадаем в консоль SoftIce. Теперь необходимо определить что считывается – MAC-адрес или это другая информация. Сравниваем первый байт MAC-адреса с содержимым регистра AL и при совпадениии меняем его на нужное значение. Если это не он, то пропускаем и ждем следующего чтения (F5). 6 байт MAC-адреса будут считываться последовательно, но нужно учесть, что считывание происходит дважды. Т.е. заменив один раз все 6 байт, трассируем до тех пор, пока MAC-адрес не будет считываться повторно. Подменив его и во второй раз, можно очистить точку останова и дать системе загрузиться полностью. Для этого в консоли SoftIce пишем:
и выходим с консоли. После загрузки системы драйвер сетевой карты будет работать с новым MAC-адресом. Убедиться в этом можно выполнив команду:
Данная операция занимает не более 5 минут. Сложно будет только в первый раз, когда неизвестно в какой именно момент считывается MAC-адрес.
Как обнаружить, что кто-то одним из указанных методов подменил MAC-адрес? Сложно сказать, потому как, анализируя сетевой траффик, никаких аномалий не наблюдается. Можно предложить следующие дополнительные проверки, которые можно сделать, к сожалению, только вручную (проверку MAC-адреса может контролировать программа) – проверка общих ресурсов (если у настоящего хоста их достаточно много, то имитировать их будет довольно сложно), а также определение удаленной ОС (хотя можно проводить атаку с хоста имеющего идентичную ОС). Из всего этого следует сделать вывод, что полагаться только на идентификацию истинности хоста только на основании соответствия MAC-адреса – нельзя.
Хочется отметить, что все вышеописанные атаки имеют воплощение в виде программ, которые по понятным причинам не выставляются для всеобщего тестирования. Большая просьба отнестись к этому с пониманием и не присылать письма с просьбой отправить эти программы. При большом желании вы можете написать их сами – пусть это будет еще один повод заняться написанием программ.
Для написания программ был использован драйвер Packet capture driver by Netgroup of Politecnico di Torino PCCap, доступный здесь:
Источник