Хакер - HTB Stocker. Используем генератор PDF для произвольного чтения файлов

Хакер - HTB Stocker. Используем генератор PDF для произвольного чтения файлов

hacker_frei

https://t.me/hacker_frei

RalfHacker

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

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

В этом рай­тапе я покажу типич­ный сце­нарий зах­вата веб‑сер­вера. Сна­чала про­ведем базовое ска­ниро­вание сай­та на пред­мет скры­тых катало­гов, затем про­ведем NoSQL-инъ­екцию, что­бы обой­ти авто­риза­цию, и HTML-инъ­екцию, что­бы про­читать про­изволь­ные фай­лы. При повыше­нии при­виле­гий исполь­зуем обход катало­гов Bash для чте­ния поль­зователь­ско­го скрип­та.

Зах­ватывать будем тре­ниро­воч­ную машину Stocker с пло­щад­ки Hack The Box. Уро­вень ее слож­ности — лег­кий.

WARNING

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

РАЗВЕДКА

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

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

10.10.11.196 stocker.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 — веб‑сер­вер Nginx 1.18.0. С SSH сей­час ничего сде­лать не можем, поэто­му про­ходим к веб‑сер­веру.

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

ТОЧКА ВХОДА

На сай­те ничего инте­рес­ного най­ти не уда­лось, поэто­му прис­тупим к поис­ку скры­тых фай­лов и катало­гов, на которые не ведут ссыл­ки. Я для это­го исполь­зую feroxbuster.

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

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

При запус­ке ука­зыва­ем сле­дующие парамет­ры:

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

На­бира­ем такую коман­ду:

feroxbuster -u http://stocker.htb/ -w directory_2.3_medium_lowercase.txt -d 2 -t 256

Ре­зуль­тат ска­ниро­вания катало­гов с помощью feroxbuster

Ни­чего най­ти не уда­лось, поэто­му ска­ниру­ем под­домены. Их я иссле­дую с помощью ffuf, переби­рая заголо­вок Host (осталь­ные клю­чи те же, что у ferox).

ffuf -u http://stocker.htb/ -w subdomains-top1million-110000.txt -t 256 -H 'Host: FUZZ.stocker.htb'

Ре­зуль­тат ска­ниро­вания под­доменов

В выводе получа­ем все сло­ва из спис­ка, поэто­му сто­ит исполь­зовать филь­тр (параметр -fs), отсе­кающий ненуж­ные отве­ты по раз­меру стра­ницы.

ffuf -u http://stocker.htb/ -w subdomains-top1million-110000.txt -t 256 -H 'Host: FUZZ.stocker.htb' -fs 178

Ре­зуль­тат ска­ниро­вания под­доменов

И находим все­го один новый под­домен — dev. Добав­ляем его в файл /etc/hosts.

10.10.11.196 stocker.htb dev.stocker.htb

Стра­ница авто­риза­ции dev.stocker.htb

ТОЧКА ОПОРЫ

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

Зап­рос на авто­риза­цию

Я сра­зу про­тес­тировал раз­ные вари­анты обхо­да авто­риза­ции для раз­ных тех­нологий и уяз­вимос­тей с помощью Burp Intruder. Ничего най­ти не уда­лось, поэто­му я перешел к тем вари­антам, которые в брут­форсер не заложе­ны. Так доходим до одной из JSON-наг­рузок для экс­плу­ата­ции NoSQL-инъ­екции.

{

"username": {

"$ne": null

},

"password": {

"$ne": null

}

}

Зап­рос на авто­риза­цию

И нам ста­новит­ся дос­тупен какой‑то онлай­новый магазин.

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

Пе­рей­дем к спис­ку товаров и добавим любой из них в кор­зину. Затем перехо­дим к кор­зине и прос­матри­ваем ее содер­жимое.

То­вары на сай­те
Кор­зина онлайн‑магази­на

Про­буем под­твер­дить покуп­ку, пос­ле чего нам дают ссыл­ку на чек.

Под­твержде­ние покуп­ки

При перехо­де по ссыл­ке получа­ем отдель­ный PDF-документ с информа­цией о товаре.

Чек с информа­цией о покуп­ке

Мы прош­ли пол­ный путь от авто­риза­ции до получе­ния чека, теперь перей­дем к исто­рии зап­росов в Burp History и под­робнее пос­мотрим, что при этом про­исхо­дило.

Произвольное чтение файлов

В зап­росе на генери­рова­ние фай­ла видим отправ­ляемые парамет­ры.

Зап­рос на /api/order в Burp History

