Хакерские секреты простых вещейSpyder (spyder@antichat.net) Задача: Обойти фильтрацию символов запятой при проведении SQL-InjectionРешение:
К чему же мы приходим? Невозможно использовать конструкцию union select, если в запросе участвует больше 2-х полей. ОК, крутим как слепую, скажешь ты. Но в данном случае большинство известных способов, таких как использование функций substring(), mid(), ExtractValue(), а также последние наработки Qwazar'a в области раскрутки слепых инъекций работать не будут. Что же делать? Будем использовать логику SQL-выражений, и здесь поможет нам LIKE.
Если запрос не удался, значит, версия отличная от 4*. Пробуем по-другому:
ОК, запрос такой же, как и при
А это значит, что первый символ версии мы подобрали успешно. Я думаю, ты понял, что делать дальше, но я все же покажу.
В данной конструкции '%pass%' остается неизменным, а подбираем мы именно table_name. Если первый запрос прошел удачно, тогда пробуем подобрать второй из символов:
И так далее. Предположим, мы получили имя таблицы users и колонки username, password,id. Составим запрос на получение пароля из базы
Подбирается по образу и подобию предыдущих запросов. Символ % в конструкции LIKE говорит о том, что после 'q' находится 1 и более любых символов. Задача: Передать управление по определенному адресу в памяти посредством Buffer OverflowРешение: Это, так сказать, один из первых шагов в написании эксплоитов и шелл-кодов для программ подверженных переполнению стека. Я не буду рассказывать про все аспекты работы с памятью, затрону лишь основное. Итак, имеем уязвимую программу:
В этом случае переменная array объявлена с установленным размером в 12 байт, но при копировании проверки на длину данных не происходит. Скомпилируем и попробуем передать программе больше 30 байт:
Посмотрим на дамп памяти:
Символы 0x41 (A) переполнили стек и заполнили собой регистры ebp и eip. Регистр eip указывает на адрес возврата, область в памяти, куда должно перейти управление программы. Наша задача — подменить eip на нужное значение. Для примера вызовем функцию text() во второй раз. Для этого надо узнать ее адрес в памяти:
Видим вызов функции text
В моем случае адрес — 0x08048496. Теперь напишем небольшой эксплоит для перезаписи адреса возврата значением 0x08048496. Для этого потребуется отправить программе 12 байт мусорного кода, которые заполнят стек, еще 4 байта, которые заполнят регистр ebp, и, наконец, наши 4 байты, которые попадут в регистр eip. Так как компилятор gcc использует определенную оптимизацию, нам нужно передать еще 6 байт мусорного кода. В итоге сплоит выглядит так:
Стек работает с методом доступа к элементам LIFO (Last In - First Out, «последним пришел - первым вышел»), и поэтому мы указываем байты в обратном порядке. Пробуем запустить наш эксплоит:
Как ты можешь видеть, функция text() выполнилась второй раз, что говорит о том, что мы удачно изменили адрес возврата. Задача: Узнать имена колонок в таблице, зная ее названиеРешение: Представлю недавно опубликованный на форуме sla.ckers.org юзером Paic способ, с помощью которого можно узнать имена колонок, если они имеют тип NOT NULL. Отправляем первый запрос, чтобы узнать, сколько колонок в нужной нам таблице: В результате MySQL вернет ошибку «Operand should contain 7 column(s)». Это значит, что в таблице users 7 полей. Тогда составим логически верный запрос: Запрос верный и ошибки мы не увидим. А теперь о том, как узнать имена колонок. Для каждого поля в запросе поочередно подставляем последовательность символов %0 и, если у поля стоит ключ NOT NULL, мы увидим ошибку. Посмотрим на примере: В итоге видим ошибку – «Column 'id' cannot be null». Задача: Закрепиться на взломанном сервереРешение: Рассмотрим случай, если у нас права не root. Для начала нужно пробекдорить различные пшп-файлы функциями, через которые можно выполнять команды либо PHP-код. Вот небольшой их список. Самые палевные:
Эти функции очень быстро обнаруживаются админами, поэтому можно использовать менее популярные и менее известные:
Следующее, что следует сделать — это расплодить и спрятать веб-шеллы. Если это какой-либо паблик двиг, вроде joomla, wordpress или vbulletin, то замаскировать шелл под окружение не очень сложно. Так же хорошей методикой считается маскировка шелла под нестандартные для PHP расширения. Рассмотрим такую ситуацию, когда в папке images много картинок, но все они имеют расширение .jpg. Мы можем спрятать наш шелл в .gif-картинке! Для этого создадим здесь .htaccess с таким содержимым:
Теперь все .gif-файлы будут выполняться как пшп-код Ну а что же делать, когда мы получили рут на сервере и хотим его сохранить? Первым делом прочитай файл /etc/shadow, — в нем хранятся пароли всех пользователей системы. Стоит сказать, что руткитов под новые версии ядер не выпускали очень давно, а запуск старых в лучшем случае вызовет ошибку, а в худшем похоронит сервер. Основными вариантами закрепления на сервере являются: протроянивание OpenSSH и маскировка суидников. Про пакости в OpenSSH ты можешь прочитать в статье ShadOS’а, которую непременно найдешь в Гугле, а про суидники я расскажу прямо сейчас, благо, тут нет ничего сложного. Создаем на сервере файл suid.c, содержимое которого:
Компилируем его командой gcc suid.c -o suid. Суидник (хотя наверняка ты знаешь) - это исполняемый файл с suid-битом. Суид-бит позволяет выполнять программы от имени пользователя, к которому он принадлежит. Эта программа принимает параметр и вызывает функцию system(). Попробуем запустить ее без suid-бита: А теперь из-под рута выполним команду:
И — выполним от пользователя www: Пусть тебя не смущает uid=30, теперь у нас полноценные права рута! Нужно как следует спрятать его в каталоге /usr/bin. Задача: Обойти защиты Sweb и Peterhost хостинговРешение: Эти хостинги отличаются защитой от различных атак, таких как PHP- и SQL-инъекции. Но на деле все защиты легко обходятся. 1) union select. Sweb - тут защита только в $_GET-переменных; если есть возможность отправить данные методом POST, то защита обходится. Peterhost - фильтруются и $_GET, и $_POST переменные, но обходится еще проще; достаточно вместо пробела между словами union и select вставить любые другие пробельные символы, такие как символ табуляции, перевода каретки и прочее. Вот их неполный список:
2) order by. В обоих случаях вместо order by можно использовать group by, про который сотрудники хостингов, видимо, не знают. Так же можно написать буквы в разных регистрах, oRdEr bY, либо использовать вышеперечисленные пробельные символы. 3) PHP-injection. На самом деле здесь абсолютно никакой защиты нет, разве что свеб хостинг пугает нас страшными ошибками, если в переменной указать /etc/passwd, хотя никто не помешает проверять наличие инклудов другими файлами, например /etc/hosts. Задача: Настроить крон для постоянного наличия файла на сервереРешение: Допустим, ты взломал сайт и очень хочешь, чтобы там остался твой шелл/фрейм/дор. Рассмотрим все ситуации подробно. 1) Шелл. Создадим файлик (назовем его cronshell.php) с содержимым:
Код будет проверять, существует ли файл на сервере и, если его нет, скопирует с твоего сайта. Кстати, убедись, что директива allow_url_fopen установлена в значение On, иначе используй функцию system() и команду wget. 2) Фрейм. Фрейм мы будем размещать в файле index.php, хотя ты можешь сделать это с любым другим файлом. Для начала скопируй файл index.php с фреймом внутри на удаленный сервер; это будет наш бэкап, на случай если админ заметит фрейм. Далее напишем скрипт cronframe.php:
3) Доры.
А теперь о том, как заставить крон обрабатывать наши файлы. Создадим в папке /home/user/ временный файл test:
Разберем его: первая строка указывает, какую шелл-оболочку нужно использовать, вторая, какому юзеру отправлять отчет о работе крона и, наконец, третья указывает, что файл /home/user/cron.php должен выполняться каждую минуту. Теперь занесем запись в таблицу, для этого выполним команду: Готово! В каталоге /var/spool/cron будет создан файл «user» примерно с таким содержимым:
— и файл /home/user/cron.php будет запускаться каждую минуту. Задача: научиться работать с netcat под VistaРешение: Здесь нет ничего сложного, но есть уловка, которую немногие знают. Попробуй при вызове интерпретатора обратиться к powershell.exe, вместо привычного cmd.exe и посмотришь, что получится :). Организация BindShell:
Еще один трюк связан с широкими возможностями PowerShell. Например, на нем можно создать клон netcat, только в скриптовой интерпретации:
Пример запуска сценария:
Now script waiting for connection on port 333. I will connect to this port using telnet.exe, and then write word "Test" into it:
Соответственно, меняя «test»-параметр, ты можешь добиться успешной передачи команд на исполнение. Задача: сделать визуализацию топологии из захваченного сетевого трафикаРешение: Подобные вещи умеет делать NMAP, правда, после передачи ему его же отчета либо при проведении сканирования. Движок там еще сыроват, при обилии хостов жутко виснет и делает работу невозможной. Поэтому предлагаю тебе немного другое решение. 1. Зададим какой-нибудь параметр для сбора трафика в файл .pcap:
2. Сохраненный трафик скормим специальной программе - rumint (rumint.org), которая в два щелчка выдаст тебе топологическую карту в нескольких вариантах просмотра. Задача: снифая сетку, перехватить файлы в явном виде по FTPРешение: Современные сниферы позволяют нюхать трафик, но получать целые файлы - очень проблемно. Собирать в бинарном виде дату этих файлов и сохранять вручную - неудобно! Для автоматизации процесса существуют более простые программы, вроде FTPXerox v1.0 (members.fortunecity.com/sektorsecurity/projects/ftpxerox.html). Как только она палит, что где-то передается файл, то сразу перехватывает его и сохраняет локально. Все, что требуется - только запустить программу. Предварительно надо перенаправить траф на себя, проведя одну из атак по несанкционированному сбору пользовательского трафика. Утилита открывает неразборчивый режим сетевой карты, поэтому опционально эта возможность должна быть поддерживаема твоим адаптером. Софтинка имеет лишь одно ограничение - нет поддержки пассивного режима работы FTP. В остальном - работает без каких-либо глюков. |