Bootstrap

华科第一届网络安全挑战赛wp

华科第一届网络安全挑战赛wp

web

secure_shell

考点:exec()无回显

先测试一下能不能执行 cmd=1;sleep 4

发现反应了4秒,能执行

然后直接 cat /f* > 1.txt

最后访问/1.txt路径就行

pyssrf

考点:ssrf漏洞

打开有个提示 /get?site=

直接file读取flag

/get?site=file:///flag

misc

一闪一闪亮晶晶

考点:凯撒与base64结合,starry语言

根据提示,“凯撒大帝想学习一下Starry语言,你能帮帮他么吗”,一定跟凯撒密码和starry语言有关。

下载文件,是一串重复度非常高的字符串

JDBhJDBsJDBhJDBsJDBhJDBhJDBsJDBrJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBhLxprJDBhJDBhJDBsJDBrJDBhJDBsLjBsJDBhMjBhJDBhLzBhJDBhJDBhLzBhLjBhJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhLzprJDthMjBhJDBhLzBhJDBhJDBhDjthJDphJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDtLLjBsJDBhJDBvJDBhJDBsJDBhJDBhJDBsJDBrJDBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhLzphJDBhJDBhJDthJDphJDBhJBphLzphJDBhJDthJDBhJDBhJDthJDphJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphDjBhJDBhJDBsJDBrJDBhJDBsLjBhJDBhLzBhJDBhJDBhLzBhLjBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDBsLjBhJDBhJDBLJDthJDphJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDtrJDBhJDBhJD4hJDBhJDBhMjBsJD4hJDBhJDthJDBhJDBhJDthJDphJDBhJDBsLjphLzBhJDBhJDBvJBphJDBhLzBhJDBhJDBhLzBhLjBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBhLzphJDBhDjBsJDBhJDBhJDBsJDBrJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBsLjBhJDBhJDBhLzBLJDphJDBhJDtrJDBhJDBsJDBhJDBhJDBsJDBrJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDBhJDthJDphJBphJDBhJDtrJDBhMjBhJD4hLzBhJDBhMjBhJDBhLzBhJDBhJDBhLzBhLjBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDtrJDBhDjBhJDBhLzBhLjBhJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDtrJDBhJDBsJDBhJDBhJDBsJDBrJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDtrJDBhJDBhJDBLLzBhLjBhJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDthJDBhJDBhJDthJDphJDBhJDBsLjBhJDBhJDBhLzBhLhphJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJD4hJDBhJD4hLzBhJDBhJDBvJDBhJDBsJDBhJDBhJDBsJDBrDjBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhLzphLzBhJDBhJDBvJDBhJDBsJDBhJDBhJDBLLzBhLjBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBsLhphLzBhJD4hJDBhJDthJDBhJDBhJDthJDphJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBhDjBsLjBsJDBhJDBhJD4hJDBhJDthJDBhJDBhJDthJDphJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhLzphJDBhJDBhJDthJDpLJDBhJDBhJDtrLjBsJDBhJDBvJDBhJDBsJDBhJDBhJDBsJDBrJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBsLjBhJDBhJBphJDthJDphJDBhJDBsLjBsJDBhMjBhJDBhLzBhJDBhJDBhLzBhLjBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBhJDtrJDBhDjBhJDBhLzBhLjBhJDBhJDtrJDBhJDBsJDBhJDBhJDBsJDBrJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDtrJDBhJDBhJDBLLzBhLjBhJDBhLzphJDBhJD4hLzBhJDBhMjBhJDBhLzBhJDBhJDBhLzBhLjBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBsLhphJDBhJDBhJDthJDphJDBhJDtrJDBhJDBsJDBhJDBhJDBsJDBrJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhDjBhJDBsJDBrJDBhJDBsLjBhJDBhLzBhJDBhJDBhLzBhLjBhJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBsLjBhJDBhJDBhLzBLJDphJDBhJDtrJDBhJDBsJDBhJDBhJDBsJDBrJDBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJBphLzphJDBhJDBhMjBhJDBhJDBvJDBhJDBhJD4hLzBhJDBhMjBhJDBhLzBhJDBhJDBhLzBhLjBhJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhLzphJDBhJDBhJDthDjBrJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDBsLjBsJDBhJDBvJDBhJDBsJDBhJDBhJDBsJDBrJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDtrJDBhJDBhJDBLLzBhLjBhJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBsLjBsJDBhJDBhJD4hJDBhJDthJDBhJDBhJDthJDphJDBhJDBsLjBhJBphJDBhJDthJDphJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBsLjBhJDBhLzBhJDBhJDBhLzBhLjBhJDBhJDtrJDBhJDBhJDBsDjBhLjBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhLzphJDBhJDthJDBhJDBhJDthJDphJDBLJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBsLjBhJDBhMjBhJDBhMjBsJDBhMjBhJDBhLxphJDBhJDBhJDthJDphJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhLzphJDBhJDthJDBhDjBhJDBsJDBrJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDthJDBhJDBLJDBsJDBrJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDBsLjBhJDBhLzBhJDBhJDBhLxphJDphJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhLzphMjBvJD4hLzBhJDBhMjBhJDBhDjthJDBhJDBhJDthJDphJDBhJDBsLjBrJDthJDBhJD4hJDBhJDthJDBhJDBhJDthJDphJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhLzphJDBhJDBhJDthJDphJDBLJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhLzphJDBhJDthJDBhJDBhJDthJDphJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhLzphJBphJDBhJDBsJDBrJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDthJDBhJDBhJDthJDphJDBhJDBsLjBhJDBhDjBhJDthJDphJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDthJDBhJDBhJDthJDphJDBhJDBsLjBhJDBhJDBLJDthJDphJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDtrJDBhJDBsJDBhJDBhJDBsJDBrJBphJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBsLjBhJDBhMjBhJDBhMjBhJDBhMjBhJDBhDj4hLzBhJDBhMjBhJDBhLzBhJDBhJDBhLzBhLjBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBLJDBhLzphJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDthJDBhJDBhJDthJDphJDBhJDBhLzphJDBhJDBhJDthJDphJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBhLxprJDBhJDBhJDBsJDBrJDBhJDBsLjBhJDBhLzBhJDBhJDBhLzBhLjBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBsLjBhJDBhJDBhLzBhLjBhJDBhJDBsLjBhJDBhDjBhJDthJDphJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBhLzphMjBvJDthMjBhJDBhLzBhJDBhJDBhLzBhLjBhJDBhJDtrJDBhJDBhJDBsJDBrJDBhJDBsLjBhJDBLJDBhJDthJDphJDBhJDBsLjBsJDBhJDBhJD4=

