hacktricks/linux-hardening/privilege-escalation/docker-security/apparmor.md
2024-02-11 01:46:25 +00:00

14 KiB

AppArmor

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Podstawowe informacje

AppArmor to uaktualnienie jądra zaprojektowane w celu ograniczenia zasobów dostępnych dla programów poprzez profile dla poszczególnych programów, efektywnie wprowadzając kontrolę dostępu wymuszaną (MAC), wiążąc atrybuty kontroli dostępu bezpośrednio z programami, a nie z użytkownikami. Ten system działa poprzez wczytywanie profili do jądra, zazwyczaj podczas uruchamiania, a te profile określają, do jakich zasobów program może uzyskać dostęp, takich jak połączenia sieciowe, dostęp do gniazd surowych i uprawnienia do plików.

Istnieją dwa tryby operacyjne dla profili AppArmor:

  • Tryb egzekwowania: Ten tryb aktywnie egzekwuje zasady zdefiniowane w profilu, blokując działania naruszające te zasady i rejestrując wszelkie próby ich naruszenia za pomocą systemów takich jak syslog lub auditd.
  • Tryb skarg: W przeciwieństwie do trybu egzekwowania, tryb skarg nie blokuje działań sprzecznych z zasadami profilu. Zamiast tego rejestruje te próby jako naruszenia zasad bez egzekwowania ograniczeń.

Składniki AppArmor

  • Moduł jądra: Odpowiada za egzekwowanie zasad.
  • Zasady: Określają zasady i ograniczenia dotyczące zachowania programu i dostępu do zasobów.
  • Parser: Wczytuje zasady do jądra w celu egzekwowania lub raportowania.
  • Narzędzia: Są to programy w trybie użytkownika, które zapewniają interfejs do interakcji z AppArmor i zarządzania nim.

Ścieżka profili

Profile AppArmor zazwyczaj są zapisywane w /etc/apparmor.d/
Za pomocą polecenia sudo aa-status można wyświetlić listę binarnych plików, które są ograniczone przez jakiś profil. Jeśli można zmienić znak "/" na kropkę w ścieżce każdego wymienionego pliku binarnego, otrzyma się nazwę profilu apparmor w wymienionym folderze.

Na przykład, profil apparmor dla /usr/bin/man będzie znajdował się w /etc/apparmor.d/usr.bin.man

Polecenia

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

