Zyxel Telnet 漏洞分析(CVE-2025-0890、CVE‑2024‑40891)

1.前言

参考资料

这是2025年开年分析的第一个洞。2月4日 Zyxel 发布安全公告,旗下部分旧款 DSL 客户终端设备(CPE)存在严重的安全漏洞[1],包括 默认凭证不安全问题 和 命令注入漏洞 ,攻击者可通过默认凭证登录 Telnet 并利用此漏洞在受影响的设备上执行任意命令。

2.产品介绍

参考资料

Zyxel DSL CPE 是 Zyxel 公司生产的一种网络设备,用于通过电话线(DSL 技术)连接互联网。它集成了调制解调器和路由器功能,可将电话线的宽带信号转换为网络信号,供用户上网、使用 Wi-Fi 或打电话。这类设备广泛应用于家庭和小型企业,适合通过 DSL 或 VDSL 技术接入互联网的场景。

简单来说,这是一种用电话线上网的设备,既能提供网络,又能支持无线连接和语音通话。

3.漏洞分析

参考资料

固件下载地址[2]

安全公告里提到的受影响型号包括:

VMG1312-B10A、VMG1312-B10B、VMG1312-B10E、VMG3312-B10A、VMG3313-B10A、VMG3926-B10B、VMG4325-B10A、VMG4380-B10A、VMG8324-B10A、VMG8924-B10A、SBG3300、SBG3500  

CVE-2025-0890 涉及以上设备存在默认凭证,攻击者可能利用这些弱凭据直接登录设备管理界面。CVE-2024-40891 是一个需要认证的命令注入漏洞,攻击者可以通过 Telnet 在受影响设备上执行操作系统命令。两个漏洞的结合使得攻击者可以先通过 CVE-2025-0890 使用默认凭证登录设备,然后利用 CVE-2024-40891 实现任意命令注入,最终完全控制目标设备。

3.1 CVE-2025-0890

CVE-2025-0890 漏洞描述

漏洞描述:Telnet 功能存在默认凭证不安全的问题。如果管理员没有更改默认凭证,攻击者可能会利用这些默认凭证登录管理界面。需要注意的是,默认情况下已禁用 WAN 访问和 Telnet 功能。

首先,分析 CVE-2025-0890 寻找默认凭证。

默认凭证保存在 /etc/default.cfg 文件中,我们来分析一下这个文件。

/etc/default.cfg

default.cfg 包含了两个用户 admin 和 zyuser 以及权限范围。其中 admin zyuser 两者均拥有 remoteMGMT 远程管理功能,可以通过 Telnet 登录设备。

这里遇到一个问题,我下载的固件是 VMG1312-B10A_1.00,其中 Password 是经过加密并 base64 编码的。通过 base64 解码后的结果是乱码,说明还需要进行解密。于是我通过搜索关键字 grep -rni "etc/defaulf.cfg" ,试图找到处理 default.cfg 的方式。

grep -rni “etc/defaulf.cfg”

以上三个二进制文件对 etc/defaulf.cfg 进行操作,但是我并没有找到有关解密的相关逻辑。于是我尝试转变思路,换个固件试试,于是在 VMG4325-B10A_1.00 中找到仅仅被 base64 编码,并没有加密的账户密码。

/etc/default.cfg

default.cfg 包含了三个用户 supervisor admin 和 zyuser 以及权限范围。其中 supervisor admin zyuser 均拥有 remoteMGMT 远程管理功能,可以通过 Telnet 登录设备。

supervisor:zyad1234  
admin:1234  
zyuser:1234  

3.2 CVE-2024-40891

CVE-2024-40891 漏洞描述

漏洞描述:存在身份验证后命令注入漏洞。该漏洞可能允许经过身份验证的攻击者通过 Telnet 在受影响的设备上执行操作系统命令。需要注意的是,默认情况下已禁用 WAN 访问和 Telnet 功能。

