• 网络安全实战之靶场渗透技术


    信息收集

    端口扫描

    nmap找到三个开放的 TCP 端口,FTP (21)、SSH (22) 和 Python 托管的 HTTP (5000):
    image.png

    发现存在ftp匿名登录,使用ftp进行登录。
    image.png

    Flask App

    访问5000端口,发现开启了web服务。
    image.png

    在登录框测试了一些常规漏洞,SQL注入和弱口令都没有用。

    【一一帮助安全学习,所有资源获取处一一】
    ①网络安全学习路线
    ②20份渗透测试电子书
    ③安全攻防357页笔记
    ④50份安全攻防面试指南
    ⑤安全红队渗透工具包
    ⑥网络安全必备书籍
    ⑦100个漏洞实战案例
    ⑧安全大厂内部视频资源
    ⑨历年CTF夺旗赛题解析

    网站上没有什么有趣的东西,我们去注册看看:

    登录之后,重定向到/dashboard这个目录下。
    image.png

    “添加注释”按钮指向/add_note,它有一个表格。尝试提交一个note进行测试。
    image.png

    image.png

    它显示在我的仪表板上。

    尝试各种 XSS 有效负载,但一切似乎都正确地转义了。“Notes” ( /notes) 现在显示我的笔记:
    1663032001_631fdac1e2b65db8403d5.png

    单击它会导致/note/3并显示注释:
    1663032002_631fdac28cb399007109c.png

    我将尝试通过检查其他注释 ID(/note/1)。例如,点击“升级到VIP”的链接显示该选项当前不可用
    1663032003_631fdac33a9d86124c97c.png

    漏洞发现

    JWT解密

    尝试解密cookie。
    1663032003_631fdac3e8e1bb90beb94.png

    Flask cookie 看起来很像 JWT。我将尝试flask-unsign,一个用于解码、暴力破解和制作 Flask cookie 的工具,它可以工作:
    1663032004_631fdac4a3ff8c241b28d.png

    目录爆破

    没有发现啥可以利用的地方,就继续看cookie。
    image.png

    Flask Unsign解密

    使用flask-unsign解密

    flask-unsign --decode--cookie'.eJwlx0EKgCAQBdCrDH_torU3iZCQHC0wBUcpEO-e0OrxOnYfrZws0FsH1QmkHQeLQGHNjWxhSvmhmENgR1eCGUbh7z6ra2ms0IRLsjdDY3mdx_gAqEYfRw.YkOi3g.uAoRysM25q2FzuEUmYMaCRMQ4aA'{'_flashes': [('success', 'You are now logged in')], 'logged_in': True, 'username': '0xdf'}
    
    cookie:eyJsb2dnZWRfaW4iOnRydWUsInVzZXJuYW1lIjoiYWRtaW4ifQ.Yxvarg.S9d5IqA4nL7CBjzYp4CfnG8IoLk
    
    • 1
    • 2
    • 3

    命令

    flask-unsign --decode --cookie 'eyJsb2dnZWRfaW4iOnRydWUsInVzZXJuYW1lIjoiYWRtaW4ifQ.Yxvarg.S9d5IqA4nL7CBjzYp4CfnG8IoLk'
    
    • 1

    1663032006_631fdac63cc23643cf374.png

    使用flask-unsign. Flask cookie 使用秘密签名,因此在不知道该密码的情况下无法修改它们。可以进行暴力破解来测试弱密码,并通过flask-unsign来提供该功能。–unsign-w,运行它会rockyou.txt返回错误:
    1663032007_631fdac70442688054d38.png

    它似乎将文件中的“123456”通过添加–no-lteral-eval. 我将添加它,它可以很快找到秘密:
    1663032007_631fdac7d5a73e5b5a939.png

    以管理员身份访问测试

    生成一个管理员的cookie,然后替换到浏览器当中去。

    eyJsb2dnZWRfaW4iOnRydWUsInVzZXJuYW1lIjoiYWRtaW4ifQ.YxvdIw.PpnxZ3h8WkIo_5JMIfhCDD7hXo8
    
    • 1

    image.png

    带有 Cookie 的暴力用户名

    使用time将可能的用户名生成一个cookie 列表。
    image.png

    代码分析

    这将获取一个名称列表并生成我需要的所有 cookie。这实际上很慢,运行时间超过 8 分钟。这是因为每项工作都必须启动,其中包括导入所有 Flask。

    我可以深入研究一下flask-unsign源代码,并跟踪我用–sign.

    @lru_cache()
    def get_serializer(secret: str, legacy: bool, salt: str) -> URLSafeTimedSerializer:
        """
        Get a (cached) serializer instance
        :param secret: Secret key
        :param salt: Salt
        :param legacy: Should the legacy timestamp generator be used?
        :return: Flask session serializer
        """
        if legacy:
            signer = LegacyTimestampSigner
        else:
            signer = TimestampSigner
    
        return URLSafeTimedSerializer(
            secret_key=secret,
            salt=salt,
            serializer=TaggedJSONSerializer(),
            signer=signer,
            signer_kwargs={
                'key_derivation': 'hmac',
                'digest_method': hashlib.sha1})
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    向后追溯,我可以发现默认的 salt 是“cookie-session”。我知道或只是在文件顶部导入的其他内容。我可以使用它来生成我自己的脚本:

    #!/usr/bin/env python3
    
    import hashlib
    import sys
    from flask.json.tag import TaggedJSONSerializer
    from itsdangerous import TimestampSigner, URLSafeTimedSerializer
    
    if len(sys.argv) < 2:
        print(f"{sys.argv[0]} [wordlist]")
        sys.exit()
    
    with open(sys.argv[1], 'r') as f:
        names = f.readlines()
    
    for name in names:
        cookie = URLSafeTimedSerializer(
                secret_key='secret123',
                salt='cookie-session',
                serializer=TaggedJSONSerializer(),
                signer=TimestampSigner,
                signer_kwargs={
                    'key_derivation': 'hmac',
                    'digest_method': hashlib.sha1
                    }
                )
        print(cookie.dumps({"logged_in": True, "username": name.strip()}))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    使用wfuzz检查每个 cookie,隐藏 302 响应(重定向回/login

    1663032009_631fdac9eaeba19da2063.png

    枚举到一个,解码为blue,发现一个blue用户。
    1663032010_631fdacacc269f53e0926.png

    使用登录 Oracle 的暴力用户名

    使用wfuzz对所有用户发送登录请求,并注意任何不响应“无效凭据”的用户。有一个文件: names.txt
    1663032011_631fdacb92436d2a31b37.png

    它返回了一个有效的用户名,blue(就像我通过制作 cookie 找到的一样)。我将flask-unsign用来制作 cookie:
    image.png

    站点访问/枚举

    无论我以哪种方式获得blue的cookie,替换 Firefox 开发工具中的当前 cookie,然后重新加载/dashboard显示我现在以blue登录:
    1663032013_631fdacdab87fa552b894.png

    还有“导入笔记”和“导出笔记”按钮。我稍后会回到这些。
    1663032014_631fdace63fab4d947ad3.png

    发现FTP登录的用户和密码。
    1663032015_631fdacf37e420235c944.png

    image.png

    FTP登录

    image.png

    发现一个 是关于密码安全的PDF,下载下来,然后进行分析。

    发现了默认的用户名格式。
    image.png

    以 ftp_admin 身份访问 FTP

    ftp_admin@Noter!
    
    • 1

    有一个目录files和一个PDF。目录为空:

    发现2个zip文件,将它们都下载到本地。
    image.png

    md 到 pdf 中的 RCE

    使用unzip -l查看压缩包文件内容。
    1663032019_631fdad328801dc5035a7.png

    使用diff命令比较2个压缩包的区别。
    image.png

    app.py将从每个中提取,并将它们重命名为app-1.pyand app-2.py

    继续使用diff进行比较。运行diff app-1.py app-2.py显示第一个对数据库有不同的信任:
    image.png

    来源分析

    该代码很有趣,export_note_local在andexport_node_remote函数中有一个有趣的东西。每个人都会得到一个注释,要么在本地读取它,要么从给定的 URL 读取它,然后用来针对它subprocess运行一个nodeJavaScript 程序。例如,来自export_node_local:

    rand_int = random.randint(1,10000)
    command = f"node misc/md-to-pdf.js  /pre>{note['body']}' {rand_int}"
    subprocess.run(command, shell=True, executable="/bin/bash")
    
    return send_file(attachment_dir + str(rand_int) +'.pdf', as_attachment=True)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    CVE-2021-23639

    漏洞描述:

    影响 md-to-pdf包,版本 <5.0.0

    md-to-pdf是一个用于将 Markdown 文件转换为 PDF 的 CLI 工具。此软件包的受影响版本容易受到远程代码执行 (RCE) 的影响,因为它利用库灰质来解析前端内容,而不禁用 JS 引擎。

    package-lock.json文件将给出所需 JavaScript 包的版本。我将从档案中提取它并通过以下方式找到它grep:
    image.png

    google搜索这个包和漏洞利用会返回一个页面:
    1663032022_631fdad6a869dee62188f.png

    攻击者可以将有效载荷放入传入的降价中,这将导致 RCE。
    image.png

    获取权限

    反向壳

    创建一个md文件,写入反弹shell的语句来利用它。
    image.png

    本地先启动一个80端口,然后使用nc进行监听,接着使用网站的Export功能。

    image.png

    反弹Shell
    image.png

    获得user.txt

    获得第一个user.txt文件,使用cat命令进行查看。
    image.png

    MySQL

    我们在其中一个脚本中发现了 mysql 凭据。由于这是一个 CTF,这样的事情总是会引起怀疑。

    我们检查mysql是否在本地运行:
    1663032027_631fdadb49159a5bbf477.png

    我们在默认端口 3306 上看到它。我们还可以检查服务,看看它是否以 root 身份运行
    image.png

    在 MySQL 中利用 UDF

    这是。所以我们知道 mysql 以 root 身份运行,并且我们有 root 凭据来登录它。使用 Exploit-DB 上的漏洞利用我们可以将源代码复制到盒子中,编译它,然后使用它在 mysql 中创建的共享库以 root 身份执行代码。

    让我们使用 searchsploit 获取代码:
    image.png

    本地开启一个web服务,将文件下载到目标机器上。

    接着使用gcc进行编译。
    image.png

    然后下载到目标机器上。
    image.png

    MYsql登录

    在之前获取到了机器的用户和密码,然后进行登录。
    1663032031_631fdadfa0782441cb021.png

    权限提升

    Raptor

    漏洞利用:

    有很多关于如何使用称为 Raptor 的代码来利用以 root 身份运行的 MySQL,我的想法是,我将编写一个共享库,将 SQL 中的命令运行到插件目录中,然后添加一个命令来访问它并以 root 身份执行。

    我需要获取漏洞利用文件的副本并使用注释中的说明进行编译:
    1663032032_631fdae07780ba3920d71.png

    将脚本文件上传上去。
    image.png

    漏洞利用过程

    1.创建一个foo表并将二进制文件读入其中:

    2.查看插件目录

    3.将二进制文件写入上面的插件目录,并将其作为用户定义的函数加载:

    4.测试文件权限。
    1663032034_631fdae20772bcf3ccb56.png

    5.运行。
    image.png

    mysql复制bash并将其更改为 SUID:

    需要找一个文件运行的地方不是/dev/shm,因为它已经安装nosuid:

    而/tmp会正常工作。因为bash删除 privs,运行它会返回一个非 root的 shell:
    1663032035_631fdae38c0dda5ae15a9.png

    获得root.txt

    读取root.txt
    1663032036_631fdae44723f46e29b2d.png

    【一一帮助安全学习,所有资源获取处一一】
    ①网络安全学习路线
    ②20份渗透测试电子书
    ③安全攻防357页笔记
    ④50份安全攻防面试指南
    ⑤安全红队渗透工具包
    ⑥网络安全必备书籍
    ⑦100个漏洞实战案例
    ⑧安全大厂内部视频资源
    ⑨历年CTF夺旗赛题解析

    总结:

    靶机主要是从信息收集开始,发现是flask搭建的,然后使用flask unsign进行解密,暴力破解。接着使用枚举出的用户进行FTP登录,FTP登录之后,下载pdf文件,发现管理员账号和密码规则,然后登录FTP管理员,接着下载压缩包,进行文件分析,发现可以使用CVE-2021-23639历史漏洞可以获取权限,在文件中发现存在mysql服务,接着进行权限提升,获取到了root文件。

  • 相关阅读:
    【操作系统】信号量机制(整型信号量、记录型信号量),用信号量实现进程互斥、同步、前驱关系
    CLIP(Contrastive Language-Image Pre-Training)简介
    模拟实现map/set[改编红黑树实现map/set容器底层]
    Java根据线程指标自定义HPA(Prometheus为监控收集)
    OPENCV实现暴力特征匹配
    HCIA-R&S自用笔记(22)STP状态与计时器、STP拓扑变化、STP配置及实验
    剑指offer---Day5
    (八) 共享模型之管程【ReentrantLock】
    Dubbo环境搭建
    【前端设计模式】之观察者模式
  • 原文地址:https://blog.csdn.net/kali_Ma/article/details/127429832