AppArmor

htARTE (HackTricks AWS Red Team 전문가)로부터 AWS 해킹을 처음부터 전문가까지 배우세요

HackTricks를 지원하는 다른 방법:

WhiteIntel다크 웹을 활용한 검색 엔진으로, 무료 기능을 제공하여 회사나 그 고객이 스틸러 악성 소프트웨어에 의해 침해당했는지 확인할 수 있습니다.

WhiteIntel의 주요 목표는 정보 도난 악성 소프트웨어로 인한 계정 탈취 및 랜섬웨어 공격을 막는 것입니다.

그들의 웹사이트를 방문하여 무료로 엔진을 시험해 볼 수 있습니다:


기본 정보

AppArmor는 프로그램별 프로필을 통해 프로그램에 제공되는 리소스를 제한하는 것을 목적으로 하는 커널 개선으로, 사용자가 아닌 프로그램에 직접 액세스 제어 속성을 묶어 강제 액세스 제어(MAC)를 효과적으로 구현합니다. 이 시스템은 프로필을 커널에 로드하여 작동하며, 이러한 프로필은 프로그램이 액세스할 수 있는 리소스를 지시합니다. 네트워크 연결, raw 소켓 액세스 및 파일 권한과 같은 것들이 포함됩니다.

AppArmor 프로필에는 두 가지 운영 모드가 있습니다:

  • 강제 모드: 이 모드는 프로필 내에서 정의된 정책을 적극적으로 시행하여 이러한 정책을 위반하는 조치를 차단하고 syslog 또는 auditd와 같은 시스템을 통해 이러한 위반 시도를 기록합니다.

  • 불평 모드: 강제 모드와 달리 불평 모드는 프로필의 정책에 어긋나는 조치를 차단하지 않습니다. 대신, 이러한 시도를 정책 위반으로 기록하고 제한을 시행하지 않습니다.

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를 사용할 수 있습니다. 이진 파일이 수행하는 작업을 apparmor가 검사한 다음 허용하거나 거부할 작업을 결정할 수 있습니다. 다음을 실행하면 됩니다:

sudo aa-genprof /path/to/binary

그럼, 다른 콘솔에서 일반적으로 실행되는 이진 파일이 수행하는 모든 작업을 수행하십시오:

/path/to/binary -a dosomething

그럼, 첫 번째 콘솔에서 "s"를 누르고 기록된 작업에서 무시하거나 허용할지 여부를 지정하십시오. 완료하면 "f"를 누르고 새 프로필이 _/etc/apparmor.d/path.to.binary_에 생성됩니다.

화살표 키를 사용하여 허용/거부/기타를 선택할 수 있습니다.

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
}

기본적으로 생성된 프로필에서는 아무 것도 허용되지 않으므로 모든 것이 거부됩니다. 예를 들어 /etc/passwd r,와 같은 줄을 추가하여 이진 파일이 /etc/passwd를 읽을 수 있도록 허용해야 합니다.

그런 다음 새 프로필을 강제로 적용할 수 있습니다.

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

로그에서 프로필 수정

다음 도구는 로그를 읽고 감지된 금지된 작업 중 일부를 허용할지 사용자에게 물을 것입니다:

sudo aa-logprof

화살표 키를 사용하여 허용할지 거부할지 또는 기타 작업을 선택할 수 있습니다.

프로필 관리

#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

도커에서의 Apparmor

도커의 프로필 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 도커 기본 프로필https://github.com/moby/moby/tree/master/profiles/apparmor에서 생성됩니다.

