В этой статье мы зай­мем­ся экс­плу­ата­цией неп­равиль­но нас­тро­енных али­асов nginx, поз­накомим­ся с одной из тех­ник получе­ния RCE через локаль­ное вклю­чение фай­лов, порабо­таем с LDAP в Linux и най­дем уяз­вимость в поль­зователь­ском скрип­те. Все это поможет нам зах­ватить флаг рута на машине Pikaboo с пло­щад­ки Hack The Box.

warning

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

 

Разведка

 

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

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

10.10.10.249 pikaboo.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).

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

Мы наш­ли три откры­тых пор­та: 21 (служ­ба VSFTPD 3.0.3), 22 (служ­ба SSH) и 80 (веб‑сер­вер nginx 1.14.2). На SSH без учет­ных дан­ных сту­чать­ся бес­полез­но, но и на FTP нам делать нечего: Nmap уже про­верил воз­можность ано­ним­ного вхо­да и не обна­ружил ее.

 

Брут FTP

Мож­но про­бовать переб­рать популяр­ные логины для FTP. Ты лег­ко най­дешь готовые спис­ки зап­росом вро­де ftp default credentials github. Для это­го будем исполь­зовать hydra (не путать с Ghidra). Опци­ей -t уста­новим 32 потока.

hydra -L ftp_username.txt -P ftp_password.txt -t 32 pikaboo.htb ftp
Результат перебора учетных данных
Ре­зуль­тат перебо­ра учет­ных дан­ных

Из это­го ничего не выш­ло, поэто­му перей­дем к вебу.

 

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

Смот­рим сайт и обна­ружи­ваем, что он еще в раз­работ­ке, о чем сви­детель­ству­ют сооб­щения «PokeAPI Integration - Coming soon!» на некото­рых стра­ницах.

Стартовая страница сайта
Стар­товая стра­ница сай­та

Толь­ко при перехо­де к стра­нице адми­нис­тра­тора нас встре­тит HTTP-аутен­тифика­ция. Если отка­зать­ся от про­вер­ки учет­ных дан­ных, получим сле­дующее сооб­щение об ошиб­ке дос­тупа.

Ошибка доступа
Ошиб­ка дос­тупа

В этой ошиб­ке инте­рес­но сооб­щение об исполь­зовании веб‑сер­вера Apache на пор­те 81. При этом обра­щались мы к пор­ту 80, на котором работа­ет веб‑сер­вер nginx (по край­ней мере, нам об этом сооб­щил Nmap). Похоже, при обра­щении к катало­гу адми­нис­тра­тора работа­ет какая‑то внут­ренняя пере­адре­сация меж­ду сер­верами.

 

Точка входа

 

Уязвимость nginx path traversal

Ес­ли стал­кива­ешь­ся с веб‑сер­вером nginx, всег­да сто­ит искать уяз­вимость обхо­да путей. Она появ­ляет­ся при неп­равиль­но нас­тро­енных али­асах. Nginx alias — это некий псев­доним, который поз­воля­ет скрыть реаль­ное мес­тополо­жение объ­екта. Он зада­ется в дирек­тиве location. К при­меру, сле­дующая кон­фигура­ция уста­новит замену /img/ на /web/data/images/:

location /img/ {
alias /web/data/images/;
}

При обра­щении к /img/test.png веб‑сер­вер вер­нет файл /web/data/images/test.png. Уяз­вимость появ­ляет­ся при неп­равиль­ном ука­зании location, к при­меру как в сле­дующей кон­фигура­ции:

location /img {
alias /web/data/images/;
}

В этом слу­чае, если мы обра­тим­ся к /img../test.png, сер­вер вмес­то того, что­бы вер­нуть файл /web/data/images/test.png, выпол­нит пря­мую замену али­аса и попыта­ется вер­нуть /web/data/test.png, тем самым обхо­дя каталог images.

Да­вай вос­поль­зуем­ся обхо­дом через каталог admin и прос­каниру­ем содер­жимое сай­та. Для это­го мы будем ска­ниро­вать адрес /admin../. Так как при обра­щении к стра­нице /admin про­исхо­дит редирект на дру­гой сер­вер, мы смо­жем прос­мотреть имен­но веб‑кон­тент внут­ренне­го сер­виса на пор­те 81.

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

Что­бы най­ти скры­тое содер­жимое на сай­тах, при­меня­ется ска­ниро­вание методом перебо­ра катало­гов. Для это­го мож­но исполь­зовать прог­раммы вро­де dirsearch и DIRB.

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

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

Ко­ман­да получа­ется сле­дующая:

ffuf -u http://pikaboo.htb/admin../FUZZ -w /home/ralf/tmp/wordlists/Content/dirs/files_interesting.txt -t 200
Результат сканирования каталогов с помощью ffuf
Ре­зуль­тат ска­ниро­вания катало­гов с помощью ffuf

В резуль­тате я нашел нес­коль­ко инте­рес­ных фай­лов. Сре­ди них — очень важ­ный файл server-status, в котором отра­жают­ся все зап­росы к веб‑сер­веру Apache. Он и рас­кры­вает нам при обра­щении к http://pikaboo.htb/admin../server-status нез­накомые до это­го момен­та катало­ги. В том чис­ле http://pikaboo.htb/admin../admin_staging/.

Содержимое файла server-status
Со­дер­жимое фай­ла server-status
Страница admin_staging
Стра­ница admin_staging

Мы наш­ли нес­коль­ко стра­ниц, на которые можем перей­ти. Если заг­лянуть в Burp History, то мы уви­дим, что жела­емая стра­ница переда­ется в качес­тве зна­чения парамет­ра page. А это веро­ятная уяз­вимость вклю­чения фай­лов, которую сле­дует про­верить.

Запрос в Burp History
Зап­рос в Burp History
 

Точка опоры

 

Уязвимость LFI

При тес­те Local File Inclusion мож­но прос­то отдать одно­му из ска­неров дирек­торий спи­сок с соот­ветс­тву­ющи­ми наг­рузка­ми. Я для перебо­ра исполь­зовал Burp Intruder со сво­ими сло­варя­ми (можешь поис­кать готовые на GitHub).

Пер­вым делом опре­деля­ем наг­рузку, с помощью которой мож­но прос­мотреть дос­тупный для всех сис­темных поль­зовате­лей файл на уда­лен­ном хос­те. В резуль­тате перебо­ра уда­лось про­читать файл /var/log/lastlog через обход дирек­торий пос­ледова­тель­ностью ../../../../../.

Результат атаки через Burp Intruder
Ре­зуль­тат ата­ки через Burp Intruder

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

Результат перебора важных файлов через LFI
Ре­зуль­тат перебо­ра важ­ных фай­лов через LFI

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

 

От LFI к RCE

Есть нес­коль­ко спо­собов получить уда­лен­ное выпол­нение кода (RCE), имея LFI, и один из них я сей­час покажу. Дело в том, что мы можем зас­тавить веб‑сер­вер обра­тить­ся к фай­лу логов служ­бы FTP и таким обра­зом кос­венно выпол­нить туда запись. Нап­ример, если мы попыта­емся авто­ризо­вать­ся от лица поль­зовате­ля test_test_test, то эта стро­ка попадет в этот лог. Таким обра­зом, мы можем записать в файл код на PHP и, обра­тив­шись к это­му фай­лу через веб‑сер­вер, выпол­нить его!

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

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

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

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

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


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

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

    Подписаться

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