当成功登录 Telnet 后,我们接下来分析 CVE-2024-40891 如何触发命令注入漏洞,

先分析入口 telnetd 。

telnetd main函数

main 通过 cmsDal_getNetworkAccessMode 检查客户端的网络访问权限, sub_4016C4 判断是否创建 Telnet 会话。

分析 cmsDal_getNetworkAccessMode,函数被定义在 lib/private/libcms_dal.so

libcms_dal.so cmsDal_getNetworkAccessMode函数

这段代码的功能是判断客户端 IP 地址是通过 lan 侧访问还是 wan 侧访问,并返回访问网络访问模式。漏洞情报说明默认情况下禁止 wan 访问,所以漏洞利用前提是设备允许 wan 访问。

接着回到 telnetd 的 sub_4016C4 分析后续操作。

telnet sub_4016C4函数

sub_4016C4 的功能是为新的 Telnet 会话分配资源并创建子进程来处理客户端连接。会通过 cmsCli_authen 进行客户端身份认证。

通过验证后 cmsCli_run 函数会启动一个命令行交互环境,该函数被定义在 lib/libcms_cli.so

libcmd_cli.so cmsCli_run函数

cmsCli_run 会启动命令行交互环境后,通过不断调用 sub_69F0 处理用户的输入和命令执行。

libcmd_cli.so sub_69F0函数

sub_69F0 通过 cmdedit_read_input 获取用户输入,再通过 cli_processCliCmd 和 cli_processHiddenCmd 分别处理常规命令和隐藏命令。cli_processHiddenCmd 可能需要管理员权限才能调用,我们先看 cli_processCliCmd

libcms_cli.so cli_processCliCmd函数

首先提取命令名称,当遇到空格、管道符、分号或者逻辑运算符是认为命令名称结束。接着获取用户权限,supervisorNameGet 判断是否为超级用户,如果不是超级用户则遍历配置查看当前用户权限。命令存储在 off_892BC 中,遍历匹配命令。

执行命令的逻辑为,如果命令有对应的处理函数 off_892BC[6 * i + 3] ,调用处理函数执行命令。如果没有处理函数,但包含分隔符(如 | 或 ;),则会调用 prctl_runCommandInShellWithTimeout 在 Shell 中运行命令。这个地方就是触发命令注入漏洞的关键了,所以我们现在要做的就是判断 check_cmd_with_split 和寻找没有处理函数的命令。

libcms_cli.so check_cmd_with_split函数

check_cmd_with_split 首先调用 strtok_r 按照分隔符 |; 和 & 将命令字符串分割成多个子命令。再通过 is_cmd_allowed 检查是否运行被执行。

livcms_cli.so is_cmd_allowed函数

is_cmd_allowed 会先判断是否为特殊命令 sh ,如果是 sh 进一步判断是否为超级用户(这个地方应该是给超级用户留的后门)。

接着会再次判断权限,然后遍历另一个命令表 off_8A3E0 检查当前子命令是否在其中。

off_8A3E0 命令表

结果发现,命令表 off_8A3E0 中包含隐藏命令 sh

那么下一步只要在 off_892BC 找到没有处理函数的命令,即可触发命令注入。

off_892BC 命令表

命令表 off_892Bc 中,类似 help logout 会直接调用对应的处理函数(如 sub_F31Csub_E9B8 ),但是 ping ifconfig ps 等没有处理函数,因此会调用 prctl_runCommandInShellWithTimeout 执行命令。

prctl_runCommandInShellWithTimeout 被定义在 libcms_util.so

libcms_cli.so prctl_runCommandInShellWithTimeout函数

prctl_runCommandInShellWithTimeout 再调用 sub_116E0 执行命令。

libcms_cli.so sub_116E0函数

sub_116E0 通过 fork 和 execv 在子进程中执行用户提供的命令。

最后,我们构造了一个 poc

ifconfig || sh

4.环境问题

参考资料

分析过程中,我们使用 QEMU 模拟环境,telnet 服务有问题导致一直是未授权访问,具体情况如下。

