四月中旬,我向Apache Tomcat发送了三份拒绝服务漏洞的报告:
随便写一下CVE-2022-29885的内容,官方对此漏洞定义只是低危
目前官方没有给出修复代码,仅认为是文档的问题,降低了对EncryptInterceptor
的安全描述
Tomcat集群之间的通讯需要配置NioReceiver
xxxxxxxxxx
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster">
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="0.0.0.0"
port="5000"
selectorTimeout="100"
maxThreads="6"/>
</Channel>
</Cluster>
以上是不安全的配置,在这种情况下黑客自己建立的Tomcat节点可以打集群中的目标并RCE,由于ClassLoader
的限制仅7U21
和8U20
的Gadget
生效:
正如作者师傅所说:Tomcat集群管理中并没有注册和管理中心,子节点加入集群不需要进行校验,所以黑客可以伪装Tomcat节点对集群其他节点进行攻击
官方其实考虑到了这种问题:Tomcat Cluster
文档的意思简单概括:请确保Tomcat集群拥有安全的网络环境,并且Tomcat的EncryptInterceptor
配置可以提供安全性,于是想到从这一点入手
安全的集群配置应该如下
xxxxxxxxxx
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster">
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="0.0.0.0"
port="5000"
selectorTimeout="100"
maxThreads="6"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.EncryptInterceptor"
encryptionAlgorithm="AES/CBC/PKCS5Padding"
encryptionKey="YOUR_KEY(LENGTH:32)"/>
</Channel>
</Cluster>
在Tomcat收到消息后,反序列化数据前,执行该类的messageReceived
方法验证
xxxxxxxxxx
public void messageReceived(ChannelMessage msg) {
try {
byte[] data = msg.getMessage().getBytes();
// 对数据进行解密
data = encryptionManager.decrypt(data);
XByteBuffer xbb = msg.getMessage();
xbb.clear();
xbb.append(data, 0, data.length);
// 进行反序列化数据等步骤
super.messageReceived(msg);
} catch (GeneralSecurityException gse) {
log.error(sm.getString("encryptInterceptor.decrypt.failed"), gse);
}
}
如果黑客不知道目标AES
加密的KEY
将会导致抛出异常,无法进行反序列化,以防止RCE
因此有两种可能造成拒绝服务漏洞的情况:
decrypt
对字节数组进行解密时触发xbb.append
初始化数据时候触发最终的POC
就不放出了,并且这也不是什么有意义的洞,没有必要过多关注
危害:
虽然是鸡肋垃圾洞,不过也算达成了去年立下的目标:拿下Tomcat和Spring的CVE
下一个目标:挖到不垃圾的洞