news 2026/9/23 2:30:04

routersploit 实战:Ubiquiti 路由器 SSH 默认凭据检测模块 ssh_default_creds 全解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
routersploit 实战:Ubiquiti 路由器 SSH 默认凭据检测模块 ssh_default_creds 全解析

routersploit 实战:Ubiquiti 路由器 SSH 默认凭据检测模块 ssh_default_creds 全解析

【免费下载链接】routersploitExploitation Framework for Embedded Devices项目地址: https://gitcode.com/gh_mirrors/ro/routersploit

本指南聚焦 routersploit 框架中的creds/routers/ubiquiti/ssh_default_creds模块——一个针对 Ubiquiti(优倍快)路由器 SSH 服务执行默认凭据字典攻击的专用模块。文章将从模块定位、参数体系、交互式操作、底层实现到测试验证逐层展开,读完即可在授权环境下独立完成对 Ubiquiti 路由器 SSH 默认口令的检测,并理解 routersploit 凭据类模块的通用架构。

模块定位:面向 Ubiquiti 路由器的 SSH 默认口令攻击

ssh_default_creds模块的官方描述为:对 Ubiquiti 路由器 SSH 服务执行默认凭据字典攻击(dictionary attack),一旦命中有效凭据,立即以表格形式展示给用户(见 ssh_default_creds.md)。

从源码结构看,该模块采用"专用子类 + 通用基类"的设计:routersploit/modules/creds/routers/ubiquiti/ssh_default_creds.py中的Exploit类直接继承自通用模块routersploit/modules/creds/generic/ssh_default.pyExploit,只通过__info__元数据和一组默认参数来定制厂商行为:

class Exploit(SSHDefault): __info__ = { "name": "Ubiquiti Router Default SSH Creds", "description": "Module performs dictionary attack against Ubiquiti Router SSH service. " "If valid credentials are found, they are displayed to the user.", "authors": ("Marcin Bury <marcin[at]threat9.com>",), "devices": ("Ubiquiti Router",), } target = OptIP("", "Target IPv4, IPv6 address or file with ip:port (file://)") port = OptPort(22, "Target SSH port") threads = OptInteger(1, "Number of threads") defaults = OptWordlist("admin:admin,root:ubnt,ubnt:ubnt", "User:Pass or file with default credentials (file://)")

同一目录下还存在 ftp_default_creds.py(继承通用 FTP 模块)与telnet_default_creds.py,三者构成 Ubiquiti 路由器的多协议默认凭据检测组合。SSH 变体默认针对端口 22,内置三组业界广为流传的 Ubiquiti 默认口令组合。

核心参数解析:字段类型、默认值与取值范围

模块可配置参数全部继承自基类,通过show options查看。各参数的类型约束由 option.py 中的 Option 子类实现,下面逐项说明。

参数类型默认值说明
targetOptIP目标 IPv4/IPv6 地址,或file://开头的多目标文件路径
portOptPort22目标 SSH 端口,合法范围 1~65535
threadsOptInteger1并发线程数
defaultsOptWordlistadmin:admin,root:ubnt,ubnt:ubnt以逗号分隔的User:Pass列表,或file://词表文件
stop_on_successOptBooltrue首次认证成功后是否立即停止
verbosityOptBooltrue是否逐条打印认证尝试日志

参数类型的行为细节

  • OptIP__set__通过is_ipv4/is_ipv6校验,非法地址会抛出OptionValidationError,拒绝接受非 IP 格式的目标。
  • OptPort:强制int(value)转换,并要求0 < value <= 65535,越界或无法转换均报错(见 option.py 中OptPort.__set__)。
  • OptWordlist__get__在读取时完成解析——若值以file://开头,则打开对应文件、逐行strip()后返回行列表;否则按逗号切分为列表。__set__会校验file://指向的文件必须真实存在,否则报"File '...' does not exist."
  • OptBool:仅接受字符串"true"/"false"赋值,显示值会规范化为小写。

默认凭据词表

defaults的默认值为admin:admin,root:ubnt,ubnt:ubnt,测试文件 test_ssh_default_creds.py 明确断言了该词表:

