
Набор инструментов для атак на IPv6
THC-IPV6-ATTACK-TOOLKIT (c) 2005-2022 [email protected] https://github.com/vanhauser-thc/thc-ipv6
Лицензировано по AGPLv3 (см. файл LICENSE)
Этот код был вдохновлён, когда я познакомился с IPv6, узнавал о нём всё больше и больше — и не нашёл инструментов для игры (читай: «взлома»). Сначала я пытался реализовать вещи с помощью libnet, но потом обнаружил, что реализация IPv6 частична и отвратительна. Я попытался добавить недостающий код, но, ну, это было не так просто, поэтому я сэкономил время и быстро написал собственную библиотеку.
Этот код в настоящее время работает только на:
Для сборки инструментов у вас должен быть установлен libpcap-dev. Кроме того, рекомендуется также libssl-dev и libnetfilter-queue-dev.
Их можно установить с помощью (Kali, Debian, Ubuntu): sudo apt-get install libpcap-dev libssl-dev libnetfilter-queue-dev
Вы можете собрать инструменты, выполнив: make all
Вы можете установить инструменты и существующие руководства, выполнив: make install
Набор инструментов THC IPV6 ATTACK TOOLKIT уже включает множество эффективных атакующих инструментов:
Просто запустите инструменты без параметров, и они покажут справку и параметры командной строки.
Библиотека thc-ipv6-lib.c является сердцем и душой всех инструментов — и тех, которые вы, возможно, захотите написать. Реализация настолько проста, что обычно требуется всего 2–4 строки, чтобы создать полный пакет IPv6/ICMPv6 с содержимым по вашему выбору.
Ваша базовая структура: (thc_ipv6_hdr *) например: thc_ipv6_hdr *my_ipv6_packet; int my_ipv6_packet_len; и вам никогда не придётся возиться с её опциями/полями.
Всякий раз, когда вы хотите создать пакет IPv6, просто напишите: my_ipv6_packet = thc_create_ipv6_extended(interface, prefer, &my_ipv6_packet_len, src6, dst6, ttl, length, label, class, version); если что-то не удаётся, возвращается NULL (только если my_ipv6_packet_len или dst6 не существуют или malloc не удаётся). Параметры thc_create_ipv6_extended: (char*) interface — интерфейс, через который вы хотите отправить пакет (int) prefer — либо PREFER_LINK (использовать локальный адрес канала), либо PREFER_HOST (использовать IPv6-адрес хоста) и PREFER_GLOBAL (использовать публичный (интернет) IP6 адрес) (по умолчанию) (int ) &my_ipv6_packet_len — размер пакета, который будет создан (unsigned char) src6 — исходный IP6 (ОПЦИОНАЛЬНО; будет выбран, если NULL) (unsigned char*) dst6 — целевой IP6 (в сетевом формате, 16 байт) обычно результат thc_resolve6("ipv6.google.com"); (int) ttl — TTL пакета (ОПЦИОНАЛЬНО; 0 установит 255) (int) length — длина, которая будет установлена в заголовке (ОПЦИОНАЛЬНО; 0 = реальная длина) (int) label — метка потока (0 подходит) (int) class — класс пакета (0 подходит) (int) version — версия IP6 (ОПЦИОНАЛЬНО; 0 установит версию 6) Возвращает NULL при ошибках или malloc'нутый структуру при успехе. free() её, когда закончите.
Теперь вы можете установить заголовки расширения поверх него: thc_add_hdr_route(my_ipv6_packet, &my_ipv6_packet_len, routers, routerptr); thc_add_hdr_fragment(my_ipv6_packet, &my_ipv6_packet_len, offset, more_frags, id); thc_add_hdr_dst(my_ipv6_packet, &my_ipv6_packet_len, buf, buflen); thc_add_hdr_hopbyhop(my_ipv6_packet, &my_ipv6_packet_len, buf, buflen); thc_add_hdr_nonxt(my_ipv6_packet, &my_ipv6_packet_len, hdropt); thc_add_hdr_misc(my_ipv6_packet, &my_ipv6_packet_len, type, len, buf, buflen); Описание функций: _route: Добавить заголовок маршрутизации пересылки (как IP Source Routing) (int) routers — количество маршрутизаторов в routerptr (char**) routerptr — структура char[routers + 1] с адресами маршрутизаторов в сетевом формате. См. пример в alive6.c. _fragment: Добавить заголовок фрагментации (int) offset — смещение, по которому должны быть записаны данные (обратите внимание: указывайте смещение в байтах, а не в октетах) (int) more_frags — установите 0, если это последний фрагмент, 1 для всех остальных (int) id — ID для пакета (одинаковый для всех фрагментов) _dst: Добавить заголовок опций назначения (char) buf — буфер символов. Вы сами управляете этим буфером, записывая в него то, что хотите. (int) buflen — длина buf _hopbyhop: Добавить заголовок Hop-By-Hop (char*) buf — буфер символов. Вы сами управляете этим буфером, записывая в него то, что хотите. (int) buflen — длина buf _nonxt: Указать, что никаких последующих заголовков не будет (int) hdropt — эта опция в настоящее время игнорируется _misc: Указать произвольный заголовок. Используйте это, если хотите создать недействительный или несуществующий заголовок расширения. (int) type — ID типа для указания заголовка (int) len — длина, рекламируемая для заголовка (ОПЦИОНАЛЬНО; -1 устанавливает правильное значение) (char*) buf — буфер символов. Вы сами управляете этим буфером, записывая в него то, что хотите. (int) buflen — длина buf Эти функции возвращают (int) 0 при успехе и -1 при ошибке.
Наконец, вы можете добавить потоковые заголовки или заголовки датаграмм. thc_add_icmp6(my_ipv6_packet, &my_ipv6_packet_len, type, code, flags, buf, buflen, checksum); thc_add_tcp(my_ipv6_packet, &my_ipv6_packet_len, source_port, destination_port, sequence_number, ack_number, flags, window_size urgent_pointer, options, optione_length, data, data_length); thc_add_udp(my_ipv6_packet, &my_ipv6_packet_len, source_port, destination_port, checksum, data, data_length); thc_add_data6(my_ipv6_packet, &my_ipv6_packet_len, type, buf, buflen); _icmp6: Добавить заголовок пакета ICMP6 (int) type: тип ICMP6 (int) code: код ICMP6 (int) flags: флаги ICMP6 (char*) buf — буфер символов. Вы сами управляете этим буфером, записывая в него то, что хотите. (int) buflen — длина buf _tcp|_udp: Добавить заголовок TCP или UDP (ushort) source_port: исходный порт (ushort) destination_port: порт назначения (uint) sequence_number: TCP sequence number (uint) ack_number: TCP acknowledgement number (ushort) checksum: UDP checksum, 0 = генерировать checksum (для TCP checksum всегда вычисляется) (uchar) flags: TCP flags: TCP_SYN, TCP_ACK, TCP_FIN, TCP_RST, TCP_PSH, ... (uint) window_size: TCP window size (uint) urgent_pointer: TCP urgent pointer (обычно 0) (char*) options: TCP options buffer, может быть NULL (uint) options_length: длина буфера TCP options (char*) data: данные, переносимые протоколом (uint) data_length: длина буфера данных _data6: Добавить произвольный заголовок (int) type: ID протокола (char*) buf — буфер символов. Вы сами управляете этим буфером, записывая в него то, что хотите. (int) buflen — длина buf Эти функции возвращают (int) 0 при успехе и -1 при ошибке.
Когда закончите, создайте и отправьте пакет. thc_generate_pkt(interface, srcmac, dstmac, my_ipv6_packet, &my_ipv6_packet_len); thc_send_pkt(interface, my_ipv6_packet, &my_ipv6_packet_len); или объединённая функция: thc_generate_and_send_pkt(interface, srcmac, dstmac, my_ipv6_packet, &my_ipv6_packet_len);
thc_generate_and_send_pkt: генерирует реальный и окончательный пакет IPv6 и затем отправляет его. (char*) interface — интерфейс для отправки пакета (unsigned char*) srcmac — исходный MAC (в сетевом формате) (ОПЦИОНАЛЬНО; используется реальный MAC, если NULL) (unsigned char*) dstmac — целевой MAC (в сетевом формате) (ОПЦИОНАЛЬНО; реальный MAC определяется, если NULL) Вместе thc_generate_pkt и thc_send_pkt обеспечивают ту же функциональность. Обычно вы используете их только если делаете что-то вроде thc_generate_pkt(...); while(1) thc_send_pkt(...); Эти функции возвращают (int) 0 при успехе и -1 при ошибке.
Когда закончите, освободите память с помощью: thc_destroy_packet(my_ipv6_packet);
Вот некоторые важные вспомогательные функции, которые вам понадобятся: thc_resolve6(destinationstring); Разрешает IPv6-адрес или DNS-имя в сетевой адрес IPv6. Используйте это для dst6 в thc_create_ipv6_extended(). Результат нужно освободить, когда он больше не нужен. thc_inverse_packet(my_ipv6_packet, &my_ipv6_packet_len); Эта умная функция меняет местами исходный и целевой адреса, заменяет тип заголовка ICMP (ECHO REQUEST -> ECHO REPLY и т.д.) и пересчитывает контрольную сумму. Если вы не понимаете, для чего это может пригодиться, идите играйте со своей xbox :-)
Если вы хотите сделать это очень быстро, существуют некоторые предопределённые функции-создатели ICMPv6, которые отправляют пакеты impc6 всего одной строкой кода: thc_ping6(interface, src, dst, size, count); thc_neighboradv6(interface, src, dst, srcmac, dstmac, flags, target); thc_neighborsol6(interface, src, dst, target, srcmac, dstmac); thc_routeradv6(interface, src, dst, srcmac, default_ttl, managed, prefix, prefixlen, mtu, lifetime); thc_routersol6(interface, src, dst, srcmac, dstmac); thc_toobig6(interface, src, srcmac, dstmac, mtu, my_ipv6_packet, my_ipv6_packet_len); thc_paramprob6(interface, src, srcmac, dstmac, code, pointer, my_ipv6_packet, my_ipv6_packet_len); thc_unreach6(interface, src, srcmac, dstmac, icmpcode, my_ipv6_packet, my_ipv6_packet_len); thc_redir6(interface, src, srcmac, dstmac, newrouter, newroutermac, my_ipv6_packet, my_ipv6_packet_len); thc_send_as_fragment6(interface, src, dst, type, buf, buflen, frag_len); Они делают то, что вы от них ожидаете, поэтому я слишком ленив^H^H^H^H^Hзанят, чтобы описывать их подробнее.
Следующие функции выделяют память для указателя результата, поэтому не забудьте освободить указатели результата этих функций, когда они вам больше не нужны: thc_ipv6_dummymac() thc_ipv62notation() thc_ipv62string() thc_string2ipv6() thc_string2notation() thc_resolve6() thc_get_own_ipv6() thc_get_own_mac() thc_get_multicast_mac() thc_get_mac() thc_lookup_ipv6_mac() thc_look_neighborcache() thc_generate_key() thc_generate_cga() thc_generate_rsa()
Очень полезно посмотреть на примеры использования. Лучшие из них — инструменты из пакета thc-ipv6, особенно implementation6.c и fake_*6.c — веселитесь и присылайте код обратно, чтобы сообщество могло дальше развивать его.
Большинство инструментов легко обнаруживаются IDS или специализированным ПО обнаружения. Это сделано намеренно, чтобы упростить обнаружение неправомерного использования. Инструменты либо задают фиксированную сигнатуру пакета, либо обобщённо перехватывают пакеты (например, поэтому также отвечают на запросы соседей ICMPv6, которые отправляются на несуществующий MAC, и поэтому их очень легко обнаружить). Если вы этого не хотите, измените код.
Отправляйте их на vh (at) thc (dot) org (и добавьте «antispam» в тему письма) Или отправляйте через GitHub: https://github.com/vanhauser-thc/thc-ipv6
Веселитесь!