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

CVE-2016-20024 ZKTeco ZKTime.Net 不安全文件权限权限提升漏洞

披露日期: 2026-03-16

漏洞信息

漏洞编号
CVE-2016-20024
漏洞类型
不安全文件权限
CVSS评分
9.8 严重
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
ZKTeco ZKTime.Net 3.0.1.6

相关标签

不安全文件权限权限提升本地提权ZKTecoZKTime.Net考勤系统Windows特权提升CVSS 9.8CVE-2016-20024文件权限配置错误

漏洞概述

CVE-2016-20024是ZKTeco公司开发的ZKTime.Net时间管理考勤系统3.0.1.6版本中存在的一个高危安全漏洞。该漏洞属于不安全文件权限(Insecure File Permissions)类型,攻击者可利用系统中ZKTimeNet3.0目录及其内容存在的世界可写(world-writable)权限配置缺陷,实现本地权限提升攻击。具体而言,系统中关键目录和可执行文件被配置为允许任何用户(包括非特权用户)进行写入操作,攻击者可以通过替换合法的可执行文件为恶意二进制程序,当系统管理员或高权限用户运行这些被篡改的程序时,攻击者即可获得系统高级权限。由于该漏洞的CVSS评分高达9.8分,属于严重级别,且攻击向量为网络形式,无需认证即可利用,对企业内网安全构成严重威胁。建议受影响的用户尽快采取修复措施,更新系统到最新版本或应用官方发布的安全补丁。

技术细节

该漏洞的根本原因在于ZKTeco ZKTime.Net 3.0.1.6在安装过程中对ZKTimeNet3.0目录及其子目录和文件设置了过于宽松的文件权限。具体表现为目录和可执行文件具有世界可写(777或类似)权限,这意味着系统上的任何用户,无论其权限级别如何,都可以对这些文件进行读取、写入和执行操作。攻击者利用此漏洞的攻击流程如下:首先,攻击者通过低权限账户登录目标系统,识别出ZKTime.Net的安装目录位置,通常位于C:\Program Files\ZKTimeNet3.0或类似路径;其次,攻击者检查该目录下的可执行文件权限,确认是否存在世界可写权限;接着,攻击者创建或下载一个恶意可执行文件,该文件可能是后门程序、命令 shell 或其他恶意代码;然后,攻击者利用文件替换或覆盖的方式,用恶意文件替换原有的合法可执行文件;最后,当具有管理员权限的用户或系统服务启动被篡改的可执行文件时,恶意代码将以高权限上下文执行,从而实现权限提升。攻击者获得高权限后,可以进一步进行数据窃取、横向移动或部署持久化后门等恶意活动。

攻击链分析

