CTF Прохождение HackTheBox - Soccer (Linux, Easy)

1687600320325.png

Приветствую, Кодебай! Сегодня пройдём Soccer - лёгкую линуксовую машину с площадки HackTheBox. Приятного чтения, друзья :)

Разведка

Начинаем, как всегда со сканирования портов, используем флаг -sC, чтобы использовать стандартные скрипты, -sV, чтобы определить сервисы открытых портов:

Bash:
nmap -sC -sV 10.10.11.194 -oN nmap.out

Bash:
PORT     STATE SERVICE         VERSION
22/tcp   open  ssh             OpenSSH 8.2p1 Ubuntu 4ubuntu0.5 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
|   3072 ad0d84a3fdcc98a478fef94915dae16d (RSA)
|   256 dfd6a39f68269dfc7c6a0c29e961f00c (ECDSA)
|_  256 5797565def793c2fcbdb35fff17c615c (ED25519)
80/tcp   open  http            nginx 1.18.0 (Ubuntu)
|_http-title: Did not follow redirect to http://soccer.htb/
|http-server-header: nginx/1.18.0 (Ubuntu)
9091/tcp open  xmltec-xmlmail?
| fingerprint-strings:
|   DNSStatusRequestTCP, DNSVersionBindReqTCP, Help, RPCCheck, SSLSessionReq, drda, informix:
|     HTTP/1.1 400 Bad Request
|     Connection: close
|   GetRequest:
|     HTTP/1.1 404 Not Found
|     Content-Security-Policy: default-src 'none'
|     X-Content-Type-Options: nosniff
|     Content-Type: text/html; charset=utf-8
|     Content-Length: 139
|     Date: Fri, 23 Jun 2023 10:33:35 GMT
|     Connection: close
|     <!DOCTYPE html>
|     <html lang="en">
|     <head>
|     <meta charset="utf-8">
|     <title>Error</title>
|     </head>
|     <body>
|     <pre>Cannot GET /</pre>
|     </body>
|     </html>
|   HTTPOptions:
|     HTTP/1.1 404 Not Found
|     Content-Security-Policy: default-src 'none'
|     X-Content-Type-Options: nosniff
|     Content-Type: text/html; charset=utf-8
|     Content-Length: 143
|     Date: Fri, 23 Jun 2023 10:33:35 GMT
|     Connection: close
|     <!DOCTYPE html>
|     <html lang="en">
|     <head>
|     <meta charset="utf-8">
|     <title>Error</title>
|     </head>
|     <body>
|     <pre>Cannot OPTIONS /</pre>
|     </body>
|     </html>
|   RTSPRequest:
|     HTTP/1.1 404 Not Found
|     Content-Security-Policy: default-src 'none'
|     X-Content-Type-Options: nosniff
|     Content-Type: text/html; charset=utf-8
|     Content-Length: 143
|     Date: Fri, 23 Jun 2023 10:33:36 GMT
|     Connection: close
|     <!DOCTYPE html>
|     <html lang="en">
|     <head>
|     <meta charset="utf-8">
|     <title>Error</title>
|     </head>
|     <body>
|     <pre>Cannot OPTIONS /</pre>
|     </body>
|    </html>

У нас есть три открытых TCP-порта: 22, 80 и 9091. Начнём с 80-го:

1687600636877.png


При переходе на http://10.10.11.194 нас сразу же перенаправляет на soccer.htb. В таком случае следует внести IP-адрес и домен в файл /etc/hosts. Сделать это можно вот таким вот образом:

1687600685422.png


Теперь мы можем попасть на домен:

1687600705427.png


На сайте я ничего интересного не обнаружил, поэтому решил профаззить каталоги и файлы:

Bash:
gobuster dir -w /opt/SecLists/Discovery/Web-Content/directory-list-lowercase-2.3-medium.txt -u http://soccer.htb/ -t 25 -x txt,html

1687600774881.png


Нашлась директория tiny. Давайте посмотрим что в ней:

1687600813656.png


Тут нас приветствует Tiny File Manager. Всегда, когда обнаруживаете подобные панели - сразу же ищите стандартные данные от них. Такие мисконфиги очень популярны в CTF:

1687600839018.png


В данном случае стандартное имя пользователя для админа это admin, а пароль admin@123. Для пользователя это user и 12345.

Пробуем войти от лица администратора:

1687600868419.png


Взятие www-data

Теперь у нас есть доступ к файловому менеджеру. Через него мы можем загрузить вредоносный PHP-файл и получить реверс шелл.

1687600888489.png


Для начала скачаем на нашу машину следующий файл - :

