Вступление

Этот документ описывает новый вид атак
против Microsoft Windows, и возможно других оконных
систем на основе сообщений. На данный
момент эта уязвимость не исправлена.
Решение этой проблемы невозможно из-за
принципа работы Windows с окнами, а
следовательно невозможно исправление
программного обеспечения разработчиками.
Microsoft была
уведомлена,
но не предприняла никаких действий - из-за
причин, описанных выше.

Данный документ - пример эксплуатации одной
уязвимости, точнее описание роботы
эксплоита Shatter

По ту сторону окон

Работа окон контролируется с помощью
сообщений Windows. Когда вы нажали клавишу, Windows
посылает сообщение активному окну и
сообщает ему об этом событии. Дальше
посылается сообщение для прорисовки
клиентской области программы. Фактически,
когда происходит какое-то событие о котором
должно знать окно, ему посылается сообщение.
Эти месаги помещаются в очередь и
обрабатываются в порядке поступления.

Это очень надежный механизм для управления
приложениями. Однако данный механизм в Windows
имеет недостатки... Дело в том, что сообщения,
присланные от какого-либо приложения имеют
равные права с системой. Нет никакой
возможности проверить подлинность
сообщений, и в следствии этого сообщения
злонамереного приложения не отличить от
сообщений ядра системы. Мы будем
использовать именно этот недостаток, чтобы
контролировать другие окна и процессы.

Обзор

В этом примере будет использоваться VirusScan
v4.5.1для ОС Windows 2000 Professional. Он имеет права
LocalSystem, а мы залогинились как гость. Цель
состоит в том, чтобы запустить свой код с
помощью VirusScan, наглядное повышения
привилегий. Вот примерные стадии:

  1. Найти подходящее окно в пределах VirusScan (идеальным
    будет поле ввода) и получить дескриптор
    окна.
  2. Удалить любые ограничения в размере
    данных поля ввода, для возможности
    внедрения произвольно длинного кода.
  3. Вставить некий бинарный код.
  4. Заставить VirusScan выполнить наш код (со
    своими правами, правами системы).

Фактически это легко сделать. Windows
предлагет нам все возможности в которых мы
нуждаемся. Программа Shatter (разрушитель)
аосуществляет все выше описанные операции.
Для работы понадобится редактор,
позволяющий копировать в буфер двоичные
данные, и отладчик. Для этого подойдут
UltraEdit и WinDbg

Сообщения Windows состоят из трех частей:
идентификатора сообщений и двух параметров.
Параметры используются в зависимости от
идентификатора. Значит для удачной атаки
нам надо знать дескриптор окна и сообщение
которое мы хотим послать. Посмотрим
насколько это легко...

1 Опознание окна 

Мы должны иметь кое что, во что можно ввести
текст. Не волнуйтесь об ограничениях
допустимой длинны текста, это поправимо.
Запускаем VirusScan, и нажимаем клавишу "New Task"
- перед нами открывается окно с полем ввода.
Теперь нам нужно узнать дескриптор этого
поля ввода. Запускаем Shatter и нажимаем "Get
cursor window". В ответ получаем дескриптор, в
данном случае был получен дескриптор 102f2.
Это дескриптор элемента, находящегося под
курсором, но не поля ввода. Щелкаем на поле
ввода в VirusScan и получаем его дескриптор (вышел
30270). Теперь мы знаем дескриптор, приступаем...

2 Удаление Ограничений 

Теперь когда нам известен дескриптор окна,
мы можем посылать на контрол любые
сообщения. Давайте сначала удостоверимся,
что мы имеем достаточно места для shellcode.

Сообщение, которое надо послать окну Edit Box
для изменения максимальной длинны текста -
EM_SETLIMITTEXT. Первый параметр в "послании" -
новая максимальная длинна текста, ставим 4,
а второй не используем, 0. Кликаем на
EM_SETLIMITTEXT для отсылки сообщения, теперь при
редактировании поля ввода максимальное
число символов - 4. Пробуем... Однозначно - в
поле влазит только четыре символа. ОК. А
теперь место четырех пишем FFFFFFFF и передаем
окну. Теоретически теперь наше
пространство под shellcode составляет 4Gb... этого
наверное достаточно 🙂

3 Внедрение Shellcode

Теперь давайте попробуем что-нибудь
вставить в поле ввода. Можно скопировать
текст, щелкнуть правой клавишей по полю
ввода и выбрать "Вставить". Но давайте
проделаем эту операцию через систему
сообщений Windows. Очищаем поле ввода и
запускаем блокнот. Набранный текст
копируем. Возвращаемся в Shatter, мы хотим
послать окну команду "Paste clipboard contents",
это WM_PASTE. Об параметра у этой команды должны
быть раны 0, соответственно ставим WPARAM и LPARAM
=0 и кликаем на WM_PASTE. Видите - в окне появился
текст. Если кликнуть еще раз - появится
второй раз, прикольно, правда?

Очистим поле ввода и запускаем HEX редактор.
Загружаем sploit.bin из дистрибутива Shatter. Это
shellcode написанный другим чуваком, он
открывает шелл на 123 порту. Дл контроля
этого процесса запустим Netcat - "nc -lp 123".
Теперь можем о нем на некоторое время
забыть, ибо в принципе он нам не так уж и
нужен - просто для контрля. Копируем shellcode в
буфер (вместе со строкой FOON) и снова
нажимаем WM_PASTE в Shatter. Наш код прописан...

4 Выполнение Shellcode

Запускаем отладчик, переключаемся на
процесс avconsol.exe (это наш антивирус), в WinDbg это
клавиша F6 - выбор процесса. Затем ищем в
памяти строку FOON (в WinDbg это: s-a 00000001 10000000 "FOON")
и записываем ее адрес (в некоторых случая
строка в памяти находится несколько раз,
собственно это не важно - любая подходит), в
данном случае он был равен 0x00148c28. Закрываем
отладчик и готовимся к поднятию привилегий
localsystem! (Если из за ограничений нет
возможности запустить дебагер, то можно
найти адрес входа в Shellcode простым
просмотром.) Перезагружаемся по гостем и
проделываем все операции снова.

Для запуска используем сообщение WM_TIMER. Оно
опасно для системы тем, что второй ее
параметр - адрес ивозврата таймера. Если
этот параметр не равен нулю, то управление
передастся нашей функцие. Значит мы можем
послать любому окну сообщение WM_TIMER с
ненулевым вторым параметром (первый -
идентификатор) и ОС перепрыгнет на
указанный нами адрес - исполнит код.

Указываем в Shatter дескриптор окна, для
сообщения первый параметр - любой, а второй -
адрес, который мы узнали в отладчике (Shellcode
начинается с 1KByte NOP'ов (No Operation), значит мы
должны совершить скачок с определенным
смещением). В данном случае вышло 0x148c28 + 0x200 =
0x148e28, но у вас могут быть другие значения.
Кликаем WM_TIMER и netcat незамедлительно
начинает принимать сообщения. WHOAMI покажет,
что мы имеем все права. Наслаждайтесь!

Check Also

В королевстве PWN. Препарируем классику переполнения буфера в современных условиях

Сколько раз и в каких только контекстах не писали об уязвимости переполнения буфера! Однак…

Оставить мнение