AppArmor
Reading time: 10 minutes
tip
Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Angalia mpango wa usajili!
- Jiunge na 💬 kikundi cha Discord au kikundi cha telegram au tufuatilie kwenye Twitter 🐦 @hacktricks_live.
- Shiriki mbinu za udukuzi kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud repos za github.
Basic Information
AppArmor ni kuimarisha kernel iliyoundwa kupunguza rasilimali zinazopatikana kwa programu kupitia wasifu wa kila programu, kwa ufanisi ikitekeleza Udhibiti wa Ufikiaji wa Lazima (MAC) kwa kufunga sifa za udhibiti wa ufikiaji moja kwa moja kwa programu badala ya watumiaji. Mfumo huu unafanya kazi kwa kuchaji wasifu kwenye kernel, kawaida wakati wa kuanzisha, na wasifu hawa huamua ni rasilimali zipi programu inaweza kufikia, kama vile muunganisho wa mtandao, ufikiaji wa socket mbichi, na ruhusa za faili.
Kuna njia mbili za uendeshaji kwa wasifu wa AppArmor:
- Enforcement Mode: Njia hii inatekeleza kwa nguvu sera zilizofafanuliwa ndani ya wasifu, ikizuia vitendo vinavyokiuka sera hizi na kuandika jaribio lolote la kuvunja sheria kupitia mifumo kama syslog au auditd.
- Complain Mode: Tofauti na njia ya utekelezaji, njia ya malalamiko haisitishi vitendo vinavyokwenda kinyume na sera za wasifu. Badala yake, inaandika jaribio hizi kama ukiukaji wa sera bila kutekeleza vizuizi.
Components of AppArmor
- Kernel Module: Inawajibika kwa utekelezaji wa sera.
- Policies: Zinabainisha sheria na vizuizi kwa tabia ya programu na ufikiaji wa rasilimali.
- Parser: Inachaji sera kwenye kernel kwa utekelezaji au ripoti.
- Utilities: Hizi ni programu za hali ya mtumiaji zinazotoa kiolesura cha kuingiliana na kusimamia AppArmor.
Profiles path
Wasifu wa AppArmor kawaida huhifadhiwa katika /etc/apparmor.d/
Kwa kutumia sudo aa-status
utaweza kuorodhesha binaries ambazo zimepunguziliwa mbali na wasifu fulani. Ikiwa unaweza kubadilisha herufi "/" kuwa nukta katika njia ya kila binary iliyoorodheshwa, utapata jina la wasifu wa apparmor ndani ya folda iliyoelezwa.
Kwa mfano, wasifu wa apparmor kwa /usr/bin/man utawekwa katika /etc/apparmor.d/usr.bin.man
Commands
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
Kuunda wasifu
- Ili kuonyesha executable iliyoathirika, njia za moja kwa moja na wildcards zinakubaliwa (kwa ajili ya kufafanua faili).
- Ili kuonyesha ufikiaji ambao binary itakuwa nao juu ya faili, udhibiti wa ufikiaji zifuatazo zinaweza kutumika:
- r (kusoma)
- w (kuandika)
- m (ramani ya kumbukumbu kama executable)
- k (kufunga faili)
- l (kuunda viungo vigumu)
- ix (kutekeleza programu nyingine na programu mpya ikirithi sera)
- Px (kutekeleza chini ya wasifu mwingine, baada ya kusafisha mazingira)
- Cx (kutekeleza chini ya wasifu wa mtoto, baada ya kusafisha mazingira)
- Ux (kutekeleza bila vizuizi, baada ya kusafisha mazingira)
- Vigezo vinaweza kufafanuliwa katika wasifu na vinaweza kubadilishwa kutoka nje ya wasifu. Kwa mfano: @{PROC} na @{HOME} (ongeza #include <tunables/global> kwenye faili la wasifu)
- Sheria za kukataa zinasaidiwa kubadilisha sheria za kuruhusu.
aa-genprof
Ili kuanza kwa urahisi kuunda wasifu, apparmor inaweza kukusaidia. Inawezekana kufanya apparmor ikague vitendo vilivyofanywa na binary kisha kukuruhusu uamue ni vitendo vipi unavyotaka kuruhusu au kukataa.
Unahitaji tu kukimbia:
sudo aa-genprof /path/to/binary
Kisha, katika console tofauti fanya vitendo vyote ambavyo binary kawaida hufanya:
/path/to/binary -a dosomething
Kisha, katika console ya kwanza bonyeza "s" na kisha katika vitendo vilivyorekodiwa onyesha kama unataka kupuuza, kuruhusu, au chochote. Unapomaliza bonyeza "f" na wasifu mpya utaundwa katika /etc/apparmor.d/path.to.binary
note
Kwa kutumia funguo za mshale unaweza kuchagua unachotaka kuruhusu/kukataa/chochote
aa-easyprof
Unaweza pia kuunda kiolezo cha wasifu wa apparmor wa binary kwa kutumia:
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
}
note
Kumbuka kwamba kwa kawaida katika wasifu ulioundwa hakuna kitu kinachoruhusiwa, hivyo kila kitu kinakataliwa. Itabidi uongeze mistari kama /etc/passwd r,
ili kuruhusu binary kusoma /etc/passwd
kwa mfano.
Unaweza kisha kulazimisha wasifu mpya na
sudo apparmor_parser -a /etc/apparmor.d/path.to.binary
Kubadilisha wasifu kutoka kwa kumbukumbu
Zana ifuatayo itasoma kumbukumbu na kumuuliza mtumiaji kama anataka kuruhusu baadhi ya vitendo vilivyogunduliwa ambavyo ni marufuku:
sudo aa-logprof
note
Kwa kutumia funguo za mshale unaweza kuchagua kile unachotaka kuruhusu/kukataa/chochote
Kusimamia Profaili
#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
Logs
Mfano wa AUDIT na DENIED logs kutoka /var/log/audit/audit.log ya executable 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
Unaweza pia kupata taarifa hii kwa kutumia:
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 katika Docker
Kumbuka jinsi profaili docker-profile ya docker inavyopakiwa kwa default:
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
Kwa default Apparmor docker-default profile inatengenezwa kutoka https://github.com/moby/moby/tree/master/profiles/apparmor
Muhtasari wa docker-default profile:
- Upatikanaji wa mtandao wote
- Hakuna uwezo ulioelezwa (Hata hivyo, baadhi ya uwezo utaweza kuja kutokana na kuingiza sheria za msingi i.e. #include <abstractions/base>)
- Kuandika kwenye faili yoyote ya /proc hakuruhusiwi
- Madirisha/faili mengine ya /proc na /sys yanakataliwa upatikanaji wa kusoma/kuandika/kufunga/kuunganisha/kutekeleza
- Kuweka hakuruhusiwi
- Ptrace inaweza kuendeshwa tu kwenye mchakato ambao umekandamizwa na profil ya apparmor sawa
Mara tu unapofanya kazi na kontena la docker unapaswa kuona matokeo yafuatayo:
1 processes are in enforce mode.
docker-default (825)
Kumbuka kwamba apparmor hata itazuia uwezo wa haki uliotolewa kwa kontena kwa default. Kwa mfano, itakuwa na uwezo wa kuzuia ruhusa ya kuandika ndani ya /proc hata kama uwezo wa SYS_ADMIN umepatiwa kwa sababu kwa default profaili ya apparmor ya docker inakataa ufikiaji huu:
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
Unahitaji kuondoa apparmor ili kupita vizuizi vyake:
docker run -it --cap-add SYS_ADMIN --security-opt seccomp=unconfined --security-opt apparmor=unconfined ubuntu /bin/bash
Kumbuka kwamba kwa kawaida AppArmor pia itakataza kontena kuunganisha folda kutoka ndani hata na uwezo wa SYS_ADMIN.
Kumbuka kwamba unaweza kuongeza/kuondoa uwezo kwa kontena la docker (hii bado itakuwa na mipaka kutokana na mbinu za ulinzi kama AppArmor na Seccomp):
--cap-add=SYS_ADMIN
toa uwezo waSYS_ADMIN
--cap-add=ALL
toa uwezo wote--cap-drop=ALL --cap-add=SYS_PTRACE
ondoa uwezo wote na toa tuSYS_PTRACE
note
Kwa kawaida, unapokuwa unapata kwamba una uwezo wa kipaumbele upatikanaji ndani ya kontena la docker lakini sehemu fulani ya exploit haifanyi kazi, hii itakuwa kwa sababu docker apparmor itakuwa inazuia.
Mfano
(Mfano kutoka hapa)
Ili kuonyesha kazi ya AppArmor, niliumba profaili mpya ya Docker "mydocker" na mstari ufuatao umeongezwa:
deny /etc/* w, # deny write for all files directly in /etc (not in a subdir)
Ili kuamsha wasifu, tunahitaji kufanya yafuatayo:
sudo apparmor_parser -r -W mydocker
Ili orodhesha wasifu, tunaweza kufanya amri ifuatayo. Amri iliyo hapa chini inoorodhesha wasifu wangu mpya wa AppArmor.
$ sudo apparmor_status | grep mydocker
mydocker
Kama inavyoonyeshwa hapa chini, tunapata kosa tunapojaribu kubadilisha “/etc/” kwani profaili ya AppArmor inazuia ufikiaji wa kuandika kwenye “/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
Unaweza kupata ni profil ya apparmor ipi inayoendesha kontena kwa kutumia:
docker inspect 9d622d73a614 | grep lowpriv
"AppArmorProfile": "lowpriv",
"apparmor=lowpriv"
Kisha, unaweza kukimbia mstari ufuatao ili kupata wasifu halisi unaotumika:
find /etc/apparmor.d/ -name "*lowpriv*" -maxdepth 1 2>/dev/null
Katika hali ya ajabu unaweza kubadilisha profaili ya apparmor docker na kuipakia upya. Unaweza kuondoa vizuizi na "kuvuka" hizo.
AppArmor Docker Bypass2
AppArmor ni msingi wa njia, hii inamaanisha kwamba hata kama inaweza kuwa inalinda faili ndani ya directory kama /proc
ikiwa unaweza kuweka jinsi kontena litakavyokuwa linaendeshwa, unaweza kuunganisha directory ya proc ya mwenyeji ndani ya /host/proc
na haitakuwa inalindwa na AppArmor tena.
AppArmor Shebang Bypass
Katika bug hii unaweza kuona mfano wa jinsi hata kama unazuia perl kuendeshwa na rasilimali fulani, ikiwa tu unaunda script ya shell ukitaja katika mstari wa kwanza #!/usr/bin/perl
na un atekeleza faili moja kwa moja, utaweza kutekeleza chochote unachotaka. Mfano:
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
tip
Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Angalia mpango wa usajili!
- Jiunge na 💬 kikundi cha Discord au kikundi cha telegram au tufuatilie kwenye Twitter 🐦 @hacktricks_live.
- Shiriki mbinu za udukuzi kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud repos za github.