Kniga-Online.club
» » » » Коллектив авторов - Защита от хакеров корпоративных сетей

Коллектив авторов - Защита от хакеров корпоративных сетей

Читать бесплатно Коллектив авторов - Защита от хакеров корпоративных сетей. Жанр: Прочая околокомпьютерная литература издательство неизвестно, год 2004. Так же читаем полные версии (весь текст) онлайн без регистрации и SMS на сайте kniga-online.club или прочесть краткое содержание, предисловие (аннотацию), описание и ознакомиться с отзывами (комментариями) о произведении.
Перейти на страницу:

/* Handle ARPs: */

if (ntohs(eth->ether_type) == ETHERTYPE_ARP &&

arp->ar_op == htons(ARPOP_REQUEST) &&

!memcmp(arp->ar_tpa, user_ip, IPV4_ADDR_LEN)) {

/*

* IF: The ethernet header reports this as an

* ARP packet, the ARP header shows it a

* request for translation, and the address

* being searched for corresponds to this

* “stack”...

*

*/

В этом месте программа ищет запросы ARP. Первое, что нужно сделать, – это удостовериться в том, что полученные данные действительно являются пакетом, содержащим нужный запрос. Для этого требуется пара надоедливых вещей. Во-первых, необходимо изменить порядок байтов в данных, на которые указывает указатель eth->ether_type, по крайней мере на системах с прямым порядком байтов. (Вполне возможно, что предложенный способ плохо работает на системах с обратным порядком байтов.) Это выполняется при помощи вызова функции ntohs, которая управляет переключением от сети к хосту. Затем следует проверить, что удаленная сторона осуществляет повторный запрос, повторно переключая порядок используемых байтов. На сей раз используется функция htons для представления ARP-запроса в присущий для сети формат. Наконец, коснемся вопроса о том, соответствует ли найденный ARP-запрос IP-адресу, присутствие которого искалось в сети для ее фальсификации. Это осуществляется при помощи инвертирования результата работы функции memcmp, возвращающей первый байт, которым отличаются два буфера. Причем нулевой код возврата означает, что различие между буферами не найдено, точно то, что нам и хотелось. Таким способом код возврата инвертируется в единичное значение:

memcpy(eth->ether_dhost, eth->ether_shost, ETHER_ADDR_LEN); memcpy(eth->ether_shost, user_mac, ETHER_ADDR_LEN);

Одной из действительно крутых вещей, которые можно сделать благодаря совместимости буферов libpcap и libnet, является то, что по желанию можно на месте переставлять пакеты в сети, а затем отослать их обратно без повторной инициализации памяти или передачи содержимого через какой-либо контекст или еще как-нибудь. (В этом нет ничего нового. Программы ядра операционной системы делают это годами. Но рассматриваемый случай – это случай нахождения в пространстве пользователя в предположении работы Netscape, mpg123 или еще чего-нибудь без имитации работы сетевой платы!) Поскольку делается попытка ответить отправителю Ethernet-пакета, поэтому просто и деструктивно копируем оригинальный адрес отправителя в поле адресата. Затем записываем в поле «хост-отправитель» пакета Ethernet MAC-адрес, который обязательно существует в сети:

memcpy(arp->ar_tha, arp->ar_sha, ETHER_ADDR_LEN); memcpy(arp->ar_sha, user_mac, ETHER_ADDR_LEN);

Ах, акронимы! Какой замечательный способ начинать день! ARP-акронимы на самом деле не слишком плохи – tha и sha не означают ничего больше, кроме как «адрес хоста получателя» и «адрес хоста отправителя». В копировании на месте важно то, что это точный эквивалент только что сделанного на уровне Ethernet: «Отправитель ARP в поле user_mac информирует ARP-получателя, кто послал ARP запрос последним». Автор надеется, что читатель не удивится избыточности протокола:

arp->ar_op = htons(ARPOP_REPLY);

memcpy(test_ip, arp->ar_spa, IPV4_ADDR_LEN);

memcpy(arp->ar_spa, arp->ar_tpa, IPV4_ADDR_LEN);

memcpy(arp->ar_tpa, test_ip, IPV4_ADDR_LEN);

Наконец, после преобразования пакета из формата запроса в формат ответа была выполнена замена IP-адресов. В рассматриваемом случае замена выполнена при помощи использования не требующей особого пояснения временной переменной. (Команда XOR тоже сгодилась бы, но автор ленив, а читатель должен был это понять.) После всех манипуляций был получен разумно законченный и правильный вариант ответа на ARP-запрос, который отправляется с инвертированными IP-адресами, ARP-адресами аппаратных средств и правильными характеристиками Ethernet-пакета. Бум, сделано:

i = libnet_write_link_layer(l, dev, packet, pkthdr.caplen);

if (verbose)

fprintf(stdout, “ARP: Wrote %i bytesn”, i);

Структура pkthdr полезна. Фактически это небольшая коллекция метаданных в момент их захвата. Они все потребуются для дальнейшей обработки. Элемент структуры caplen хранит длину захваченных данных. Он полностью подходит для функции установления связи и записи данных, которая нуждается в счетчике числа предполагаемых для отправки байтов. Поскольку при модификации пакетов situ длина их данных в общем случае не будет изменяться (хотя такое и могло произойти), знание оригинальной длины пакета позволяет узнать точное количество отосланных обратно данных. Также поможет и то, что рассматривается протокол с фиксированным размером пакетов, как, например, FTP, а не протокол с пакетами переменной длины, как, например, DNS:

/* Handle ARP replies (responding with upstream IP) */

} else if (eth->ether_type == ntohs(ETHERTYPE_ARP) &&

arp->ar_op == htons(ARPOP_REPLY) &&

!memcmp(arp->ar_spa, upstream_ip, IPV4_ADDR_LEN)){

Ниже представлен тот же самый процесс, что и при прослушивании запросов ARPOP_REQUEST, только теперь осуществляется проверка полей ARPOP_REPLY:

memcpy(upstream_mac, arp->ar_sha, ETHER_ADDR_LEN);

if (verbose)

fprintf(stdout, “Router Found: %hu.%hu.%hu.%hu at

%X:%X:%X:%X:%X:%Xn”,

upstream_ip[0], upstream_ip[1], upstream_ip[2],

upstream_ip[3],

upstream_mac[0], upstream_mac[1], upstream_mac[2],

upstream_mac[3], upstream_mac[4], upstream_mac[5]);

Помните путь назад, когда был отослан ARP-запрос на поиск нашего маршрутизатора? Ниже показано, как обработать ответ. Следует взять предложенный MAC-адрес, запомнить его в буфере upstream_mac, копируя его из данных, на которые указывает указатель arp->ar_sha. И все, сделано. Отметим, что в действительности такой подход, когда не учитываются состояния программы (обработка без памяти), уязвим к атакам спуфинга. В любое время злоумышленник может безнаказанно послать в адрес программы незатребованный ответ на ARP-запрос, для того чтобы он был использован для обновления величины upstream_mac. Для борьбы с этим есть неплохие способы, например для предотвращения обновления соединения можно использовать триггерную переменную, для реагирования на вышедшие из строя сайты – предусмотреть монитор маршрутизатора и т. д., но рассмотрение подобных способов выходит за рамки этой главы:

/* Handle ICMP ECHO (Ping) */

} else if (!memcmp(eth->ether_dhost, user_mac,

ETHER_ADDR_LEN) &&

ntohs(eth->ether_type) == ETHERTYPE_IP &&

memcmp((u_char *) & ip->ip_dst, user_ip,

IPV4_ADDR_LEN) &&

ip->ip_p == IPPROTO_ICMP &&

icmp->icmp_type == ICMP_ECHO) {

Ах, утилита ping! Как автор по тебе тоскует! Без всякого сомнения, это лучшее средство определения, в каком режиме работает хост: в сети или автономно. Пытаясь достичь хоста, утилита не ищет сведений о нем в ARP-кэше. В процессе работы утилита отображает результат обработки текущих запросов. Фактически утилита ping является эхо-сигналом подканала ICMP протокола IP, направленного к адресуемому хосту с параметром IP ethertype и верным аппаратным адресом. Для того чтобы удостовериться в том, что полученный пакет является пакетом утилиты ping, проверяются пять условий. Несколько необычный способ принятия решения используется для проверки протокола IP, но он работает:

/* Swap Source and Destination MAC addresses */

memcpy(test_mac, eth->ether_dhost, ETHER_ADDR_LEN);

memcpy(eth->ether_dhost, eth->ether_shost, ETHER_ADDR_LEN);

memcpy(eth->ether_shost, test_mac, ETHER_ADDR_LEN);

Алиса посылает пакет Бобу… Боб отвечает Алисе пакетом с инвертированными значениями полей. Все, что делается в приведенном ниже примере, – это инвертирование значений полей отправителя и получателя, для того чтобы сформировать ответ:

/* Swap Source and Destination IP addresses */

test_ipa = ip->ip_dst;

ip->ip_dst = ip->ip_src;

ip->ip_src = test_ipa;

То же самое, что было сделано для MAC-адресов, теперь делается на сетевом уровне для IP-адресов:

/*

* Change the packet to a reply, and decrement time

* to live

*/

icmp->icmp_type = ICMP_ECHOREPLY;

ip->ip_ttl—;

Системы, подверженные какому-либо риску зациклиться при маршрутизации, с каждым «прыжком» должны уменьшать счетчик предписанного времени жизни пересылаемого пакета TTL. Это общее правило. Если этого не сделать, то можно получить довольно странные результаты из-за существования риска бесконечной циклической маршрутизации данных. Кроме того, уменьшение значения TTL позволяет избежать усиления действия циклов обратной связи, губительных для сетей. В приведенном ниже примере пакеты с нулевым значением величины TTL не удаляются. Автор привел нижерасположенный фрагмент кода для того, чтобы читатель лучше понял суть дела:

/* Recalculate IP and TCP/UDP/ICMP checksums */

libnet_do_checksum(packet + LIBNET_ETH_H, IPPROTO_IP,

LIBNET_IP_H);

libnet_do_checksum(packet + LIBNET_ETH_H, IPPROTO_ICMP,

pkthdr.caplen – LIBNET_ETH_H – LIBNET_IP_H);

Поскольку данные пакета были модифицированы (было уменьшено значение предписанного времени жизни пересылаемого пакета TTL), то следует откорректировать контрольные суммы, гарантируя тем самым целостность пакета при воздействии на него шума, помех или чего-то еще. Способ формирования контрольных сумм применяется на транспортном уровне (протоколы TCP/UDP/ICMP), который обеспечивает доставку между конечными точками сети. Контрольные суммы обычно применяются в протоколе ICMP. Для протоколов TCP и UDP метод контрольных сумм не применяется из-за сложностей успешного его применения в протоколе IP. В данном примере использование контрольной суммы рассматривается только для примера. В реальных условиях приведенный алгоритм маршрутизации работает гораздо лучше. При вызове алгоритма маршрутизации для указания длины обрабатываемых данных используется поле ip->ip_len, что, возможно, приводит к уязвимости этого способа к некоторым типам атак (из-за излишнего доверия к значению переменной, представляющей фактическую длину полного набора данных). Так что будьте внимательны:

Перейти на страницу:

Коллектив авторов читать все книги автора по порядку

Коллектив авторов - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки kniga-online.club.


Защита от хакеров корпоративных сетей отзывы

Отзывы читателей о книге Защита от хакеров корпоративных сетей, автор: Коллектив авторов. Читайте комментарии и мнения людей о произведении.


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

  • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
  • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
  • 3. Просьба отказаться от нецензурной лексики.
  • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

Надеемся на Ваше понимание и благоразумие. С уважением, администратор kniga-online.


Прокомментировать
Подтвердите что вы не робот:*
Подтвердите что вы не робот:*