Обзор эксплойтовЭтот месяц был не таким плодотворным на качественные эксплойты, видимо погода сделала свое дело – кому охота сидеть за дебаггером, когда на улице солнце. Но все же кое-что интересное я для вас подготовил. И помните, все это не для того, чтобы нарушать статьи УК РФ, а для того, чтобы учится на чужих ошибках и быть в курсе актуальных угроз. Выход за пределы домашней директории в WFTPD ServerCVE
TARGETS
BRIEFWFTPD Server – FTP-сервер для ОС Windows (кстати, не бесплатный). Данная программа содержит очень характерную ошибку. Аналогичную ошибку находили и в других FTP-серверах от таких именитых производителей как Cisco, HTC, Serv-U и многих других. Поэтому не лишним будет еще раз обратить внимание на классические просчеты программистов. EXPLOITЛогика FTP-сервиса в том, что у каждого пользователя есть своя директория, и работать он должен в своей рабочей папке. Понятно, что это дело должно быть защищено. Программисты – люди не глупые, и последовательность “../” фильтруют.
Но невнимательность губит любое хорошее начинание. Так, например, следующий запрос выполнится без проблем: Что ж, очевидно, что кроме относительного пути, можно указать и абсолютный. Будь внимателен. SOLUTIONРешения нет. Разве только не использовать WFTPD для многопользовательского доступа по FTP. Переполнение буфера в Rumba FTP ClientCVE
TARGETS
BRIEFЧто ж, ошибки бывают не только в платных FTP-серверах, но и в платных FTP-клиентах. Уязвимость переполнения буфера – вот что хранит в себе этот клиент. EXPLOITЭксплойт представляет собой симулятор FTP-сервера, который отвечает на некоторые команды и ждет, когда же у него спросят листинг файлов. И в момент, когда клиент это сделает, сервер-эксплойт пошлет (в пассивном режиме, поэтому если использовать эксплойт удаленно, нужно поменять переменную $pasvip) имя файла, причем очень длинное. Настолько длинное, что перезапишет SEH-дескриптор и вызовет исключительную ситуацию. Естественно, что, обрабатывая исключительную ситуацию, клиент перейдет в SEH-цепочку, вершину который мы перезаписали. Так что «обработчиком» исключительной ситуации станет наш шелл-код, который запускает калькулятор. Разберем эксплойт:
Эксплойт работает стабильно, правда, понятно, что с DEP он работать не будет. SOLUTIONОбновить ПО, хотя автор думает, что и новая версия тоже уязвима. Так что лучше не использовать его вообще... Множественные уязвимости в PHPNukeCVE
TARGETS
BRIEFПрошедший месяц оказался для создателей PHP-Nuke не очень приятным. Что неудивительно, ведь в их детище был найден целый букет уязвимостей. Исследователь Майкл Брукс (Michael Brooks) опубликовал эксплойт, который, используя уязвимости LFI, SQL-инъекции, раскрытия пути, как результат, заливает бэкдор на сервер. Кроме того, этот эксплойт не обошел стороной и старые уязвимости, включая ошибку phpBB, которая может присутствовать в PHP-Nuke 7.0. Программа Брукса написана на PHP и поддерживает использование прокси, а в комментариях даны гугль-хак советы, что делает этот эксплойт крайне неприятным и может использоваться не только скрипт-киддисами, но и червяками. EXPLOITВесь код эксплойта занимает полтысячи строк кода, и поэтому целиком его я тут приводить не буду, лишь интересные кусочки. Разумеется, полную версию эксплойта ты всегда сможешь найти на нашем диске, но исключительно в целях самопроверки. Ведь PHP-Nuke достаточно популярный движок, поэтому стоит провериться. Вдруг ты в опасности? Ладно, хватит лирики, приступаем к делу. Эксплойт запускается элементарно:
Для эксплуатации последней версии PHP-Nuke нужна хоть какая-то учетная запись, поэтому эксплойт требует cookie:
В эксплойт встроена собственная функция для работы со слепыми инъекциями, кодировки строк и т.д. Так что получается мощный зверь. В качестве тестового примера, я попробовал найти инъекцию и получить хэш админа с помощью этого эксплойта. Найдя относительно заброшенный сайт на этом движке, проверим старую инъекцию, в поле referer:
Эксплойт Брукса использует эту уязвимость для получения хэша и формирования cookie для дальнейшей заливки шелла через другую инъекцию, уже новую, но требующую прав администратора, а затем открывает бэкдор через LFI-баг. Конечно, если есть регистрация, можно просто зарегистрироваться и использовать уже другую уязвимость (из арсенала эксплойта) для получения учетки админа и заливки бэкдора. Эксплойт обходит встроенные фильтры защиты от инъекций, а также правила по умолчанию AppArmor’а для Ubunta. Код заливки бэкдора:
Функция charEncode () кодирует символы для использования char() в MySQL. Это сделано, чтобы обойти фильтры. Далее эксплойт открывает бэкдор:
Заливка трояна в /tmp как раз и позволяет обмануть AppArmor. SOLUTIONРешения пока нет, автор предлагает вообще отказаться от использования PHP-Nuke, мотивируя это тем, что там очень плохо с безопасностью, и много уязвимостей еще будет найдено. Повышение привилегий в avast!CVE
TARGETS
BRIEFМатэо Меиелли (Matteo Memelli) из Offensive-Security порадовал нас отличным эксплойтом для антивируса «avast!». Уязвимость, найденная Тобиасом Клейном (Tobias Klein), кроется в драйвере антивируса, который криво обрабатывает IOCTL-запросы. Так как драйвер – дело низкоуровневое, то очевидно, что после эксплуатации уязвимости мы получаем права системы. Таким образом, можно поднять свои привилегии в ОС с помощью данного драйвера и уязвимости в нем. EXPLOITИтак, для того, чтобы воспользоваться уязвимостью, достаточно лишь запустить эксплойт и молиться :). Ошибка обнаружена в драйвере aavmker4.sys. Дело в том, что драйвер может обрабатывать IOCTL-запросы без проверки валидности данных, а конкретнее, IOCTL 0xb2d60030, позволяет копировать любые данные по любому адресу:
Чтобы использовать эту ошибку, был найден указатель на функцию со статическим сдвигом от базового адреса. Именно этот адрес и перезаписывается на адрес шелл-кода, который передается в буфере запроса. Но сначала надо сделать так, что бы EAX указывал на наши данные. Как видно, данные берутся по статическому сдвигу. Прежде чем начать перезапись, эксплойт сохраняет по этому сдвигу специально подготовленные данные так, чтобы уязвимая функция скушала их, и в итоге EAX+0x18 содержал указатель на перезаписываемую нами область памяти с адресом функции. Чтобы осуществить запись в .data, используется IOCTL-запрос 0xb2d6001c. После того, как данные сохранены, вызывается уже наш IOCTL 0xb2d60030, который перезаписывает указатель на функцию, используя предварительно сохраненные в .data адреса. После этого провоцируется вызов функции с перезаписанным указателем – IOCTL 0xb2d60020. Кроме того, эксплойт должен спровоцировать вызов syscall. Для этого он тупо пытается выполнить аутентификацию в системе:
В итоге шелл-код выполнится-таки в нужном контексте. Можно подсоединяться на порт 4444, чтобы получить системный шелл. Формат входных данных в эксплойте:
Эксплойт разбивается на потоки, и там засыпает на минуту. Пока идет ожидание, посылаются два IOCTL-запроса. Первый сохраняет по адресу read_data_from, буфер stor_input. Второй запрос отправляет шелл-код и адрес read_data_from, откуда читать данные для обработки функции – evil_input.
А дальше провоцируем переход с помощью IOCTL-запроса 0xb2d60020 и syscall c помощью lsass.exe. Только после того, как шелл-код закончит работу, lsass.exe умрет и отправит за собой всю ОС в перезагрузку. SOLUTIONОбновление антивируса до версии 4.8 может уберечь от данной проблемы. Выполнение произвольного кода в Apple SafariCVE
TARGETS
BRIEFНачнем наш обзор с 0day уязвимости в браузере Safari. Уязвимость обнаружил Кристиан Клосковски (Krystian Kloskowski) и незамедлительно опубликовал эксплойт для последней версии яблочного браузера. Ответных действий от Apple в виде патча пока не последовало. EXPLOITЭксплойт представляет собой обыкновенный HTML-файл c JavaScript-кодом. Уязвимость кроется в методе parent.close(), который способен повредить память процесса, что, в итоге, может передать управление злобному шелл-коду. В примере Кристиана – шелл-код запускает калькулятор, но ты же понимаешь, что заменить шелл-код – дело пустяковое. Чтобы эксплойт работал удаленно, необходимо существование родительского объекта. Для этого в эксплойте предлагается первоначально использовать метод window.open(), который откроет HTML с эксплойтом. А для этого нужно, чтобы у жертвы были разрешены всплывающие окна. Фишка же самого эксплойта в том, что происходит вызов метода close() для родительского объекта, а затем вызов метода prompt() для того же объекта. Так как parent-объект уже «закрыт», у Safari возникает «разрыв шаблона», то есть ошибка в памяти, в результате которой, при обработке метода prompt(), происходит перезапись регистра ESI значением, которое будет браться из ошибочного места. После записи регистра идет вызов по адресу из этого регистра – CALL ESI. Кристиан в своем эксплойте использует до вызова close() еще пару вызовов prompt(), чтобы «сдвинуть» указатель ESI для принятия значения 0x40E00000. Осталось подготовить шелл-код, чтобы он разместился по адресу 0x40E00000. Тут вступает в дело классический heap spray, что приводит к заполнению адресного пространства процесса, включая адрес 0x40E00000, нашим шелл-кодом. Таким образом, жертва открывает страничку, видит окошко, сгенерированное методом prompt(), пытается закрыть его по ALT+F4, видит второе окошко, которое опять закрывает и в результате – pwned после close() и уже не отобразившего окошка, третьего вызова prompt(). Рассмотрим код эксплойта:
Недостаток эксплойта в том, что Safari у нас работает в режиме permanent-DEP, и шеллкод из кучи исполняться не будет. Компания VUPEN разработала коммерческий эксплойт, который обходит permanent-DEP. Ну, мы же кул-хацкеры – сделаем так, чтобы он еще, кроме DEP, и ASLR обходил. Я не знаю, как сделали ребята из компании VUPEN (догадываюсь, что с помощью ROP), но для ASLR этого мало (в данном случае), поэтому я воспользуюсь техникой JIT-SPRAY и одним из шеллкодов, который я же и разработал (себя не похвалишь – никто не похвалит :)). Мой шеллкод открывает блокнот. Итак, суть проста – заменяем heap spray (который, кстати, жестко палится антивирусами) на JIT-SPRAY. Но не все так легко, как казалось. Если вставить флеш-объект на ту же страницу или даже на родительскую, то при вызове parent.close() вся память, выделенная для Flash, очистится. Тогда я придумал углубить цепочку «наследования». Первая страница грузит JIT-SPRAY и делает открытие в новом окошке второй, вторая страница ничего не делает, кроме как открывает третью. А уже третья страница открывает четвертую – с эксплойтом, но без heap spray. Все страницы в Safari – обрабатывает один процесс, так что память общая. Но адрес 0x40E00000 меня также не устраивает, кто читал мою статью про JIT SPRAY в апрельском ][, тот помнит, что нам нужен адрес вида 0xXXYY0101, чтобы попасть в JIT-шеллкод. Немного побаловавшись с параметром, я нашел ситуацию, когда указатель ESI переписывается значением, генерируемым в качестве параметра метода parent().
Теперь мы можем передать управление по точному адресу. Я выбрал 0x09430101. Там как раз наш шеллкод. Вот и все. SOLUTIONРешения пока нет. Разве что отключить JavaScript- и Pop-Up окошки (а вот это в Safari уже сделано по умолчанию). |