渗透基础 —— Minio 版本探测

发布于 2024-11-06 03:24:05 字数 6235 浏览 3 评论 0

0x00 前言

本文将要介绍 Minio 版本探测的方法,通过 Python 实现自动化,记录开发细节,开源代码。

0x01 简介

本文将要介绍以下内容:

  • 实现思路
  • 实现细节
  • 开源代码

0x02 基础知识

MinIO 是一款基于 Go 语言发开的高性能、分布式的对象存储系统。Minio 可以做为云存储的解决方案用来保存海量的图片,视频,文档。由于采用 Go 语言实现,服务端可以工作在 Windows,Linux, OS X 和 FreeBSD 上,并且只需要单独的可执行程序就可以运行。

在 Windows 上的环境搭建可参考: https://min.io/docs/minio/windows/index.html

1.下载

历史版本在下载后将文件后缀名添加 .exe ,运行即可

2.启动服务

命令行参数: minio.exe server C:\minio --console-address :9090

3.Web 访问

URL 地址: http://127.0.0.1:9090

  • 默认用户名: minioadmin
  • 默认口令: minioadmin

0x03 实现思路

Minio 的版本探测需要登录到 Web 后台

访问位置:Health 页面,如下图

Alt text

从页面中可以看到当前版本以及节点和存储的信息

在程序实现上,我们可以通过抓包的方式分析认证过程,具体内容如下:

1.登录

访问地址: http://127.0.0.1:9090/api/v1/login

通过 json 格式传入认证信息,具体内容如下:

{"accessKey": "minioadmin","secretKey": "minioadmin"}

登录成功后返回状态码 204 ,在 Header 中添加 Cookie: token=xxxx 作为凭据

2.读取版本信息

访问地址: http://127.0.0.1:9090/api/v1/admin/info

需要带有 Cookie: token=xxxx 作为凭据

返回结果为 json 格式,如下图

Alt text

补充:获得 Minio 的最新版本

访问地址: http://127.0.0.1:9090/api/v1/check-version

0x04 实现细节

1.登录

这里需要考虑一个问题:默认端口被修改的情况

在用程序实现自动化时,通常会使用端口 9000 ,但存在端口被修改为 9001 的情况,也存在很少一部分将端口修改为其他不常见的端口

如果端口错误,会返回状态码 400 ,返回内容示例:

<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>BadRequest</Code><Message>An error occurred when parsing the HTTP request POST at &#39;/api/v1/login&#39;</Message><Resource>/api/v1/login</Resource><RequestId></RequestId><HostId>1d119326-9fa7-4c24-b2c8-c236a17cfd35</HostId></Error>

所以在程序实现上这里可以添加一个判断:当使用默认端口 9000 时,如果返回特定条件,提示端口错误,接下来尝试端口 9001 ,如果再次失败,提示修改默认端口

完整示例代码:

def loginMinIO(url, username, password):
    print("[*] Try to login:" + url)
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36",
        "Content-Type": "application/json",
        "Accept-Encoding": "gzip, deflate",
        "Accept-Language": "en-US,en;q=0.9"
    }
    target = url + "/api/v1/login"
    d = {"accessKey": username,
        "secretKey": password,
    }
    try:
        res = session.post(target, headers=headers, json=d, verify = False, timeout = 10)
        if res.status_code == 204:
            print('[+] Login Success')
            print("    Cookie:")
            print("    token=" + res.cookies['token'])
            return url
        else:
            print('[-] Login error')
            if "An error occurred when parsing the HTTP request POST at" in res.text and "9000" in url:
                print("    Wrong port,try to use 9001")
                newurl = url.rsplit(':9000')[0] +":9001"
                print("[*] Try to login:" + newurl + "/api/v1/login")
                res = session.post(newurl + "/api/v1/login", headers=headers, json=d, verify = False, timeout = 10)
                if res.status_code == 204:
                    print('[+] Login Success')
                    print("    Cookie:")
                    print("    token=" + res.cookies['token'])
                    return newurl
                else:
                    print('[-] Login error')
                    print("    Wrong port,try to use another port")
                    sys.exit(0)
            else:
                print(res.status_code)
                print(res.text)
                sys.exit(0)        
    except Exception as e:
        print("[!]")
        print(e)
        sys.exit(0)

2.读取版本信息

返回结果为 json 格式,结果示例:

{"advancedMetricsStatus":"not configured","backend":{"backendType":"Erasure"},"servers":[{"commitID":"87cbd4126599ae825903230fdb32197204e42c22","drives":[{"availableSpace":33283801088,"drivePath":"C:\\minio","endpoint":"C:\\minio","state":"ok","totalSpace":64422408192,"usedSpace":31138607104,"uuid":"2d684591-69af-42c1-b940-ce7f4d711aa1"}],"endpoint":"127.0.0.1:9000","network":{"127.0.0.1:9000":"online"},"state":"online","uptime":214,"version":"2023-03-24T21:41:23Z"}],"widgets":null}

这里存在多个 servers 的情况,所以在解析时需要使用遍历,示例代码如下:

dictt = res.json()["servers"]
for k in dictt:
    print("   +server:  " + str(k["network"]))
    print("    state:   " + k["state"])
    print("    uptime:  " + str(k["uptime"]))
    print("    version: " + k["version"])

0x05 开源代码

完整的实现代码已上传至 github,地址如下:https://github.com/3gstudent/Homework-of-Python/blob/master/MinIO_GetVersion.py

代码支持以下两种命令:

  • getversin:用来获得版本信息
  • getinfo:用来获得完整信息

0x06 小结

本文介绍了 Minio 版本探测的方法,结合实际环境介绍了通过 Python 开发的细节,开源代码。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

拥抱我好吗

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

安静被遗忘

文章 0 评论 0

喔爱吃橙子

文章 0 评论 0

草莓味的萝莉

文章 0 评论 0

梦里兽

文章 0 评论 0

mb_83J3Cyxa

文章 0 评论 0

时间海

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文