实战演练:使用Hydra对SSH服务进行字典爆破与防御思考

📅 发布时间:2026/7/8 5:35:26 👁️ 浏览次数:
实战演练:使用Hydra对SSH服务进行字典爆破与防御思考
1. 环境搭建与信息收集从零开始的“敲门”准备大家好我是老张在安全圈里摸爬滚打了十几年今天咱们不聊那些虚头巴脑的理论直接上手干。咱们的目标很明确在一个完全可控的虚拟环境里模拟一次针对SSH服务的密码爆破攻击并且把每一步都掰开揉碎了讲清楚。这就像你要去开一扇门总得先知道门在哪、锁是什么型号对吧所以第一步就是搭好我们的“实验沙盘”。我习惯用VMware或者VirtualBox这次我用的是VMware Workstation Pro。你完全可以用任何你熟悉的虚拟化软件。我创建了两台Kali Linux虚拟机一台作为攻击机Kali 2023.1另一台作为靶机Kali 2022.2。为啥都用Kali因为它自带了我们需要的几乎所有工具省去了安装配置的麻烦让我们能聚焦在核心流程上。在实际的渗透测试授权中攻击机可能是你本地的物理机靶机则是云服务器或者内网的一台主机原理完全一样。开机后第一件事就是搞清楚“敌我”位置。在两台机器上我都打开了终端输入ifconfig新一点的系统可能是ip addr来查看IP地址。我的攻击机IP是192.168.223.133靶机是192.168.223.134。记下这两个地址它们就是我们接下来所有操作的坐标。这里有个小坑我踩过确保两台虚拟机网络模式设置正确比如都设为NAT或者桥接保证它们在同一网段能互相ping通。你可以用ping 192.168.223.134从攻击机测试一下看到有回包就说明网络通了。知道了门牌号下一步就是“踩点”。我们得确认靶机是不是真的开着SSH这扇“门”。这里祭出我们的老朋友——Nmap。回到攻击机的终端输入nmap -sS -sV 192.168.223.134我来解释一下这几个参数是干嘛的。-sS代表TCP SYN扫描这是一种半开放扫描速度比较快且相对隐蔽它发送SYN包根据返回的SYN-ACK或RST来判断端口状态。-sV是版本探测它会尝试进一步识别端口上运行的服务及其具体版本号。这条命令比简单的nmap 192.168.223.134能给我们更多信息。执行命令后我们盯着输出结果。如果一切正常你应该能看到类似下面这样的信息PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3 (Ubuntu Linux; protocol 2.0)看到没22/tcp open明确告诉我们靶机的22号端口是开放的上面运行的服务是SSH具体版本是OpenSSH 8.9p1。这一步至关重要它不仅仅确认了攻击目标的存在还告诉我们服务的版本。知道版本号有时候能帮我们查找是否有已知的漏洞当然我们这次只用爆破。信息收集阶段到此就完成了我们成功定位了目标。2. 打造你的“万能钥匙”字典的艺术与科学找到了门接下来就得准备开锁的“钥匙串”也就是字典。很多人觉得爆破就是无脑撞库其实不然一个精心准备的字典往往能事半功倍。字典的质量直接决定了你这次“敲门”是“咚咚咚”几下就开还是“哐哐哐”敲到天亮也白费劲。我先在攻击机的/root目录下你也可以在任何你喜欢的位置创建两个文本文件users.txt和passwords.txt。这两个文件将分别存放我们猜测的用户名列表和密码列表。怎么创建用vim、nano或者直接用echo命令重定向都行。比如echo -e root\nadmin\nkali\nubuntu\ntest\nuser users.txt echo -e 123456\npassword\nadmin123\nroot\n12345678\nqwerty\nletmein passwords.txt这样我们就有了一个最简单的字典。但实战中这远远不够。我根据这么多年的经验分享一下我准备字典的几个思路你可以把它们组合起来生成一个更强大的字典文件。第一利用社会工程学信息。如果目标是一个公司可以尝试公司名缩写、产品名、创始年份等组合。比如公司叫“安全科技2020”那用户名可能是aqkj、security密码可能是Aqkj2020!、Security2020。第二收集公开的泄露密码库。互联网上有大量因数据泄露而流出的密码集合比如著名的rockyou.txt在Kali的/usr/share/wordlists目录下就有。你可以直接使用或者用它们作为基础进行加工。使用大字典时要有心理准备耗时可能会很长。第三使用字典生成工具。Kali自带的crunch或者cewl是非常好的工具。crunch可以按照指定的字符集和长度生成所有排列组合。例如生成所有6位纯数字密码crunch 6 6 0123456789 -o num6.txt。cewl则更智能它可以爬取指定网站提取网页中出现的单词作为字典这特别适用于有对外网站的目标。第四基于规则的变形。这是最有效的方法之一。很多人设置密码有固定模式比如“基础词年份特殊符号”。我们可以用hashcat的规则或者John the Ripper的规则对基础字典进行变形。例如对password这个基础词规则可以将其变形为Password123、Pssw0rd、password2023!等等。我通常会准备一个包含常见弱口令的基础小字典然后用几条简单的规则跑一遍生成一个针对性更强的字典。注意在授权的渗透测试中使用超大字典或过于暴力的规则可能会对目标服务造成拒绝服务DoS影响务必在测试计划中明确并获得许可。在我们的实验环境里就放开手脚试试吧。最后别忘了用户名字典。除了常见的root、admin还可以尝试目标系统可能存在的真实用户名比如通过网页注释、邮箱格式如zhangsan、lisi等途径收集。把准备好的users.txt和passwords.txt放在顺手的地方我们的“钥匙串”就准备好了。接下来该请出今天的主角——Hydra开始真正的“敲门”了。3. Hydra实战让自动化工具替你“敲门”工具准备好了靶机也就位了现在轮到Hydra闪亮登场。Hydra是一款非常强大的网络登录破解工具支持几十种协议SSH只是其中之一。它的设计哲学就是快和并行能同时发起多个连接尝试不同的凭证组合。今天我们就用它来对付SSH。最基本的命令格式就像原始文章里写的hydra -L users.txt -P passwords.txt ssh://192.168.223.134-L users.txt指定包含用户名的文件。-P passwords.txt指定包含密码的文件。ssh://192.168.223.134指定协议和目标地址。回车之后你会看到Hydra开始疯狂尝试。屏幕上会滚动显示尝试的进度比如[22][ssh] host: 192.168.223.134 login: root password: 123456。如果密码错了它会继续下一个。这个基本命令在简单环境下可能就够用了但实战中我们往往需要更多控制。下面我分享几个我常用的参数和技巧它们能显著提升爆破的效率和成功率。第一个技巧控制线程避免“砸门”声太大。-t参数用于指定并行任务数线程。默认是16。线程数太高可能会被对方的防御系统如Fail2ban瞬间察觉并封禁IP线程数太低速度又太慢。我一般会根据情况调整在4到8之间。命令就变成了hydra -L users.txt -P passwords.txt -t 4 ssh://192.168.223.134。第二个技巧非标准端口怎么办很多管理员会把SSH端口从默认的22改成其他端口比如2222、3522等。这时候需要用-s参数指定端口号hydra -L users.txt -P passwords.txt -s 2222 ssh://192.168.223.134。第三个技巧保存和恢复进度。如果你用的字典很大一次可能跑不完或者中途网络断了。-o参数可以指定一个文件来保存找到的凭证。更实用的是-I参数它允许Hydra从上次中断的地方恢复任务而不是从头开始这能节省大量时间。不过注意恢复功能需要配合特定的输出格式。第四个技巧针对性的用户名-密码组合尝试。有时候我们怀疑某个特定用户用了弱密码但不想用完整的字典去跑所有用户。这时候可以用-l小写L指定单个用户名或者用-p指定单个密码。例如只尝试用密码字典爆破root用户hydra -l root -P passwords.txt ssh://192.168.223.134。在我的实验里运行了加强版的命令后稍等片刻Hydra就传来了捷报[22][ssh] host: 192.168.223.134 login: root password: 123456 [22][ssh] host: 192.168.223.134 login: kali password: kali它成功地找到了两组有效的凭证root/123456和kali/kali。看到这个结果既在情理之中因为我们字典里确实有这些弱口令也再次印证了弱口令风险的普遍性。Hydra的工作完成后它会给出一个简洁的统计告诉你尝试了多少组成功了几个耗时多久。拿到这些“钥匙”下一步就是去“开门”验证了。4. 验证成果与登录从“门外汉”到“管理员”爆破出密码只是第一步就像你配了一把钥匙总得插进锁孔拧一下看看能不能真的打开门。验证凭证的有效性并成功登录才是整个攻击链闭环的关键。同时这也是我们理解攻击者视角的重要一环。我们使用刚才Hydra发现的第一个成果root用户和密码123456。在攻击机的终端里输入SSH登录命令ssh root192.168.223.134如果你是第一次连接这台靶机SSH客户端会提示你目标主机的指纹RSA key fingerprint无法验证问你是否继续连接。这是SSH协议的一个安全特性用于防止中间人攻击。在我们可控的实验环境里我们知道这就是我们的靶机所以直接输入yes并回车即可。在实际的未知环境中这步需要格外谨慎需要核对指纹是否与预期一致。接下来命令行会提示你输入root用户的密码password:。这里注意输入密码时屏幕是不会有任何显示的连星号*都没有这是Linux系统的正常行为防止旁人窥视。你只管稳稳地敲入123456然后按下回车。如果一切顺利命令行的提示符会瞬间发生变化你仔细看登录前你的提示符可能是kalikali:~$表示你是kali用户在kali主机上。登录成功后提示符会变成rootkali2022:~#。注意用户从kali变成了root主机名也可能变成了靶机的主机名我这里是kali2022并且普通用户的$符号变成了root用户的#符号。这个变化是登录成功最直观的标志。为了进一步确认我们可以执行几个命令。输入whoami它会返回root。输入ifconfig查看的网络接口IP地址应该是靶机的IP192.168.223.134而不是你攻击机的IP。再输入ls -la /root你可以列出靶机root用户家目录下的所有文件包括隐藏文件。到了这一步我们已经完全证明了凭证的有效性并且获得了靶机系统的最高权限root。这里有个非常实用的技巧使用-vverbose参数进行SSH连接。即ssh -v root192.168.223.134。这个参数会让SSH客户端输出详细的连接过程日志包括密钥交换、认证方法尝试等。当登录遇到问题时比如公钥认证冲突、密码错误但不确定-v输出的信息是绝佳的调试依据。成功登录后攻击者视角能做什么那就太多了。可以查看敏感文件如/etc/shadow获取密码哈希虽然现在多是加密的、安装后门、添加新用户、翻看历史命令history、查看网络连接netstat -antp以寻找内网其他目标或者直接开始横向移动。我们的复现目的已经达到所以在实验环境里输入exit或logout命令退出SSH会话即可。切记在真实授权测试中任何进一步的操作都必须严格控制在授权范围内。5. 防御之道让你的SSH服务“固若金汤”扮演完攻击者咱们立刻切换回防御者视角。这次实战演练就像一次消防演习目的不是为了放火而是为了找到建筑的消防隐患。通过亲自动手实施了一次SSH爆破我们应该比任何人都更清楚一个配置不当的SSH服务有多么脆弱。下面我就结合自己的运维经验聊聊几个立竿见影的加固措施让你的服务器不再是“纸糊的门”。第一道防线彻底抛弃密码拥抱公钥认证。这是我最推荐、也是效果最显著的一步。公钥认证的原理是你在客户端生成一对密钥公钥和私钥把公钥放到服务器的对应用户目录下~/.ssh/authorized_keys。登录时服务器用公钥挑战客户端用私钥应答。由于私钥从不通过网络传输且长度非常长比如RSA 2048位暴力破解在理论上不可行。配置好后直接在SSH服务配置里禁用密码登录。修改/etc/ssh/sshd_config文件PubkeyAuthentication yes PasswordAuthentication no ChallengeResponseAuthentication no然后重启SSH服务systemctl restart sshd。从此爆破工具对你服务器的密码登录端口就彻底失效了。记得一定要保管好你的私钥并给私钥文件设置强密码passphrase。第二道防线修改默认端口避开“流弹”。把SSH端口从22改为一个大于1024的非知名端口比如3522、7822。这能挡掉互联网上绝大多数漫无目的的自动化扫描脚本。修改sshd_config中的Port指令即可。但要注意这只是一个“隐蔽”措施并非安全措施Security through obscurity。一旦端口被扫描发现攻击依然会来所以必须结合其他手段。第三道防线部署Fail2ban动态封禁“撞门者”。Fail2ban是我心中的神器。它实时监控系统日志比如/var/log/auth.log当发现同一个IP在短时间内有多次失败的登录尝试时就自动调用防火墙规则如iptables或firewalld将该IP封禁一段时间。这相当于一个自动化的门卫发现有人鬼鬼祟祟一直试钥匙就直接把他赶走并拉黑名单。配置起来也不复杂安装后主要修改/etc/fail2ban/jail.local设置封禁时间、查找时间窗口和最大重试次数。第四道防线实施强密码策略与访问控制。如果因为某些原因必须使用密码登录那么强密码策略是底线。确保密码长度足够12位以上、复杂度高大小写字母、数字、符号混合。可以使用pam_pwquality模块来强制实施。另外利用sshd_config的AllowUsers或AllowGroups指令只允许特定的用户或组通过SSH登录能极大缩小攻击面。例如AllowUsers zhangsan lisi。第五道防线使用防火墙严格限制源IP。如果您的服务器只允许从特定的办公网络或管理终端访问那么在最前端的防火墙云服务器安全组、硬件防火墙或系统本身的iptables上设置白名单是最高效的防御。只放行可信IP地址段对SSH端口的访问其他IP一律拒绝。这相当于把门藏在了只有自己人知道的巷子里。在我负责的项目中我通常会采用“公钥认证 非标准端口 Fail2ban”的组合拳。公钥认证解决了认证根本的安全问题改端口减少了无谓的日志噪音和低层次扫描干扰Fail2ban则作为动态的主动防御应对那些针对性的攻击。这套组合实施下来再去看服务器的auth.log会发现那些爆破尝试的记录几乎都变成了Fail2ban的封禁记录世界瞬间清静了很多。安全是一个持续的过程但把这些基础工作做扎实就能抵御掉99%的自动化攻击脚本让你有更多精力去应对更高级的威胁。