Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #48, НОЯБРЬ 2004 г.

Эксплоит для сетевого чата

sba (sba@list.ru)

Спецвыпуск: Хакер, номер #048, стр. 048-034-1


ICQ 274-602-370

v0ldemar (v0ldemar@mail.ru), ICQ 226-428-062

Поиск и использование уязвимости в Network Assistant

Об эксплоитах написано огромное количество теоретических статей. Мы же покажем на конкретном примере, как найти и использовать уязвимость в популярном сетевом чате Network Assistant 2.0.

Для чего это нам необходимо? Во-первых, нужно по возможности больше знать о программах, которыми пользуешься каждый день, особенно если они имеют хоть какое-то отношение к сети. Во-вторых, эксплоит – это специфичный набор байт, который в нужном месте превращается из обычных и безобидных данных в код, способный завладеть удаленным компьютером и выполнить практически любые действия.

Исследование протокола Network Assistant с помощью снифера

Перед нами обычный чат для локальной сети Network Assistant 2.0, и нам во что бы то ни стало нужно найти в нем дыру, желательно без особого напряга :). Начнем с изучения протокола жертвы. Это значительно упростит нам жизнь и даст общее понятие о том, как осуществляется обмен данными между удаленными хостами. Порывшись в настройках программы, мы обнаруживаем закладку “Связь”, которая снабжает нас следующей информацией: обмен данными осуществляется по протоколу UDP и TCP через 50138-й и 50139-й порты соответственно, с использованием широковещательных адресов.

Теперь мы готовы перехватить несколько пакетов Network Assistant. Запускаем какой-нибудь снифер (например, CommView) и создаем правило для захвата пакетов только на 50138-м и 50139-м портах.

Начинаем захват. Проходит минута за минутой, а ни одного пакета мы так и не перехватили. В чем дело? Неужели глючит любимый снифер? Или в чате никто не пишет? Для надежности набиваем строчку “Hello, people!!!”. Но 50138-й и 50139-й порты по-прежнему молчат. Стоп. Память услужливо подсказывает, что фаервол обнаруживал активность Network Assistant на совершенно других портах, а именно на 56003-м и 56259-м.

Путем несложных манипуляций приходим к выводу, что автор программы забыл поменять порядок байт (поля заголовков семейства протоколов IP должны быть в формате big-endian),

Более детальную информацию ищи в Microsoft Knowledge Base Article – 102025 (support.microsoft.com/default.aspx?scid=kb;en-us;102025).

Заполняя поле DstPort в структуре UDPHeader, то есть - 50138 = 0хC3DA, htons(0хC3DA) = 0хDAC3, 0хDAC3 = 56003.

typedef struct _UDPHeader {

WORD SrcPort;

WORD DstPort;

WORD Length;

WORD Checksum;

} UDPHeader;

Натравливаем правило-фильтр на 56003-й порт. И – о, чудо! – снифер начинает ловить пакеты. Пакетов много, очень много. Разберемся! Пробуем поискать среди перехваченных пакетов текст из канала “Main” чата. Он находится без проблем.

Беглый анализ подтверждает наше скромное предположение о том, что Network Assistant передает в сеть свои данные без использования какого-либо шифрования. Нам это только на руку. Для того чтобы разобраться в дебрях формата пакета самого Network Assistant, используем любимый шестнадцатеричный редактор. Для начала перехватим несколько однотипных пакетов. Например, обычный текст из канала “Main”. Будем посылать по несколько раз одни и те же сообщения, потом серию сообщений разной длины. Не забываем перехватывать сообщения и других участников чата. В идеале желательно найти себе помощника в сети, который бы отсылал нужные сообщения, но если все хочется сделать самому, то можно обойтись эмулятором ПК, например VMware Workstation. Когда соберется достаточное количество пакетов, приступаем к их сравнению. Анализируем сохраненные пакеты начиная со смещения 0x2A (байты от 0 до 0x29 входят в Ethernet-, IP- и UDP-заголовки пакета, а со смещения 0x2A начинается тело UDP-пакета, то есть пакет Network Assistant). Сначала ищем одинаковые байты, а потом разные. Сразу бросается в глаза, что байт со смещением 0 всегда равен 0, это версия протокола. Для следующих версий чата вплоть до 3.2 версия протокола равна единице. Далее идет 2-байтовое поле, которое отличается в разных пакетах, но идентично в одинаковых, очевидно, что и означает оно длину пакета в байтах :). Затем идет непонятное 4-байтовое поле, которое меняется от пакета к пакету, что навевает подозрение о счетчике (например, для борьбы с флудом). Следующий байт всегда равен 0х0F для пакетов с текстом, это тип пакета. Изучаем другие пакеты и выделяем следующие типы: 0х00 – вход в канал “Main”, 0х01 - выход из канала “Main”, 0х02 – всплывающее сообщение, 0х1E – изменение состояния пользователя, 0х1F – изменение цвета пользователя и т.д. Дальше размещаются два Pascal-стринга с названием хоста-отправителя и ника юзера. За ними идет текущая дата в формате double (8 байт). Следующие 4 байта – цвет пользователя в чате. На этом заканчивается заголовок пакета Network Assistant. Остальные байты в каждом из пакетов специфичны для каждого типа. Например, уже известный нам пакет ID=0х0F (пересылка текста) помимо заголовка содержит Pascal-стринг с названием канала, в который посылается текст, а также сам посылаемый текст, заканчивающийся символом “\0”.

Содержание  Вперед на стр. 048-034-2