CISCN#2023
CISCN#2023
第一次参加国赛,纯纯坐牢
web
unzip
复现环境在ctfshow
1 |
|
解释一下就是,文件上传并解压,但是会传到tmp文件夹执行
-o参数会覆盖已存在的文件,覆盖软连接的前提条件(有的解压缩不会覆盖原有的同名文件)
可以先传一个包含软连接的文件,
再传一个同名的带马的文件
会通过软链接覆盖把⻢解压到网站根目录
软连接是linux中一个常用命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接
先linux下命令创建软连接文件并压缩
1 |
|
上传1.zip,会解压里面的shell软连接到tmp下
这时候上传一个包含shell文件夹的压缩包
unzip后会把shell文件解压到tmp目录
而后shell软连接(第一次传的)会把第二次传的shell内的文件软连接到根目录并执行,可以放马拿shell
go_session
1 |
|
三个路由
- Index
- Admin
- Flask
先看Index路由,Index路由内容很简单,直接赋了个session,session中的name值为guest,这里发现session的key是通过SESSION_KEY环境变量获取的
再看Admin路由:
- 这里对session做了验证,需要name为admin
- 这里用pongo2做模板渲染,存在模板渲染漏洞
接着看Flask路由:
- Flask路由会请求靶机里5000端口服务,并把请求页面回显
经过测试,得到以下结论:
- 5000端口为python的flask服务,开启了debug模式,源码不存在ssti漏洞
- session默认key为空,可以直接伪造admin用户
flask源码可以通过让flask报错获取:
1 |
|
本题正确思路如下:
- 由于session默认key为空,伪造admin用户后可以调用Admin路由
- Admin路由中存在pongo2模板注入漏洞,pongo2模板语法可以参考Django模板语法
- 通过Django模板注入覆盖/app/server.py文件,由于python服务是可以“热部署”的,因此覆盖恶意文件后,再通过Flask路由调用即可RCE
再说一下错误思路:
- 错误思路是利用pongo2模板语法读取算PIN所需的文件,计算出PIN后通过Flask路由请求/console实现RCE,但是想在/console中执行命令仅通过GET传参是无法完成验证的,并且后续执行代码请求都需要携带Cookie验证,所以这条路走不通
首先获取一下admin用户的session:
- 把下方代码加到route里,访问即可拿到伪造后的session
1 |
|
admin用户的session如下:
1 |
|
接着构造请求包覆盖/app/server.py:
- 注意name值需要url编码
- c.HandlerName的值为
main/route.Admin
,接着用first过滤器获取到的就是m
字符,用last过滤器获取到的就是n
字符 - 注意GET请求也是可以使用表单上传文件的
1 |
|
完整的HTTP请求
1 |
|
接着访问Flask请求即可getshell
1 |
|
PWN
烧烤摊儿
静态链接和动态链接最直白的区别就是一个代码多一个代码少,因为静态是把所有的代码融合到一个可执行文件里面,而动态链接是将那些可能用不到的函数放到dll或者其他文件里
1,所以第一步发现这个文件很大,有很多东西猜测就是静态链接,静态链接就可以使用ROPgadget构建ropchian
1 |
|
函数调用关系简易,但函数居多,大概就是静态链接的
2.分析题目
(1)主函数里面有5个分支,分别是pijiu,chuan,yue,vip,gaiming,通过分析我们发现前面4个函数里面根本没有溢出点,在gaiming中才有一个read,但这个函数是需要条件才能进入的,就是需要在vip函数中用10000买下烧烤摊,初始只有233元,通过分析pijiu和chuan我们发现了整形溢出漏洞
3.所以整体的思路就是 整形溢出->计算溢出点->获取rop
点进去就能看到溢出的大小,
1 |
|
法二:使用ret2syscall,前面步骤都是一样的,首先就是到溢出点,然后既然是静态链接,就很大概率包含了我们需要的所有rop片段(为了做这个我又学了一遍64位的syscall)
1 |
|
RE
babyre
小学生编程器
https://shimo.im/file-invite/n3tTF5DcSFoQNaHijyyJhd2NOGGN6/
1.首先使用浏览器打开这个文件,发现最上面有一个网站,直接访问,打开那个xml文件
2.首先点击右边的锁(加密函数),然后点击上面的按钮(步入),在这个一串数据上单击,使其步入到这个地方,然后右击数据,选择export,导出他的数据
3.前面是步骤,现在我来简单的描述一下他的加密步骤,
首先经过前面的函数,这几个东西除了secret都有了数据,经过这一串得到secret数据,至于数据的位置,在at后面,可以自己看一下,不重要,经过上面步入操作后,secret就有了数据
4.把数据提出来后,观察JavaScript函数,前面就是说明是异或,后面就是异或前后的数据,是从一个地方提取的,只不过分一个先后,大概就是a[i] ^ a[i-1] ,一直执行,但一开始我以为是一个一个的前后异或就好,但出来的是乱码,后来发现是要把异或后的数据放入a[i]才可以后续异或
1 |
|
MISC
签到卡
提示是print(open(’/etc/passwd’).read())
存在任意文件读取
猜测flag在根目录
print(open(’/flag’).read())
打印出flag
国粹
国粹麻将,但是不会打麻将也可以做
a.png和k.png分别是x和y轴坐标
1 |
|
flag{202305012359}
脚本2:
1 |
|
被加密的生产流量
题目名字是误导
tcp第0流有base32加密密文
MMYWMX3GNEYWOXZRGAYDA===
c1f_fi1g_1000
pyshell
这是一个python的命令窗口
但是限制了输入长度
所以可以通过_+”__”获取一个字符串变量 可以不断拼接绕过7个字符的限制
最长只能7位
eg:
依次输入’__imp’和 _+’ort’ 将字符串 拼接成
依次输入以下命令拿到flag
1 |
|
CRYPTO
Sign_in_passwd
j2rXjx8yjd=YRZWyTIuwRdbyQdbqR3R9iZmsScutj2iqj3/tidj1jd=D
GHI3KLMNJOPQRSTUb%3DcdefghijklmnopWXYZ%2F12%2B406789VaqrstuvwxyzABCDEF5
附件的两段
第二段url decode解码
GHI3KLMNJOPQRSTUb=cdefghijklmnopWXYZ/12+406789VaqrstuvwxyzABCDEF5
当第一段的base64码表
把base的基本的码表为:A–Z,a–z,0–9,+,/ 替换成url解码出来的码表
可信度量
非预期
直接grep搜索一下:
grep -r “flag{“ /
末尾得到搜索到的文件结果,直接cat即可得到Flag。
基于国密SM2算法的密钥密文分发
上传名字,学校拿到 id
上传公钥
然后访问/api/quantum接口获取密文
查看新信息,直接访问/api/search接口 上传 quantumStringServer 的内容即可
babykey1
1 |
|