hacktricks/linux-unix/privilege-escalation/apparmor.md

11 KiB
Raw Blame History

从零到英雄学习AWS黑客攻击 htARTE (HackTricks AWS 红队专家)

支持HackTricks的其他方式

基本信息

AppArmor 是一种内核增强功能,用于将程序限制在具有每个程序配置文件有限资源集中。配置文件可以允许诸如网络访问、原始套接字访问以及在匹配路径上读取、写入或执行文件的能力

它是一种强制访问控制或MAC,将访问控制属性绑定到程序而不是用户
AppArmor限制是通过加载到内核中的配置文件提供的,通常在启动时。
AppArmor配置文件可以处于两种模式之一:

  • 执行:以执行模式加载的配置文件将导致执行配置文件中定义的策略以及报告策略违规尝试通过syslog或auditd
  • 投诉:投诉模式下的配置文件不会执行策略,而是报告策略违规尝试。

AppArmor与Linux上的一些其他MAC系统不同它是基于路径的允许混合执行和投诉模式配置文件它使用包含文件来简化开发并且它的入门门槛远低于其他流行的MAC系统。

AppArmor的组成部分

  • 内核模块:执行实际工作
  • 策略:定义行为和限制
  • 解析器:将策略加载到内核
  • 工具用户模式程序与apparmor交互

配置文件路径

Apparmor配置文件通常保存在 /etc/apparmor.d/
使用sudo aa-status,您将能够列出受某些配置文件限制的二进制文件。如果您能将每个列出的二进制文件的路径中的字符“/”更改为点您将获得在上述文件夹中的apparmor配置文件的名称。

例如,针对 /usr/bin/manapparmor配置文件将位于 /etc/apparmor.d/usr.bin.man

命令

aa-status     #check the current status
aa-enforce    #set profile to enforce mode (from disable or complain)
aa-complain   #set profile to complain mode (from diable or enforcement)
apparmor_parser #to load/reload an altered policy
aa-genprof    #generate a new profile
aa-logprof    #used to change the policy when the binary/program is changed
aa-mergeprof  #used to merge the policies

