Windows PDF 服务器修复 Ghostcat 与 SWEET32 漏洞实测
文章目录18 节
这次在一台 Windows PDF 服务器上处理了两个漏洞:Tomcat AJP 端口存在 CVE-2020-1938 (Ghostcat),Windows 远程桌面的 TLS 服务支持 DES/3DES,存在 CVE-2016-2183 (SWEET32) 风险。
业务已确认不使用 AJP 功能,因此本次采用的方法是:关闭未使用的 8009 端口,并在 Windows Schannel 中禁用 DES/3DES。两项调整已在测试环境完成验证,PDF 业务和远程桌面均正常。
适用范围
本文适用于以下场景:
- Windows Server 上的业务系统自带 Tomcat,并监听 AJP 8009 端口。
- 业务和软件维保已确认没有使用 AJP 转发或负载均衡。
- 漏洞扫描在 3389 端口检出 DES/3DES 密码套件。
- 可以安排 Windows 重启窗口,并具备本地控制台或带外管理通道。
本次现场使用的 Tomcat 目录为:
E:\apache-tomcat-6.0.29这是本次环境的实际路径,不是 Tomcat 的固定安装位置。其他环境需要替换为实际路径。
变更前确认
在修改配置前,先完成以下检查:
- 业务部门和软件维保确认 AJP 模块没有使用。
- 确认已经取得业务验证窗口和 Windows 重启窗口。
- 确认本地控制台或 iLO/iDRAC 等带外入口可用,避免 Schannel 调整异常时无法通过 RDP 回退。
- 记录 8009 和 3389 的当前监听状态:
:: 确认 AJP 8009 是否监听
netstat -ano | findstr ":8009"
:: 确认 RDP 3389 是否监听
netstat -ano | findstr ":3389"处理 Ghostcat: 关闭未使用的 AJP
1. 备份 server.xml
本次需要修改的文件为:
E:\apache-tomcat-6.0.29\conf\server.xml修改前先复制一份备份,例如:
:: Tomcat 路径必须按实际环境修改
copy "E:\apache-tomcat-6.0.29\conf\server.xml" "E:\apache-tomcat-6.0.29\conf\server.xml.bak"2. 注释 AJP Connector
在 server.xml 中找到 8009 端口对应的 AJP Connector:
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>使用 XML 注释将整个 Connector 包起来:
<!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/> -->只处理 protocol="AJP/1.3" 的 Connector,不要修改 8080 或 8443 对应的 HTTP/HTTPS Connector。保存后确认文件名仍为 server.xml,没有被文本编辑器另存为 server.xml.txt。
3. 确认 Tomcat 的重启方式
这台服务器使用 HouSoft 定时执行 restarttomcat.bat。脚本的主要内容如下:
set CATALINA_HOME=E:\apache-tomcat-6.0.29
taskkill /f /t /im java.exe
call %CATALINA_HOME%\bin\shutdown.bat
ping -n 3 localhost > nul
call %CATALINA_HOME%\bin\startup.bat
exit其中这条命令会强制结束服务器上所有 java.exe 进程:
taskkill /f /t /im java.exe因此,不要在未盘点 Java 进程的情况下手工执行该脚本。先使用以下只读命令确认是否还有其他 Java 业务:
:: 查看所有 Java 进程
tasklist /fi "imagename eq java.exe"
:: 老版 Windows Server 可用 WMIC 查看进程路径和启动参数
wmic process where "name='java.exe' or name='javaw.exe'" get ProcessId,ParentProcessId,ExecutablePath,CommandLine如果服务器上还有其他 Java 程序,应由业务维保确定正确的 Tomcat 停启方式,不应直接杀掉所有 Java 进程。
处理 SWEET32: 禁用 Schannel DES/3DES
本次扫描在 TCP 3389 端口检出 SWEET32。3389 是 Windows 远程桌面端口,加密能力由 Windows Schannel 提供,与 PDF 软件自身的 OpenSSL 配置不是一回事。
1. 备份 Schannel 注册表
在管理员 CMD 中执行:
:: 备份 Schannel 配置到 C:\SCHANNEL-backup.reg
reg export "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL" C:\SCHANNEL-backup.reg /y出现“操作成功完成”后,确认 C:\SCHANNEL-backup.reg 已生成。
同时记录两个密码算法子项在变更前是否存在、Enabled 的原始值是什么。这一步是为了区分“恢复原值”和“删除本次新建的子项”:
:: 子项不存在时会提示找不到,记录该结果即可
reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\Triple DES 168"
reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\DES 56/56"2. 禁用 Triple DES 和 DES
在同一个管理员 CMD 中逐条执行:
:: 禁用 Triple DES 168
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\Triple DES 168" /v Enabled /t REG_DWORD /d 0 /f
:: 禁用 DES 56/56
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\DES 56/56" /v Enabled /t REG_DWORD /d 0 /f这两条命令会在子项不存在时自动创建子项,并将 Enabled 设为 REG_DWORD 0。这是 Schannel 系统级变更,会影响该服务器上所有使用 Schannel 的服务,不只是 RDP。
这是本次旧版 Windows Server 测试环境验证的方法。较新的 Windows Server 应先确认 TLS 密码套件是否由域组策略、MDM 或 PowerShell 统一管理;如果存在上级策略,本地配置可能被重新覆盖。
3. 检查写入结果
:: 两项的 Enabled 都应显示为 REG_DWORD 0x0
reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\Triple DES 168"
reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\DES 56/56"此时只能说明注册表已经写入,Schannel 需要重启 Windows 后才能完整加载新配置。
重启与验证
本次同时修改了 Tomcat 和 Schannel 配置,因此在变更窗口内重启 Windows 服务器,让两项配置一次生效。
重启前需要完成以下盘点:
- PDF 服务、HouSoft 和 Tomcat 是否随系统自动启动。
- 服务器上是否还有其他 Java 程序需要手工恢复。
- PDF 上传、转换、预览和下载等关键业务的验证人员已就位。
- 本地控制台或带外管理入口可用。
重启完成后按以下顺序验证。
1. 验证 AJP 8009
netstat -ano | findstr ":8009"预期没有输出,表示 Tomcat 已不再监听 8009。
2. 验证 RDP 3389
netstat -ano | findstr ":3389"预期 3389 仍处于 LISTENING 状态。再使用正常运维客户端完成一次 RDP 登录,确认远程管理正常。
部分较新的 Windows Server 支持以下 PowerShell 命令:
# 检查系统密码套件列表中是否还有 DES/3DES
Get-TlsCipherSuite | Where-Object { $_.Name -match '3DES|DES' }这条命令只是辅助检查。如果仍列出 3DES,需继续检查本地或域组策略中的 TLS 密码套件顺序;如果提示找不到 Get-TlsCipherSuite,说明当前 Windows 版本不支持该命令。无论输出如何,都应以 3389 端口的实际握手结果或原漏洞扫描器复扫作为最终证据。
3. 验证 PDF 业务
本次测试环境的验证结果为:
| 验证项 | 结果 |
|---|---|
| 8009 端口 | 已停止监听 |
| 3389 端口 | 仍正常监听 |
| RDP 登录 | 正常 |
| PDF 业务 | 正常 |
4. 漏洞复扫
注册表查询只能证明“已写入禁用配置”,不能单独证明 3389 已经不再接受 3DES。最终应使用原漏洞扫描器复扫,确认以下风险不再报出:
CVE-2020-1938
CVE-2016-2183
TLS_RSA_WITH_3DES_EDE_CBC_SHA回退方法
如果 Tomcat 启动或 PDF 业务出现异常:
- 将备份的
server.xml.bak恢复为server.xml。 - 使用业务维保确认的方式重启 Tomcat。
- 确认 8009 恢复监听并重新验证 PDF 业务。
如果禁用 DES/3DES 后出现 RDP 或其他 Schannel 业务兼容问题,应根据变更前的查询结果回退:
- 如果子项原本存在,恢复
Enabled的原始值。 - 如果子项是本次新建的,在本地控制台或带外管理中删除本次新建的子项:
reg delete "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\Triple DES 168" /f
reg delete "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\DES 56/56" /f变更前导出的文件仍应保留,可用于恢复原有的 Schannel 值:
:: 导入变更前备份的 Schannel 注册表
reg import C:\SCHANNEL-backup.reg注意,导入 .reg 文件不会自动删除备份之后新建的子项,因此不能只导入备份就认为已完整回退。完成回退后需要再次重启 Windows,然后验证 RDP、PDF 业务和其他使用 Schannel 的服务。
实测结论
在已确认业务不使用 AJP 的前提下,注释 8009 对应的 AJP Connector 可以直接消除该端口的 Ghostcat 暴露面。在 Schannel 中禁用 DES/3DES 后,测试环境的 RDP 登录和 PDF 业务均未受影响。
需要注意,本次环境使用的 Tomcat 6.0.29 已经停止维护。关闭未使用的 AJP 解决的是本次 8009/Ghostcat 暴露问题,不代表这个 Tomcat 版本已经完成整体安全升级。后续如需升级,应使用 PDF 软件厂商提供的兼容版本或补丁,不宜直接手工替换内置 Tomcat 目录。