freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

实战打靶之Noter
2022-10-19 19:10:55
所属地 北京

信息收集

端口扫描

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

1662591506147-f7858e7c-a120-4a54-b581-a687fc866d21.png

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

1662591477574-6e9ada13-f453-4a54-9eda-552fdfcf0589.png

Flask App

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

1662591657757-30d56774-e5ab-4215-87a1-f5063aa5e0bc.png

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

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

1662591684030-e40399d9-14dd-4c56-8d3a-9f5e00fcb5ef.png

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

1662591751600-87cae92f-188e-43af-aa2d-a491007b32ba.png

“添加注释”按钮指向/add_note,它有一个表格。尝试提交一个note进行测试。
1662591810130-03aa5298-5657-44f1-a91b-6dec82a03596.png1662591855008-e4de7534-76ce-43dc-90ac-41fd7b296e54.png

它显示在我的仪表板上。

1662591870497-452f990c-8db9-4605-9234-130deb52dc31.png

尝试各种 XSS 有效负载,但一切似乎都正确地转义了。“Notes” ( /notes) 现在显示我的笔记:1662591910226-c0c164e7-b71e-467d-9a32-6f431e1aa916.png

单击它会导致/note/3并显示注释:

1662592067992-87f1fc2a-ffd7-4ba9-8998-06ed13fba2eb.png

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

1662769856060-519efb7b-8bc5-422d-826e-c8c167d52d35.png

漏洞发现

JWT解密

尝试解密cookie。

1662592236970-568d1770-71d7-46b1-9d6f-c09ceaa6afb2.png

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

1662801991958-fe6b780d-1ecf-4b6e-933f-f4e28aa4fcd6.png

目录爆破

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

1662769775258-1e0bd0b9-5b23-4e74-8d15-e11f582e8878.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

命令flask-unsign --decode --cookie 'eyJsb2dnZWRfaW4iOnRydWUsInVzZXJuYW1lIjoiYWRtaW4ifQ.Yxvarg.S9d5IqA4nL7CBjzYp4CfnG8IoLk'1662770296931-df342aea-928d-4112-b95b-fef65f0c868f.png

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

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

1662770440531-a98bec0f-8df4-4436-9e1a-bc7f4a5b9f81.png

以管理员身份访问测试

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

eyJsb2dnZWRfaW4iOnRydWUsInVzZXJuYW1lIjoiYWRtaW4ifQ.YxvdIw.PpnxZ3h8WkIo_5JMIfhCDD7hXo8

1662770474904-3ee8d970-33e4-48c1-a9e1-ce4661b46f3d.png

带有 Cookie 的暴力用户名

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

1662771096492-e7807c24-25cb-4932-8e0b-ef61a414f686.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})

向后追溯,我可以发现默认的 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()}))

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

1662771213335-d84ff1bf-0fed-4863-ac5c-df77c487349b.png

枚举到一个,解码为blue,发现一个blue用户。

1662771084671-49e31957-43ee-498a-a361-6117c77b7921.png

使用登录 Oracle 的暴力用户名

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

1662771253812-6abd6993-2d03-42b5-80df-b6745f269335.png

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

1662802519119-048760ad-84fd-476d-9ab4-09ca9c2f0391.png

站点访问/枚举

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

1662771303257-042872d6-1aca-4ffe-9008-2c97f0d642df.png

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

1662771344879-cae0f387-abdc-4df1-ab32-1322de302153.png

发现FTP登录的用户和密码。

1662771385943-582fb5fe-b6f4-4837-9269-6274576cb2a7.png1662771407557-551ca2cc-3e41-4dd5-a41b-d6409c0f4b43.png

FTP登录

1662771527471-9a1b1754-c6c4-401d-be23-b9c1ea5b4672.png

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

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

1662771604590-48f5ba13-3e81-408e-b48f-5ddb7a96490e.png

以 ftp_admin 身份访问 FTP

ftp_admin@Noter!

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

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

1662771902167-0c966c58-a0c8-4d9f-a90e-eea18d7b11aa.png

md 到 pdf 中的 RCE

使用unzip -l查看压缩包文件内容。

1662771878356-569dd3f3-a1e4-451a-b595-020b41718ee1.png

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

1662771943835-d6dbc60c-b389-447f-8da6-70fbc4098d7d.png

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

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

1662772019841-c939a1c1-5ea0-4df4-b77f-c1c0ae384bd3.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  $'{note['body']}' {rand_int}"
subprocess.run(command, shell=True, executable="/bin/bash")

return send_file(attachment_dir + str(rand_int) +'.pdf', as_attachment=True)

CVE-2021-23639

漏洞描述:

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

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

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

1662772068411-b3145fd3-3e85-4fcc-8111-f6166c7dff5f.png

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

1662772210591-260dc30b-3106-44d1-a25c-a0eb621d1c61.png

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

1662772193394-4ea1a541-0192-4dee-94b4-f60521fbab74.png

获取权限

反向壳

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

1662773937410-6ab3102c-37e7-42b0-ba48-226fe79238ac.png

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

1662774105872-f122e04c-49cb-4e14-9b63-0fba825873a3.png反弹Shell

1662774096836-1a39e0a7-d1ec-4408-be7a-f005661eff29.png

获得user.txt

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

1662774291293-b13762a5-675c-4adb-8359-17b1232ca585.png

MySQL

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

我们检查mysql是否在本地运行:

1662774412972-114abb39-1d6a-4b2e-9487-202e8f3a2703.png

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

1662803470324-0c949ba4-7718-4bc5-8c2d-09f99abd047a.png

在 MySQL 中利用 UDF

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

让我们使用 searchsploit 获取代码:

1662803555898-27526f80-d8b0-4c23-9c9a-04a05a47dc87.png本地开启一个web服务,将文件下载到目标机器上。

接着使用gcc进行编译。

1662775354653-c3b8ebe9-f009-486c-a06a-35e30808da64.png

然后下载到目标机器上。

1662776412755-77c84766-b46a-4b3f-af40-dc8b2752f423.png

MYsql登录

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

1662775402334-3e5bad67-e8ad-4cf2-9f77-7c8c8669aeac.png

权限提升

Raptor

漏洞利用:

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

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

1662775427978-93bf7cd9-abd1-4948-ac6f-422db0f79dcf.png

将脚本文件上传上去。

1662778632941-05afc6ab-89de-45e3-8439-f20c3ae83024.png

漏洞利用过程

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

2.查看插件目录

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

4.测试文件权限。

1662778609466-cd6d0d08-cad4-4783-a237-9c5797d99cda.png

5.运行。

1662778621740-a460d52f-b847-447d-87c6-5a6d1b94fcfc.pngmysql复制bash并将其更改为 SUID:

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

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

1662778569965-1a6584eb-f66e-4db5-8247-60cfefc507a5.png

获得root.txt

读取root.txt

1662778514901-291c425c-80e9-4ada-ae76-323e74d6e0d6.png

总结:

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

# 渗透测试 # web安全 # 系统安全 # 内网渗透 # 漏洞分析
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者