assert exploit.defaults == ["admin:admin", "root:ubnt", "ubnt:ubnt"]

值得注意的是,Ubiquiti 官方固件历史上广泛使用ubnt:ubnt作为默认管理凭据,root:ubnt则常见于部分型号的底层账户,因此这三组组合是检测该品牌设备 SSH 弱口令的高性价比起点。

交互式实战:从启动到命中凭据的完整操作

模块的完整操作流程记录在 ssh_default_creds.md 中,共五步:

  1. 启动框架:./rsf.py
  2. 加载模块:use creds/routers/ubiquiti/ssh_default_creds
  3. 设置目标:set target [TargetIP]
  4. 执行攻击:run
  5. 若命中有效凭据,结果将展示给用户

完整运行场景示例

以下为该文档提供的真实场景输出(目标为192.168.1.1,SSH 端口 22):

rsf > use creds/routers/ubiquiti/ssh_default_creds rsf (Ubiquiti Router Default SSH Creds) > set target 192.168.1.1 [+] target => 192.168.1.1 rsf (Ubiquiti 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 Authentication Failed),[+]表示认证成功;日志中的12345/123456/Admin等条目说明defaults已被用户自定义扩充(示例演示了run前通过set defaults扩展词表的场景)。命中后框架以对齐表格输出Target / Port / Service / Username / Password五列结果,并打印Elapsed time统计耗时。

自定义词表与批量目标

  • 扩展词表set defaults admin:admin,root:ubnt,ubnt:ubnt,admin:passwordset defaults file:///path/to/creds.txt(每行一个User:Pass)。
  • 批量目标target支持file://协议,文件每行一个ip:port。该能力由exploit.py中的multi装饰器实现:解析时按partition(":")拆分,带端口则覆盖模块默认端口,不带则回退到port选项值,逐行执行攻击(见 exploit.py)。

底层实现原理:攻击链路与并发机制

攻击主流程

run()方法初始化空凭据列表后调用attack(),攻击链路如下(见 generic/ssh_default.py):

  1. 服务探测check()先通过ssh_client.test_connect()验证目标是否暴露 SSH 服务。test_connect()(见 ssh_client.py)以随机 12 位密码尝试连接:若收到paramiko.AuthenticationException,说明 SSH 服务存在且已进入认证阶段,返回True并打印Target exposes SSH service;否则打印Target does not expose SSH并终止攻击。
  2. 词表迭代LockedIterator包装defaults列表,通过threading.Lock保证多线程下每组凭据只被消费一次。
  3. 线程调度run_threads(threads, target_function, data)创建指定数量线程,每个线程命名thread-0thread-1……由threading.Event控制停止信号,结束后打印Elapsed time(见 exploit.py)。
  4. 凭据尝试target_function内对每条User:Pass调用ssh_client.login(username, password);成功后若stop_on_success为真则清除 Event 令其余线程退出,并把(target, port, "ssh", username, password)追加到凭据列表。
  5. 结果汇总:若列表非空,打印Credentials found!并输出表格;否则打印Credentials not found

SSH 客户端实现细节

SSHCli.login()(见 ssh_client.py)基于 paramiko 实现:

  • timeout=SSH_TIMEOUT(8 秒)、banner_timeout=SSH_TIMEOUT,避免无响应目标长时间阻塞;
  • look_for_keys=Falseallow_agent=False,禁用本机私钥与 ssh-agent,确保仅使用字典密码认证;
  • set_missing_host_key_policy(paramiko.AutoAddPolicy())自动接受未知主机密钥;
  • 成功返回TrueAuthenticationException则打印失败日志并关闭连接。

供其他模块复用的静默检查接口

基类还提供@mute修饰的check_default():抑制所有 stdout 输出执行完整攻击,命中则返回凭据列表,否则返回None。该接口供扫描器(如scanners/autopwn.py)内部调用,用于在不打扰用户的情况下批量确认默认凭据。

测试验证:模块行为的自动化保障

tests/creds/routers/ubiquiti/test_ssh_default_creds.py针对该模块断言了关键行为:

