尽管如此,多年来,我还是发现并经常使用一些技巧,这些技巧在macOS的安全任务中非常有用,无论是编写代码、搜索漏洞、记录恶意软件行为还是筛选受感染的设备。在这篇文章中,我想分享其中一些技巧,希望其他人可以使用它们。以下是我最常用的15个macOS安全技巧!
查找任何应用程序的Bundle ID
技巧:
- lsappinfo list | grep
或
- grep -A1 -i bundleidentifier "$(mdfind -name .app | head -n 1)"/Contents/Info.plist
介绍:
App Bundle ID(Bundle IDentifier)是系统APP唯一bai识别du的ID。其用来捆绑识别用,表明应用和其他App的区别。App Bundle ID一般zhi用于软件开发者在生成软件时需要进dao行捆绑的特殊字串,并且每一个APP仅有一个专有Bundle ID,其他软件开发不可使用。常规Bundle ID采用“com.
- com.apple.finder
Bundle ID在应用程序Bundle的Info.plist文件中设置,并在Bundle写入磁盘后立即注册到Launch Services数据库中。这样,如果你知道应用程序的Bundle ID,那么就很容易找到它的位置,而不必像使用Finder或shell find命令那样花费不必要的处理器资源。
第一个示例使用lsappinfo从输出中查询所有正在运行的应用程序和grep,以获得Bundle ID。该实用程序的列表信息非常丰富,不仅可以告诉你包的ID,还可以告诉你可执行文件的路径,当前的PID和许多其他详细信息。有关更多详细信息,请参见官网。
但是,你可能希望找到当前未运行的应用程序的bundle标识符。为此,请使用利用mdfind实用程序的第二个版本。
请注意,mdfind只显示用户有权访问的文件的结果:这就是为什么你不会得到常规' find '命令中所有的权限错误(除非你将stderr重定向到/dev/null)。但这没关系,因为整个Launch Services数据库都是与用户相关的:它只会返回用户有权启动的应用的结果。mdfind命令就是Spotlight功能的终端界面,这意味着如果Spotlight被禁用,mdfind命令也将无法工作。mdfind命令非常迅速、高效。
寻找缺乏硬化运行时(Hardened Runtime)的应用程序
技巧:
- for i in /Applications/*.app; do codesign -dv "${i}" &>> /tmp/codes; done; grep -B3 'none' /tmp/codes | grep ^Executable | sed 's/^Executable=/No\ Hardened\ Runtime:\ /g'; rm -rf /tmp/codes
介绍:
从macOS 10.15 Catalina开始,默认情况下,所有的应用程序都必须经过公证才能启动,但是有一些免责条款意味着你的系统中可能有未经公证的应用程序。首先,用户可以在本地完成对公证的要求,这并不需要管理员权限。这是一种常见的macOS恶意软件技术,可对用户进行社交工程设计以做到这一点。其次,苹果在早期阶段在公证要求上有些摇摆不定,在2020年2月之前在不那么严格的要求下进行了公证并安装的应用程序,比如没有硬化的运行时,即使在更严格的要求生效后,也可以在Catalina上正常运行。
如果你安装的Xcode工具的单行代码短得多,则可以检查应用程序是否没有公证“票证”:
- for i in /Applications/* ; do stapler validate "${i}"|grep -B 1 -v worked;done
但是,这有两个问题,除了需要Xcode命令行工具之外。
首先,无需凭票即可对应用进行公证;实际上,许多开发人员将票证附加到DMG或安装程序,而不是应用程序本身,因此仅检查票证不会产生准确的结果。
其次,从安全性角度来看,公证的主要好处是,在最严格的规则下,它需要强化的运行时标志。没有这种标志的应用程序可以被恶意进程修改,因此,使用此技巧,我们实际上要在“应用程序”文件夹中列出所有应用程序。当然,你可以并且应该考虑将相同的技术应用于包含应用程序的其他文件夹,然后测试它们是否都缺少必需的标志。单行代码将代码签名的结果输出到一个临时文件,然后对文件中所有根本没有标志的条目进行抓取,这表明没有强化的运行时。在输出与搜索匹配的可执行文件列表之后,单行代码还会清除此临时文件。
查找连接到局域网的设备
技巧:
- while true; do clear; arp -alnx; c=$(arp -alnx | wc -l); let n=$c-1; printf '\tCount: \t'$n'\n'; sleep 2; done;
介绍:
这个单行程序利用arp实用程序会打印出连接到LAN的设备的信息,包括本地IP地址、MAC地址(又称链路层地址)和失效时间等。该命令使用2秒钟延迟的无限while循环,以便它不断更新,直到你使用键盘命令Ctl-C中断它为止
如果你还保留网络上允许的MAC地址的清单,这可能是一种非常容易的方法,可以手动发现家庭,实验室或其他小型网络中出现的恶意设备。对于自动化企业解决方案,请使用SentinelOne的Ranger之类的工具。
对文件进行inflate处理,改变它的哈希
技巧:
- for i in {1..3000000}; do echo '0' >> ; done
介绍:
当测试已知的恶意软件时,在某些情况下,你可能需要改变文件的大小或哈希,以击败安全检测规则。这个技巧在我们最近的一篇关于如何在Catalina上绕过XProtect的文章中介绍过,但这肯定不是你想使用它的唯一原因。任何文件大小检查以及针对文件哈希的信誉检查都可以通过这种方式进行。在后一种情况下,不需要将文件扩展到一个字节以上,因此将条件中的第二个数字从3000000调整为2,并将其调整为比你试图打破的规则中提到的大小稍微大一点的数字。
查找所有日志子系统的名称
技巧:
- ls -al /System/Library/Preferences/Logging/Subsystems | awk '{print $9}' | sed 's/.plist//g'
介绍:
苹果的内置日志工具允许你访问os_log、os_trace和其他日志系统创建的系统范围日志消息。一旦你掌握了如何使用它,通用日志系统就是一个强大的实用工具。不过,这需要清除几个障碍。一个是习惯使用基于谓词的过滤。另一个是知道哪些子系统可供查询。
在这个技巧中,我们从系统中提取所有可用的子系统,并将它们打印到stdout。
通过此列表,我们现在可以将搜索范围缩小到特定区域,这对于错误查找和漏洞评估非常理想。
查找具有完全磁盘访问权限的应用程序
技巧:
- sudo sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db "SELECT client,allowed FROM access WHERE service == 'kTCCServiceSystemPolicyAllFiles'" | grep '1'$
介绍:
全磁盘访问(FDA)是macOS Mojave中引入的一种用户保护机制,并在macOS Catalina中得到了显著扩展。它是否真的能有效地提供现实世界的保护还有待商榷,但毋庸置疑的是,对于开发人员和高级用户来说,这常常是令人沮丧的原因,因为许多常见的应用程序和脚本功能将无法工作,除非执行过程获得FDA的许可。
这个技巧允许你快速确定给定设备上的哪些应用程序被授予了该权限。在大多数情况下,输出应该与你在系统首选项“安全和隐私”窗格中看到的一致(参见“隐私”选项卡下的“全磁盘访问”)。但是,如果你的设备是由MDM解决方案管理的,那么系统首选项不会显示实际具有完整磁盘访问权限的所有项,因此在这种情况下,这个技巧也很有用。注意sudo命令的使用:你需要管理员权限才能读取TCC SQLITE3数据库。
值得注意的是,如果你在末尾停止对grep的调用,那么你将看到一个更长的条目列表,其他条目的末尾为0。这些应用程序已经出现在FDA的列表中,但目前还没有启用。
获取Mac的UUID, Board-ID
技巧:
- ioreg -rd1 -c IOPlatformExpertDevice | grep UUID | awk '{print $NF}' | sed 's/\"//g'
或
- /usr/sbin/system_profiler SPHardwareDataType | grep UUID | awk '{print $NF}'
介绍:
这是macOS广告软件常用的技巧,由于多种原因,它很有用。从攻击者的角度来看,IOPlatformUUID是攻击者跟踪受感染的受害者的好方法,并且UUID可以作为URL的一部分从受害者的计算机发送到攻击者的C2。从防御者的角度来看,监视对ioreg和system_profiler的调用是值得的,这些调用专门查找IOPlatformExpertDevice属性或解析UUID。
请注意,ioreg同一属性列表中的“board-id”键是恶意进程辨别它是运行在裸机上还是在研究人员的虚拟机上的几种方法之一。
- ioreg -rd1 -c IOPlatformExpertDevice | grep board-id
类似地,从system_profiler获得完整的硬件概述提供了大量有用的环境信息(使用与上面相同的命令,但是删除对grep的调用和之后的所有内容)。
system_profiler命令实际上是系统信息的命令行版本,位于应用程序文件夹内的工具子文件夹中的应用程序。使用system_profiler -listDataTypes查看可以查询的所有不同部分,本文将为你提供有关该实用程序的其他有用信息。
将十六进制字符串转换为ASCII(然后再转换)
技巧:
- echo '' | xxd -r -p
或
- echo 'hello world' | xxd -p
或
- echo 'hello world' | od -t c -t x1
或
- python -c "print bytearray.fromhex('')"
介绍:
如果你注意设备的安全性,那么就几乎不可避免地会经常遇到在十六进制编码的字符串和ASCII字符之间进行转换的情况。如上面的代码所示,实际上有很多方法可以实现,具体取决于你的偏好。就我个人而言,我更喜欢使用xxd,因为它速度快,易于记忆且输入简短。确保使用-p开关来获得漂亮的连续打印字符串。通过-r开关,可以将十六进制转换回ASCII码。
od实用程序提供的输出略有不同,以ASCII和十六进制并行显示每个字节,这在你要直观地将每个字节与其ASCII表示形式进行比较的情况下很有用。
批量将PNG图像文件夹转换为JPEG
技巧:
- mkdir jpegs; sips -s format jpeg *.* --out jpegs
介绍:
无论你是进行渗透测试、研究还是写作,安全领域中的另一个常见任务是截屏。默认情况下,macOS屏幕捕获实用程序将使用.png格式。但是,如果你将屏幕截图上传到网页,通常首选JPEG格式,因为这些文件更轻巧,并且页面加载速度更快。
尽管你可以更改screencapture的默认文件格式(请参见man screencapture),但我发现将默认值保留为.png很有用,因为它通常是许多其他任务的首选格式。幸运的是,这种单行代码几乎可以立即遍历当前工作目录中的所有图像,创建一个名为“JPEGS”的新文件夹,并使用JPEG格式的所有PNG副本填充该文件夹。sips工具是一个鲜为人知的实用程序,具有许多有用的功能。Sips是Mac提供的一个处理图片的命令行工具,与Photoshop这种重量级选手相比,自然功能上要差很多。不过话说回来如大小裁剪、图片翻转和旋转这些日常小功能其实也不必非得动用Photoshop这样专业级的工具。简单学习一下像sips这样的终端指令可以快速辅助你完成任务。可能那边PS还没完全打开,这边图片已经处理好了。
本文翻译自:https://www.sentinelone.com/blog/15-macos-power-tricks-for-security-pros/