Bash:
wget https://raw.githubusercontent.com/pentestmonkey/php-reverse-shell/master/php-reverse-shell.php

1687600917923.png


Это готовый реверс шелл, который был написан на PHP. Теперь отредактируем его - в $ip нам нужно вставить наш IP-адрес в VPN-сети, а в $port, соответственно, порт:

1687600937155.png


Теперь ставим листенер на порт, который мы указали в PHP-файле:

1687600970671.png


Сразу же в каталог, в котором мы оказались изначально, загрузить файл не получилось, поэтому переходим в tiny:

1687601001688.png


Затем в uploads:

1687601037676.png


И нажимаем кнопку “Upload”:

1687601065458.png


Прожимаем область с текстом “Drop files here to upload” и выбираем php-reverse-shell.php:

1687601082896.png


Файл загружен, теперь нужно заставить веб-сервер запустить PHP-код, который расположен в нём:

1687601106421.png


Нажимаем на “php-reverse-shell.php”, а затем на кнопку “Open”:

1687601131739.png


И получаем сессию от лица пользователя веб-сервера www-data:

1687601178856.png


Стабилизируем оболочку с помощью python3:

Bash:
python3 -c ‘import pty;pty.spawn(”/bin/bash”);’

Взятие пользователя

К сожалению, на машине повысить привилегии в данном случае не получилось. Но мы можем обнаружить следующий конфигурационный файл Nginx’а, где есть поддомен soc-player.soccer.htb:

1687601221481.png


Вносим его в /etc/hosts и переходим на soc-player.soccer.htb:

1687601274140.png


Тут мы можем посмотреть матчи, авторизоваться и зарегистрироваться. Для начала выполним последнее:

1687601317373.png


Теперь авторизуемся:

1687601440679.png


Отлично. Тут написано, что ID нашего билета равен 52405. Похоже, что тут есть какое-то обращение к базе данных:

1687601498079.png


Попробуем ввести в форму 52405:

1687601552881.png


Отправляем запрос и получаем “Ticket Exists”:

1687601577590.png


То есть данный сервис проверяет валидность нашего билета по ID через базу данных. Попробуем проэксплуатировать SQL-инъекцию:

1687601608786.png

1 or 1 - наш тикет существует :)

Посмотрим исходный HTML-код страницы:

1687601630802.png


Запросы идут через веб-сокеты и 9091 порт, который был в сканировании nmap. В таком случае мы можем попробовать использовать sqlmap, который поддерживает веб-сокеты, чтобы вытащить нужные нам данные из базы данных. Для начала посмотрим какие есть базы данных с помощью опции --dbs:

Bash:
sqlmap -u "ws://soc-player.soccer.htb:9091" --level 5 --risk 3 --data '{"id": "*"}' --dbs --batch --technique=B --threads 10

1687601678568.png


1, 2, 3 и 5 база данных - генерируются автоматически. Следовательно, нам нужна soccer_db: используем опцию -D, чтобы указать название БД и --dump. чтобы получить из неё таблицы с данными:

Bash:
sqlmap -u "ws://soc-player.soccer.htb:9091" --level 5 --risk 3 --data '{"id": "*"}' --dbs --batch --technique=B --threads 10 -D soccer_db --dump

1687601696118.png


Самое интересное это:

Код:
player@player.htb
PlayerOftheMatch2022

Эти данные могут подойти для пользователя player. Попробуем подключиться по SSH:

1687601732326.png


Взятие рута

Скачем программу [URL='http://linpeas.sh/']linpeas.sh[/URL] с нашего хоста в каталог /tmp на удалённую машину (про linpeas и то, как это делается я рассказывал в прошлых прохождениях):

1687601758208.png


Даём права на запуск (+x) и запускаем. Во вкладке с “интересными” правами мы можем увидеть /usr/local/bin/doas с SUID-битом:

1687601789603.png


Doas, как и sudo позволяет запускать приложения от имени других пользователей. Настроить doas можно через doas.conf ( ):

1687601817766.png


Ищем конфиг с помощью whereis и видим, что мы можем запускать /usr/bin/dstat с привилегиями суперпользователя. Проверяем:

1687601837355.png


Запуск dstat через doas работает, отлично. Теперь заглянем на GTFOBINS ( ) - как можно повысить привилегии, если мы можем запускать dstat с правами суперпользователя:

1687601866309.png


Нам нужна вкладка “Sudo”. И просто повторяем эти две строки:

1687601900498.png


Рут получен.

Огромное спасибо, что дочитали статью до конца. Если есть какие-то ошибки/неточности, то, пожалуйста, напишите об этом в комментариях :)
 
Последнее редактирование модератором:
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!