hacktricks/linux-unix/privilege-escalation/apparmor.md
2023-08-03 19:12:22 +00:00

14 KiB
Raw Blame History

☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

基本信息

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

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

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

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

AppArmor的组成部分

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

配置文件路径

AppArmor配置文件通常保存在_/etc/apparmor.d/_目录中
使用sudo aa-status命令,您将能够列出受某个配置文件限制的二进制文件。如果您可以将每个列出的二进制文件的路径中的字符“/”更改为点您将获得所提到文件夹中apparmor配置文件的名称。

例如,usr/bin/man_的apparmor配置文件将位于/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。它可以检查二进制文件执行的操作,然后让您决定要允许还是拒绝哪些操作
只需运行以下命令:

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 %}

管理配置文件

To manage a profile, you can use the apparmor_parser command. Here are some useful commands:

  • To load a profile: sudo apparmor_parser -r -W /path/to/profile
  • To unload a profile: sudo apparmor_parser -R /path/to/profile
  • To check the status of a profile: sudo apparmor_parser -Q /path/to/profile

You can also use the aa-status command to view the status of all loaded profiles.

Enforcing and Complaining Modes

AppArmor profiles can be in two modes: enforcing and complaining.

  • Enforcing mode: In this mode, AppArmor enforces the rules defined in the profile. If a process violates any of the rules, it will be blocked or restricted.
  • Complaining mode: In this mode, AppArmor logs violations but does not enforce them. It is useful for testing and debugging profiles.

To change the mode of a profile, you can use the aa-enforce and aa-complain commands:

  • To enforce a profile: sudo aa-enforce /path/to/profile
  • To set a profile to complain mode: sudo aa-complain /path/to/profile

Editing a Profile

To edit a profile, you can use a text editor to modify the profile file located in /etc/apparmor.d/. Make sure to follow the syntax and rules defined in the AppArmor documentation.

After making changes to a profile, you need to reload it using the apparmor_parser command:

sudo apparmor_parser -r -W /path/to/profile

Creating a New Profile

To create a new profile, you can use the aa-genprof command. This command will guide you through the process of creating a profile for a specific application.

sudo aa-genprof /path/to/application

Follow the prompts and provide the necessary information to generate the profile.

Conclusion

Managing and configuring AppArmor profiles is an essential part of securing a Linux system. By understanding how to manage, enforce, and edit profiles, you can effectively control the access and permissions of processes, reducing the risk of privilege escalation and unauthorized access.

#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

日志

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

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配置文件是从https://github.com/moby/moby/tree/master/profiles/apparmor生成的。

docker-default配置文件摘要

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

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

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

请注意,默认情况下,apparmor甚至会阻止容器被授予的特权权限。例如即使授予了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 逃逸

您可以使用以下命令找到正在运行容器的apparmor配置文件

docker inspect 9d622d73a614 | grep lowpriv
"AppArmorProfile": "lowpriv",
"apparmor=lowpriv"

然后,您可以运行以下命令来查找正在使用的确切配置文件

find /etc/apparmor.d/ -name "*lowpriv*" -maxdepth 1 2>/dev/null

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

☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 YouTube 🎥