论坛首页 漏洞分析研究区 阅读主题

[强网杯S9]Qcalc

158 浏览 1 回复
#1 楼主 2026-06-01 21:08:55
首先是查看导出的Activity 只有MainActivity导出,但发现有导出的contentProvider
看看是否存在路径穿越

检测了私有目录,这个漏洞点可以直接放弃。
审计MainAcitivy主要是两个处理intent的地方

第一发是把intent存入fallback,第二发是带着fallback进入不导出的BridgeActivity,触发方式在代码中有所体现,通过除0触发异常即可。

记下来就是检查token之后触发之前fallback的Activity,这里还有一个有意思的URI,通过provider提供了私有目录下files里面的history.yml,也就是启动的Activity有读写他的权限,接下来看与History相关的代码

这里发现加载了yaml文件然后又startAcitivy,本来以为是可以通过这个然后构造content://com.qinquang.calc/../flag-xxxxxx.txt给我的poc apk的但是yaml语法不知道怎么回事,好像构造不了无限报错

无奈放弃,后发现后门函数

直接反序列化执行,拼接命令即可。
那么就是触发loadHistory然后反序列化执行PingUtil了
目前梳理调用链就是Save Intent -> Expected -> Save Intetn -> Expected -> RCE
首先写一个计算token的每次intent都有token校验,我们一开始可以直接调试看输出或者自己计算都可以,token错误会输出期望token

测试一下命令执行

首先利用MT管理器直接手动写入一个Yaml,启动之后手动触发loadHistory

执行了,然后才用分号拼接执行其他命令,这里本来打算cat flag之后dns外带出来,但是后来发现这apk没有网络权限,这就很炸裂了。

然而apk权限的shell也无法写入到data/local/tmp
后想起之前可控的history.yml,将flag回写到history.yml再读取出来就可以了
构造出的yml文件如下
"!!com.qinquang.calc.PingUtil "8.8.8.8; FLAG=(cat/data/data/com.qinquang.calc/flag−∗.txt);echo−−nflag:(cat /data/data/com.qinquang.calc/flag-*.txt); echo \\\"---\\\\nflag:(cat/data/data/com.qinquang.calc/flag−∗.txt);echo−¨​−−nflag:FLAG\\n...\" > /data/data/com.qinquang.calc/files/history.yml"";
最后如何发送又成了问题,这里建立一个服务端然后搭一个反代,随便搞一个证书就可以了

这一步是由于一些安全限制,没有整数的域名可能不好传出去,也可以直接不限制,但是忘记怎么写了,懒得调试直接一步到位
接下来就是apk构造了

主体框架大概就是这样
再看看WriteActivity

在看看read的

这就结束了,测试好了直接打包上传就拿到flag了
写wp截图的时候系统好像出bug了,上传了两次没反应第三次上传返回了两个flag奇奇怪怪的(第一次的时候系统正常一个flag)
写wp收flag截图:
代码POC见:efbK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6e0d9r3q4F1k6%4N6W2L8X3c8S2k6r3q4Q4x3V1k6c8j5$3I4S2j5#2m8G2j5H3`.`.from flask import Flask, request

---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-288857.htm
#2 2026-06-01 21:08:55
respect!坐牢坐了一天

请登录后参与讨论

立即登录 注册账号