看到末尾的=,想到base64,所以是凯撒与base64的结合。

先用脚本爆破凯撒,将结果用base64编码

import base64
# 截取文件最前面一部分进行猜测,因为根据后面可知这一部分是近似的四字符反复重复
key = "JDBhJDBsJDBhJDBsJDBhJDBhJDBsJDBrJDBhJDBhLzphJDBhJDBhJDthJDphJDBh"
 
# 遍历凯撒加密中25种的可能性
for n in range(0, 26):
    str_encrypt = ""
    for letter in key:
        if "a" <= letter <= "z":
            str_encrypt += chr((ord(letter) - ord("a") + n) % 26 + ord("a"))
        elif "A" <= letter <= "Z":
            str_encrypt += chr((ord(letter) - ord("A") + n) % 26 + ord("A"))
        else:
            str_encrypt += letter
 
    # 输出每一种可能性最后的结果
    print(base64.decodebytes(str_encrypt.encode()))

结果中发现只有当n=25时,会出现starry语言特有的+,*等符号

于是用脚本将其全部转化成starry语言

import base64
with open("C:\\Users\\Lucky\\Desktop\\华科杯\\misc\\一闪一闪亮晶晶\\flag.txt", "r", encoding="utf-8") as f:    #flag.txt是凯撒密码的文本
    str_encrypt = ""
    n = 25
    for letter in f.read():
        if "a" <= letter <= "z":
            str_encrypt += chr((ord(letter) - ord("a") + n) % 26 + ord("a"))
        elif "A" <= letter <= "Z":
            str_encrypt += chr((ord(letter) - ord("A") + n) % 26 + ord("A"))
        else:
            str_encrypt += letter
    open("C:\\Users\\Lucky\\Desktop\\华科杯\\misc\\一闪一闪亮晶晶\\flag.starry", "wb").write(base64.decodebytes(str_encrypt.encode()))

最后用starry语言转换脚本转换就能得到flag

import sys
fp = open('C:\\Users\\Lucky\\Desktop\\华科杯\\misc\\一闪一闪亮晶晶\\flag.starry')     #flag.starry是保存的starry语言文件
data = fp.read()
fs = open('C:\\Users\\Lucky\\Desktop\\华科杯\\misc\\一闪一闪亮晶晶\\f.txt', 'w')       #f.txt是输出的中间文件
sub = 0
for i in data:
    if i == '\n':
        continue
    elif i == ' ':
        sub += 1
    elif i == '+':
        if sub == 1:
            fs.write('dup\n')
            sub = 0
        elif sub == 2:
            fs.write('swap\n')
            sub = 0
        elif sub == 3:
            fs.write('rotate\n')
            sub = 0
        elif sub == 4:
            fs.write('pop\n')
            sub = 0
        else:
            fs.write('push  ' + str(sub-5) + '\n')
            sub = 0
    elif i == '*':
        if sub == 0:
            fs.write('+\n')
            sub = 0
        elif sub == 1:
            fs.write('-\n')
            sub = 0
        elif sub == 2:
            fs.write('*\n')
            sub = 0
        elif sub == 3:
            fs.write('/\n')
            sub = 0
        elif sub == 4:
            fs.write('%\n')
            sub = 0
        else:
            print('error!!!')
            sub = 0
            sys.exit()
    elif i == '.':
        if sub == 0:
            fs.write('num_out\n')
            sub = 0
        else:
            fs.write('char_out\n')
            sub = 0
    else:
        print('error!!!!')
        sys.exit()
fp.close()
fs.close()
fp = open('C:\\Users\\Lucky\\Desktop\\华科杯\\misc\\一闪一闪亮晶晶\\f.txt', 'r')
data = []
for line in fp:
    line = line.strip('\n')
    if line[:4] == 'push':
        data.append(int(line.split('  ')[1]))
    elif line == '*':
        x = data[-1]
        y = data[-2]
        data = data[:-2]
        data.append(x * y)
    elif line == '+':
        x = data[-1]
        y = data[-2]
        data = data[:-2]
        data.append(x + y)
    elif line == '-':
        x = data[-1]
        y = data[-2]
        data = data[:-2]
        if (x-y)<0:
            data.append(y-x)
        else:
            data.append(x-y)
    elif line == 'dup':
        x = data[-1]
        data.append(x)
    elif line == 'char_out':
        x = data[-1]
        data = data[:-1]
        print(chr(x),end="")
    else:
        print('error!!!')
        sys.exit()

flag{785c45ea-d2a1-4993-8d4f-325323d5bcd9}

;