内网安全学习笔记-Ⅴ:域内横向移动
这是第五章的学习记录汇总…
域内横向移动再内网攻击中被广泛使用,尤其是在APT 高级持续威胁。
攻击者利用横向移动,以被攻陷主机为跳板,访问其它域内主机 以扩大资产范围,包括包括跳板机器中的文档和存储的凭证、跳板机的数据库连接信息、域控及其它重要资产。
一、常用Windows远程连接(IPC$)和相关命令
场景:已经获取到目标主机用户明文密码,网络环境较为苛刻,可以用Windows自带工具IPC建立远程连接。
IPC(Internal Process Connection,空连接)共享“命名管道”资源,能够查看远程主机的共享资源。通过ipc可以与目标主机建立连接,从而访问、上传或下载目标主机的文件及运行其它命令。
使用方法:
1 | # 建立一个连接 |

IPC连接常见错误提示:
1 | 错误号5:拒绝访问(本地权限问题) |
利用条件:
开放了139、445端口;目标开启ipc$文件共享;已获取用户账号密码。
利用方法:
可以使用以下命令
1 | # 列出目标c盘目录 |
利用IPC上传后门并执行:
1 | # 首先建立连接 |
二、Windows系统散列值获取
在Windows系统中通常使用两种方法对用户明文密码进行加密处理:LM HASH和NTLM HASH。
LM HASH全名LAN Manager Hash,是微软为了提高Windows系统安全性而采用的散列加密算法,本质是DES加密,LM HASH较容易被破解,从Windows2008开始系统默认禁用LM HASH,如果被禁用,一般用工具抓取的LM HASH值为aad3b435b51404eeaad3b435b51404ee(代表空值或禁用)。
MTLN HASH是微软为了提高安全性的同时保证兼容性而设计的加密算法,是基于MD4加密算法加密的。从Windows2003以后,Windows认证方式均为NTLM HASH。
Windows hash结构username:RID:LM-HASH:NT-HASH。
利用条件:
System权限
利用工具及方法:
1、GetPass获取明文密码
2、PwDump7
可以获取系统所有账户的NTLM HASH,然后通过彩虹表破解hash或者用哈希传递的方法进行横向渗透
3、Mimikatz
mimikatz是一款c语言编写的轻量级系统调试工具,该工具可以从内存中提取明文密码、散列值、PIN和Kerberos票据,也可以执行哈希传递、票据传递以及构建黄金票据(Golden Ticket)。
通过SAM和SYSTEM文件抓取密码
1 | # 方法1 |
使用mimikatz在线读取SAM文件
1 | mimkatz.exe "privilege::debug" "log" "sekurlsa::logonpasswords" |
使用mimikatz离线读取lsass.dmp文件
lsass.exe进程:Local Security Authority Service、本地安全权限服务,用于本地安全和登录策略
1 | # 使用微软官方提供的工具procdump导出lsass.dmp文件 |
使用Powershell进行hash dump
Nishang的Get-PassHashes.ps1可以导出hash
1 | # 以管理员权限打开powershell,进入Nishang目录 |
使用MSF进行hash dump
1 | hashdump |
三、哈希传递(Pass-the-Hash,PTH)
从Windows Vista和Windows Server 2008版本开始,系统默认禁用LM HASH,因为在使用NTLM HASH进行身份认证时,不会使用明文密码,而是将明文密码通过系统API转化成HASH在进行对比认证,因此攻击者在获得密码哈希时就可以利用哈希传递来通过认证。
利用场景:
适用Windwos Server 2012 R2及之后的版本,因为默认内存不会记录明文密码;
拿到HASH不容易破解明文密码;
域内主机管理员用户名密码统一使用。
使用NTLM HASH进行哈希传递
如果已经获取到目标的用户名及NTLM HASH值,可以管理员身份运行以下命令进行hash传递。
可以用mimikatz进行hash传递
1 | mimikatz "privilege::debug" "sekurlsa::pth" /user:administrator /domain:de1ay.com /ntlm:1d6cfe0d16ae931b73c59d7e0c089c0 |

