tools

samrdump.py Impacket: Enumerare Utenti Windows via SAMR

samrdump.py Impacket: Enumerare Utenti Windows via SAMR

Guida a samrdump.py di Impacket per enumerare utenti Windows via MS-SAMR su SMB, ottenere RID e attributi account con password, hash NTLM o Kerberos.

  • Pubblicato il 2026-07-25
  • Tempo di lettura: 6 min

Come enumerare account Windows via SAMR con samrdump.py #

samrdump.py fa parte di Impacket e sfrutta il protocollo MS-SAMR per enumerare account utente e i loro attributi su un sistema Windows, via SMB. Interroga il primo dominio SAM restituito dal target, elenca i suoi utenti e per ognuno recupera un set di attributi (nome completo, commenti, contatore password errate, stato dell’account). Non enumera gruppi, alias, membri di gruppo, né condivisioni — nonostante alcune guide online (anche note) lo diano per scontato, il codice attuale non chiama nessuna funzione per farlo.

A differenza di GetADUsers.py che usa LDAP e deve puntare al DC, samrdump funziona contro qualsiasi host Windows — workstation, member server, DC — purché l’account con cui ti autentichi sia autorizzato a fare chiamate SAMR remote su quel target. Non è automatico: dipende dalla policy RestrictRemoteSAM del target, di cui parliamo più sotto.

Riferimento ufficiale: fortra/impacket — samrdump.py

Come funziona davvero #

text
1. Connessione SMB (porta 445 o 139) verso la named pipe \pipe\samr
2. Bind sull'interfaccia MS-SAMR
3. hSamrConnect → apre l'handle al server SAM
4. hSamrEnumerateDomainsInSamServer → elenca TUTTI i domini SAM trovati (li stampa tutti)
5. hSamrOpenDomain sul PRIMO dominio della lista → apre solo quello
6. hSamrEnumerateUsersInDomain → elenca gli utenti di quel dominio
7. Per ogni utente:
   hSamrOpenUser → apre il contesto utente
   hSamrQueryInformationUser2 (UserAllInformation) → recupera gli attributi
8. Stampa i risultati (tabella o CSV)

Nessuna chiamata a funzioni di enumerazione alias/gruppi, nessuna interazione con share. Se vedi un output con Found alias: Domain Admins, rid = 512 da qualche parte online, non viene da questa versione del tool.

Differenza chiave rispetto a GetADUsers.py:

samrdump.pyGetADUsers.py
ProtocolloMS-SAMR via SMB (445/139)LDAP (389)
TargetQualsiasi host Windows raggiungibile via SAMRSolo Domain Controller
Mostra account localiNo
Mostra account di dominioSì, se punti al DCSì, sempre
Attributi mostratiRID, nome completo, commenti, contatori, stato basesAMAccountName, email, pwdLastSet, lastLogon
Gruppi/OUNoNo (nessuno dei due)

Sintassi e opzioni reali #

bash
impacket-samrdump [opzioni] [[dominio/]utente[:password]@]target
OpzioneDescrizione
-csvOutput in formato CSV (vero CSV, separato da virgole)
-dc-ip IPIP del Domain Controller
-target-ip IPIP del target — utile quando il target è un nome NetBIOS non risolvibile
-port {139,445}Porta SMB (default: 445) — solo questi due valori sono accettati
-hashes LM:NTPass-the-Hash
-aesKey KEYChiave AES per Kerberos — impostarla forza automaticamente -k
-kAutenticazione Kerberos
-no-passNon chiedere la password
-tsTimestamp nei log
-debugOutput verboso

Non esiste un argomento posizionale tipo 139/SMB o 445/SMB in coda al target — è un errore che gira in alcune guide. La porta si imposta solo con -port.

Utilizzo pratico #

Base — con password #

bash
# Domain Controller — utenti di dominio
impacket-samrdump corp.local/user:Password123@10.10.10.5

# Workstation — account locali (Administrator, utenti locali)
impacket-samrdump ./administrator:Password123@10.10.10.50

Pass-the-Hash #

bash
impacket-samrdump -hashes :NThash corp.local/administrator@10.10.10.5

Kerberos, con hostname e IP separati #

bash
export KRB5CCNAME=/path/to/ticket.ccache

impacket-samrdump \
  -k -no-pass \
  -dc-ip 10.10.10.5 \
  -target-ip 10.10.10.50 \
  corp.local/user@WS01.corp.local

-target-ip conta quando usi un hostname come target (necessario per Kerberos) ma vuoi forzare la connessione verso un IP specifico — se lo ometti, il tool usa lo stesso valore del target.

Output CSV — per analisi offline #

bash
impacket-samrdump -csv corp.local/user:pass@10.10.10.5 > samrdump_output.csv

Via porta 139 (fallback se 445 è bloccata) #

bash
impacket-samrdump -port 139 corp.local/user:'Password123!'@10.10.10.5

Output e come leggerlo #

Formato normale (senza -csv):

