感谢 08067Sec 的师傅们精心准备的比赛!本次DASCTF我们 SU 取得了 第一名🏆 的好成绩,感谢队里师傅们的辛苦付出!同时我们也在持续招人,欢迎发送个人简介至:suers_xctf@126.com 或者直接联系baozongwi QQ:2405758945。
以下是我们 SU 本次 2025 DASCTF 上半年赛的 部分writeup以及赛后解出的部分题目。

Web
Phpms(赛后)
扫描出git,进行git恢复
| |

发现php基础函数都不存在,只有原生类,现在可以列出目录以及读取一些有权限的文件
| |
发现Redis服务,读取/etc/redis.conf得到Redis密码为admin123,这里可以打CVE-2024-2961,修改exp关键部分
| |
执行命令
| |
没成功,换了一个项目来尝试,https://github.com/kezibei/php-filter-iconv
| |
然后修改exp
| |
成功了,分段写入sh准备和Redis交互
| |
处理压缩,避免长度超过
| |
最后发现maps和libc和动态的,所以和出题人@L1mbo交流,并且要到了exp,自己修改了一下,害的是一把锁啊
| |
泽西岛(赛后)
不出网H2 RCE,利用war包部署,可以直接写入文件
鉴权绕过
| |
重点在这里
| |
配置了静态资源的访问,导致了绕过。直接访问/api/testConnect;.js即可
直接打JDBC RCE就可以,需要一个参数,参考文章
https://www.leavesongs.com/PENETRATION/talk-about-h2database-rce.html
这里直接注释掉,利用$CATALINA_HOME确定tomcat的根目录
构造Payload
| |
Misc
BlueTrace
一开始先用neta梭了一下,发现能得到一张jpg,发现显示不全

猜测是neta提取的有问题,估计是做限制了,故转手搓:
众所周知蓝牙传输的协议一般是obex,所以过滤一下,可以发现这里明显是传了一个jpg的

用tshark导出一下
| |
导出后将数据拉到010,分析一下会发现藏了一个压缩包(可以直接将流量包拿去binwalk就会发现有这么个压缩包了)

全部提取出来,根据010的模板会发现内容是不全的

回到wireshark分析一下,会发现在最后面还漏了一个流量数据,将他单独提取出来拼上后即可修复压缩包

打开后它提示我们密码是蓝牙传输的目标电脑名字

在wireshark的无线中找到蓝牙设备,然后简单遍历一下就知道密码是INFERNITYのPC

解压得到一张奇怪的png图,猜测是lsb隐写,stegsolve分析找到flag

Webshell Plus
根据题意易得webshell流量,那么就看是哪种常见的,简单分析可以发现传了个shell.php

其内容如下,不难看出就是冰蝎,但又不太一样,显然魔改了,一开始会进行检测,当攻击者进行密钥交换时(传入gene_key和public_key),shell的key为一个随机的8字节的字符串转hex后取md5的前16个字符,然后用这个key结合传入的public_key进行openssl加密,最后输出被两个8长度的伪造base64字符串包含的base64字符串
| |
接着分析,发现攻击者确认传了这俩参数,所以key值就不是默认的了,可以看到回显就是被两个8长度的伪造base64字符串包含的base64字符串,现在要做的就是找到RSA的私钥去解出p值和key

用厨子解一下传入的public_key,可以得到RSA的公钥,结合搜到的这篇文章

用这个在线网站https://www.ssleye.com/ssltool/pub_asysi.html 解出n,然后用yafu爆破得到p和q,接着按照文章操作得出私钥文件即可

然后搓个脚本解出p和key
| |
得到key就可以对流量解密了
用在线网站 http://tools.bugscaner.com/cryptoaes/ 解密,然后base64解一下msg,最后爆破shadow的hash即可得到密码



md5之后就是flag
Pwn
mini
Only read 挑战,给了 pop rax 但是我没有用到,
参考这个文章的3 个 gadget https://github.com/imLZH1/2025-CTF-writep/tree/main/2025-smileyCTF#pwnbabyrop
| |
NSUSServer
格式化字符串泄露地址, 然后 直接栈溢出
a.so 可以直接访问远程环境下载

访问一个不存在的文件时,会调用这个函数 存在格式化字符串漏洞

| |
Crypto
Excessive Security
ecdsa复用了随机数k1、k2和私钥x1、x2,四个式子整理一下就是两变量x1、x2和两个方程,可以用矩阵解。剩下打Franklin-Reiter攻击,系数大了点用HGCD即可。
| |
| |
Strange RSA
首先发现u,v较小,导致hint函数里面的d1,d2是小私钥,用boneh脚本可以解出d1,d2进一步解出u,v
| |
观察e的生成,有等式
$$\frac{eu}{v} = \frac{w}{v} + A$$
$$e \cdot u = w + A \cdot v$$
其中e,u,v已知,A为2048bits,w为538bits
进一步变形
$$\text A = N^4 - s^4 + 4Ns^2 - 2N^2 + 1, ; s = p + q$$
考虑近似求出s,然后factor N,实际发现求出的s+1等于p+q
| |
Reverse
xuans
| |
从上面的轮加密很容易看出来对于flag的加密逻辑是SM4,前面对SM4的key进行了一系列的操作,如下
| |
写个脚本提出来shellcode
| |
ida反汇编得到
| |
很明显的循环异或逻辑,从最后一位一直向前异或,写个脚本模拟一下得到真正的key
| |
解完得到39 63 61 66 61 36 34 36 36 61 30 32 38 62 66 62
然后赛博厨子解得假flag

然后卡住了挺长时间的,猜想通过ptrace改了密文,翻阅函数看到了方程组
| |
z3脚本如下
| |
得到:1d7fea8e9b8991f350e69118d732b3fc49c12679a87162f6a1d42dc5e43b5956

猜测是真正的密文,尝试解密

解得flag,flag为:DASCTF{9d78b5507187421a48de8f6ef24a8d4b}
鱼音乐
exe很明显pyinstaller打包的,解包找到main.pyc和xianyu_decrypt.cp38-win_amd64.pyd,pylingual反编译pyc可知是python3.8
核心代码如下
| |
把pyd拿过来和main、xianyu后缀文件放同一目录动态调试即可得到flag

flag是DASCTF{fl5h_mus1c_miao_m1a0_mlaO}
更适合CTF宝宝体质的app
java层是假的flag(tea加密)
so层分析后发现还是arm好读,里面有几个函数开头有花指令

分析可以发现在跳转BR X8后的代码反汇编失败,分析X8值,首先是X8=(1^0xAB^0xC7)-0x6C=1,然后X8=X9+X12*X8=0x4028+0x14=0x403C,所以实际上实现了一个计算跳转地址,中间所有的都是花指令,直接IDA nop即可
去花后可以反编译,根据JNI_OnLoad找到Check函数如下
| |
分析可知s1是密文,sub_3FD0是白盒AES(很大的查表操作),sub_37F0是带有crc的异或加密
首先分析crc加密,使用了dword_65FB8来查表计算,交叉引用发现在Java_com_example_test_MainActivity_Get进行了初始化,可以直接模拟逻辑生成。
| |
然后是白盒AES,需要提取密钥,关注到sub_3FD0中的unk_6FA4大小是163840,正好是41016256,unk_2EFA4大小是4096,正好是16256,结合aes白盒板子要得到tyibox和tbox,idc提取数据填入即可
| |
得到故障数据,用phoneixAES生成轮密钥
| |
sus求解第一轮密钥:

44306E5175317830746535616E636830——D0nQu1x0te5anch0

得到flag为DASCTF{FALLEN_FLOWERS_FADE_NONE_CARES}