阅读视图

发现新文章,点击刷新页面。

破解企业安全软件网络拦截实战记录

一、背景与现象

问题描述

image.png 个人电脑访问某技术网站时,被企业安全软件(零信任安全架构)拦截,提示:

"您访问的站点或应用因不合规,企业安全软件 已自动拦截此次访问"

关键特征

  • 这是个人电脑,未连接公司 VPN,未访问公司内网
  • 浏览器和系统设置中看不到任何代理配置
  • 重启电脑后问题依然存在

二、排查与分析过程

第一阶段:DNS 层面排查

初始假设:DNS 被劫持到企业服务器

$ scutil --dns | grep nameserver
nameserver[0] : 10.x.x.x  ← 企业 DNS
nameserver[0] : 192.168.0.1

尝试修复

  • 修改 /etc/resolv.conf失败,文件被自动恢复
  • 使用 chflags schg 锁定文件 → 失败,企业安全软件 有更高权限
  • 创建 cron 定时任务每分钟修复 → 失败,治标不治本

关键发现/etc/resolv.conf 是一个符号链接,指向 /var/run/resolv.conf

$ ls -la /etc/resolv.conf
lrwxr-xr-x  1 root  wheel  22  /etc/resolv.conf -> ../var/run/resolv.conf

突破:删除链接,创建真实文件并锁定

sudo rm /etc/resolv.conf
echo "nameserver 192.168.0.1" | sudo tee /etc/resolv.conf
sudo chflags schg /etc/resolv.conf

结果:DNS 正确了,但仍然被拦截


第二阶段:路由层面排查

检查路由表

$ netstat -nr | grep 10.x
10.x.x.x         10.x.x.x         UH              utun0
30.0.0.1/32        10.x.x.x         UGSc            utun0
198.18.0/16        10.x.x.x         UGSc            utun0

关键发现utun0 是一个 VPN 隧道接口,所有流量被路由到企业服务器!

术语解释:路由表中的地址含义

$ netstat -nr | grep 10.x
10.x.x.x         10.x.x.x         UH              utun0
30.0.0.1/32        10.x.x.x         UGSc            utun0
198.18.0/16        10.x.x.x         UGSc            utun0
地址 含义 作用
10.x.x.x 企业安全软件 企业网关 这是企业 零信任架构 服务器的入口地址,类似 VPN 服务器的 IP
30.0.0.1/32 特定应用路由 某些企业应用(如企业微信、OA 系统)强制走这个网关
198.18.0/16 全流量劫持网段 这是一个保留地址段,企业安全软件 用它拦截所有外网流量

通俗理解

  • 正常情况下,你访问 某网盘网站 → 直接走家用路由器 → 互联网
  • 被劫持后,流量走向:你 → 198.18.0/16 路由 → 10.x.x.x 企业网关 → 企业安全审查 → 可能放行/拦截

术语解释:VPN 隧道接口(utun0)

utun0 是什么?

  • utun = User Tunnel(用户隧道)
  • 它是 macOS 创建的一个虚拟网络接口,和物理网卡(Wi-Fi 网卡 en0)并列
  • 作用:把所有网络流量"打包"送进企业服务器,就像挖了一条"隧道"
正常网络:  App → Wi-Fi 网卡(en0) → 路由器 → 互联网
                    ↓
企业安全软件 劫持: App → utun0(虚拟隧道) → 企业服务器 → 互联网/拦截

为什么"退出 VPN"还能被劫持?

普通 VPN

  • 在菜单栏点"断开" → VPN 关闭 → 路由表清理 → 网络恢复

企业安全软件 零信任

  • 所谓的"退出"只是隐藏了界面图标
  • com.企业安全.sase.helper 守护进程仍在后台运行
  • 自动维护 utun0 接口,一旦发现被关闭,立即重建
  • 这种设计是为了"安全"——确保员工无法绕过企业监控

尝试关闭

sudo ifconfig utun0 down

结果:utun0 被自动重新创建,背后有守护进程在维护


第三阶段:进程层面排查

查找幕后进程

$ ps aux | grep -iE "(enterprise|sase|某企业)"
root  120  /Library/PrivilegedHelperTools/com.企业安全.sase.helper

关键发现com.企业安全.sase.helper 是一个 Privileged Helper Tool(特权助手工具),拥有系统最高权限,即使退出主程序,它依然在后台运行。

最终解决