text
Found domain(s):
 . CORP
 . Builtin
Found user: Administrator, uid = 500
Administrator (500)/FullName:
Administrator (500)/AdminComment: Account amministrativo predefinito
Administrator (500)/UserComment:
Administrator (500)/PrimaryGroupId: 513
Administrator (500)/BadPasswordCount: 0
Administrator (500)/LogonCount: 47
Administrator (500)/PasswordLastSet: 2024-01-15 10:23:11
Administrator (500)/PasswordDoesNotExpire: True
Administrator (500)/AccountIsDisabled: False
Administrator (500)/ScriptPath:

Nota: il tool stampa uid nell’output, ma tecnicamente quel numero è il RID (Relative Identifier).

Formato CSV (-csv), header reale:

text
#Name,RID,FullName,PrimaryGroupId,BadPasswordCount,LogonCount,PasswordLastSet,PasswordDoesNotExpire,AccountIsDisabled,AdminComment,UserComment,ScriptPath
Administrator,500,,513,0,47,2024-01-15 10:23:11,True,False,Account amministrativo predefinito,,
svc_sql,1104,SQL Service,513,0,12,2019-03-10 12:00:00,False,False,,,

Come interpretare i campi reali:

CampoSignificato
RID (uid in output)Identificatore relativo dell’account, ultima parte del SID
FullNameNome completo impostato sull’account
PrimaryGroupIdRID del gruppo primario dell’utente
BadPasswordCountContatore tentativi falliti, riportato dal target interrogato
LogonCountNumero di logon registrati
PasswordLastSetUltima impostazione password — vecchia non equivale automaticamente a debole, solo a non ruotata
PasswordDoesNotExpireLa password è configurata per non scadere — non significa che sia debole o nota
AccountIsDisabledStato disabilitato dell’account
AdminComment / UserCommentCommenti testuali — a volte contengono credenziali dimenticate
ScriptPathScript di logon associato

Il tool NON restituisce: gruppi, membri di gruppo, share, msDS-SupportedEncryptionTypes (RC4/AES supportati), flag PasswordNotRequired, stato di lock dell’account, o data di scadenza.

RID — cosa sono e cosa non dimostrano #

Il RID identifica l’account all’interno del dominio; unito al SID del dominio forma il SID completo (S-1-5-21-X-Y-Z-RID). Alcuni RID sono fissi per convenzione:

text
500 = Administrator incorporato
501 = Guest
502 = krbtgt (solo su DC, in un dominio Active Directory)

Attenzione: questi sono RID di account utente. samrdump.py non enumera gruppi, quindi non aspettarti di vedere RID di gruppo (512 = Domain Admins, 519 = Enterprise Admins, ecc.) nel suo output.

Un RID 501 (Guest) presente e non disabilitato non equivale ad accesso anonimo possibile. Verifica separatamente la configurazione SMB prima di concludere che l’accesso anonimo funzioni.

bash
# Per ottenere il SID del dominio, serve un altro tool
impacket-lookupsid corp.local/user:pass@10.10.10.5 | head -5

Con RID e SID del dominio puoi poi costruire ticket Kerberos forgiati (vedi Golden Ticket).

samrdump.py funziona senza credenziali? #

Le null session erano il modo classico per fare enumerazione SAMR senza credenziali. Su sistemi moderni dipendono da diversi fattori configurabili indipendentemente: RestrictAnonymous, accesso anonimo a share/named pipe, e soprattutto la policy RestrictRemoteSAM.

bash
impacket-samrdump ''@10.10.10.5
impacket-samrdump 10.10.10.5

Da Windows 10 1607 / Server 2016 in poi, il descrittore di sicurezza predefinito per RestrictRemoteSAM limita l’accesso SAM remoto ai soli amministratori locali sui sistemi non-DC; sui Domain Controller invece il default resta più permissivo (storicamente Everyone), anche se può essere ristretto tramite policy. Un buon riferimento pratico è questo articolo su SAM Remote access enumeration, oltre alla documentazione Microsoft su RestrictRemoteSAM.

Differenza tra workstation, member server e Domain Controller #

TargetAccount generalmente enumerati
Workstation standaloneAccount locali
Member workstation/serverAccount del SAM locale, se l’account che usi passa RestrictRemoteSAM
Domain ControllerAccount del dominio AD esposti via SAMR (default storicamente più permissivo)
Samba o compatibiliDipende interamente dall’implementazione e configurazione

Confronto con tool alternativi #

ToolProtocolloInfo principali
samrdump.pySAMR/SMBRID, nome completo, commenti, gruppo primario, contatori, stato base
rpcclientRPC/SMBUtenti, gruppi, membri — più flessibile ma richiede sessione interattiva
lookupsid.pyMS-LSAT/SMBRID bruteforce, utile per costruire il SID completo
GetADUsers.pyLDAPsAMAccountName, email, pwdLastSet, lastLogon
BloodHoundLDAP+SMBRelazioni, gruppi, sessioni, attack path
bash
# Alternativa con rpcclient (più flessibile per gruppi, richiede autenticazione)
rpcclient -U "corp.local/user%Password123" 10.10.10.5 -c "enumdomusers"
rpcclient -U "corp.local/user%Password123" 10.10.10.5 -c "enumdomgroups"