先找到相关文件 telnetd

find . -name “telnet

/usr/sbin/telnetd 能成功启动 Telnet 服务,但是存在认证问题导致未授权访问且没有权限。

/strace /usr/sbin/telnetd -l /bin/login -F

strace 看了一下存在子进程无法打开 /dev/pts/0 和配置文件缺失问题(无法启动 IPv6 支持)。

后续,我们尝试运行 /bin/telnetd ,同样存在内核无法启动 IPv6 问题,因为整体不影响漏洞分析,所以我们没有进一步深入研究。

学习网络安全技术的方法无非三种:

第一种是报网络安全专业,现在叫网络空间安全专业,主要专业课程:程序设计、计算机组成原理原理、数据结构、操作系统原理、数据库系统、 计算机网络、人工智能、自然语言处理、社会计算、网络安全法律法规、网络安全、内容安全、数字取证、机器学习,多媒体技术,信息检索、舆情分析等。

第二种是自学,就是在网上找资源、找教程,或者是想办法认识一-些大佬,抱紧大腿,不过这种方法很耗时间,而且学习没有规划,可能很长一段时间感觉自己没有进步,容易劝退。

第三种就是去找培训。

image.png

接下来,我会教你零基础入门快速入门上手网络安全。

网络安全入门到底是先学编程还是先学计算机基础?这是一个争议比较大的问题,有的人会建议先学编程,而有的人会建议先学计算机基础,其实这都是要学的。而且这些对学习网络安全来说非常重要。但是对于完全零基础的人来说又或者急于转行的人来说,学习编程或者计算机基础对他们来说都有一定的难度,并且花费时间太长。

第一阶段:基础准备 4周~6周

这个阶段是所有准备进入安全行业必学的部分,俗话说:基础不劳,地动山摇
image.png

第二阶段:web渗透

学习基础 时间:1周 ~ 2周:

① 了解基本概念:(SQL注入、XSS、上传、CSRF、一句话木马、等)为之后的WEB渗透测试打下基础。
② 查看一些论坛的一些Web渗透,学一学案例的思路,每一个站点都不一样,所以思路是主要的。
③ 学会提问的艺术,如果遇到不懂得要善于提问。
image.png

配置渗透环境 时间:3周 ~ 4周:

① 了解渗透测试常用的工具,例如(AWVS、SQLMAP、NMAP、BURP、中国菜刀等)。
② 下载这些工具无后门版本并且安装到计算机上。
③ 了解这些工具的使用场景,懂得基本的使用,推荐在Google上查找。

渗透实战操作 时间:约6周:

① 在网上搜索渗透实战案例,深入了解SQL注入、文件上传、解析漏洞等在实战中的使用。
② 自己搭建漏洞环境测试,推荐DWVA,SQLi-labs,Upload-labs,bWAPP。
③ 懂得渗透测试的阶段,每一个阶段需要做那些动作:例如PTES渗透测试执行标准。
④ 深入研究手工SQL注入,寻找绕过waf的方法,制作自己的脚本。
⑤ 研究文件上传的原理,如何进行截断、双重后缀欺骗(IIS、PHP)、解析漏洞利用(IIS、Nignix、Apache)等,参照:上传攻击框架。
⑥ 了解XSS形成原理和种类,在DWVA中进行实践,使用一个含有XSS漏洞的cms,安装安全狗等进行测试。
⑦ 了解一句话木马,并尝试编写过狗一句话。
⑧ 研究在Windows和Linux下的提升权限,Google关键词:提权
image.png
以上就是入门阶段

第三阶段:进阶

已经入门并且找到工作之后又该怎么进阶?详情看下图
image.png

给新手小白的入门建议:
新手入门学习最好还是从视频入手进行学习,视频的浅显易懂相比起晦涩的文字而言更容易吸收,这里我给大家准备了一套网络安全从入门到精通的视频学习资料包免费领取哦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值