问答
发起
提问
文章
攻防
活动
Toggle navigation
首页
(current)
问答
商城
实战攻防技术
漏洞分析与复现
NEW
活动
摸鱼办
搜索
登录
注册
【Web实战】 Atlassian Confluence CVE-2023-22518/22515 Getshell 速通
漏洞分析
对 CVE-2023-22518 的一波分析
前言&&参考 ============== 前阵子爆出来的评分10.0的Confluence未授权漏洞可谓是比较震撼的,但其实漏洞原理不算复杂,利用的是XframeWork2的getter特性。具体分析可以参考我的往期文章 [Atlassian Confluence CVE-2023-22515 深入浅出 - Boogiepop Doesn’t Laugh](https://boogipop.com/2023/10/16/Atlassian%20Confluence%20CVE-2023-22515%20%E6%B7%B1%E5%85%A5%E6%B5%85%E5%87%BA/) 然后有一些外国佬发了一些不全的验证性质的POC,没有EXP <https://github.com/davidfortytwo/CVE-2023-22518/blob/main/CVE-2023-22518.py> 我就浅浅的分析一下。 漏洞分析 ==== 但只需要给出漏洞的路由,我们就可以进一步去分析,这个POC中给出的路由是 `/json/setup-restore.action` 我们直接到structs.xml文件中去寻找相关的路由 !\[image.png\] ![image.png](https://shs3.b.qianxin.com/attack_forum/2023/11/attach-d9ef12df3aeb2bc68fc54dc35e5f77a6e23f4580.png) 这乍一看就发现了一个Action,进去看看逻辑 ![image.png](https://shs3.b.qianxin.com/attack_forum/2023/11/attach-537e65faf95be9b7bc196bbcabd0f6b01b3f5460.png) 这个接口没有进行鉴权,并且我们可以触发validate方法,他会获取请求体中上传的File,然后带入`getExportDescriptor`方法 ![image.png](https://shs3.b.qianxin.com/attack_forum/2023/11/attach-74e93245ee0e6a260bb15d507fcb479fe4b0ebc4.png) 在这里可以看到参数名是Zip,不难想到让我们上传一个zip文件。 ![image.png](https://shs3.b.qianxin.com/attack_forum/2023/11/attach-eb206afa53230d5bffd7bbed15c342db7d20ebfc.png) 随后创建一个解压类unzipper ![image.png](https://shs3.b.qianxin.com/attack_forum/2023/11/attach-489b32a26ff520ea37add37ce7f04172fb9ab7c6.png) 进行解压操作 ![image.png](https://shs3.b.qianxin.com/attack_forum/2023/11/attach-f0414a60522242b04573230a31a3169af8a0d051.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2023/11/attach-1eaf8a12cf3d0f2844ae6e4bbc7fe75159438b6c.png) 进入saveEntry看看 ![image.png](https://shs3.b.qianxin.com/attack_forum/2023/11/attach-5ad21875c37c94e49f587e622f1e40b86e6c68a5.png) 一开始我以为是zipslip,所以有了下面一个失败的尝试 调试流程分析 ====== ![image.png](https://shs3.b.qianxin.com/attack_forum/2023/11/attach-9a207c7c6a25694b3aa798f997fd48bbcb662104.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2023/11/attach-ebc29d0b8a747849fa72225aa67d70aef328a921.png) 进入我们的断点了已经,这里有个细节,就是我们需要给header加一个 `X-Atlassian-Token=no-check` 往前看堆栈 ![image.png](https://shs3.b.qianxin.com/attack_forum/2023/11/attach-0190020e6e3aa60adee0977cfcba675422944f86.png) 有一个isProtected属性,是由methodRequiresProtection方法赋值的 ![image.png](https://shs3.b.qianxin.com/attack_forum/2023/11/attach-d72a34680f39e6712c5fdae44b2486b97ce1b3d3.png) isOverrideHeaderPresent方法 ![image.png](https://shs3.b.qianxin.com/attack_forum/2023/11/attach-942dfa421a233de4fd87883064471ee90f248c3a.png) 这样isProtected属性就为false了 ![image.png](https://shs3.b.qianxin.com/attack_forum/2023/11/attach-b32c67a10152d4462d05ad448561ebb4685f9c03.png) 因此我们才有接下来的调用哦。那我们继续看解压流程 ![image.png](https://shs3.b.qianxin.com/attack_forum/2023/11/attach-d31d010f461170d4ef70f6f40242bd2e5a0d6946.png) 在这里会创建一个缓存文件夹,存放zip的位置 ![image.png](https://shs3.b.qianxin.com/attack_forum/2023/11/attach-9a7b3bc7e2dbc1806238f7fa8a84017334c6742a.png) 确实是有这东西,继续往下看 ![image.png](https://shs3.b.qianxin.com/attack_forum/2023/11/attach-b138464c4c2a2670b7b6d7308b394ebd05f17c6b.png) 这里会读取zip文件里有没有exportDescriptor.properties这个文件 ![image.png](https://shs3.b.qianxin.com/attack_forum/2023/11/attach-22a3dd56aca5033bf1d17ec041e8037b94d949f9.png) 这里我的zip文件并没有他,因此就寄掉了,我们加上这个文件再来一遍 ![image.png](https://shs3.b.qianxin.com/attack_forum/2023/11/attach-98d4fc8c0a1f2951de8c30e3c4ef2cd5f5a61e98.png) 很好这次是成功获取咯。 然后经过多次尝试,properties有几个必要的属性 - exportType - createdByBuildNumber - buildNumber 其中我们要让exportType=ALL,这样才可以进入接下来的execute流程 并且这个zip需要一个entities.xml,而且这个entities.xml需要一定的配置,到这里我就去网上搜了一下这个文件,然后才知道,哦,原来这就是confluence的备份文件zip ![image.png](https://shs3.b.qianxin.com/attack_forum/2023/11/attach-b99c301523aa64e33f2a6a4019bbe9a872a9da13.png) 然后这个也就是数据恢复接口未授权访问。恍然大悟的我发现哪里来的那么多操作,直接自己本地准备个备份文件,然后给目标上传复原,管理员密码就是自己的了。 对于这个路由为什么是未授权的,其实就是stucts.xml配置错误问题了 ![image.png](https://shs3.b.qianxin.com/attack_forum/2023/11/attach-11a901e2ac5201bbe59a4c995e39a1e5db0ff36e.png) `/json`路由继承了admin路由,导致不需要鉴权也可以访问管理员权限的接口 ![image.png](https://shs3.b.qianxin.com/attack_forum/2023/11/attach-1a3ec9aab1cfb1f7bcb51c3314f64eb8573a8b06.png) 我们直接post界面请求就可以进入该界面了。 正确的Getshell方法 ============= 这里我准备2个confluence,一个搭建在我的虚拟机里,一个搭建在本地 > 虚拟机管理员用户密码为 > kino/kino123 > 本机管理员用户密码为 > admin/admin 我们现在需要做的事利用本机的confluence获取一份备份文件,鉴于严谨,这边选择把版本对应起来,都是8.5.1 ![image.png](https://shs3.b.qianxin.com/attack_forum/2023/11/attach-a7e3283a0e3da2e36eaaaccb942a8d9d34b8b974.png) 在官网备份有2种备份文件,第一种就是设置里面->备份与恢复->导出站点 他得到的文件是restore打头的 ![image.png](https://shs3.b.qianxin.com/attack_forum/2023/11/attach-45f89897b88098c8b31fe56340db3f8255271547.png) 其中exportType为site,通过上述调试流程的判断,我们需要让exportType为ALL,因此我们选用另一个导出方案 `/json/backup.action` ![image.png](https://shs3.b.qianxin.com/attack_forum/2023/11/attach-dad9db1e33d8a455880de071c31628451ce51d0f.png) 这个备份文件中主要内容是在entities.xml里,我们可以粗略的看看 ![image.png](https://shs3.b.qianxin.com/attack_forum/2023/11/attach-219c0507009f1d38290b282295fadcafd6417a51.png) 这样导出的就是all了,之后我们进行覆盖。 ![image.png](https://shs3.b.qianxin.com/attack_forum/2023/11/attach-cf13198cf70179db7a71ebea50647753786d63bf.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2023/11/attach-4a4c087c32089f301994af3202287fa8f5d3b60a.png) 然后等待一会儿,就可以发现用户名密码和空间内容被我们覆盖 ![image.png](https://shs3.b.qianxin.com/attack_forum/2023/11/attach-682ea16c83e20fddf7e55517f9fea2789ede78d8.png) ^^,然后就是rce的问题 后台插件RCE ------- <https://github.com/AIex-3/confluence-hack/tree/main> 后台提供了插件功能 ![image.png](https://shs3.b.qianxin.com/attack_forum/2023/11/attach-b7147bb18bc4ea2707317926affe1c04ff2dbfc0.png) 我们可以上传自定义插件,github上有人做了一个恶意插件 ![image.png](https://shs3.b.qianxin.com/attack_forum/2023/11/attach-d87088b8bd011cdd60083ad5bc71eff5843d7695.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2023/11/attach-c0abbbd1fa16d7b318676502de69f5e3c848febb.png) 成功rce咯~CVE-2023-22515也是这样后台RCE的,但这个毕竟不是完整的TTY,假如服务不出网,我们还是需要修改一下插件的,最好能哥斯拉连接这样子。不过理论应该是可以的,只需要修改下逻辑- - 看了一下它的源码 ![image.png](https://shs3.b.qianxin.com/attack_forum/2023/11/attach-4021f6cfb32464e35ac1f8b205060ef3d1ad4993.png) 就是一个单纯的马,咱们传一个哥斯拉的马就行了OVO 失败的Getshell尝试 ============= 再说说失败的getshell方式吧,一开始我是逆向分析的,而不是正向分析的,因为当时不知道confluence有备份文件这东西,所以就自己手动构造了一下zip包,也是希望这个失败的思路可以给大家一点思路,个人觉得还是比较有趣的。这里就说一下我逆向的思路 ![image.png](https://shs3.b.qianxin.com/attack_forum/2023/11/attach-b4e5538bd2a2b6163f8e95c1cef92735cbd78b3a.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2023/11/attach-096af7f11ec4987b635d23354414bba1cfcf2acc.png) 我准备了一个zipslip的压缩包,由于上面说到了这个zip需要entities.xml和properties属性文件,然后xml就是随便给了一个大标签,是没有任何内容的,紧接着就进入断点判断了。 获取到了属性文件properties就会进入doRestore方法去进行恢复 ![image.png](https://shs3.b.qianxin.com/attack_forum/2023/11/attach-bc8d16170f3ea00f91a587917f5655194b6dc333.png) 这个isSynchronous就是我们get传入的参数,我们要让他为true才可以进入task.run ![image.png](https://shs3.b.qianxin.com/attack_forum/2023/11/attach-93a51622f43c802b06055f884311c5641f04ee26.png) 这个context是一个DefalutImportContext对象,所以之后task.run运行的逻辑应该在里面 ![image.png](https://shs3.b.qianxin.com/attack_forum/2023/11/attach-e154f5655e94a24f543558519b9fee5ea6b02877.png) 进入了doImport方法,然后有个preImport进行解压处理。 ![image.png](https://shs3.b.qianxin.com/attack_forum/2023/11/attach-ad24a84e6aa10e5bbc396500d3335ca96fafbfe4.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2023/11/attach-a7abc2ac8b7293a30c1f496491b6223563edb748.png) 最后自然就到了unzip方法 ![image.png](https://shs3.b.qianxin.com/attack_forum/2023/11/attach-d887ff9c8d517ea156170f71cc916852d77ee2cb.png) 我以为在SaveEntity这里可以进行zipslip操作的。QWQ ![image.png](https://shs3.b.qianxin.com/attack_forum/2023/11/attach-331b8bbc3e854e27cf7e822ca190b7cf7c5e908d.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2023/11/attach-d4dc06f7d6fc6f8bbcf1aca6e2c3781c893afd4b.png) 结果有一层判断isChildOf,导致我们的zipslip失败呜呜呜呜 总结 == 总得来说这漏洞是一个自爆式百分百损失的漏洞,你假如想用,那么就拿不到服务器那边原来的数据,而我们打Confluence的站一般都是去看他的文库数据,而不是获取这个站点的shell,这是一种比较极端的利用方式,不太建议使用,除非已知文库没啥东西,就是想要这个shell。
发表于 2023-11-13 10:07:47
阅读 ( 20796 )
分类:
漏洞分析
2 推荐
收藏
0 条评论
请先
登录
后评论
Nookipop
4 篇文章
×
发送私信
请先
登录
后发送私信
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!