# Alternativa con netexec
nxc smb 10.10.10.5 -u user -p pass --users

Quando samrdump.py restituisce STATUS_ACCESS_DENIED sull’intera enumerazione, puoi comunque provare a interrogare singoli RID uno per uno — la policy RestrictRemoteSAM a volte blocca l’enumerazione di massa ma non le query puntuali:

bash
# RID cycling manuale con rpcclient (funziona anche con null session su target permissivi)
for i in $(seq 500 1100); do
  rpcclient -N -U "" 10.10.10.5 -c "queryuser 0x$(printf '%x\n' $i)" | grep "User Name\|user_rid\|group_rid" && echo ""
done

# Stesso concetto automatizzato con netexec
nxc smb 10.10.10.5 -u '' -p '' --rid-brute

Quando usare samrdump.py invece delle alternative: vuoi specificamente gli attributi esposti da SamrQueryInformationUser2 (commenti, contatori, PrimaryGroupId) su un host preciso, o ti serve un CSV pronto da processare senza passare da rpcclient interattivo.

Workflow tipico #

text
samrdump.py
│
├── Ottieni username e RID
│   ├── userlist per controlli autorizzati (password spraying, solo dopo aver verificato lockout policy)
│   └── correlazione con lookupsid.py per il SID completo
│
├── Account con AdminComment/UserComment sospetti
│   └── a volte contengono credenziali dimenticate in chiaro
│
├── Nomi che sembrano service account (svc_*)
│   └── verifica reale con GetUserSPNs.py — il nome da solo non dimostra nulla
│
├── Account di dominio ottenuti da un DC
│   ├── GetNPUsers.py per verificare no-preauth reale
│   └── BloodHound/LDAP per gruppi e privilegi (samrdump non li mostra)
│
└── Account locali ottenuti da un member server
    └── verifica separata di gruppi locali e diritti (rpcclient, nxc)

Detection #

Non esistono Event ID “dedicati” a samrdump specifico — quello che si osserva è traffico SAMR generico, indistinguibile da altri tool che usano la stessa interfaccia:

  • Autenticazione SMB e logon di rete verso il target
  • Connessione a IPC$ e accesso alla named pipe \pipe\samr
  • Traffico DCE/RPC su interfaccia MS-SAMR — molte chiamate SamrOpenUser/SamrQueryInformationUser in sequenza sono un pattern enumerativo
  • Sorgenti non amministrative che interrogano un numero elevato di account
  • Event ID 5145 se è abilitato il Detailed File Share Auditing
  • Telemetria EDR/NDR su SMB e RPC resta il segnale più affidabile, più della singola voce di log

Non esiste una regola generale per cui un tool di enumerazione sia “sempre più silenzioso” di un altro.

Errori comuni #

ErroreCausa probabileVerifica
STATUS_LOGON_FAILURECredenziali o dominio erratiControlla formato e materiale di autenticazione
STATUS_ACCESS_DENIEDAccount escluso dalle ACL SAMR o dalla policy RestrictRemoteSAM sul targetNon presumere serva sempre un admin
STATUS_PIPE_NOT_AVAILABLENamed pipe SAMR non disponibileControlla SMB, IPC$ e firewall
TimeoutPorta 139/445 filtrata o routing erratoVerifica connettività, prova -target-ip
Errore hostname/KDC con KerberosTarget indicato solo tramite IPUsa FQDN come target e -target-ip per la connessione effettiva
Nessuna entry ricevutaDominio SAM aperto ma nessun utente recuperatoAttiva -debug e verifica il tipo di target

Cheat Sheet #

bash
# Base con credenziali
impacket-samrdump corp.local/user:pass@TARGET

# Workstation — account locali
impacket-samrdump ./administrator:pass@WORKSTATION

# Pass-the-Hash
impacket-samrdump -hashes :NThash corp.local/user@TARGET

# Output CSV per analisi
impacket-samrdump -csv corp.local/user:pass@TARGET > output.csv

# Kerberos con hostname/IP separati
export KRB5CCNAME=ticket.ccache
impacket-samrdump -k -no-pass -dc-ip DC_IP -target-ip TARGET_IP corp.local/user@WS01.corp.local

# Via porta 139 (fallback)
impacket-samrdump -port 139 corp.local/user:pass@TARGET

# Null session (riesce solo se la policy lo permette)
impacket-samrdump ''@TARGET

# Cerca account con password che non scade
impacket-samrdump -csv corp.local/user:pass@TARGET | awk -F, '$8=="True"'

Articoli correlati #

Uso esclusivo in ambienti autorizzati.

#samrdump #samr #windows-enumeration #active-directory

lascia un messaggio

Non sono un robot