Tworzenie profilu

  • Aby wskazać dotknięty plik wykonywalny, dozwolone są ścieżki bezwzględne i symbole wieloznaczne (dla globbingu plików) w celu określenia plików.
  • Aby wskazać dostęp, jaki będzie miał program binarny do plików, można użyć następujących kontroli dostępu:
  • r (odczyt)
  • w (zapis)
  • m (mapowanie pamięci jako wykonywalne)
  • k (blokowanie plików)
  • l (tworzenie twardych dowiązań)
  • ix (wykonanie innego programu z nowym programem dziedziczącym politykę)
  • Px (wykonanie w ramach innego profilu po wyczyszczeniu środowiska)
  • Cx (wykonanie w ramach profilu potomnego po wyczyszczeniu środowiska)
  • Ux (wykonanie bez ograniczeń po wyczyszczeniu środowiska)
  • Zmienne mogą być definiowane w profilach i mogą być manipulowane spoza profilu. Na przykład: @{PROC} i @{HOME} (dodaj #include <tunables/global> do pliku profilu)
  • Zasady odrzucania są obsługiwane w celu zastąpienia zasad zezwalania.

aa-genprof

Aby łatwo rozpocząć tworzenie profilu, można skorzystać z narzędzia apparmor. Możliwe jest sprawienie, żeby apparmor zbadał działania wykonywane przez program binarny, a następnie pozwolił Ci zdecydować, które działania chcesz zezwolić lub odrzucić.
Wystarczy uruchomić:

sudo aa-genprof /path/to/binary

Następnie, w innym konsolowym oknie wykonaj wszystkie czynności, które zwykle wykonuje binarny plik:

/path/to/binary -a dosomething

Następnie, w pierwszej konsoli naciśnij "s", a następnie w zarejestrowanych działaniach wskaż, czy chcesz zignorować, zezwolić, czy cokolwiek innego. Po zakończeniu naciśnij "f", a nowy profil zostanie utworzony w /etc/apparmor.d/path.to.binary

{% hint style="info" %} Za pomocą strzałek możesz wybrać, co chcesz zezwolić/odmówić/cokolwiek innego {% endhint %}

aa-easyprof

Możesz również utworzyć szablon profilu apparmor dla binarnego pliku za pomocą:

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" %} Zauważ, że domyślnie w utworzonym profilu nic nie jest dozwolone, więc wszystko jest odrzucane. Będziesz musiał dodać linie takie jak /etc/passwd r, aby umożliwić odczyt binarny /etc/passwd na przykład. {% endhint %}

Następnie możesz wymusić nowy profil za pomocą

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

Modyfikowanie profilu na podstawie logów

Narzędzie poniżej odczyta logi i zapyta użytkownika, czy chce zezwolić na niektóre z wykrytych zabronionych działań:

sudo aa-logprof

{% hint style="info" %} Za pomocą strzałek możesz wybrać, co chcesz zezwolić/odmówić/cokolwiek {% endhint %}

Zarządzanie profilem

#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

Dzienniki

Przykład AUDIT i DENIED dzienników z pliku /var/log/audit/audit.log dla wykonywalnego pliku service_bin:

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

Możesz również uzyskać te informacje, korzystając z:

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 w Dockerze

Zauważ, że profil docker-profile dla Dockera jest domyślnie załadowany:

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

Domyślnie profil Apparmor docker-default jest generowany z https://github.com/moby/moby/tree/master/profiles/apparmor

Podsumowanie profilu docker-default:

  • Dostęp do całej sieci
  • Nie zdefiniowano żadnych uprawnień (Jednak niektóre uprawnienia będą pochodzić z podstawowych reguł bazowych, tj. #include <abstractions/base>)
  • Zapisywanie do dowolnego pliku /proc jest nie dozwolone
  • Inne podkatalogi/pliki w /proc i /syszakazane dostępu do odczytu/zapisu/blokady/linkowania/wykonania
  • Montowanie jest nie dozwolone
  • Ptrace może być uruchomiony tylko na procesie, który jest ograniczony przez ten sam profil apparmor

Po uruchomieniu kontenera dockerowego powinieneś zobaczyć następujący wynik:

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

Zauważ, że apparmor domyślnie blokuje uprawnienia capabilities przyznane kontenerowi. Na przykład, będzie w stanie zablokować uprawnienie do zapisu wewnątrz /proc, nawet jeśli przyznano uprawnienie SYS_ADMIN, ponieważ domyślny profil apparmor dla dockera odrzuca ten dostęp:

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

Musisz wyłączyć apparmor, aby ominąć jego ograniczenia:

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

Zauważ, że domyślnie AppArmor również zabrania kontenerowi montowania folderów od wewnątrz, nawet z uprawnieniami SYS_ADMIN.

Zauważ, że możesz dodawać/usuwać uprawnienia dla kontenera Docker (to nadal będzie ograniczone przez metody ochrony takie jak AppArmor i Seccomp):

  • --cap-add=SYS_ADMIN nadaje uprawnienia SYS_ADMIN
  • --cap-add=ALL nadaje wszystkie uprawnienia
  • --cap-drop=ALL --cap-add=SYS_PTRACE usuwa wszystkie uprawnienia i nadaje tylko SYS_PTRACE

{% hint style="info" %} Zazwyczaj, gdy zauważysz, że masz uprawnienia zwiększające dostępność wewnątrz kontenera docker, ale część ataku nie działa, oznacza to, że apparmor docker to uniemożliwia. {% endhint %}

Przykład

(Przykład z tutaj)

Aby zilustrować funkcjonalność AppArmor, utworzyłem nowy profil Docker "mydocker" z dodanym następującym wierszem:

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

Aby aktywować profil, musimy wykonać następujące czynności:

sudo apparmor_parser -r -W mydocker

Aby wyświetlić profile, możemy użyć następującej komendy. Poniższa komenda wyświetla mój nowy profil AppArmor.

$ sudo apparmor_status  | grep mydocker
mydocker

Jak pokazano poniżej, otrzymujemy błąd podczas próby zmiany "/etc/", ponieważ profil AppArmor uniemożliwia dostęp do zapisu w "/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

Możesz sprawdzić, który profil AppArmor uruchamia kontener za pomocą:

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

Następnie możesz uruchomić następującą komendę, aby znaleźć dokładny profil używany:

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

W dziwnym przypadku możesz zmodyfikować profil apparmor dla dockera i go przeładować. Możesz usunąć ograniczenia i je "omijać".

Ominięcie AppArmor Docker

AppArmor działa na podstawie ścieżek, co oznacza, że nawet jeśli chroni pliki wewnątrz katalogu, takiego jak /proc, jeśli możesz skonfigurować sposób uruchamiania kontenera, możesz zamontować katalog proc z hosta wewnątrz /host/proc, a nie będzie już chroniony przez AppArmor.

Ominięcie AppArmor Shebang

W tym błędzie możesz zobaczyć przykład, jak nawet jeśli uniemożliwiasz uruchomienie perla z pewnymi zasobami, jeśli po prostu utworzysz skrypt powłoki określając w pierwszej linii #!/usr/bin/perl i wykonasz plik bezpośrednio, będziesz mógł wykonać cokolwiek chcesz. Na przykład:

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
Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks: