Большое чудо в маленьком офисе. Часть 3


__sheva740 prototype 2 =) Хочется поприветствовать тех, кто выстоял, ведь этот туториал ,кажется, может утомить ))).

Мы помним, как в прошлом шаге не рекомендовалось запускать программу.
В этом шаге мы устраним это недоразумение.

Дело в том, что программа, которая рассматривалась в прошлом шаге, двумя потоками генерировала неверное соответствие IPA – MAC(IPAttack) и IPB – MAC(IPAttack) у атакуемых машин.

Так вот, если мы просто остановим эти потоки и не исправим ложное соответствие на истинное IPA – MAC(IPA) и IPB – MAC(IPB), то атакованным машинам придется ждать обновлений в своих локальных arp-таблицах какое-то время, или попросту ждать своей перезагрузки.

Но мы хотим все провести программно и грамотно.

Для корректировки данных, испорченных предшествующими потоками, мы запустим те же потоки снова, но новые потоки будут подавать обеим машинам истинные IP-MAC соответствия.

Thread A

Thread B

Вот как раз этим мы и займемся в рамках функции ResetSpoof(). Мы запустили два новых потока с истинными данными. Причем мы даем 5-10 секунд на то, чтобы потоки поработали и "убедили" атакованные машины сменить данные в локальных arp – таблицах. Далее просто останавливаем эти потоки и освобождаем память. Все, программу можно спокойно закрывать.
Остается один вопрос – как отловить признак завершения программы пользователем в консольном приложении? Этот вопрос успешно решается функцией SetConsoleCtrlHandler(). Простой пример использования этой полезной функции вы найдете по пути:
"sources/__sheva740/miracle/03/files/setConHandl/setConHandl.asm"

Поэкспериментируйте с ней, запустите и наберите Ctrl+С. Через несколько секунд процесс завершится и все станет понятней.

Итак, у нас по пути:
"sources/__sheva740/miracle/03/files/arpspoof_sub2/src/arpspoof_sub2.asm"
… программа, которую можно безопасно запустить. Результатом ее работы будет обрыв сетевого обмена атакованной машины (IPA) с шлюзом (IPB). Причем программа корректно завершается, восстанавливая после себя все соответствия на атакованных хостах.

Если помните второй шаг, то там мы наметили себе еще задачу перехвата трафика с IPA к IPB. Как реализовать эту задачу? Сделать это можно средствами WinPcap. В ее недрах есть функция pcap_loop()
Что это за функция? Открыв интерфейс по pcap_open_live() и получив его хендл, передаем его pcap_loop(). Эта функция будет получать указатель на все заголовки получаемых/передаваемых пакетов с/на этот интерфейс. Так, уже проще. )))
Посмотрим на ее заголовок:
pcap_loop(adhandle, 0, offset packet_handler, NULL)
где
adhandle – указанный выше хендл открытого интерфейса
offset packet_handler – адрес callback функции, которая должна так же быть организованна правильно.

Приведем выдержку из справки:
void packet_handler (u_char *user, struct pcap_pkthdr *phrd, u_char *pdata)
где
user - Пользовательский параметр, который передается в pcap_dispatch подпрограмму.
phdr - является указателем на pcap_pkthdr структуру, которая предшествует каждому пакету.
pdata - указывает на данные пакета. Это позволяет пользователям определять собственную обработку фильтрованных пакетов.

Так и сделаем. В рамках функции packet_handler() вызываем функцию ForwardPacket() и уже в рамках которой будем получать тело пакетов (указатель pktdata) и анализировать его.
Вот наступил долгожданный момент, и мы получили пакет. Пакет прошел длинный путь
pcap_loop() – packet_handler() – ForwardPacket(). В рамках последней функции мы получили указатель на заголовок и тело пакета. Давайте теперь откроем исходник функции ForwardPacket() и вместе проследим по нему. Получаем заголовок tcp - пакета, и берем из него IP-отправителя, и IP-назначения.

Начинаем отлавливать и обрабатывать поток IPA-IPB.

IPA-IPB

Изменив заголовок пакета, отправляем его снова в сеть.

Начинаем отлавливать и обрабатывать поток IPB-IPA.

IPB-IPA

Изменив заголовок пакета, отправляем его снова в сеть

Кажется понятно?
- если я получил пакет от IPA, я изменяю его так чтобы он пошел к IPB.
- если я получил пакет от IPB, я изменяю его так чтобы он пошел к IPA.

Кстати, в этом месте программы можно дополнить функцию ForwardPacket() более сложной обработкой или, прости Господи – подменой, данных в пакете, тут очень удобно будет с ним работать.

__sheva740 prototype 3 =)

Подведем итоги. Полностью работающая программа лежит по пути:
"sources/__sheva740/miracle/03/files/arpspoof/src/arpspoof.asm"

Также в папке files вы найдете простую программку по обнаружению атаки этого типа. Эта консольная программа покажет, какие машины в сети меняли свои MAC адреса. Далее , если вы поняли, где меняются адреса, нужно сесть за одну из них и позапускать сниффер для определения хоста который ей шлет ARP-пакеты с ложными MAC-адресами. Вот та, которая шлет, та и есть "преступник". ))

Программу монитора смены MAC – ов можно найти тут:
"sources/__sheva740/miracle/03/files/macmon/macmon.exe"
Просто запускаем и ждем сообщений.

__sheva740 prototype 4 =) Проект не был сложным.

Нам удалось детально во всем разобраться, порисовать алгоритмы и уловить закономерности.

Так же мы смогли привести промежуточные результаты проектирования.

Были разработаны вспомогательные утилиты.

В общем, было увлекательно.

Но всему под солнцем должен придти конец, для того чтобы уступить место еще более лучшему. )))

Так что – До свиданья друзья!


<<< Часть 2


Исходники: sources/__sheva740/miracle/03/files


______________________________
__sheva740
2012

Inception E-Zine