创建配置文件

  • 为了指示受影响的可执行文件,允许使用绝对路径和通配符(用于文件匹配)来指定文件。
  • 为了指示二进制文件将对文件拥有的访问权限,可以使用以下访问控制
  • r(读取)
  • w(写入)
  • m(将内存映射为可执行文件)
  • k(文件锁定)
  • l(创建硬链接)
  • ix(执行另一个程序,新程序继承策略)
  • Px(在清理环境后,根据另一个配置文件执行)
  • Cx(在清理环境后,根据子配置文件执行)
  • Ux(在清理环境后,无限制执行)
  • 变量可以在配置文件中定义,并且可以从配置文件外部操作。例如:@{PROC} 和 @{HOME}(在配置文件中添加#include <tunables/global>
  • 支持拒绝规则以覆盖允许规则

aa-genprof

为了轻松开始创建配置文件apparmor 可以帮助您。它可以让 apparmor 检查二进制文件执行的操作,然后让您决定想要允许或拒绝哪些操作
您只需要运行:

sudo aa-genprof /path/to/binary

然后,在不同的控制台执行二进制文件通常会执行的所有操作:

/path/to/binary -a dosomething

然后,在第一个控制台按下“s”,然后在记录的操作中指示您想要忽略、允许或其他操作。完成后按下“f”,新的配置文件将在 /etc/apparmor.d/path.to.binary 中创建

{% hint style="info" %} 使用箭头键可以选择您想要允许/拒绝/其他操作 {% endhint %}

aa-easyprof

您还可以使用以下命令为二进制文件创建一个apparmor配置文件模板

sudo aa-easyprof /path/to/binary
# vim:syntax=apparmor
# AppArmor policy for binary
# ###AUTHOR###
# ###COPYRIGHT###
# ###COMMENT###

#include <tunables/global>

# No template variables specified

"/path/to/binary" {
#include <abstractions/base>

# No abstractions specified

# No policy groups specified

# No read paths specified

# No write paths specified
}

{% hint style="info" %} 请注意,默认情况下,在创建的配置文件中不允许任何操作,因此一切都将被拒绝。您需要添加像 /etc/passwd r, 这样的行来允许二进制文件读取 /etc/passwd,例如。 {% endhint %}

然后,您可以使用以下命令强制执行新的配置文件

sudo apparmor_parser -a /etc/apparmor.d/path.to.binary

从日志修改配置文件

以下工具将读取日志,并询问用户是否想要允许一些检测到的禁止操作:

sudo aa-logprof

{% hint style="info" %} 使用箭头键,您可以选择要允许/拒绝/其他操作的内容。 {% endhint %}

管理配置文件

#Main profile management commands
apparmor_parser -a /etc/apparmor.d/profile.name #Load a new profile in enforce mode
apparmor_parser -C /etc/apparmor.d/profile.name #Load a new profile in complain mode
apparmor_parser -r /etc/apparmor.d/profile.name #Replace existing profile
apparmor_parser -R /etc/apparmor.d/profile.name #Remove profile

日志

以下是来自 /var/log/audit/audit.log 中可执行文件 service_binAUDITDENIED 日志示例:

type=AVC msg=audit(1610061880.392:286): apparmor="AUDIT" operation="getattr" profile="/bin/rcat" name="/dev/pts/1" pid=954 comm="service_bin" requested_mask="r" fsuid=1000 ouid=1000
type=AVC msg=audit(1610061880.392:287): apparmor="DENIED" operation="open" profile="/bin/rcat" name="/etc/hosts" pid=954 comm="service_bin" requested_mask="r" denied_mask="r" fsuid=1000 ouid=0

您也可以使用以下方法获取这些信息:

sudo aa-notify -s 1 -v
Profile: /bin/service_bin
Operation: open
Name: /etc/passwd
Denied: r
Logfile: /var/log/audit/audit.log

Profile: /bin/service_bin
Operation: open
Name: /etc/hosts
Denied: r
Logfile: /var/log/audit/audit.log

AppArmor denials: 2 (since Wed Jan  6 23:51:08 2021)
For more information, please see: https://wiki.ubuntu.com/DebuggingApparmor

Docker 中的 Apparmor

注意默认情况下如何加载 docker 的 docker-profile 配置文件:

sudo aa-status
apparmor module is loaded.
50 profiles are loaded.
13 profiles are in enforce mode.
/sbin/dhclient
/usr/bin/lxc-start
/usr/lib/NetworkManager/nm-dhcp-client.action
/usr/lib/NetworkManager/nm-dhcp-helper
/usr/lib/chromium-browser/chromium-browser//browser_java
/usr/lib/chromium-browser/chromium-browser//browser_openjdk
/usr/lib/chromium-browser/chromium-browser//sanitized_helper
/usr/lib/connman/scripts/dhclient-script
docker-default

默认情况下,Apparmor docker-default profile 是从 https://github.com/moby/moby/tree/master/profiles/apparmor 生成的。

docker-default profile 概要

  • 对所有网络访问
  • 没有定义能力(然而,一些能力将来自包含基本基础规则,即 #include <abstractions/base>
  • 不允许向任何**/proc** 文件写入
  • /proc 和 /sys 的其他子目录/文件拒绝读/写/锁定/链接/执行访问
  • 不允许使用挂载
  • Ptrace 只能在被相同 apparmor profile限制的进程上运行

一旦你运行一个 docker 容器,你应该看到以下输出:

1 processes are in enforce mode.
docker-default (825)

请注意,apparmor 甚至会默认阻止授予容器的 capabilities 权限。例如,即使授予了 SYS_ADMIN 能力,它也能够阻止写入 /proc 的权限,因为默认情况下 docker apparmor 配置文件拒绝此访问权限:

docker run -it --cap-add SYS_ADMIN --security-opt seccomp=unconfined ubuntu /bin/bash
echo "" > /proc/stat
sh: 1: cannot create /proc/stat: Permission denied

你需要禁用 apparmor 来绕过它的限制:

docker run -it --cap-add SYS_ADMIN --security-opt seccomp=unconfined --security-opt apparmor=unconfined ubuntu /bin/bash

请注意,默认情况下,AppArmor 也会禁止容器从内部挂载文件夹,即使具有 SYS_ADMIN 能力。

请注意,您可以添加/删除对 docker 容器的能力(这仍将受到像 AppArmorSeccomp 这样的保护方法的限制):

  • --cap-add=SYS_ADMIN 赋予 SYS_ADMIN 能力
  • --cap-add=ALL 赋予 所有能力
  • --cap-drop=ALL --cap-add=SYS_PTRACE 删除所有能力,只赋予 SYS_PTRACE

{% hint style="info" %} 通常,当您发现docker 容器内部有一个特权能力可用但是部分利用不起作用时,这将是因为 docker apparmor 将阻止它。 {% endhint %}

AppArmor Docker breakout

您可以使用以下方法找出哪个apparmor 配置文件正在运行容器

docker inspect 9d622d73a614 | grep lowpriv
"AppArmorProfile": "lowpriv",
"apparmor=lowpriv"
然后,您可以运行以下命令来**找到正在使用的确切配置文件**
find /etc/apparmor.d/ -name "*lowpriv*" -maxdepth 1 2>/dev/null

在这种奇怪的情况下,你可以修改 apparmor docker 配置文件并重新加载它。 你可以移除限制并“绕过”它们。

从零开始学习 AWS 黑客技术,成为 htARTE (HackTricks AWS 红队专家)

支持 HackTricks 的其他方式: