1. 项目概述:为什么SSH弱口令依然是“低垂的果实”?
在网络安全领域,SSH(Secure Shell)协议是远程管理服务器、传输文件最核心、最广泛使用的加密通道。它设计之初就是为了替代不安全的Telnet和FTP,其安全性建立在强加密算法和密钥交换机制之上。然而,一个再坚固的城堡,如果守门人(口令)过于简单,那么攻破它可能只需要一把“万能钥匙”——也就是我们常说的弱口令字典。这就是为什么“SSH弱口令爆破”在渗透测试和红队评估中,始终是一个绕不开的、高优先级的基础攻击面。它不涉及复杂的漏洞利用,不依赖0day,纯粹是“人”的疏忽——管理员使用了默认口令、简单数字序列、常见单词组合,或是公司名+年份这类极易猜测的密码。
我见过太多案例,一个配置了复杂防火墙规则、打了所有系统补丁的服务器,仅仅因为root账户的密码是“admin@123”或“Password2023!”,就被轻易拿下,导致整个内网沦陷。对于攻击者而言,这就像在战场上发现了一个没有上锁的弹药库,成本极低,收益极高。因此,作为防御方,理解攻击者如何利用Metasploit这样的自动化框架进行SSH弱口令爆破,是构建有效防御策略的第一步。这不仅能帮助我们检查自身资产的安全性,更能深刻理解自动化攻击的流程,从而在日志监控、告警规则设置上做到有的放矢。
今天,我们就来深入拆解如何使用Metasploit Framework,在5分钟内完成一次针对SSH服务的自动化弱口令检测。我会附上经过实战筛选和优化的字典配置思路,而不仅仅是扔给你一个文件。毕竟,好的工具重要,但用好工具的思路更重要。
2. 核心工具与原理:Metasploit的SSH登录扫描模块
2.1 Metasploit Framework:不只是漏洞利用
很多人一提到Metasploit,第一反应就是“漏洞利用工具”。这没错,但它更是一个功能极其强大的渗透测试平台。其auxiliary/scanner/ssh/目录下,集成了多种针对SSH服务的辅助模块,包括版本探测、用户枚举以及我们今天重点使用的登录扫描(Login Scanner)。
auxiliary/scanner/ssh/ssh_login模块就是专门为SSH弱口令爆破而生的。它的工作原理非常直接:
- 连接建立:模块尝试与目标IP地址的22端口(默认SSH端口)建立TCP连接。
- 协议交互:完成SSH协议版本协商和密钥交换。
- 认证尝试:使用我们提供的用户名和密码组合,逐一尝试进行身份验证。
- 结果判定:根据服务器的响应(接受或拒绝)来判断尝试是否成功。
这个过程完全模拟了一个正常的SSH客户端登录行为,因此在网络层面,它产生的流量与普通管理登录无异,隐蔽性相对较高。但会在目标系统的认证日志(如/var/log/auth.log或/var/log/secure)中留下大量失败的登录记录,这是防御方需要重点监控的。
2.2 模块核心参数深度解析
启动模块后,使用show options命令,你会看到一系列参数。理解每个参数的含义和配置逻辑,是高效利用该模块的关键。
msf6 auxiliary(scanner/ssh/ssh_login) > show options Module options (auxiliary/scanner/ssh/ssh_login): Name Current Setting Required Description ---- --------------- -------- ----------- BLANK_PASSWORDS false no Try blank passwords for all users BRUTEFORCE_SPEED 5 yes How fast to bruteforce, from 0 to 5 DB_ALL_CREDS false no Try each user/password couple stored in the current database DB_ALL_PASS false no Add all passwords in the current database to the list DB_ALL_USERS false no Add all users in the current database to the list PASSWORD no A specific password to authenticate with PASS_FILE no File containing passwords, one per line RHOSTS yes The target host(s), range CIDR identifier, or hosts file with syntax 'file:<path>' RPORT 22 yes The target port (TCP) STOP_ON_SUCCESS false yes Stop guessing when a credential works for a host THREADS 1 yes The number of concurrent threads (max one per host) USERNAME no A specific username to authenticate with USERPASS_FILE no File containing users and passwords separated by space, one pair per line USER_AS_PASS false no Try the username as the password for all users USER_FILE no File containing usernames, one per line VERBOSE true yes Whether to print output for all attempts我们来拆解几个最核心的参数:
RHOSTS:这是目标地址。它支持多种格式:- 单个IP:
192.168.1.100 - IP范围:
192.168.1.1-192.168.1.254 - CIDR网段:
192.168.1.0/24 - 文件导入:
file:/path/to/targets.txt(文件内每行一个IP或主机名) - 实操心得:对于内网扫描,我习惯先使用
nmap -sS -p 22 --open 192.168.1.0/24 -oG ssh_hosts.txt快速找出所有开放22端口的机器,然后将结果文件处理成纯IP列表,再用file:方式导入。这样比直接扫整个网段更精准、更高效。
- 单个IP:
USERNAME与USER_FILE,PASSWORD与PASS_FILE:这两组参数定义了爆破的“用户名”和“密码”来源。USERNAME和PASSWORD用于指定单个值进行测试。USER_FILE和PASS_FILE用于指定字典文件,模块会进行笛卡尔积组合尝试(即用户字典中的每个用户,尝试密码字典中的每个密码)。- 注意事项:
USERPASS_FILE参数是另一个选择,它要求文件格式为username password(每行一对,用空格分隔)。这种方式适用于你已经掌握了一些特定的用户名-密码对应关系,或者想测试一些固定组合,避免全量组合带来的巨大时间开销。
THREADS:并发线程数。这是影响扫描速度的最关键参数之一。默认是1,即单线程顺序尝试。你可以根据目标网络的性能和自身带宽适当提高,例如设置为10或20。但务必注意:过高的线程数会产生大量并发连接,可能触发目标的防火墙或IPS/IDS的“暴力破解防护”规则,导致IP被临时封锁,也可能会对目标服务器造成拒绝服务(DoS)影响。在授权测试中,建议从较低线程数(如5)开始,根据响应情况调整。STOP_ON_SUCCESS:这个参数非常实用。设置为true时,一旦某个用户在某台主机上成功登录,模块就会停止对该主机的后续尝试,直接转向下一个目标。这能极大节省时间,尤其是在你只想知道“有没有弱口令”而非“所有弱口令”时。BRUTEFORCE_SPEED:暴力破解速度,范围0-5。这个参数控制尝试之间的延迟。0最慢(延迟最长),5最快(无延迟)。它和THREADS共同作用。在需要规避检测或对老旧设备进行测试时,可以调低此值。VERBOSE:设置为true时,会输出所有尝试记录(成功和失败)。在调试或需要完整日志时开启。如果只关心成功结果,可以设为false,界面会更清爽。
3. 实战演练:5分钟快速部署与执行
下面,我们进入实战环节。假设我们的测试环境是Kali Linux,目标是一个内网IP192.168.1.105。
3.1 步骤一:启动Metasploit并加载模块
首先,打开终端,启动Metasploit控制台。
msfconsole等待初始化完成后,搜索并加载SSH登录模块。
search ssh_login use auxiliary/scanner/ssh/ssh_login3.2 步骤二:配置目标与基础参数
现在,我们来设置最基本的目标和线程参数。
set RHOSTS 192.168.1.105 set THREADS 5 set STOP_ON_SUCCESS true set VERBOSE false- 解释:我们针对单个目标
192.168.1.105,使用5个并发线程,一旦成功就停止,并且不显示冗长的失败信息。
3.3 步骤三:准备与配置字典文件
这是整个环节的灵魂。一个糟糕的字典会让你事倍功半,一个精良的字典则能直击要害。我们不直接提供字典文件,而是教你如何构建和选择。
1. 用户名字典 (user.txt):对于SSH服务,常见的用户名包括:
- 系统默认用户:
root,admin,ubuntu,centos,debian,test,user,guest,oracle,postgres,nginx,www-data等。 - 公司相关:公司名缩写、产品名、部门名称(如
dev,ops)。 - 个人信息:管理员姓名拼音或缩写。
你可以创建一个简单的用户名字典文件:
root admin ubuntu test user nginx2. 密码字典 (pass.txt):密码字典的构建更有讲究。一个高效的字典应该是“分层”的:
- 第一层:极简通用弱口令。用于快速试探。
123456 password 12345678 qwerty 123456789 12345 1234 111111 1234567 dragon - 第二层:与用户名相关的密码。利用
USER_AS_PASS参数,或者手动组合。 - 第三层:常见默认口令。如
admin@123,P@ssw0rd,Welcome123,Changeme123。 - 第四层:基于规则的密码。使用工具如
crunch或hashcat的--stdout模式生成。例如,生成所有6位数字密码:crunch 6 6 0123456789 -o num_6.txt。或者生成“公司名+年份”的变体。 - 第五层:大型通用字典。如
rockyou.txt(Kali自带),但通常体积庞大,仅作为最后的手段。
实操心得:字典的“热身”策略我通常不会一上来就用几十MB的大字典。我的策略是:
- 先用一个包含20-50个最常用弱口令的微型字典,配合
root,admin等3-5个常见用户名进行“热身扫描”。这一步通常在几秒到一分钟内完成,却能命中大量“裸奔”的服务器。 - 如果热身失败,再根据目标属性(如公司行业、使用的CMS、设备品牌)加载更具针对性的中型字典。
- 大型通用字典通常只在时间充裕的深度测试中使用。
现在,假设我们准备好了user.txt和pass.txt,将它们放在/home/kali/wordlists/目录下。在Metasploit中配置:
set USER_FILE /home/kali/wordlists/user.txt set PASS_FILE /home/kali/wordlists/pass.txt3.4 步骤四:执行扫描与结果分析
配置完成后,可以先使用show options确认一遍所有参数。然后,运行扫描。
run # 或者 exploit如果一切顺利,你可能会看到类似下面的成功输出:
[+] 192.168.1.105:22 - Success: 'root:admin123' 'uid=0(root) gid=0(root) groups=0(root) Linux target-host 5.4.0-xx-generic #xx-Ubuntu SMP ...'这行信息就是“金子”!它告诉我们:
- 目标:
192.168.1.105:22 - 成功凭证:用户名
root,密码admin123 - 验证信息:它甚至执行了
id命令并返回了结果,确认了我们获取的是root权限的shell。
重要提示:成功登录后,Metasploit会自动在后台为该会话创建一个“SSH Session”。你可以使用sessions -l命令查看所有活跃的会话,并使用sessions -i <会话ID>来交互式地进入这个shell,就像你直接用ssh客户端连接上去一样。这是进行后续横向移动或信息收集的起点。
4. 高级技巧与字典优化配置
4.1 利用Metasploit数据库进行智能爆破
Metasploit内置的数据库(PostgreSQL)不仅仅用来存储扫描结果,更能为后续攻击提供智能化的数据支持。在启动msfconsole前,需要确保数据库服务已启动并连接。
# Kali中启动服务并初始化(通常只需一次) sudo systemctl start postgresql sudo msfdb init # 启动msfconsole并自动连接数据库 msfconsole -q在数据库支持下,你可以使用以下高级功能:
db_nmap:使用db_nmap代替普通nmap进行扫描,所有结果(开放端口、服务、主机信息)会自动存入数据库。creds命令:管理(添加、查看、导出)成功获取的凭证。- 模块参数联动:前面提到的
DB_ALL_CREDS,DB_ALL_PASS,DB_ALL_USERS参数,可以直接调用数据库中已存储的凭证、密码或用户名来作为本次爆破的字典源。这在针对一个大型内网进行测试时非常有用,可以从已攻破的机器上收集到的信息,用于攻击其他机器。
4.2 字典的“动态生成”与“规则化”思路
手动维护静态字典是基础,但真正的效率来自于动态生成。这里介绍两个核心思路:
1. 使用cewl生成定制化字典cewl是一个爬取网站并生成基于关键词的密码字典的工具。假设目标公司官网是www.target-company.com,你可以这样做:
cewl -d 3 -m 6 -w company_words.txt https://www.target-company.com-d 3: 爬取深度为3。-m 6: 只收集长度至少为6的单词。-w: 输出到文件。
然后,你可以用这个company_words.txt作为基础,结合密码常见规则(首字母大写、尾部加数字年份、特殊符号替换)用脚本进行处理,生成一个高度定制化的字典。
2. 使用hashcat规则进行智能变形hashcat不仅是密码破解工具,其“规则”功能可以让你用一个基础字典,衍生出无数变体。例如,有一个基础密码company,通过规则可以实现:
Company(首字母大写)Company2023(尾部加年份)C0mpany(字母o替换为数字0)Company!(尾部加标点)
你可以直接使用hashcat附带的优秀规则集(如best64.rule,d3ad0ne.rule)来扩展你的小字典:
# 使用 best64.rule 规则对 base_pass.txt 进行扩展,输出到 expanded_pass.txt hashcat --force --stdout base_pass.txt -r /usr/share/hashcat/rules/best64.rule > expanded_pass.txt4.3 规避检测与速率控制
在真实的渗透测试或安全评估中,避免触发安全设备的告警同样重要。
- 调整
BRUTEFORCE_SPEED和THREADS:如前所述,降低速度、减少并发是最直接的方法。 - 使用代理或TOR网络:通过
set Proxies命令设置SOCKS代理,将流量转发,隐匿真实IP。但这会显著降低速度。 - 随机化尝试顺序:Metasploit的扫描模块通常是顺序尝试,行为模式固定。更高级的做法是编写自定义的Ruby脚本模块,实现用户名和密码的随机抽取尝试,增加行为噪音。
- 分散扫描源:如果条件允许,从多个不同的IP地址发起扫描,每个IP只尝试有限的次数。
5. 防御视角:如何发现和阻止此类攻击?
作为防守方,了解攻击手法后,我们可以采取以下措施:
1. 强化认证策略(治本之策)
- 禁用密码登录,强制使用SSH密钥对:这是最有效的方法。在
/etc/ssh/sshd_config中设置PasswordAuthentication no和PubkeyAuthentication yes。 - 使用强密码策略:如果必须使用密码,强制要求长度(如16位以上)、复杂度(大小写字母、数字、特殊符号组合)并定期更换。
- 禁止root用户直接远程登录:设置
PermitRootLogin no,使用普通用户登录后再su或sudo。 - 使用多因素认证(MFA):为SSH登录添加第二重验证,如Google Authenticator。
2. 网络层控制
- 限制SSH访问源IP:通过防火墙(如
iptables,ufw)或SSH配置中的AllowUsers、AllowGroups指令,只允许来自管理IP段的连接。 - 修改默认端口:将SSH服务端口从22改为一个非标准的高位端口,可以阻挡绝大部分自动化扫描脚本。但这只是“安全通过隐匿”,并非绝对安全。
3. 主动监控与告警
- 监控认证日志:集中收集和分析
/var/log/auth.log或/var/log/secure日志。重点关注:- 短时间内来自同一IP的大量失败登录尝试。
- 尝试使用不存在的用户名(如
admin,test)登录。 - 成功登录的来源IP异常。
- 部署入侵检测系统:使用如
fail2ban或denyhosts这样的工具。它们可以实时分析日志,当检测到来自某个IP的失败登录次数超过阈值时,自动将其IP加入防火墙黑名单一段时间。fail2ban简单配置示例:安装后,通常已经内置了针对SSH(sshd)的监控 jail,你只需要在/etc/fail2ban/jail.local中调整maxretry(最大重试次数)和bantime(封禁时间)即可。
4. 定期进行漏洞扫描与弱口令自查
- 使用同样的工具(如Metasploit,或专门的弱口令扫描器如
Hydra,Medusa),在授权的前提下,定期对自己的外网和内网SSH服务进行扫描,主动发现风险。 - 使用脚本定期检查服务器上的用户密码强度。
攻击与防御是一场永恒的博弈。通过Metasploit进行SSH弱口令爆破,是一项基础但至关重要的技能。它清晰地揭示了一个道理:在安全体系中,人的因素和基础配置往往是最薄弱的环节。掌握它,不仅是为了“进攻”,更是为了能更好地“防守”,从攻击者的视角审视自身系统的坚固程度。记住,安全是一个过程,而非一个状态。持续地评估、加固和监控,才是应对此类“低垂果实”式威胁的根本之道。