# 停止守护进程
sudo launchctl unload /Library/LaunchDaemons/com.企业安全.sase.helper.plist
sudo pkill -f com.企业安全.sase.helper

# 关闭隧道接口
sudo ifconfig utun0 down

# 禁用开机自启
sudo launchctl disable system/com.企业安全.sase.helper

结果:🎉 成功! 网络恢复正常,不再被拦截


三、原理剖析

企业安全软件/零信任架构 的多层拦截机制

企业零信任安全软件通过五层架构实现流量劫持:

┌─────────────────────────────────────────┐
│  第5层:应用层    │ 浏览器插件、证书注入    │
├─────────────────────────────────────────┤
│  第4层:传输层    │ 代理设置、PAC 自动配置  │
├─────────────────────────────────────────┤
│  第3层:网络层    │ 路由表劫持 (utun0)     │
├─────────────────────────────────────────┤
│  第2层:DNS 层   │ resolv.conf 篡改       │
├─────────────────────────────────────────┤
│  第1层:系统层    │ 守护进程监控、自恢复    │
└─────────────────────────────────────────┘

各层工作机制

层级 机制 目的
DNS 层 修改 /etc/resolv.conf 指向企业 DNS 域名解析监控
路由层 创建 utun0 虚拟接口,添加路由表 流量强制转发
系统层 com.企业安全.sase.helper 守护进程 持久化控制、自修复

什么是 /etc/resolv.conf

这是类 Unix 系统(macOS/Linux)的 DNS 配置文件,告诉系统去哪里查询域名对应的 IP。

正常流程:
你输入 某网盘网站 → 系统查 /etc/resolv.conf → 问家用路由器(192.168.0.1) → 返回 IP → 访问网站

被劫持后:
你输入 某网盘网站 → 系统查 /etc/resolv.conf → 问企业 DNS(10.x.x.x) → 企业说"这是非法网站" → 拦截

为什么修改它没用?

  • 企业安全软件 的守护进程会每秒检测这个文件
  • 一旦发现被改了,立即恢复成企业 DNS
  • 它还把这个文件做成符号链接,指向一个 企业安全软件 控制的动态文件

什么是 PrivilegedHelperTools?

macOS 的一种特权助手机制

  • 普通 App 没有权限修改系统网络配置
  • 但 App 可以安装 Helper Tool,获得 root 权限
  • 即使主 App 退出,Helper 仍在后台运行
  • 这是 企业安全软件 能"阴魂不散"的根本原因

为什么简单退出无效?

普通用户退出 企业安全软件 应用,只是关闭了界面程序,而以下组件依然在运行:

  • PrivilegedHelperTools:系统级特权进程
  • LaunchDaemons:开机自启守护进程
  • 网络扩展:内核级网络过滤

四、完整解决方案

方案 A:手动命令

# 1. 停止 零信任架构 守护进程
sudo launchctl unload /Library/LaunchDaemons/com.企业安全.sase.helper.plist
sudo pkill -f com.企业安全.sase.helper

# 2. 关闭 VPN 隧道
sudo ifconfig utun0 down

# 3. 修复 DNS(删除链接,创建真实文件)
sudo rm /etc/resolv.conf
echo "nameserver 192.168.0.1" | sudo tee /etc/resolv.conf
sudo chflags schg /etc/resolv.conf

# 4. 禁用开机自启
sudo launchctl disable system/com.企业安全.sase.helper

# 5. 刷新网络
sudo dscacheutil -flushcache

方案 B:自动化脚本

创建两个便捷脚本,随时切换:

disable-enterprise.sh - 禁用拦截

#!/bin/bash
sudo launchctl unload /Library/LaunchDaemons/com.企业安全.sase.helper.plist
sudo pkill -f com.企业安全.sase.helper
sudo ifconfig utun0 down 2>/dev/null
sudo rm -f /etc/resolv.conf
echo "nameserver 192.168.0.1" | sudo tee /etc/resolv.conf
sudo chflags schg /etc/resolv.conf
sudo launchctl disable system/com.企业安全.sase.helper
echo "企业安全软件 已禁用"

enable-enterprise.sh - 恢复企业网络

#!/bin/bash
sudo chflags noschg /etc/resolv.conf 2>/dev/null
sudo ln -sf /var/run/resolv.conf /etc/resolv.conf
sudo launchctl enable system/com.企业安全.sase.helper
sudo launchctl load /Library/LaunchDaemons/com.企业安全.sase.helper.plist
echo "企业安全软件 已恢复"

五、企业安全软件拦截手段总结

