AppArmor
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
AppArmor 是一个 内核增强,旨在通过每个程序的配置文件限制程序可用的资源,有效地通过将访问控制属性直接与程序而不是用户绑定来实现强制访问控制(MAC)。该系统通过 在内核中加载配置文件 来运行,通常在启动时,这些配置文件规定了程序可以访问的资源,例如网络连接、原始套接字访问和文件权限。
AppArmor 配置文件有两种操作模式:
强制模式:此模式积极执行配置文件中定义的策略,阻止违反这些政策的操作,并通过 syslog 或 auditd 等系统记录任何试图违反它们的行为。
投诉模式:与强制模式不同,投诉模式不会阻止违反配置文件政策的操作。相反,它将这些尝试记录为政策违规,而不执行限制。
内核模块:负责政策的执行。
政策:指定程序行为和资源访问的规则和限制。
解析器:将政策加载到内核中以进行执行或报告。
实用程序:这些是用户模式程序,提供与 AppArmor 交互和管理的接口。
Apparmor 配置文件通常保存在 /etc/apparmor.d/
使用 sudo aa-status
,您将能够列出受某些配置文件限制的二进制文件。如果您可以将每个列出二进制文件路径中的字符 "/" 更改为点,您将获得提到的文件夹内的 apparmor 配置文件名称。
例如,/usr/bin/man 的 apparmor 配置文件将位于 /etc/apparmor.d/usr.bin.man
为了指示受影响的可执行文件,绝对路径和通配符被允许用于指定文件。
为了指示二进制文件对文件的访问,可以使用以下访问控制:
r(读取)
w(写入)
m(将内存映射为可执行)
k(文件锁定)
l(创建硬链接)
ix(执行另一个程序,新程序继承策略)
Px(在另一个配置文件下执行,清理环境后)
Cx(在子配置文件下执行,清理环境后)
Ux(在无约束下执行,清理环境后)
变量可以在配置文件中定义,并可以从配置文件外部进行操作。例如:@{PROC} 和 @{HOME}(将 #include <tunables/global> 添加到配置文件中)
支持拒绝规则以覆盖允许规则。
为了轻松开始创建配置文件,apparmor 可以帮助你。可以让apparmor 检查二进制文件执行的操作,然后让你决定要允许或拒绝哪些操作。 你只需运行:
然后,在另一个控制台执行二进制文件通常会执行的所有操作:
然后,在第一个控制台按“s”,然后在记录的操作中指示您想要忽略、允许或其他。当您完成后按“f”,新配置文件将创建在 /etc/apparmor.d/path.to.binary
使用箭头键可以选择您想要允许/拒绝/其他的内容
您还可以使用以下命令创建二进制文件的 apparmor 配置文件模板:
请注意,在创建的配置文件中,默认情况下不允许任何操作,因此所有操作都被拒绝。您需要添加类似 /etc/passwd r,
的行,以允许二进制文件读取 /etc/passwd
,例如。
您可以使用以下命令强制执行新配置文件:
以下工具将读取日志并询问用户是否希望允许某些检测到的禁止操作:
使用箭头键可以选择您想要允许/拒绝/其他的内容
示例来自可执行文件 service_bin
的 AUDIT 和 DENIED 日志,位于 /var/log/audit/audit.log:
您还可以使用以下方法获取此信息:
注意docker-profile的配置文件是默认加载的:
默认情况下,Apparmor docker-default 配置文件是从 https://github.com/moby/moby/tree/master/profiles/apparmor 生成的。
docker-default 配置文件摘要:
访问所有网络
未定义能力(但是,一些能力将来自包含基本基础规则,即 #include <abstractions/base>)
写入任何**/proc** 文件不允许
其他/proc 和/sys 的子目录/文件被拒绝读/写/锁/链接/执行访问
挂载****不允许
Ptrace 只能在被相同 apparmor 配置文件限制的进程上运行
一旦你运行一个 docker 容器,你应该看到以下输出:
注意,apparmor 甚至会阻止默认情况下授予容器的能力特权。例如,即使授予了 SYS_ADMIN 能力,它也能够阻止写入 /proc 的权限,因为默认情况下 docker apparmor 配置文件拒绝此访问:
您需要禁用 apparmor以绕过其限制:
注意,默认情况下,AppArmor 还会 禁止容器从内部挂载 文件夹,即使具有 SYS_ADMIN 能力。
注意,您可以 添加/删除 能力 到 docker 容器(这仍然会受到 AppArmor 和 Seccomp 等保护方法的限制):
--cap-add=SYS_ADMIN
给予 SYS_ADMIN
能力
--cap-add=ALL
给予所有能力
--cap-drop=ALL --cap-add=SYS_PTRACE
删除所有能力,仅给予 SYS_PTRACE
通常,当您 发现 在 docker 容器 内部 有 特权能力 可用 但 某些部分的 利用 不起作用时,这将是因为 docker apparmor 会阻止它。
(示例来自 这里)
为了说明 AppArmor 的功能,我创建了一个新的 Docker 配置文件 “mydocker”,并添加了以下行:
要激活配置文件,我们需要执行以下操作:
要列出配置文件,我们可以执行以下命令。下面的命令列出了我的新 AppArmor 配置文件。
如下面所示,当尝试更改“/etc/”时,我们会遇到错误,因为 AppArmor 配置文件阻止了对“/etc”的写入访问。
您可以使用以下命令查找正在运行容器的 apparmor 配置文件:
然后,您可以运行以下命令来查找正在使用的确切配置文件:
在奇怪的情况下,你可以修改 apparmor docker 配置文件并重新加载它。 你可以移除限制并“绕过”它们。
AppArmor 是基于路径的, 这意味着即使它可能在保护像 /proc
这样的目录中的文件,如果你可以配置容器的运行方式, 你可以挂载主机的 proc 目录到 /host/proc
,并且它将不再受到 AppArmor 的保护。
在 这个漏洞 中,你可以看到一个例子,说明即使你阻止 perl 使用某些资源运行, 如果你只需创建一个 shell 脚本在第一行指定 #!/usr/bin/perl
并且你直接执行该文件, 你将能够执行你想要的任何内容。例如:
学习与实践 AWS 黑客技术:HackTricks 培训 AWS 红队专家 (ARTE) 学习与实践 GCP 黑客技术:HackTricks 培训 GCP 红队专家 (GRTE)