macOS 被攻破的渗试及速度,比大多数人想象得快。透测去年我帮一个朋友检查他的其加 MacBook Pro,M1 芯片,渗试及系统版本停留在 Ventura 13.2。透测他坚称自己"从不下载奇怪的其加东西",结果我用一条简单的渗试及 LaunchAgent 持久化脚本,五分钟内就拿到了他 Chrome 里保存的透测 47 个密码。整个过程他甚至没看到任何弹窗。其加这不是渗试及电影桥段,是透测 macOS 渗透测试里的常规操作。
先聊信息收集。其加macOS 自带一堆方便攻击者的渗试及工具,比如 system_profiler 能吐出硬件、透测软件、其加网络配置的完整清单,dscl 可以枚举本地用户和组。更隐蔽的是 mdfind,Spotlight 的索引数据库能让你瞬间定位到包含"password"或"private key"的文件。我习惯先跑 sudo dscacheutil -q user 看有哪些账户,再用 find /Users -name "*.pem" -o -name "id_rsa" 2>/dev/null 碰碰运气。很多开发者的 SSH 私钥就明晃晃躺在那里,权限设成 644。
权限提升这块,macOS 的 TCC(透明度、同意和控制)数据库是个软肋。用户授权过的应用列表存在 ~/Library/Application Support/com.apple.TCC/TCC.db,但普通用户读不了。不过如果你能通过某个已授权的应用执行代码——比如被授予"完全磁盘访问权限"的终端——直接 sqlite3 打开那个库,就能看到哪些应用有麦克风、摄像头、屏幕录制权限。我试过一个案例:某公司给员工配的 Mac 上,一个老版本的备份工具拥有完全磁盘访问权,而它的更新机制是明文 HTTP 下载。中间人替换二进制文件,下次重启就是 root 权限的持久化后门。
持久化手法里,LaunchAgent 和 LaunchDaemon 最经典。~/Library/LaunchAgents/ 下的 plist 文件会在用户登录时自动运行,不需要管理员密码。更隐蔽的是利用 ~/Library/Containers/ 里的应用容器,把恶意脚本塞进某个合法应用的启动项。我见过有人把 payload 伪装成 iCloud 同步的辅助进程,在活动监视器里显示为 com.apple.iCloudHelper,普通用户根本不会多看一眼。
加固不是装个杀毒软件就完事。第一件事:检查 /Library/LaunchAgents 和 /Library/LaunchDaemons 里有没有你不认识的 plist。用 launchctl list 看当前加载的服务,对照苹果官方列表排掉系统自带的。第二,打开终端跑 sudo spctl --status,确保 Gatekeeper 是启用的。第三,别给任何应用"完全磁盘访问权限",除非你完全清楚它在干什么。我自己的 Mac 上,只有终端和备份工具拿到了这个权限,其他一律拒绝。
还有个小细节:macOS 的 sudo 默认缓存凭证 5 分钟。如果你离开电脑不锁屏,攻击者可以在这段时间内直接 sudo -s。改 /etc/sudoers 里的 timestamp_timeout=0 能关掉缓存,代价是每次都要输密码。我选了 1 分钟,折中一下。
最后说个反直觉的点:macOS 的沙盒机制对恶意软件限制有限。因为很多攻击根本不走沙盒逃逸,而是直接利用用户授予的权限。你点了一次"允许",后面就全通了。所以渗透测试里最有效的入口往往不是漏洞,是那个被用户亲手点掉的确认框。