AppArmor
Reading time: 11 minutes
tip
AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks का समर्थन करें
- सदस्यता योजनाएँ देखें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमारे Twitter 🐦 @hacktricks_live** का पालन करें।**
- हैकिंग ट्रिक्स साझा करें और HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में PRs सबमिट करें।
Basic Information
AppArmor एक kernel enhancement है जिसे प्रोग्रामों के लिए उपलब्ध संसाधनों को प्रति-प्रोग्राम प्रोफाइल के माध्यम से प्रतिबंधित करने के लिए डिज़ाइन किया गया है, प्रभावी रूप से Mandatory Access Control (MAC) को लागू करता है, जो पहुँच नियंत्रण विशेषताओं को सीधे प्रोग्रामों से जोड़ता है बजाय उपयोगकर्ताओं के। यह प्रणाली kernel में प्रोफाइल लोड करके काम करती है, आमतौर पर बूट के दौरान, और ये प्रोफाइल निर्धारित करते हैं कि एक प्रोग्राम किन संसाधनों तक पहुँच सकता है, जैसे नेटवर्क कनेक्शन, कच्चे सॉकेट तक पहुँच, और फ़ाइल अनुमतियाँ।
AppArmor प्रोफाइल के लिए दो संचालन मोड हैं:
- Enforcement Mode: यह मोड प्रोफाइल के भीतर परिभाषित नीतियों को सक्रिय रूप से लागू करता है, उन क्रियाओं को अवरुद्ध करता है जो इन नीतियों का उल्लंघन करती हैं और syslog या auditd जैसे सिस्टम के माध्यम से उल्लंघन के किसी भी प्रयास को लॉग करता है।
- Complain Mode: Enforcement mode के विपरीत, complain mode उन क्रियाओं को अवरुद्ध नहीं करता है जो प्रोफाइल की नीतियों के खिलाफ जाती हैं। इसके बजाय, यह इन प्रयासों को नीति उल्लंघनों के रूप में लॉग करता है बिना प्रतिबंध लागू किए।
Components of AppArmor
- Kernel Module: नीतियों के प्रवर्तन के लिए जिम्मेदार।
- Policies: प्रोग्राम व्यवहार और संसाधन पहुँच के लिए नियम और प्रतिबंध निर्दिष्ट करते हैं।
- Parser: प्रवर्तन या रिपोर्टिंग के लिए नीतियों को kernel में लोड करता है।
- Utilities: ये उपयोगकर्ता-मोड प्रोग्राम हैं जो AppArmor के साथ इंटरैक्ट करने और प्रबंधित करने के लिए एक इंटरफ़ेस प्रदान करते हैं।
Profiles path
Apparmor प्रोफाइल आमतौर पर /etc/apparmor.d/ में सहेजे जाते हैं।
sudo aa-status
के साथ आप उन बाइनरीज़ की सूची प्राप्त कर सकेंगे जो किसी प्रोफाइल द्वारा प्रतिबंधित हैं। यदि आप सूचीबद्ध प्रत्येक बाइनरी के पथ में "/" को बिंदु में बदल सकते हैं, तो आप उल्लेखित फ़ोल्डर के भीतर apparmor प्रोफाइल का नाम प्राप्त करेंगे।
उदाहरण के लिए, /usr/bin/man के लिए एक apparmor प्रोफाइल /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
एक प्रोफ़ाइल बनाना
- प्रभावित निष्पादन योग्य को इंगित करने के लिए, पूर्ण पथ और वाइल्डकार्ड फ़ाइलों को निर्दिष्ट करने के लिए अनुमति है (फ़ाइल ग्लोबिंग के लिए)।
- यह इंगित करने के लिए कि बाइनरी के पास फाइलों पर क्या पहुंच होगी, निम्नलिखित एक्सेस नियंत्रण का उपयोग किया जा सकता है:
- 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 में बनाया जाएगा।
note
तीर कुंजियों का उपयोग करके आप चुन सकते हैं कि आप क्या अनुमति/अस्वीकृत/कुछ और करना चाहते हैं।
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
}
note
ध्यान दें कि एक बनाए गए प्रोफ़ाइल में डिफ़ॉल्ट रूप से कुछ भी अनुमति नहीं है, इसलिए सब कुछ अस्वीकृत है। आपको उदाहरण के लिए बाइनरी को /etc/passwd
पढ़ने की अनुमति देने के लिए /etc/passwd r,
जैसी पंक्तियाँ जोड़ने की आवश्यकता होगी।
आप फिर enforce कर सकते हैं नया प्रोफ़ाइल के साथ
sudo apparmor_parser -a /etc/apparmor.d/path.to.binary
लॉग से प्रोफ़ाइल को संशोधित करना
निम्नलिखित उपकरण लॉग को पढ़ेगा और उपयोगकर्ता से पूछेगा कि क्या वह कुछ पहचानी गई प्रतिबंधित क्रियाओं की अनुमति देना चाहता है:
sudo aa-logprof
note
तीर कुंजियों का उपयोग करके आप चुन सकते हैं कि आप क्या अनुमति देना/अस्वीकृत करना/कुछ और करना चाहते हैं
प्रोफ़ाइल प्रबंधित करना
#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
Example of AUDIT and DENIED logs from /var/log/audit/audit.log of the 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
आप इस जानकारी को निम्नलिखित का उपयोग करके भी प्राप्त कर सकते हैं:
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-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 के अन्य उपनिर्देशिकाएँ/फ़ाइलें पढ़ने/लिखने/लॉक/लिंक/कार्य करने की पहुँच अस्वीकृत हैं
- माउंट अनुमति नहीं है
- Ptrace केवल उस प्रक्रिया पर चलाया जा सकता है जो समान apparmor प्रोफ़ाइल द्वारा सीमित है
एक बार जब आप docker कंटेनर चलाते हैं तो आपको निम्नलिखित आउटपुट देखना चाहिए:
1 processes are in enforce mode.
docker-default (825)
ध्यान दें कि apparmor डिफ़ॉल्ट रूप से कंटेनर को दी गई क्षमताओं के विशेषाधिकारों को भी ब्लॉक करेगा। उदाहरण के लिए, यह /proc के अंदर लिखने की अनुमति को ब्लॉक करने में सक्षम होगा, भले ही SYS_ADMIN क्षमता दी गई हो क्योंकि डिफ़ॉल्ट रूप से 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 कंटेनर में क्षमताएँ जोड़/हटा सकते हैं (यह अभी भी AppArmor और Seccomp जैसी सुरक्षा विधियों द्वारा प्रतिबंधित रहेगा):
--cap-add=SYS_ADMIN
SYS_ADMIN
क्षमता दें--cap-add=ALL
सभी क्षमताएँ दें--cap-drop=ALL --cap-add=SYS_PTRACE
सभी क्षमताएँ हटा दें और केवलSYS_PTRACE
दें
note
आमतौर पर, जब आप पाते हैं कि आपके पास एक विशिष्ट क्षमता docker कंटेनर के अंदर उपलब्ध है लेकिन शोषण का कुछ हिस्सा काम नहीं कर रहा है, तो इसका कारण यह होगा कि docker 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
जैसा कि नीचे दिखाया गया है, जब हम “/etc/” को बदलने की कोशिश करते हैं, तो हमें त्रुटि मिलती है क्योंकि AppArmor प्रोफ़ाइल “/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 प्रोफ़ाइल को संशोधित कर सकते हैं और इसे फिर से लोड कर सकते हैं। आप प्रतिबंधों को हटा सकते हैं और "बायपास" कर सकते हैं।
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
tip
AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks का समर्थन करें
- सदस्यता योजनाएँ देखें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमारे Twitter 🐦 @hacktricks_live** का पालन करें।**
- हैकिंग ट्रिक्स साझा करें और HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में PRs सबमिट करें।