也可以用msf进行hash传递
1 | use exploit/windows/smb/psexec |
使用ASE-256密钥进行哈希传递
也可以使用mimikatz利用ASE-256密钥进行哈希传递,前提是本地安装了补丁KB2871997(但是如果安装了该补丁,会导致管理员权限无法使用PsExec、WMI、smbexec、schtasks、at,也无法使用远程主机的共享文件)
1 | mimikatz "priviledeg::debug" "sekurlsa::pth" /user:administrator /domain:de1ay.com /aes256:5d37c27c9a06abee82a5aea3cf662834fd4318ad |
另外还有一点需要注意:更新该补丁后,发现无法使用常规的hash传递方法横向移动,但是administrator除外(SID是500),使用该账号仍然可以进行hash传递。
四、票据传递(Pass-the-Ticket,PTT)
Kerberos协议主要用于计算机网络的身份鉴别(Authentication), 其特点是用户只需输入一次身份验证信息就可以凭借此验证获得的票据(ticket-granting ticket)访问多个服务,即SSO(Single Sign On)。由于在每个Client和Service 之间建立了共享密钥,使得该协议具有一定的安全性。Active Directory 域服务是域或林中的默认 Kerberos 实现所必需的。
Kerberos认证流程:

- 使用用户的NTLM哈希和时间戳一起加密,将加密的结果发送到KDC进行身份验证的票据请求 (AS REQ) ;
- 域控(KDC)检查用户信息(登录限制, 组成员等) 并创建票证授权票证(TGT),,将TGT加密、签名并返回给用户(AS REP),只有域中的Kerberos服务(kbrtgt)才能打开和读取TGT数据 ;
- 用户请求票证授权服务票证时(TGS REQ),会将 TGT发送给DC,DC打开TGT并验证PAC校验和,验证通过之后,,复制TGT中的数据用于创建TGS票证;
- 使用目标服务账户的NTLM哈希对TGS进行加密,并将加密结果发送给用户(TGS REP) ;
- 用户连接到服务器托管的服务端口上发送TGS给 服务器(AP REQ),被托管的服务使用服务账户的哈希打开票证;
- 如果客户端需要进行相互间的身份验证就会执行这一步。
伪造TGT-黄金票据;伪造TGS->白银票据。
伪造黄金票据
参考链接:https://mp.weixin.qq.com/s/45pfuc31uQEnZRUPG0_-yw
黄金票据的原理就是用krbtgt的hash来伪造TGT的内容。更改里面的client参数与session key等。让TGS以为我就是那个我所声称的人,一般声称administrator。所谓的黄金票据其实就是kerberos认证的第二个阶段中的tgs的ticket也就是TGT。这个ticket相当于对请求端的一个身份认证的凭据,如果可以伪造这个ticket,那么就可以伪造任意身份,而黄金票据就是一个实现方式。
利用条件:
- krbtgt的hash
- 本地管理员权限
- 域的sid(普通用户的sid除去最后三位就是域的sid)
- 域内任意用户的本地管理员权限
利用方法:
1 | # 清空已有票据 |
伪造白银票据:
参考链接:https://shu1l.github.io/2020/06/06/qian-xi-huang-jin-piao-ju-yu-bai-yin-piao-ju/
- 白银票据是一个有效的票据授予服务(TGS)Kerberos票据,因为Kerberos验证服务运行的每台服务器都对服务主体名称的服务帐户进行加密和签名。
- 黄金票据是伪造TGT并且有效的获得任何Kerberos服务,而白银票据是伪造TGS。这意味着白银票据仅限于特定服务器上的任何服务。
- 大多数服务不验证PAC(通过将PAC校验和发送到域控制器进行PAC验证),因此使用服务帐户密码哈希生成的有效TGS可以完全伪造PAC
- 攻击者需要服务帐户密码哈希值
- TGS是伪造的,所以没有和TGT通信,意味着DC从验证过
- 任何事件日志都在目标服务器上。
利用条件:
- 域名称
- 域的SID值
- 域中的Server服务器账户的NTLM-Hash
- 伪造的用户名,可以是任意用户名
- 目标服务器上面的kerberos服务
可利用的服务列表:
1 | 服务名称 同时需要的服务 |
利用方法:
1 | # 通过mimikatz查看当前域账号administrator的HASH值 |
五、PsExec
PsExec起初被用于大批量Windiows主机的运维,是微软提供的工具,尤其在域环境下的应用,后来被攻击者广泛使用。通过psexec可以在远程目标执行命令并且可以提权到system,其原理是通过IPC管道在远程目标机器创建一个psexec服务,并在本地磁盘中生成一个名为psexesvc的二进制文件,然后通过服务运行命令并在运行结束后删除服务。
使用注意:
- 使用psexec时要保证远程目标开启了admin$共享(net share admin$)
- 在使用ipc$连接后无需在输入账密
- 使用psexec执行命令会创建服务,执行完成被自动删除,会产生大量日志
- 使用psexec可以获取system权限的交互式shell
- 随着应用广泛,越来越多的反病毒厂商开始将其加入黑名单
使用方法:
1 | # 获取system权限的交互shell,前提是获取了一个ipc$管道;-accepteula使用该参数不会弹出确认框、-s获取system权限 |
msf的psexec模块
1 | exploit/windows/smb/psexec |
六、WMI
WMI(Windows Management Instrumentation)由一系列工具组成,可以在本地或者远程管理计算机。随着psexec在内网中被严格监控,攻击者开始逐渐用wmi在内网进行横向移动,使用wmi操作不会产生日志,相对来说隐蔽性更好。(使用过程中发现火绒会告警)
使用方法
1 | # 基本命令:执行远程命令 |
七、SMBexec
smbexec通过文件共享(admin$、C$、IPC$、D$)在远程目标执行命令。
C++版本下载地址:https://github.com/sunorr/smbexec
python版本-impacket工具包的smbexec.py
可以使用impacket的exec版本:https://github.com/maaaaz/impacket-examples-windows

