dawgmon - 道格走廊巡逻员
摘要
该工具的名称源自《南方公园》第10季第10集,其中卡特曼扮演“道格走廊巡逻员”在学校走廊巡逻。该工具用于帮助监控基于Linux的系统自上次运行以来发生的变化。
一种使用方式是使用诸如提供的示例cronjob定期运行dawgmon,并将结果通过电子邮件发送给系统管理员。这有助于识别正在发生恶意活动的机器,并监控谁在何处安装了什么。请注意,任何严重的内核后门都可以轻松隐藏自己不被该工具检测到,因此它只是工具箱中的额外工具之一,不应完全依赖它来进行Linux机器的全面安全监控。它只是工具箱中的又一个选项。
另一种用途是在安装软件之前生成基线。安装该软件后,再次运行该工具,即可轻松查看系统发生了哪些变化。例如,在建立基线后在一台机器上安装virtualbox,可能会得到类似以下结果:
./dawgmon -gfA
1 change detected (0 warnings)
- systemd property NNames changed from 259 to 261
apt install virtualbox-5.1
[...]
./dawgmon -gfA
33 changes detected (0 warnings)
- size of file /etc/group changed from 937 to 954
- file /etc/group got modified on 2017-09-14 19:29:51.804811 +0200
- size of file /etc/group- changed from 934 to 937
- file /etc/group- got modified on 2017-09-14 19:29:14.000000 +0200
- file /etc/gshadow got modified on 2017-09-14 19:29:51.812811 +0200
- size of file /etc/gshadow- changed from 777 to 794
- size of file /etc/mailcap changed from 40777 to 41063
- file /etc/mailcap got modified on 2017-09-14 19:29:51.632812 +0200
- file /etc/systemd/system/multi-user.target.wants/vboxautostart-service.service got created (owner=root, group=root, perm=lrwxrwxrwx, size=49)
- file /etc/systemd/system/multi-user.target.wants/vboxballoonctrl-service.service got created (owner=root, group=root, perm=lrwxrwxrwx, size=51)
- file /etc/systemd/system/multi-user.target.wants/vboxdrv.service got created (owner=root, group=root, perm=lrwxrwxrwx, size=35)
- file /etc/systemd/system/multi-user.target.wants/vboxweb-service.service got created (owner=root, group=root, perm=lrwxrwxrwx, size=43)
- file /etc/udev/rules.d/60-vboxdrv.rules got created (owner=root, group=root, perm=-rw-r--r--, size=747)
- group vboxusers added
- package virtualbox-5.1 is to be installed
- suid binary /usr/lib/virtualbox/VBoxHeadless got created (owner=root, group=root, perm=-r-s--x--x, size=158304)
- suid binary /usr/lib/virtualbox/VBoxNetAdpCtl got created (owner=root, group=root, perm=-r-s--x--x, size=23144)
- suid binary /usr/lib/virtualbox/VBoxNetDHCP got created (owner=root, group=root, perm=-r-s--x--x, size=158304)
- suid binary /usr/lib/virtualbox/VBoxNetNAT got created (owner=root, group=root, perm=-r-s--x--x, size=158304)
- suid binary /usr/lib/virtualbox/VBoxSDL got created (owner=root, group=root, perm=-r-s--x--x, size=158296)
- suid binary /usr/lib/virtualbox/VBoxVolInfo got created (owner=root, group=root, perm=-r-s--x--x, size=10472)
- suid binary /usr/lib/virtualbox/VirtualBox got created (owner=root, group=root, perm=-r-s--x--x, size=158304)
- i-node for listening UNIX socket /run/systemd/private changed from 3428734 to 3452848
- systemd property NInstalledJobs changed from 8392199 to 3238035463
- systemd property NNames changed from 261 to 263
- systemd unit file vboxautostart-service.service added
- systemd unit file vboxballoonctrl-service.service added
- systemd unit file vboxdrv.service added
- systemd unit file vboxweb-service.service added
- systemd unit 'vboxautostart-service.service' added
- systemd unit 'vboxballoonctrl-service.service' added
- systemd unit 'vboxdrv.service' added
- systemd unit 'vboxweb-service.service' added
以上内容有助于对virtualbox进行彻底的安全审查。安装的suid二进制文件是明显的入口点,而运行的服务也值得关注。
另一个示例运行正确检测到TCP端口的打开和关闭:
./dawgmon -gfA
0 changes detected (0 warnings)
nc -l -p 4455 &
[1] 12489
./dawgmon -gfA
1 change detected (0 warnings)
fg
nc -l -p 4455
^C
./dawgmon -gfA
1 change detected (0 warnings)
该工具不追求完全精确。通常有非常严肃的建议,不依赖GNU coreutils(如ls)的输出作为工具输入。换句话说,很少应该构建工具来解析并依赖这类输出,因为它随时可能发生变化。但实际上,这些工具的输出相对稳定,因为很多人和自动化工具已经依赖它们的输出来实现各种目的。
然而,dawgmon的权衡如下:我们需要自行实现大量逻辑来进行文件系统监控,构建复杂的二进制文件来包含解析和监控块设备、网络接口等库。这也会使工具更加复杂且难以维护。在当前项目中,可以非常快速地添加新的命令并进行变化检测,因为主dawgmon工具已经负责缓存、执行命令,然后在运行比较时向命令实现提供先前和当前的输出。这意味着在时间紧迫的项目中,可以非常迅速地添加新命令并运行分析,包括这些新命令。
添加命令只需继承Command类即可。该类定义在commands/init.py中。该文件还包含命令的主列表(以及执行完整分析时的执行顺序)。然后需要设置'name'、'shell'、'command'和'desc'等属性,并实现两个方法'parse()'和'compare()'。包含的命令足够多,可以很好地了解如何实现和添加新命令。
用法
为获得最佳效果,请以root用户运行该工具。输入-h/--help获取帮助,输入-v/--version获取版本信息。
必须始终指定一个主要操作。这些操作包括:
-A:分析系统
-C:比较缓存条目
-E:列出可用命令
-L:列出缓存条目
运行分析
dawgmon -A
仅使用少数命令运行分析
dawgmon -A -e list_suids -e list_tcpudp_ports
显示可用命令列表
dawgmon -E
显示用于比较的可用缓存条目
dawgmon -L
比较旧缓存条目3与新缓存条目5
dawgmon -C 3 5
有助于分析的其他选项包括:
-d:显示调试输出
-e:执行特定命令(可多次使用)
-f:强制运行,不发出未以root运行警告
-g:对输出着色
-l:要使用的数据库缓存位置
-m:缓存中允许的最大缓存条目数(如果缓存条目超过此数量,将截断数据库)
-t:不输出每个检测到异常的时间戳信息。
更多用法信息请运行工具并输入-h。
局限性
该工具解析命令行工具的输出,并依赖于GNU coreutils的特定选项。没有具体理由说明该工具及其命令实现不能快速移植到其他操作系统(如BSD),但目前尚未进行操作系统检测,也没有根据操作系统支持对命令进行分类。这需要先实现。
关于查找管道、UNIX套接字、/boot、/etc等目录中的文件,需要注意的是,传递给'find'的-xdev选项意味着不会遍历挂载在起始目录下的所有文件系统。这意味着例如/boot会被正确扫描,但/boot/efi可能不会被扫描。未来需要采用更智能的方法。
当前分析时的时间戳可能会有些混乱。默认情况下,警告、正常或调试异常消息的时间戳是其生成时间的时间戳(如commands/init.py所示)。异常是在完成完整的命令行扫描后生成的。因此,用于检测的输出是在更早的时候生成的,随后各个异常的时间戳显示的是扫描之后的时间。当比较缓存条目时,使用的是扫描的时间戳来输出检测发生的时间,因为这在逻辑上更合理。
关于
保留所有权利。版权所有 (C) 2017-2019 Anvil Ventures Inc.
许可信息请参阅LICENSE。
如需更多信息,请联系Vincent Berg [email protected]
要查找更新的源代码或贡献补丁,请访问以下URL:
https://github.com/anvilventures/dawgmon/