Мож­но было бы вмес­то пути к кар­тинке в парамет­ре image отпра­вить путь к про­изволь­ному фай­лу, но кар­тинка в отче­те не отоб­ража­ется. Единс­твен­ный параметр, который находит отра­жение в отче­те, — это поле title, наиме­нова­ние товара. Генера­торы PDF час­то поз­воля­ют про­водить инъ­екцию тега iframe, в котором мы можем отоб­разить локаль­ный файл. Для при­мера поп­робу­ем вста­вить в PDF файл /etc/passwd.

<iframe src=file:///etc/passwd height=800px width=800px></iframe>

Зап­рос на генери­рова­ние отче­та

В отве­те видим иден­тифика­тор отче­та, который встав­ляем в ссыл­ку такого вида:

http://dev.stocker.htb/api/po/63fb37ad3724ba9a5070fffa

Но­вый отчет с вклю­чен­ным фрей­мом

И вмес­то наиме­нова­ния товара получа­ем встав­ленный фрейм с зап­рошен­ным фай­лом. В etc/passwd видим активно­го поль­зовате­ля angoose с дей­ству­ющей коман­дной обо­лоч­кой /bin/bash. Так как мы можем читать фай­лы, пос­мотрим исходные коды сай­та.

По наз­ванию под­домена dev пред­полага­ем, что сайт рас­положен в соот­ветс­тву­ющем катало­ге /var/www/dev/. По наз­ванию парамет­ра куки connect.sid мож­но пред­положить, что исполь­зует­ся Node.js, поэто­му будем зап­рашивать файл /var/www/dev/index.js.

<iframe src=file:///var/www/dev/index.js height=800px width=800px></iframe>

Но­вый отчет с вклю­чен­ным фрей­мом

В исходном коде index.js отме­чаем исполь­зование СУБД MongoDB, а так­же учет­ные дан­ные для под­клю­чения к базе.

mongodb://dev:IHeardPassphrasesArePrettySecure@localhost/dev?authSource=admin&w=1

Про­буем при­менить най­ден­ный пароль для авто­риза­ции по SSH от име­ни поль­зовате­ля angoose и получа­ем сес­сию на машине.

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

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

Те­перь нам необ­ходимо соб­рать информа­цию. Я для это­го обыч­но исполь­зую скрип­ты PEASS.

Справка: скрипты PEASS

Что делать пос­ле того, как мы получи­ли дос­туп в сис­тему от име­ни поль­зовате­ля? Вари­антов даль­нейшей экс­плу­ата­ции и повыше­ния при­виле­гий может быть очень мно­го, как в Linux, так и в Windows. Что­бы соб­рать информа­цию и наметить цели, мож­но исполь­зовать Privilege Escalation Awesome Scripts SUITE (PEASS) — набор скрип­тов, которые про­веря­ют сис­тему на авто­мате и выда­ют под­робный отчет о потен­циаль­но инте­рес­ных фай­лах, про­цес­сах и нас­трой­ках.

Заг­рузим на хост скрипт для Linux, дадим пра­во на выпол­нение и запус­тим ска­ниро­вание. В выводе будет мно­го информа­ции, но ничего важ­ного най­ти не уда­лось, кро­ме сооб­щения о зап­росе пароля для прос­мотра нас­тро­ек sudoers.

Ошиб­ка при зап­росе нас­тро­ек sudoers

Справка: sudoers

Файл /etc/sudoers в Linux содер­жит спис­ки команд, которые раз­ные груп­пы поль­зовате­лей могут выпол­нять от име­ни адми­нис­тра­тора сис­темы. Мож­но прос­мотреть его как нап­рямую, так и при помощи коман­ды sudo -l.

Вы­пол­ним коман­ду sudo -l и вве­дем извес­тный пароль.

Нас­трой­ки sudoers

Мы можем выпол­нить от име­ни поль­зовате­ля root такую коман­ду:

/usr/bin/node /usr/local/scripts/*.js

В дан­ном слу­чае выпол­нить про­изволь­ный код Node.js очень лег­ко, так как в зна­чении сим­вола «звез­дочка» мож­но переда­вать и пос­ледова­тель­ность ../../../ для обхо­да катало­га. Исполь­зуем это, что­бы соз­дать файл rshell.js, который прис­воит бит SUID фай­лу коман­дной обо­лоч­ки /bin/bash.

require('child_process').exec('chmod u+s /bin/bash')

Те­перь выпол­ним скрипт сле­дующей коман­дой, пос­ле чего про­верим пра­ва фай­ла /bin/bash:

sudo /usr/bin/node /usr/local/scripts/../../../../home/angoose/rshell.js

Ре­зуль­тат выпол­нения коман­ды

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

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

Флаг рута

Флаг рута у нас, а зна­чит, машина зах­вачена!

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



Report Page