常见拦截技术

技术手段 检测命令 解决思路
DNS 劫持 scutil --dns cat /etc/resolv.conf 修改 DNS 为公共 DNS,锁定文件
路由劫持 netstat -nr ifconfig 删除企业路由,关闭虚拟接口
代理设置 networksetup -getwebproxy 关闭自动代理配置
系统扩展 systemextensionsctl list 卸载网络过滤扩展
证书注入 钥匙串访问 → 系统根证书 删除企业根证书
守护进程 ps aux launchctl list 停止并禁用 LaunchDaemon

本次案例的拦截技术分析

技术手段 本次是否涉及 严重程度 说明
DNS 劫持 ✅ 涉及 ⭐⭐⭐ 修改 resolv.conf 指向企业 DNS
路由劫持 主要 ⭐⭐⭐⭐⭐ 创建 utun0 隧道接口劫持所有流量
代理设置 ❌ 未涉及 - 未修改系统代理配置
系统扩展 ❌ 未涉及 - 未安装网络过滤扩展
证书注入 ❌ 未涉及 - 未进行 HTTPS 中间人攻击
Hosts 劫持 ❌ 未涉及 - hosts 文件未被修改
守护进程 ✅ 涉及 ⭐⭐⭐⭐⭐ PrivilegedHelperTool 持续监控和修复

结论:本次属于 "路由劫持 + 守护进程控制" 的组合拦截,是最顽固的一种形式。


其他拦截技术的详细解决方案

1. 代理设置劫持(HTTP/HTTPS 代理)

原理:修改系统代理设置,让流量通过企业代理服务器转发。

检测

# 查看代理设置
networksetup -getwebproxy "Wi-Fi"
networksetup -getsecurewebproxy "Wi-Fi"
scutil --proxy

预期输出(被劫持)

Enabled: Yes
Server: 10.x.x.x
Port: 8080

解决

# 关闭所有代理
networksetup -setwebproxystate "Wi-Fi" off
networksetup -setsecurewebproxystate "Wi-Fi" off
networksetup -setautoproxystate "Wi-Fi" off

# 或设置为空
networksetup -setwebproxy "Wi-Fi" "" 0
networksetup -setsecurewebproxy "Wi-Fi" "" 0

2. PAC 自动代理配置

原理:通过 PAC(Proxy Auto-Config)脚本,根据网址决定是否走代理。比固定代理更隐蔽。

检测

networksetup -getautoproxyurl "Wi-Fi"
# 输出:URL: http://10.x.x.x/proxy.pac

解决

networksetup -setautoproxystate "Wi-Fi" off

额外检查:某些软件会修改 .pac 文件的系统设置,需检查:

# 查看系统网络偏好设置
defaults read /Library/Preferences/SystemConfiguration/NetworkInterfaces

3. 系统扩展/网络过滤(Network Extension)

原理:安装内核级网络扩展,直接过滤所有网络数据包。比应用层代理更底层,更难发现和清除。

检测

# 列出所有网络扩展
systemextensionsctl list

# 预期输出(正常):
# 0 extension(s)

# 被劫持时可能看到:
# com.某企业.sase.filter [active enabled]

解决

# 方法1:命令行卸载(需知道 team ID 和 bundle ID)
systemextensionsctl uninstall <team_id> <bundle_id>

# 方法2:图形界面(推荐)
# 系统设置 → 隐私与安全性 → 扩展 → 网络扩展 → 取消勾选