STEP 1
步骤1
信息收集:攻击者获取目标系统的低权限访问权限后,开始识别ZKTime.Net的安装目录位置,通常位于C:\Program Files\ZKTimeNet3.0或类似路径
STEP 2
步骤2
权限检查:攻击者使用Windows icacls命令或类似工具检查ZKTimeNet3.0目录及其内容(如.exe、.dll文件)的访问控制列表,确认是否存在世界可写(Everyone/Users组具有写权限)权限配置
STEP 3
步骤3
恶意文件准备:攻击者创建或下载恶意可执行文件,可以是反弹shell程序、命令执行后门或其他恶意二进制代码,并确保文件具有可执行权限
STEP 4
步骤4
文件替换:利用目录和文件的世界可写权限,攻击者将原始的合法可执行文件(如ZKTimeNet.exe)备份,并使用恶意文件进行替换
STEP 5
步骤5
触发执行:等待系统管理员或高权限服务账户登录系统并启动被篡改的可执行文件,或者通过计划任务、服务重启等方式触发恶意代码执行
STEP 6
步骤6
权限获取:恶意代码以高权限(通常是SYSTEM或管理员权限)上下文执行,攻击者成功获得系统高级权限,实现权限提升攻击
STEP 7
步骤7
持久化控制:攻击者利用获得的高权限进行横向移动、部署后门、窃取敏感数据或进一步渗透内网其他系统

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 """ CVE-2016-20024 PoC - ZKTeco ZKTime.Net Insecure File Permissions This script checks for world-writable permissions on ZKTime.Net installation directory. Note: This is for educational and authorized security testing purposes only. """ import os import stat import platform from pathlib import Path def check_file_permissions(filepath): """Check if file has world-writable permissions""" try: file_stat = os.stat(filepath) mode = file_stat.st_mode # Check world-write permission (0o002) world_write = mode & stat.S_IWOTH # Check world-read permission (0o004) world_read = mode & stat.S_IROTH # Check world-execute permission (0o001) world_exec = mode & stat.S_IXOTH return { 'path': filepath, 'world_read': bool(world_read), 'world_write': bool(world_write), 'world_exec': bool(world_exec), 'is_vulnerable': bool(world_write) } except Exception as e: return {'path': filepath, 'error': str(e)} def find_zktime_installation(): """Try to find ZKTime.Net installation directory""" possible_paths = [] if platform.system() == 'Windows': program_files = os.environ.get('ProgramFiles', 'C:\\Program Files') program_files_x86 = os.environ.get('ProgramFiles(x86)', 'C:\\Program Files (x86)') possible_paths = [ os.path.join(program_files, 'ZKTimeNet3.0'), os.path.join(program_files_x86, 'ZKTimeNet3.0'), 'C:\\Program Files\\ZKTimeNet3.0', 'C:\\Program Files (x86)\\ZKTimeNet3.0' ] found_paths = [] for path in possible_paths: if os.path.exists(path): found_paths.append(path) return found_paths def exploit_zktime_privilege_escalation(target_exe, malicious_exe): """ Simulate privilege escalation via file replacement WARNING: This is for authorized testing only """ print(f"[*] Target executable: {target_exe}") print(f"[*] Malicious executable: {malicious_exe}") if not os.path.exists(target_exe): print("[-] Target executable not found") return False if not os.path.exists(malicious_exe): print("[-] Malicious executable not found") return False # Check if target is world-writable result = check_file_permissions(target_exe) if result.get('is_vulnerable'): print("[!] VULNERABLE: Target file has world-write permission") print(f"[*] Exploitation possible - attacker can replace {target_exe}") return True else: print("[-] Target file is not vulnerable") return False def main(): print("=" * 60) print("CVE-2016-20024 PoC - ZKTeco ZKTime.Net") print("Insecure File Permissions Privilege Escalation") print("=" * 60) # Find installation print("\n[*] Searching for ZKTime.Net installation...") installations = find_zktime_installation() if not installations: print("[-] ZKTime.Net installation not found") print("[*] Manual check required") return for install_path in installations: print(f"\n[+] Found installation: {install_path}") # Check common executables common_exes = ['ZKTimeNet.exe', 'ZKTimeService.exe', 'TimeServer.exe'] for exe in common_exes: exe_path = os.path.join(install_path, exe) if os.path.exists(exe_path): result = check_file_permissions(exe_path) print(f"\n[*] Checking: {exe_path}") print(f" World-Read: {result['world_read']}") print(f" World-Write: {result['world_write']}") print(f" World-Execute: {result['world_exec']}") if result['is_vulnerable']: print(f" [!] VULNERABLE - Privilege escalation possible!") if __name__ == '__main__': main()

影响范围

ZKTeco ZKTime.Net 3.0.1.6及之前版本

防御指南

临时缓解措施
在官方补丁发布之前,可采取以下临时缓解措施:首先,立即使用Windows内置的icacls命令修复ZKTimeNet3.0目录的不安全权限,执行命令'icacls "C:\Program Files\ZKTimeNet3.0" /inheritance:r /grant:r "Administrators:F" "SYSTEM:F" /T'以移除继承权限并仅保留管理员和SYSTEM完全控制权;其次,限制用户对ZKTime.Net安装目录的访问权限,确保普通用户无法写入可执行文件;再次,监控计划任务和服务配置,防止恶意文件被自动执行;最后,增强终端防护能力,部署EDR工具实时检测异常的文件修改和进程执行行为。建议在测试环境中验证修复措施不会影响ZKTime.Net的正常运行功能后再部署到生产环境。

参考链接

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