AppArmor
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
AppArmor, programlara program başına profiller aracılığıyla mevcut kaynakları kısıtlamak için tasarlanmış bir çekirdek geliştirmesidir, erişim kontrol özelliklerini doğrudan kullanıcılara değil, programlara bağlayarak Zorunlu Erişim Kontrolü (MAC) uygulamaktadır. Bu sistem, profilleri çekirdeğe yükleyerek çalışır, genellikle önyükleme sırasında, ve bu profiller bir programın erişebileceği kaynakları, örneğin ağ bağlantıları, ham soket erişimi ve dosya izinleri gibi, belirler.
AppArmor profilleri için iki çalışma modu vardır:
Zorunlu Mod: Bu mod, profil içinde tanımlanan politikaları aktif olarak uygular, bu politikaları ihlal eden eylemleri engeller ve bunları syslog veya auditd gibi sistemler aracılığıyla kaydeder.
Şikayet Modu: Zorunlu modun aksine, şikayet modu profilin politikalarına aykırı olan eylemleri engellemez. Bunun yerine, bu girişimleri politika ihlalleri olarak kaydeder, ancak kısıtlamaları uygulamaz.
Çekirdek Modülü: Politikaların uygulanmasından sorumludur.
Politikalar: Program davranışı ve kaynak erişimi için kuralları ve kısıtlamaları belirtir.
Ayrıştırıcı: Politikaları uygulama veya raporlama için çekirdeğe yükler.
Araçlar: AppArmor ile etkileşimde bulunmak ve yönetmek için bir arayüz sağlayan kullanıcı modu programlarıdır.
AppArmor profilleri genellikle /etc/apparmor.d/ dizininde saklanır.
sudo aa-status
komutunu kullanarak bazı profiller tarafından kısıtlanan ikili dosyaları listeleyebilirsiniz. Listelenen her ikili dosyanın yolundaki "/" karakterini bir nokta ile değiştirirseniz, belirtilen klasördeki AppArmor profilinin adını elde edersiniz.
Örneğin, /usr/bin/man için bir apparmor profili /etc/apparmor.d/usr.bin.man konumunda bulunacaktır.
Etkilenen çalıştırılabilir dosyayı belirtmek için mutlak yollar ve joker karakterler (dosya globbing için) kullanılabilir.
İkili dosyanın dosyalar üzerindeki erişimini belirtmek için aşağıdaki erişim kontrolleri kullanılabilir:
r (okuma)
w (yazma)
m (bellek haritası olarak çalıştırılabilir)
k (dosya kilitleme)
l (sert bağlantılar oluşturma)
ix (yeni programın politika miras alarak başka bir programı çalıştırması için)
Px (ortamı temizledikten sonra başka bir profil altında çalıştırma)
Cx (ortamı temizledikten sonra bir çocuk profil altında çalıştırma)
Ux (ortamı temizledikten sonra kısıtlanmamış olarak çalıştırma)
Değişkenler profillerde tanımlanabilir ve profil dışından manipüle edilebilir. Örneğin: @{PROC} ve @{HOME} (profil dosyasına #include <tunables/global> ekleyin)
İzin verme kurallarını geçersiz kılmak için yasaklama kuralları desteklenmektedir.
Profil oluşturmaya başlamak için apparmor size yardımcı olabilir. Apparmor'un bir ikili dosya tarafından gerçekleştirilen eylemleri incelemesi ve ardından hangi eylemleri izin vermek veya yasaklamak istediğinize karar vermenize olanak tanıması mümkündür. Sadece şunu çalıştırmanız yeterlidir:
Sonra, farklı bir konsolda ikili dosyanın genellikle gerçekleştireceği tüm eylemleri gerçekleştirin:
Sonra, ilk konsolda "s" tuşuna basın ve ardından kaydedilen eylemlerde neyi yok saymak, neyi izin vermek veya ne yapmak istediğinizi belirtin. İşlemi tamamladığınızda "f" tuşuna basın ve yeni profil /etc/apparmor.d/path.to.binary içinde oluşturulacaktır.
Ok tuşlarını kullanarak neyi izin vermek/yasaklamak/veya ne yapmak istediğinizi seçebilirsiniz.
Ayrıca, bir ikili dosyanın apparmor profilinin bir şablonunu oluşturabilirsiniz:
Varsayılan olarak oluşturulan bir profilde hiçbir şeye izin verilmediğini unutmayın, bu nedenle her şey reddedilir. Örneğin, ikili dosyanın /etc/passwd
okumasına izin vermek için /etc/passwd r,
gibi satırlar eklemeniz gerekecek.
Daha sonra yeni profili uygulayabilirsiniz.
Aşağıdaki araç, logları okuyacak ve kullanıcıya tespit edilen bazı yasaklı eylemleri izin verip vermek istemediğini soracaktır:
Ok tuşlarını kullanarak neyi izin vermek/engellemek/başka bir şey yapmak istediğinizi seçebilirsiniz.
Örnek AUDIT ve DENIED logları /var/log/audit/audit.log dosyasından service_bin
yürütülebilir dosyası için:
Bu bilgiyi şu şekilde de alabilirsiniz:
docker-profile profilinin varsayılan olarak nasıl yüklendiğine dikkat edin:
Varsayılan olarak Apparmor docker-default profili https://github.com/moby/moby/tree/master/profiles/apparmor adresinden oluşturulur.
docker-default profili Özeti:
Tüm ağ erişimi
Hiçbir yetenek tanımlanmamıştır (Ancak, bazı yetenekler temel temel kuralları içermekten gelecektir, yani #include <abstractions/base>)
Herhangi bir /proc dosyasına yazma izin verilmez
Diğer alt dizinler/dosyalar için /proc ve /sys okuma/yazma/kilit/link/çalıştırma erişimi reddedilir
Mount izin verilmez
Ptrace, yalnızca aynı apparmor profili tarafından kısıtlanmış bir süreçte çalıştırılabilir
Bir docker konteyneri çalıştırdığınızda aşağıdaki çıktıyı görmelisiniz:
Not edin ki apparmor varsayılan olarak konteynere verilen yetenek ayrıcalıklarını bile engelleyecektir. Örneğin, SYS_ADMIN yeteneği verilse bile /proc içine yazma iznini engelleyebilecektir çünkü varsayılan olarak docker apparmor profili bu erişimi reddeder:
AppArmor kısıtlamalarını aşmak için apparmor'ı devre dışı bırakmalısınız:
Not edin ki varsayılan olarak AppArmor, konteynerin içinden klasörleri monte etmesini yasaklayacaktır; bu, SYS_ADMIN yetkisi ile bile geçerlidir.
Not edin ki docker konteynerine yetkiler ekleyebilir/çıkarabilirsiniz (bu, AppArmor ve Seccomp gibi koruma yöntemleri tarafından hala kısıtlanacaktır):
--cap-add=SYS_ADMIN
SYS_ADMIN
yetkisini verir
--cap-add=ALL
tüm yetkileri verir
--cap-drop=ALL --cap-add=SYS_PTRACE
tüm yetkileri kaldırır ve yalnızca SYS_PTRACE
yetkisini verir
Genellikle, bir docker konteynerinin içinde bir ayrıcalıklı yetki bulduğunuzda ama bazı kısımlarının sömürüsü çalışmıyorsa, bunun nedeni docker'ın apparmor'un bunu engelliyor olmasıdır.
(Örnek buradan alınmıştır)
AppArmor işlevselliğini göstermek için, aşağıdaki satırı ekleyerek “mydocker” adında yeni bir Docker profili oluşturdum:
Profili etkinleştirmek için aşağıdakileri yapmamız gerekiyor:
Profilleri listelemek için aşağıdaki komutu verebiliriz. Aşağıdaki komut, benim yeni AppArmor profilimi listelemektedir.
Aşağıda gösterildiği gibi, “/etc/” dizinini değiştirmeye çalıştığımızda hata alıyoruz çünkü AppArmor profili “/etc” dizinine yazma erişimini engelliyor.
Bir konteynerin hangi apparmor profilinin çalıştığını bulmak için:
Sonra, kullanılan tam profili bulmak için aşağıdaki satırı çalıştırabilirsiniz:
In the weird case you can apparmor docker profilini değiştirebilir ve yeniden yükleyebilirsiniz. Kısıtlamaları kaldırabilir ve "bypass" edebilirsiniz.
AppArmor yol tabanlıdır, bu, /proc
gibi bir dizin içindeki dosyaları koruyor olsa bile, eğer konteynerin nasıl çalıştırılacağını yapılandırabiliyorsanız, ana bilgisayarın proc dizinini /host/proc
içine mount edebilir ve artık AppArmor tarafından korunmayacaktır.
bu hata ile belirli kaynaklarla perl'in çalıştırılmasını engelleseniz bile, eğer sadece ilk satırda #!/usr/bin/perl
belirten bir shell script oluşturursanız ve dosyayı doğrudan çalıştırırsanız, istediğiniz her şeyi çalıştırabileceksiniz. Örnek:
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE) GCP Hacking'i öğrenin ve pratik yapın: HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)