Злобные Shatter-атаки

DigitalScream

Xakep, номер #060, стр. 060-068-2


Посылка сообщения

SendMessage(hwndHandle, WM_TIMER, intInterval, intAddr);

hwndHandle – дескриптор окна, которому посылается сообщение

WM_TIMER – само сообщение таймера

intInterval – через сколько миллисекунд запустить функцию

intAddr – адрес запускаемой функции

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

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

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

Наша цель – запуск процесса с правами системы (скорее всего, этим процессом будет cmd.exe). Поэтому этот процесс должен запустить тот, у кого такие права уже есть. Иными словами - необходимо заставить системный процесс запустить наш код. Но проблема в том, что ни один из известных мне сервисов Windows не предназначен для таких вещей. Поэтому надо найти способ добавить в него такую функцию и потом уже вызывать ее при помощи сообщения WM_TIMER.

Внедрение shellcode

Механизм сообщений Windows не имеет встроенных функций защиты при работе с системными приложениями, а это значит, что его можно использовать для внедрения программного кода в чужой процесс. Идея заключается в том, чтобы поместить shellcode в произвольное поле ввода размещенного на окне некоторого сервиса. Таким образом, он будет находиться в пределах памяти атакуемого приложения, а зная его адрес, можно воспользоваться сообщением WM_TIMER для исполнения shellcode.

Для копирования исполнимого кода в адресное пространство сервиса юзается сообщение WM_PASTE (вставить из буфера обмена). Правда, возможна такая ситуация, когда размера поля ввода будет не хватать для размещения shellcode. В таких случаях взломщики используют сообщение EM_SETLIMITTEXT для увеличения максимального числа символов в этом поле.

Поиск адреса по сигнатуре можно осуществить, используя отладчик WinDBG. Запусти его. В меню "File->Attach to process" (клавиша F6) откроется новый список. В нем уже выбирай необходимый процесс. Далее по сигнатуре ты найдешь искомый участок памяти. Но для начала задай ему саму сигнатуру. Сигнатура – это тот текст, который помещен в поле ввода. И чтобы сразу определить правильный адрес памяти, поставь в этом поле что-нибудь уникальное, что точно не повторится в программе. Например, если ввести в поле значение "DigitalScream", то, подключившись к процессу (F6) в окне "command"(Alt+1), нужно набрать "s -a 0000000 FFFFFFF "DigitalScream"". Таким образом, произойдет поиск в области памяти [00000000;0FFFFFFF] на предмет наличия строки "DigitalScream". В результате будет получен адрес, который используется в сообщении WM_TIMER.

Назад на стр. 060-068-1  Содержание  Вперед на стр. 060-068-3