exploit = Exploit() assert exploit.target == "" assert exploit.port == 22 assert exploit.threads == 1 assert exploit.defaults == ["admin:admin", "root:ubnt", "ubnt:ubnt"] assert exploit.stop_on_success is True assert exploit.verbosity is True exploit.target = generic_target.host exploit.port = generic_target.port assert exploit.check() is False assert exploit.check_default() is None assert exploit.run() is None

测试通过generic_targetfixture 指向测试专用 SSH 服务器,验证了默认参数值(端口 22、单线程、内置词表、命中即停、详细日志)以及"目标不可达/无 SSH 服务时check()check_default()run()均安全返回"的容错路径——即在未暴露 SSH 的目标上模块不会抛异常,只会静默结束。

使用边界与注意事项

  • 授权前提:默认凭据检测属于安全评估行为,仅应在拥有明确授权的自有设备或测试靶场上执行;routersploit 定位为嵌入式设备渗透测试框架(见 README.md),滥用造成的后果由使用者自行承担。
  • 版本差异:不同 Ubiquiti 固件版本的默认口令策略不同,ubnt:ubnt等在较新固件上可能已强制修改,未命中不代表设备安全,仅代表默认口令集失效。
  • 适用协议族:如需同时检测 FTP(端口 21)与 Telnet,可切换到同目录下的 ftp_default_creds.py 与telnet_default_creds.py对应模块,其内置词表与 SSH 版本一致。

【免费下载链接】routersploitExploitation Framework for Embedded Devices项目地址: https://gitcode.com/gh_mirrors/ro/routersploit

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/23 2:28:17

90分钟自建企业库存管理系统实战指南

1. 为什么你需要一个自建库存管理系统上周帮朋友盘点仓库时&#xff0c;发现他还在用Excel手工记录出入库&#xff0c;结果库存数据与实际货物差了30%。这不是个案——2023年制造业调研显示&#xff0c;43%的中小企业仍在使用纸质或简单电子表格管理库存。手工操作不仅效率低下…

作者头像 李华
网站建设 2026/9/23 2:21:28

Switch联机卡顿排查指南:从NAT、MTU到路由器优化的实战方案

大周末好不容易凑齐四个人&#xff0c;打开 Switch 准备组队上分&#xff0c;结果还没跑完第一圈队友就开始吼&#xff1a;“你拉我干啥”“别站桩了”“怎么又全是红信号”。这种场面我估计每个玩联机游戏的人都经历过。我一开始也以为是任天堂服务器不行&#xff0c;后来花了…

作者头像 李华
网站建设 2026/9/23 2:18:45

企业微信通讯录同步自建指南:增量更新与冲突解决全解析

在企业微信通讯录同步这件事上&#xff0c;我最开始的想法很简单&#xff1a;每天定时拉一次全量通讯录&#xff0c;写入内部系统&#xff0c;完事。结果第一次上线就被现实按在地上摩擦——公司三千多人的通讯录&#xff0c;每天都有入离职、跨部门调动、岗位调整&#xff0c;…

作者头像 李华
网站建设 2026/9/23 2:17:38

GMM与DBSCAN实战:从K-means不足到聚类算法选型与调参

“Lecture 5 GMM DBSCAN”——如果你是按顺序追机器学习课程&#xff0c;这一讲多半排在K-means之后&#xff0c;专门解决硬聚类解决不了的两类问题。我在真实项目里踩过同样的坑&#xff1a;做用户分群时&#xff0c;K-means 跑出来的几个簇看上去轮廓分明&#xff0c;一落到业…

作者头像 李华
网站建设 2026/9/23 2:17:00

Linux权限管理从入门到实战:破解Permission denied的那些事

1. 为什么你总在Linux上撞见Permission denied刚接触Linux的读者&#xff0c;十有八九都经历过这样的场景&#xff1a;照着教程敲命令&#xff0c;前几步还挺顺利&#xff0c;突然屏幕冒出一行冷冰冰的英文——Permission denied。网上搜了一圈&#xff0c;有人让加sudo&#x…

作者头像 李华