首页
社区
课程
招聘
[原创]SUCTF2026 Ez_Router
发表于: 7小时前 162

[原创]SUCTF2026 Ez_Router

7小时前
162

本来想整个大的, 但无奈水平有限只能尽力做到这个程度 QwQ

设计了一个以IPC为主的后端模式, 需要攻击者将cgi与mainproc中的功能通过猜测联系在一起

通过抓包登录的报文, 我们可以发现如果先是随便输入一对账密

会抓到一个发向http的包

可以看到有一个参数auth=0

此时如果放行报文就会登录失败, 但是将auth的值改成1就可以登录成功

首先可以来到固件与备份, 将这个项目下载得到二进制文件

首先可以分析得到请求的传输流程html -> /cgi-bin/*.cgi

对http进行分析, 可以发现这个文件:

接下来我们可以结合html页面和cgi综合分析每个业务逻辑的链路

图片描述

除了重启按钮以外, 几乎每一个接口都有对应的cgi

我们用IDA打开可以发现, 每一个cgi的结尾几乎都有一个函数CFG_SET

而且没有对这些报文的具体处理, 这就涉及到一个在iot中重要的概念 : IPC(进程间通信)

以下给出源码, 位于libutils.so

可以看到SET函数用于将数据流投入内核中的消息队列

对应的, GET函数负责将内容从消息队列中取出放入当前进程的内存中

综合以上结论我们可以得出 : 整个环境中必然存在一个实现GET功能的进程

我们可以从两个方向找到这个文件

图片描述

可以发现一个奇怪的二进制文件mainproc,大概可以猜到这就是负责GET的文件

或者直接从docker启动脚本中发现

起docker的时候顺手将mainproc拉起放置在后台

现在就该重点分析mainproc了

首先可以发现这个文件中的init_array存在一个函数指针

获取了堆的基地址, 并为其添加了x(可执行权限)<本意是想模拟iot固件中总是不开NX保护导致堆可执行, 但感觉有点刻意了:_( >

在main函数可以发现在不停监听消息队列, 只要消息队列中有内容便投入dispatch_action

接着在dispatch_action函数中可以发现一个巨大的switch-case结构(IDA的反编译会变成if-else结构)

根据不同的魔数, 调用不同功能的函数, 从cgi中提取不同的功能可以整理出接口与处理函数的对应关系(其实从名字就能看出来)

接下来应该梳理不同结构体, 结构体从IDA静态分析不是很容易, 推荐通过gdb调试描绘结构体轮廓

**黑白名单 : **

**wifi设置 : **

这两种结构体只会在堆上创建两种不同大小的堆块, 没有具体的作用

**vpn : **

在vpn.cgi中

在mainproc中

可以发现vpn结构体在两个进程中的结构差异很大, 且在mainproc中存在函数和内存两种指针

不同的处理函数的逻辑很简单, 包括vpn也是, 从cgi结构体中将同名成员复制到mainproc结构体中

但是注意, 这里使用了不安全的strcpy且没有做保护

我们知道这些成员都是从json中取出来的, 一般的json都会在字段的结构加上'\0'

但如果我们前往.so审计

发现当字段的预定长度被充满后, 就不会在末尾加上null戳

结合strcpy我们就可以实现off-by-null

从结构体结构上看, 最有溢出价值的字段就是certpass字段, 可以修改两种指针的末尾

但是在IDA中审计发现, 如果把default_vpn_apply的末尾改成null, 会跳转到一个导致进程段错误的地址

所以可以利用的字段只剩下了pass字段, 可以修改custom字段的末尾, 而且custom指向的是堆地址

我们可以用堆风水的手段, 让custom能指向一个能够修改函数指针的地址


[培训]Windows内核深度攻防:从Hook技术到Rootkit实战!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 3106
活跃值: (11075)
能力值: (RANK:438 )
在线值:
发帖
回帖
粉丝
2
麻烦图片传看雪平台,尽量不要用外部链接,容易失效。谢谢!
3小时前
0
游客
登录 | 注册 方可回帖
返回