도커 기본 프로필 요약:

  • 모든 네트워킹액세스 권한

  • **능력(capability)**이 정의되지 않음 (그러나 일부 능력은 기본 기본 규칙을 포함하여 제공됨 예: #include <abstractions/base>)

  • /proc 파일에 쓰기허용되지 않음

  • 다른 /proc 및 /sys하위 디렉토리/파일은 읽기/쓰기/잠금/링크/실행 액세스가 거부됨

  • 마운트허용되지 않음

  • Ptrace동일한 apparmor 프로필에 의해 제한된 프로세스에서만 실행될 수 있음

도커 컨테이너를 실행하면 다음 출력이 표시됩니다:

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

참고로 apparmor는 기본적으로 컨테이너에 부여된 권한(capabilities privileges)도 차단할 것입니다. 예를 들어, SYS_ADMIN 권한이 부여되더라도 /proc 내부에 쓰기 권한을 차단할 수 있습니다. 이는 기본적으로 도커(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 능력을 갖고 있더라도 내부에서 폴더를 마운트하는 것을 금지합니다.

도커 컨테이너에 능력을 추가/제거할 수 있음을 유의하세요 (이는 AppArmorSeccomp과 같은 보호 방법에 의해 여전히 제한될 것입니다):

  • --cap-add=SYS_ADMINSYS_ADMIN 능력을 부여합니다.

  • --cap-add=ALL은 모든 능력을 부여합니다.

  • --cap-drop=ALL --cap-add=SYS_PTRACE은 모든 능력을 제거하고 SYS_PTRACE만 부여합니다.

일반적으로, 도커 컨테이너 내에서 특권 능력을 발견했지만 일부 부분의 exploit이 작동하지 않는 경우, 이는 도커 AppArmor가 방지하고 있기 때문일 수 있습니다.

예시

(여기의 예시에서 가져옴)

AppArmor 기능을 설명하기 위해 새로운 Docker 프로필 "mydocker"를 만들고 다음 줄을 추가했습니다:

deny /etc/* w,   # deny write for all files directly in /etc (not in a subdir)

프로필을 활성화하려면 다음을 수행해야 합니다:

sudo apparmor_parser -r -W mydocker

프로필을 나열하려면 다음 명령을 사용할 수 있습니다. 아래 명령은 새로운 AppArmor 프로필을 나열합니다.

$ sudo apparmor_status  | grep mydocker
mydocker

아래와 같이 AppArmor 프로필이 "/etc/"에 쓰기 액세스를 방지하고 있기 때문에 " /etc/"를 변경하려고 시도할 때 오류가 발생합니다.

$ docker run --rm -it --security-opt apparmor:mydocker -v ~/haproxy:/localhost busybox chmod 400 /etc/hostname
chmod: /etc/hostname: Permission denied

AppArmor Docker Bypass1

컨테이너에서 실행 중인 apparmor 프로필을 찾을 수 있습니다.

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

그럼, 다음 줄을 실행하여 사용 중인 정확한 프로필을 찾을 수 있습니다:

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

AppArmor Docker Bypass2

AppArmor는 경로를 기반으로 하며, 이는 /proc 디렉토리 내의 파일을 보호하더라도 컨테이너가 실행될 방법을 구성할 수 있다면, 호스트의 proc 디렉토리를 **/host/proc**에 마운트할 수 있으며, 이는 더 이상 AppArmor에 의해 보호되지 않을 것입니다.

AppArmor Shebang Bypass

이 버그에서 특정 리소스로 perl 실행을 방지하고 있더라도, 첫 줄에 **#!/usr/bin/perl**을 지정한 쉘 스크립트를 만들고 해당 파일을 직접 실행하면 원하는 작업을 실행할 수 있습니다. 예:

echo '#!/usr/bin/perl
use POSIX qw(strftime);
use POSIX qw(setuid);
POSIX::setuid(0);
exec "/bin/sh"' > /tmp/test.pl
chmod +x /tmp/test.pl
/tmp/test.pl

WhiteIntel다크 웹을 기반으로 한 검색 엔진으로, 회사나 그 고객이 스틸러 악성 소프트웨어에 의해 침해당했는지 확인할 수 있는 무료 기능을 제공합니다.

WhiteIntel의 주요 목표는 정보를 도난하는 악성 소프트웨어로 인한 계정 탈취와 랜섬웨어 공격을 막는 것입니다.

그들의 웹사이트를 방문하여 무료로 엔진을 시험해 볼 수 있습니다:

htARTE (HackTricks AWS Red Team Expert)를 통해 **제로**부터 **히어로**가 되는 AWS 해킹을 배우세요!

HackTricks를 지원하는 다른 방법:

Last updated