Stocker Hack The Box WriteUp by artrone
Разведка
На повестке дня тачка Stocker с уровнем "Easy". Начать стоит с того, что машинка интересная, поскольку заставляет хорошо подумать на определенном этапе, который будет озвучен позже.
Предлагаю начать процесс. Как и всегда, начинаем наш путь со скана:
Ничего интересного я не увидел, лишь 22й и 80й открытый порт. Давайте перейдем по адресу на веб страницу, предварительно изменив /etc/hosts:
Красивый сайт, который прямо таки просит прошерстить его интересные директории)))
Ничего интересного я не обнаружил. Решил просмотреть код элемента страницы, но результат тот же.
Ничего страшного, попробуем найти поддомен через ffuf:
Ага, то то и оно. Опять редачим /etc/hosts и залетаем на сайт:
Нас встречает страница авторизации, которую нам нужно обойти. Стоит отметить, что Redis, MongoDB или memcached являются возможными вариантами СУБД на данной тачке. Выясним это попозже.
Поиск точки входа
Я перебирал стандартные NOSQL инъекции, что-то вроде такого:
Ничего не получалось, и я стал гуглить. Нашел просто прекрасную статью по NOSQL инъекциям, которую вы обязательно должны изучить.
Статья: https://book.hacktricks.xyz/pentesting-web/nosql-injection#basic-authentication-bypass
Итак, что мы имеем? Мы имеем возможность использовать инъекцию для обхода аутентификации:
Я использовал 3 запроса из данной статьи, 2 из которых оказались рабочими.
ВАЖНО: в запросе Content-Type нужно изменить на Content-Type: application/json, поскольку мы используем синтаксис json.
Славно, теперь мы имеем доступ к странице, обойдя аутентификацию.
Но как мы это поняли? Посмотрите на респонс в двух случаях: говорится, что пользователь найден и нас перенаправляет на "основную" страницу нашего поддомена:
Тут по сути нет ничего интересного, поэтому давайте поступим по "сценарию сайта"- добавим в корзину какой-нибудь товар и составим ордер:
Так, открылся pdf-файл, показывающий нам наш заказ. Ага, хорошо, но давайте мы перехватим запрос открытия этого документа и изучим его:
Как мы видим, "success":true, "orderId":"номер ордера", что говорит о корректном исполнении запроса.
А как можно использовать этот факт для личных целей?
Так как идет отправка заказа через API в расширение "json" (видно в запросе), а также в файле pdf столбец "Item" выдает нам строку из запроса "title":"Cup", то, я так думаю, можно изменить запрос нужным нам образом, используя тег <iframe></iframe>:
Минутка пояснений: <iframe></iframe> является контейнером, содержание которого игнорируется браузерами, не поддерживающими данный тег. Для таких браузеров можно указать альтернативный текст, который увидят пользователи.
Используя "title": "<iframe src=file:///etc/passwd></iframe>", мы получили положительный ответ, который мы откроем в браузере командой http://dev.stocker.htb/api/po/*ваш ордер айди* и проверим результат:
Отлично, мы успешно открыли файл "passwd", что дает нам возможность обнаружить пользователя angoose и понять, что можно сгенерировать новый запрос:
P.S. для корректного отображения нашей полезной нагрузки, я рекомендую добавить в запросе "title": "<iframe src=file:///etc/passwd height:800px width: 800px></iframe>"
Получение юзер флага
Так, теперь нужно определиться с дальнейшим ходом вещей. Так как на сайте используется Node.Js (чекаем wappalyzer), то и есть файл index.js, который мы вызовем:
Внимательно изучив документ, мы находим замечательную для нас строку и видим, что используется mongoDB:
Это ничто иное, как пароль для учетки с ником angoose.
Летим в ssh и забираем юзер флаг:
Повышение привелегий
Давайте стандартным образом посмотрим наши права:
Как мы можем видеть, у нас есть право запускать js скрипты от имена root'a, указывая путь /usr/bin/node.
Отлично, ведь это значит, что мы без проблем можем создать полезный js документ для буста)))
Будем использовать обход каталога и порождение дочернего процесса.
Подробнее: https://stackoverflow.com/questions/30134236/use-child-process-execsync-but-keep-output-in-console и https://nodejsdev.ru/api/child_process/
Далее "устанавливаем" bash и гордимся собой с +30 поинтами)))
Наш уютный ТГ-канал: https://t.me/hackerblog