【最新漏洞预警】JDBC新的攻击面:PostgreSQL JDBC Driver RCE&任意文件写入漏洞分析与利用构造

渗透技巧 2年前 (2022) admin
1,294 0 0
漏洞信息


当一个JDBC连接的URL可控时,存在一些攻击套路,在HITB2021SIN的议题中针对H2等数据库Driver的攻击思路进行了共享:


JDBC Attack

https://i.blackhat.com/eu-19/Thursday/eu-19-Zhang-New-Exploit-Technique-In-Java-Deserialization-Attack.pdf


近期Github pgjdbc上爆出了PostgreSQL JDBC Driver在URL可控的情况下存在2个相关漏洞,分别是远程命令执行漏洞CVE-2022-21724以及任意文件写入漏洞:


【最新漏洞预警】JDBC新的攻击面:PostgreSQL JDBC Driver RCE&任意文件写入漏洞分析与利用构造


## 0x01 CVE-2022-21724描述


【最新漏洞预警】JDBC新的攻击面:PostgreSQL JDBC Driver RCE&任意文件写入漏洞分析与利用构造


漏洞影响版本:


  • >= 9.4.1208,< 42.2.25

  • >= 42.3.0,< 42.3.2


从描述来看,PostgreSQL JDBC Driver根据`sslhostnameverifier`、`socketFactory`、`sslfactory`、`sslpasswordcallback`的值来完成实例化操作,但是由于缺少验证,导致可以构造恶意类加载实现RCE。


##0x02 任意文件写入漏洞描述


【最新漏洞预警】JDBC新的攻击面:PostgreSQL JDBC Driver RCE&任意文件写入漏洞分析与利用构造


漏洞影响版本:


  • 42.3.x < 42.3.3

  • 42.1.x


从描述来看,漏洞与pgjdbc集成的日志操作功能有关,通过控制`loggerFile`、`loggerLevel`连接属性,可以造成任意文件写入漏洞。


CVE-2022-21724


为了方便分析,构造一个测试环境。引入`postgresql`:


<!-- https://mvnrepository.com/artifact/org.postgresql/postgresql --><dependency>    <groupId>org.postgresql</groupId>    <artifactId>postgresql</artifactId>    <version>42.3.1</version>


构造如下测试代码:


【最新漏洞预警】JDBC新的攻击面:PostgreSQL JDBC Driver RCE&任意文件写入漏洞分析与利用构造


直接运行,查看报错信息:


【最新漏洞预警】JDBC新的攻击面:PostgreSQL JDBC Driver RCE&任意文件写入漏洞分析与利用构造


提示找不到参数`socketFactoryClass`提供的恶意类`EvilClass`,我们在最后报错的代码处`org.postgresql.core.SocketFactoryFactory#getSocketFactory`打下断点,采用Debug模式运行,触发断点:


【最新漏洞预警】JDBC新的攻击面:PostgreSQL JDBC Driver RCE&任意文件写入漏洞分析与利用构造


进入`ObjectFactory.instantiate`:


【最新漏洞预警】JDBC新的攻击面:PostgreSQL JDBC Driver RCE&任意文件写入漏洞分析与利用构造


这里通过参数`socketFactoryClass`来实例化一个类,采用的构造函数只有一个输入参数来自`socketFactoryArg`,并且为`String`字符串类型。如果我们能在程序运行上下文环境中找到满足这些条件的类,就可能实现恶意操作。回顾Jackson经典的反序列化漏洞CVE-2017-17485,我们可以找到类`org.springframework.context.support.ClassPathXmlApplicationContext`,修改测试代码如下(引入`spring-context-support`):


【最新漏洞预警】JDBC新的攻击面:PostgreSQL JDBC Driver RCE&任意文件写入漏洞分析与利用构造


其中poc.xml内容为:


<beans xmlns="http://www.springframework.org/schema/beans"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xsi:schemaLocation="     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">    <bean id="pb" class="java.lang.ProcessBuilder">        <constructor-arg value="calc" />        <property name="whatever" value="#{ pb.start() }"/>    </bean></beans>


成功实现RCE:


【最新漏洞预警】JDBC新的攻击面:PostgreSQL JDBC Driver RCE&任意文件写入漏洞分析与利用构造


任意文件写入漏洞


参考漏洞通报,构造如下测试代码:


【最新漏洞预警】JDBC新的攻击面:PostgreSQL JDBC Driver RCE&任意文件写入漏洞分析与利用构造


漏洞触发原理比较简单,pgjdbc在连接提供的数据源时,会进行日志操作,将URL写入指定文件,代码位于`org.postgresql.Driver#connect`函数:


【最新漏洞预警】JDBC新的攻击面:PostgreSQL JDBC Driver RCE&任意文件写入漏洞分析与利用构造


进入`setupLoggerFromProperties`函数:


【最新漏洞预警】JDBC新的攻击面:PostgreSQL JDBC Driver RCE&任意文件写入漏洞分析与利用构造


【最新漏洞预警】JDBC新的攻击面:PostgreSQL JDBC Driver RCE&任意文件写入漏洞分析与利用构造


所以可以通过参数`loggerFile`控制日志写入文件的路径和名称。回到`org.postgresql.Driver#connect`函数,完成日志操作初始化后,直接调用`LOGGER.log`将URL写入了日志。由于URL是完全可控的,所以我们可以实现任意文件写入。成功写入的`hack.jsp`文件内容如下:


【最新漏洞预警】JDBC新的攻击面:PostgreSQL JDBC Driver RCE&任意文件写入漏洞分析与利用构造


结合实际Web应用和`../`路径穿越可GetShell。


修复方式


## 0x01 CVE-2022-21724修复方式


【最新漏洞预警】JDBC新的攻击面:PostgreSQL JDBC Driver RCE&任意文件写入漏洞分析与利用构造


【最新漏洞预警】JDBC新的攻击面:PostgreSQL JDBC Driver RCE&任意文件写入漏洞分析与利用构造


限制了输入类型,导致无法调用加载恶意类。


## 0x02 任意文件写入漏洞修复方式


【最新漏洞预警】JDBC新的攻击面:PostgreSQL JDBC Driver RCE&任意文件写入漏洞分析与利用构造


【最新漏洞预警】JDBC新的攻击面:PostgreSQL JDBC Driver RCE&任意文件写入漏洞分析与利用构造


删除了`setupLoggerFromProperties`函数。



由于传播、利用此文档提供的信息而造成任何直接或间接的后果及损害,均由使用本人负责,且听安全团队及文章作者不为此承担任何责任。



点关注,不迷路!

【最新漏洞预警】JDBC新的攻击面:PostgreSQL JDBC Driver RCE&任意文件写入漏洞分析与利用构造

关注公众号回复“漏洞”获取研究环境或工具

原文始发于微信公众号(且听安全):【最新漏洞预警】JDBC新的攻击面:PostgreSQL JDBC Driver RCE&任意文件写入漏洞分析与利用构造

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...