# 方法3:强制删除(如果无法卸载)
sudo rm -rf /Library/SystemExtensions/*
# 重启后生效

注意:系统扩展可能需要 SIP(系统完整性保护)权限才能完全清除。


4. 证书注入(HTTPS 中间人攻击)

原理:企业安装自己的根证书到系统,可以解密 HTTPS 流量进行检查,再重新加密转发。

检测

方法一:浏览器查看证书

  • 访问任意 HTTPS 网站 → 点击地址栏锁图标 → 查看证书
  • 如果看到证书颁发者是公司名而非正规 CA,说明被中间人

方法二:命令行检查

# 查找企业证书
security find-certificate -a -c "某企业" /System/Library/Keychains/SystemRootCertificates.keychain
security find-certificate -a -c "Company" /System/Library/Keychains/SystemRootCertificates.keychain

# 列出所有根证书
security dump-trust-settings

解决

# 删除指定证书(需知道证书名称)
security delete-certificate -c "某企业 零信任架构 CA" /System/Library/Keychains/SystemRootCertificates.keychain

# 或在"钥匙串访问"应用中:
# 1. 打开"钥匙串访问"(Keychain Access)
# 2. 选择"系统"钥匙串 → "证书"
# 3. 找到企业证书(通常名称包含公司名、零信任架构、Proxy 等)
# 4. 右键 → 删除

风险提示:删除企业证书可能导致无法访问企业内网的 HTTPS 网站。


5. Hosts 文件劫持

原理:修改 /etc/hosts 文件,将特定域名指向错误 IP 或本地地址,实现屏蔽。

检测

cat /etc/hosts

预期异常输出

127.0.0.1   某网盘网站
127.0.0.1   www.youtube.com

解决

# 编辑 hosts 文件,删除企业添加的规则
sudo nano /etc/hosts

# 或使用 sed 删除特定行
sudo sed -i '' '/某网盘网站/d' /etc/hosts

6. 浏览器插件

原理:安装浏览器扩展,在应用层拦截和修改网页内容。

检测

  • Chrome: 地址栏输入 chrome://extensions/
  • Edge: edge://extensions/
  • Safari: 系统设置 → 扩展

查找可疑插件

  • 名称包含:安全、防护、监控、某企业、企业
  • 未主动安装,突然出现
  • 无法删除或禁用(被企业策略锁定)

解决

# Chrome/Edge 强制删除被策略控制的插件
# 1. 找到插件 ID(在 extensions 页面)
# 2. 删除插件目录
rm -rf ~/Library/Application\ Support/Google/Chrome/Default/Extensions/<插件ID>

# 或通过组策略(如果企业用了策略)
# 可能需要删除策略文件
sudo rm -f /Library/Managed\ Preferences/com.google.Chrome.plist

快速诊断流程图

访问网站被拦截?
       │
       ▼
┌─────────────┐     异常      ┌──────────────┐
│ 检查 DNS    │ ───────────→ │ 修复 resolv.conf │
│ scutil --dns│              │ 并锁定          │
└─────────────┘     正常      └──────────────┘
       │
       ▼
┌─────────────┐     异常      ┌──────────────┐
│ 检查路由表   │ ───────────→ │ 停止守护进程   │
│ netstat -nr │              │ 关闭 utun 接口 │
└─────────────┘     正常      └──────────────┘
       │
       ▼
┌─────────────┐     异常      ┌──────────────┐
│ 检查代理    │ ───────────→ │ 关闭代理设置   │
│ networksetup│              │               │
└─────────────┘     正常      └──────────────┘
       │
       ▼
┌─────────────┐     异常      ┌──────────────┐
│ 检查 hosts  │ ───────────→ │ 清理 hosts    │
│ cat /etc/hosts│            │               │
└─────────────┘     正常      └──────────────┘
       │
       ▼
┌─────────────┐     异常      ┌──────────────┐
│ 检查证书    │ ───────────→ │ 删除企业证书   │
│ 钥匙串访问   │              │               │
└─────────────┘     正常      └──────────────┘
       │
       ▼
    问题解决!

排查 checklist

# 1. 检查 DNS
scutil --dns

# 2. 检查路由表
netstat -nr | grep -E "(utun|10\.251)"

# 3. 检查代理
networksetup -getwebproxy "Wi-Fi"
scutil --proxy

# 4. 检查 hosts
cat /etc/hosts

# 5. 检查网络扩展
systemextensionsctl list

# 6. 检查后台进程
ps aux | grep -iE "(某企业|enterprise|sase|ioa)"

# 7. 检查证书(钥匙串访问)
security dump-trust-settings | grep -i "某企业\|company"

# 8. 检查浏览器插件(手动查看 chrome://extensions)

六、总结

核心要点

  1. 企业安全软件具有持久化机制,简单退出无法停止拦截
  2. 多层架构:DNS + 路由 + 进程,需要全部清理
  3. 最高权限:PrivilegedHelperTools 拥有系统级控制权
  4. 自恢复机制:守护进程会持续监控并修复配置

解决思路

定位问题层 → 停止守护进程 → 清理配置 → 锁定防护 → 验证

最后建议

  • 个人电脑:建议完全卸载企业安全软件
  • 公司电脑:遵守企业安全策略,不要擅自绕过
  • 边界场景:如本文情况(个人电脑被强制安装),使用脚本灵活切换

技术无罪,但请合规使用。 各位大佬,本文仅供技术研究和问题排查参考。

❌