使用方法:
1 | python smbexec.py -h |
Linux跨Windows执行命令
下载链接:https://github.com/brav0hax/smbexec
使用方法:
1 | # 下载安装 |
八、DCOM在远程系统中的使用
DCOM(分布式组件对象)是微软的一系列概念和程序接口。通过DCOM客户端程序对象能够向网络中的另一台计算机上的服务器程序对象发送请求。
使用方法:
获取DCOM程序列表
1 | # powershell3.0以上版本(Windows Server 2012及以上系统) |

使用DCOM执行任意命令
1 | # 利用MMC20.Application接口在本地启动一个管理员权限的powershell |

使用DCOM在远程目标执行命令
目标:192.168.111.80
1 | # 1、建立ipc$ |
九、SPN在域环境中的应用
在域环境中运行的大量应用包含各种资源,为资源合理分组、分类和再分配提供了便利,微软给各种资源分配了不同的服务主题名称(Service Principal Name,SPN)。
SPN扫描
对于域内置帐户默认注册了SPN,非内置帐户需要进行手动注册,并且域环境中的每台服务器都需要在kerberos身份验证中注册SPN,攻击者通过向域控查询请求需要的SPN,便可以知道SPN位置。因此通过SPN扫描就可以获取服务资源所在位置。
根据之前分析过的Kerberos协议,用户账密登录AD,域控对账密进行验证,验证通过后KDC会将服务授权票据(TGT)发给用户,用户使用TGT 访问资源。举个栗子,用户访问MYSQL服务,先向域控查询SYN为MYSQL的记录,找到记录后服务器与KDC进行通信,将KDC发放的TGT作为身份凭据发送给KDC进行验证,KDC解密验证成功后,由TGS将一张允许访问mysql spn的服务票据和对应spn服务地址发给用户,用户便可以访问MYSQL服务。

SPN命令格式
1 | SPN = serviceclass "/" hostname [":"port] ["/" servicename] |
常见SPN服务
1 | # MSSQL服务 |
使用powershell进行SPN扫描
powershell-ad-recon工具包提供了一系列服务与服务登录帐号和运行服务的主机之间的对应关系,这些服务包括但不限于MSSQL、Exchange、RDP、WinRM。
使用方法
1 | # 扫描MSSQL服务 |
使用Windows自带工具列出SPN信息
1 | setspn -T domain -q */* |
Kerberoast攻击
Kerberoast是一种针对Kerberos协议的攻击,通过 爆破TGS-REP 实现,在TGS_REP的过程中用户将会收到由目标服务实例的NTLM hash加密生成的TGS(service ticket),加密算法为RC4-HMAC,如果获得这个TGS,我们可以尝试穷举口令,模拟加密过程,进行破解。
使用示例-破解mssql服务的票据:
请求SPN Kerberos票据
1 | # 在powershell下输入以下命令。请求单个TGS |
导出票据并破解
1 | # 在mimikatz执行命令,将内存中的票据导出,导出的票据会保存在当前目录的kirbi文件中 |