RouterSploit 实战:使用 ssh_default_creds 模块对 ZTE 路由器执行默认 SSH 凭据字典攻击
【免费下载链接】routersploitExploitation Framework for Embedded Devices项目地址: https://gitcode.com/gh_mirrors/ro/routersploit
导读
本文围绕 RouterSploit 中的creds/routers/zte/ssh_default_creds模块展开,讲解如何对 ZTE 路由器上暴露的 SSH 服务执行默认凭据字典攻击,并在命中后自动展示有效账号密码。读完本文,你将掌握该模块的加载方式、参数配置、完整攻击流程,以及其底层基于 paramiko 的 SSH 认证与多线程字典攻击的实现原理,可直接在 RouterSploit 交互终端中复现整个操作。
模块功能概述
creds/routers/zte/ssh_default_creds是 RouterSploit 中针对ZTE Router(中兴路由器)的默认凭据审计模块。其核心职责是:
- 对目标 ZTE 路由器的 SSH 服务执行基于默认凭据的字典攻击(dictionary attack);
- 一旦发现有效的用户名与密码组合,立即将其展示给用户;
- 支持多线程并发,加快爆破速度。
模块在源码中注册的设备类型为"ZTE Router",其实现继承自通用 SSH 默认凭据模块 ssh_default.py,并通过 ssh_default_creds.py 注入 ZTE 专属的默认凭据列表。
快速上手:验证步骤(Verification Steps)
原文档给出了完整的操作路径,在 RouterSploit 交互终端中依次执行即可:
- 启动 RouterSploit:
./rsf.py - 加载 ZTE SSH 默认凭据模块:
use creds/routers/zte/ssh_default_creds - 设置目标 IP:
set target [TargetIP] - 执行攻击:
run - 若找到有效凭据,模块会将结果显示在终端中。
其中./rsf.py为仓库根目录下的主入口脚本,负责启动 Python 3 环境并拉起交互解释器(详见 rsf.py)。需要注意的是,RouterSploit 仅支持 Python 3,若在 Python 2 环境中启动会直接提示并退出。
实战场景演示
下面是对目标192.168.1.1执行模块的完整输出,可直接作为操作参照:
rsf > use creds/routers/zte/ssh_default_creds rsf (ZTE Router Default SSH Creds) > set target 192.168.1.1 [+] target => 192.168.1.1 rsf (ZTE Router Default SSH Creds) > run [*] Running module... [*] Target exposes SSH service [*] Starting default credentials attack against SSH service [*] thread-0 thread is starting... [-] SSH Authentication Failed - Username: 'admin' Password: '12345' [-] SSH Authentication Failed - Username: 'admin' Password: '123456' [-] SSH Authentication Failed - Username: 'Admin' Password: '12345' [-] SSH Authentication Failed - Username: 'Admin' Password: '123456' [+] SSH Authentication Successful - Username: 'admin' Password: 'admin' [*] thread-0 thread is terminated. [*] Elapsed time: 2.3932292461395264 seconds [+] Credentials found! Target Port Service Username Password ------ ---- ------- -------- -------- 192.168.1.1 22 ssh admin admin从输出中可以清晰看到整个攻击链路:模块首先探测目标是否暴露 SSH 服务,随后逐条尝试默认凭据,失败记录为SSH Authentication Failed,命中记录为SSH Authentication Successful,最终以表格形式汇总输出Target / Port / Service / Username / Password五列结果,并统计总耗时。
模块源码与核心参数解析
ZTE 专属模块的源码非常精简(ssh_default_creds.py),它通过继承通用 SSH 默认凭据模块,仅重定义元信息与四个关键参数:
| 参数 | 默认值 | 类型 | 说明 |
|---|---|---|---|
target | "" | OptIP | 目标 IPv4 / IPv6 地址,也支持file://指向的ip:port列表文件 |
port | 22 | OptPort | 目标 SSH 端口,默认 22 |
threads | 1 | OptInteger | 并发线程数(ZTE 模块默认 1,通用模块默认 8) |
defaults | admin:admin,ZXDSL:ZXDSL,user:user,on:on,root:Zte521,root:W!n0&oO7. | OptWordlist | 以逗号分隔的用户:密码组合,或file://指向的字典文件 |
其中内置的 6 组 ZTE 默认凭据为:admin:admin、ZXDSL:ZXDSL、user:user、on:on、root:Zte521、root:W!n0&oO7.。这一点也由测试用例 test_ssh_default_creds.py 直接断言验证(assert exploit.defaults == [...])。
参数类型的底层约束
各参数的校验逻辑定义在 option.py 中:
OptIP会校验地址必须是合法的 IPv4 或 IPv6,否则抛出OptionValidationError;OptPort将值转为整数并要求落在0 < value <= 65535区间;OptWordlist支持两种取值方式:直接传入user:pass,user2:pass2字符串(按逗号切分),或传入file:///path/to/wordlist指向的本地字典文件(按行读取并 strip 空白),文件不存在时同样会校验报错。
这意味着你可以通过set defaults file:///home/user/zte_creds.txt的方式,将自定义字典喂给该模块,实现更大规模的默认凭据审计。
底层攻击流程与实现原理
该模块的实际攻击逻辑由父类 ssh_default.py 提供,主要包含三个环节:
1. 服务探测(check)
check()方法调用ssh_client.test_connect(),向目标 SSH 端口发起一次携带随机密码(random_text(12))的连接尝试(见 ssh_client.py 中的test_connect)。若返回paramiko.AuthenticationException,说明端口上确实存在 SSH 服务(认证失败恰恰证明服务在响应),此时输出Target exposes SSH service并返回True;若连接超时或出现其他异常,则判定目标未暴露 SSH,直接终止攻击。
2. 字典迭代与多线程并发
攻击入口attack()使用LockedIterator包装凭据列表,保证多个线程从同一数据源取凭据时不会重复或冲突;随后通过run_threads()启动指定数量的线程并发执行target_function(线程调度实现在 exploit.py 的run_threads与LockedIterator中)。每个线程不断从迭代器中取出user:pass组合,切分后交给 SSH 客户端尝试登录。
3. SSH 认证与结果汇总
认证核心在 ssh_client.py 的login()方法中:基于 paramiko 的SSHClient.connect()完成认证,设置timeout与banner_timeout均为 8 秒,并显式关闭look_for_keys与allow_agent,避免本机密钥干扰纯密码爆破。认证失败打印SSH Authentication Failed,成功则打印SSH Authentication Successful并将结果追加到self.credentials。
攻击结束后,attack()会检查self.credentials:
- 非空:输出
Credentials found!并以Target / Port / Service / Username / Password表格打印全部命中结果; - 为空:输出
Credentials not found。
父类中还提供了两个可调参数:stop_on_success(命中后是否立即停止其余线程,默认True)与verbosity(是否显示每次认证尝试,默认True),均可通过set命令调整。
多目标批量审计
attack()方法带有@multi装饰器(见 exploit.py)。当target被设置为file://开头的文件路径时,模块会自动读取文件中每行ip:port的目标并逐个执行攻击,适合对网段内多台 ZTE 设备做批量默认凭据巡检。
自动化接口与测试验证
除了交互式使用,该模块还面向自动化场景暴露了check_default()接口:它被@mute装饰器静默化,不向 stdout 输出任何内容,仅返回命中的凭据列表或None,便于被上层脚本(如自动扫描工具)复用。
对应的单元测试 test_ssh_default_creds.py 验证了:
- 模块默认参数:
target == ""、port == 22、threads == 1、defaults与内置 6 组凭据一致; stop_on_success is True、verbosity is True;- 针对未运行 SSH 服务的测试目标,
check()返回False、check_default()返回None、run()正常返回且不报错。
这为在 CI 环境或自动化脚本中安全地回归测试该模块提供了参考范例。
使用注意事项
- 该模块属于凭据审计类模块,请仅在已获授权的目标上使用,遵守当地法律法规与测试授权边界;
- 默认凭据列表仅覆盖常见 ZTE 设备出厂配置,若目标已修改口令,可结合
set defaults file://...扩展自定义字典; - ZTE 模块默认
threads = 1,如需加速可set threads 8提升并发,但过高的并发可能触发目标设备的安全防护或影响稳定性; - 若目标 SSH 端口非默认 22,务必通过
set port同步修改,否则check()阶段会直接判定目标未暴露 SSH 而中止攻击。
延伸阅读
- 同系列 ZTE 模块:
creds/routers/zte/telnet_default_creds、creds/routers/zte/ftp_default_creds可覆盖其余管理协议; - 通用模块源码:ssh_default.py;
- SSH 客户端实现:ssh_client.py;
- 参数类型与校验:option.py;
- 线程调度与多目标装饰器:exploit.py。
【免费下载链接】routersploitExploitation Framework for Embedded Devices项目地址: https://gitcode.com/gh_mirrors/ro/routersploit
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考