Защита от хакеров корпоративных сетей
Шрифт:
Проектирование несуществующего: сетевая карта, которая не существовала, но возвращала код возврата
В сети маршрутизатор всегда выполняет три вещи:
• отвечает на ARP-пакеты, которые ищут определенный MAC-адрес;
• отвечает на запросы ping, которые ищут определенные IP-адреса;
• передают транзитные пакеты дальше, возможно, запрашивая информацию о промежуточных точках маршрута пакетов.
Традиционно эти функции выполняются ядрами операционных систем. В худшем случае ядра операционных систем – это большие, неповоротливые, трудно управляемые животные. В лучшем – изящные, быстро работающие черные ящики с функциями адресования и фильтрации пакетов, выполняемыми сетевыми картами самостоятельно. В специализированных системах Cisco и некоторых других производителей большинство функций маршрутизации реализованы аппаратными средствами. Максимальную производительность демонстрируют оптоволоконные специализированные системы ASIC. Но сеть не заботит вопрос о том, каким образом задание будет выполнено: будет ли оно выполнено аппаратными средствами, ядром операционной системы или, как в рассматриваемом случае,
Программа DoxRoute является интересным решением. Это был эксперимент, который продемонстрировал возможность реализации разумных возможностей спуфинга машин сети при помощи программы, вызывающей функции библиотек libnet и libpcap. Обычно считалось, что подобные функциональные возможности могут быть реализованы сложными программами ядра операционной системы. На самом деле было показано, что их можно реализовать программой, содержащей удивительное число изящных простых решений, направленных на достижение невообразимого уровня производительности. Вероятно, необычайный уровень производительности был достигнут благодаря работе библиотек libpcap, libnet непосредственно с обрабатываемыми пакетами при их получении и передаче. Для обработки 12-мегабитного потока данных потребовалось загрузить процессор P3-800 приблизительно на 2 %. При этом время ожидания эха при посылке управляющих сообщений по протоколу ICMP было уменьшено до 0.23 мс. Оба показателя могут быть улучшены при помощи незначительного упрощения кода.
Примечание
Между прочим, это не первая попытка прямой передачи данных по каналу связи для реализации стека основных протоколов. Это даже не вариант наиболее «законченной» мини-сети Miniweb, который можно найти по адресу www.dunkels.com/adam/miniweb и который компилируется в программу размером в 30 байт, работающую на уровне IP. Эта программа размером в 30 байт является рабочей реализацией протокола TCP с разумными возможностями. Существуют системы, которые имитируют группу серверов на одной машине. Достоинство программы DoxRoute заключается в ее простоте, интернациональности, разумной переносимости на различные платформы и качестве написания. Программа была написана с исключительно обнадеживающей простотой.
Реализация программы DoxRoute: раздел за разделом
Выполнение DoxRoute довольно тривиально:
[root@localhost effugas]# ./doxroute -r 10.0.1.254 -c -v
10.0.1.170
ARP REQUEST: Wrote 42 bytes looking for 10.0.1.254
Router Found: 10.0.1.254 at 0:3:E3:0:4E:6B
DATA: Sent 74 bytes to 171.68.10.70
DATA: Sent 62 bytes to 216.239.35.101
DATA: Sent 60 bytes to 216.239.35.101
DATA: Sent 406 bytes to 216.239.35.101
DATA: Sent 60 bytes to 216.239.35.101
DATA: Sent 60 bytes to 216.239.35.101Поскольку рассматриваемая реализация программы неполная, то на самом деле в ней нет обработки состояний маршрутизатора (поэтому в тексте программы не следует заменять константы со значением 7200 с). Программа DoxRoute такова, что вполне возможно завершить процесс маршрутизации на одной машине и запустить его на другой, не сообщая об этом переключателю режимов работы программы. Можно найти большое количество инструментальных систем активного спуфинга. Например, инструментальное средство Ettercap является одним из наиболее интересных пакетов фальсификации для реализации атак «злоумышленник посередине» (MITM), направленных против сеансов сети. Пакет поддерживает большое количество протоколов. С помощью Ettercap можно реализовать различные специфические варианты спуфинга. Пакет DoxRoute обеспечивает инфраструктуру для ответа на вопрос: «Что произойдет, если к сети подключить машину для выполнения..?» Если можно обмануть внутренний маршрутизатор несколькими строчками кода, то фальсификация еще чего-нибудь будет ненамного сложнее.
Инструментарий и ловушки
Гибкая маршрутизация в UNIX на горизонте?
Маршрутизация операционной системы UNIX может быть быстрой, но она прямолинейна до абсурда. Хотите направить трафик через порт? Этого нельзя сделать. Хотите направить трафик через собственную машину? Опять нельзя. Хотите ограничить пропускную способность жестко определенным набором сетевых действий? Попробуйте, и пусть читателю повезет. Главное предназначение программы DoxRoute, которое сильно отличает ее от остальных, заключается в предоставлении хороших способов программирования действительно интересных фильтров и наборов правил для сетевого трафика. В действительности программировать на уровне ядра операционной системы очень сложно, слишком опасно и практически непереносимо с одной платформы на другую, для того чтобы большинство людей смогло этим заняться. Напротив, эти же задачи, решаемые с помощью DoxRoute, занимают всего пару листков программного кода с комментариями. Цель: «Если читатель захочет самостоятельно заняться маршрутизацией всех пакетов, которые отсылаются по кабельному модему вместо цифровой абонентской линии каждое третье воскресенье каждого месяца с нечетным числом байтов и которые содержат слово ziggybop, то пусть он попробует».
Все, что для этого нужно сделать, на самом деле не очень сложно. После чтения нескольких опций пользователя инициируется программа перехвата и генерации пакетов, которая сравнивает каждый поступивший пакет с коротким списком правил, определяющих возможную генерацию кода возврата в той или иной форме. Хотите более подробно? Вот схема алгоритма:
1. Установить конфигурацию.
1.1.
Установить статические переменные.1.2. Присвоить значения по умолчанию.
1.3. Выполнить анализ командной строки.
2. Начать анализ трафика.
2.1. Открыть устройство прослушивания с максимально возможной производительностью.
2.2. Применить фильтрацию ядра к потоку данных, который вскоре будет активизирован.
2.3. Активизировать поток.3. Начать спуфинг.
3.1.Открыть устройство отправки данных с максимально возможной производительностью.
3.2. Послать ARP-запрос на поиск MAC-адреса маршрутизатора.4. Разбор прослушиваемого пакета (бесконечный цикл, который срабатывает по приему пакета).
4.1. Применить правила анализа.
4.2. Потребовать пространство пользователя для IP-и MAC-адреса.
4.2.1. Поиск ARP-запросов для своего IP-адреса.
4.2.2. Деструктивное преобразование ARP-запроса в ARP-ответ с указанием IP-адреса и МАС-адреса в пространстве пользователя.
4.2.3. Отсылка преобразованного пакета.
4.3. Поиск ARP-ответов с MAC-адресами маршрутизатора.
4.3.1. Создание кэша для последующего решения задач маршрутизации.
4.4. Поиск запросов PING (ICMP ECHO) к своим IP-и MAC-адресам.
4.4.1. Деструктивное преобразование ICMP ECHO и ответ на него.
4.4.2. Уменьшение счетчика времени жизни пакета TTL.
4.4.3. Пересчет контрольной суммы пакета.
4.4.4. Отсылка преобразованного пакета.
4.5. Маршрутизация пакета на свой MAC-адрес.
4.5.1. При необходимости проверить, является ли полученный пакет IP-пакетом.
4.5.2. Деструктивное переназначение Ethernet-адресов получателя и отправителя на адреса отправителя пакета и получателя в локальной сети соответственно.
4.5.3. Если можно вычислить контрольную сумму, то уменьшить счетчик времени жизни пакета и повторно вычислить контрольную сумму пакета.
4.5.4. Отослать измененный пакет.
Начало: директивы препроцессора и объявления функций. Ниже приводится полный код для использования. Его трудно прокомментировать. В интересах обсуждения отступ в комментариях был удален. Давайте начнем!#define TITLE “DoxRoute: Userspace IP Router”
#define VERSION “0.1”
#define CODERS “Copyright (C) 2001 Dan Kaminsky
(dan@doxpara.com)”
#define CODENAME “Bender”
#define GIANT “Mark Grimes(obecian@packetninja.net)”Конечно, следует доверять там, где это оправданно. Удивительно, но приведенных строк достаточно для построения кода с использованием блестящего пакета nemesis компании Grimes, хотя его использование практически не заметно.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <libnet.h>
#include <pcap.h>
#ifndef IPV4_ADDR_LEN
#define IPV4_ADDR_LEN 4
#endifПрежде всего следует определить необходимые для работы приложения библиотеки. Для программы DoxRoute потребуются три вещи. Во-первых, стандартные библиотеки, необходимые почти каждому приложению на языке C. Они подключаются при помощи файлов stdio.h, stdlib.h и unistd. Во-вторых, система для отправки фальсифицированных пакетов. Она инкапсулирована внутри файла libnet.h, очевидно, связанного с библиотекой libnet. И наконец, в-третьих, система прослушивания любых пакетов, передаваемых по каналу связи. Подключение такой системы осуществляется при помощи файла pcap.h библиотеки libpcap.
Но более важным является не то, что реализовано, а то, что не реализовано. Обычно для любой предназначенной для работы в сети программы, особенно программы обработки пакетов на низком уровне, требуется огромное число зависимых от операционной системы библиотек и включаемых в программу файлов заголовков. Используемые файлы и заголовки сильно изменяются от платформы к платформе, что является головной болью не только при переходе от одной платформы к другой, но и от одной версии ядра к другой. Программа сталкивается с ордами директив препроцессора с большим числом макросов #ifdef, которые определяют последовательность действий на каждой системе. После этого кода программа приобретает вполне законченный вид.
Использование библиотек libpcap и libnet позволяет изменить это. В них содержатся описания входящих и выходящих пакетов, а также некоторые базовые структуры, которые необходимы для того, чтобы понять, что вообще происходит на самом деле. Появляется возможность отвлечься от рассмотрения пустой болтовни, зависимой от операционной системы:void usage;
void print_ip(FILE * stream, u_char * ip);
void print_mac(FILE * stream, u_char * mac);
int
main(int argc, char **argv)
{Объявления переменных. В основном все переменные предназначены для функции getopt – общего синтаксического анализатора опций командной строки:
int opt;
extern char *optarg;
extern int opterr;К настоящему моменту времени читатель уже, вероятно, заметил, что в операционной системе UNIX почти все приложения командной строки совместно используют одинаковый синтаксис: что-то вроде foo – X – y параметр. Этот формат входных параметров стандартизирован и обрабатывается библиотечной функцией getopt. Очень старые платформы для успешного анализа входных параметров потребуют от программиста добавить в начало его программного кода директиву # include <getopt.h>. Более современные стандарты предусматривают помещение функции getopt как части файла unistd.h: