Linux Capabilities
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
RootedCON İspanya'daki en önemli siber güvenlik etkinliği ve Avrupa'daki en önemli etkinliklerden biridir. Teknik bilgiyi teşvik etme misyonu ile bu kongre, her disiplinde teknoloji ve siber güvenlik profesyonelleri için kaynayan bir buluşma noktasıdır.\
Linux yetenekleri root ayrıcalıklarını daha küçük, belirgin birimlere böler, süreçlerin bir ayrıcalık alt kümesine sahip olmasına olanak tanır. Bu, tam root ayrıcalıklarını gereksiz yere vermeyerek riskleri en aza indirir.
Normal kullanıcıların sınırlı izinleri vardır, bu da root erişimi gerektiren bir ağ soketi açma gibi görevleri etkiler.
Inherited (CapInh):
Amaç: Ebeveyn süreçten devredilen yetenekleri belirler.
Fonksiyon: Yeni bir süreç oluşturulduğunda, bu setten ebeveyninden yetenekleri devralır. Süreç oluşturma sırasında belirli ayrıcalıkları korumak için kullanışlıdır.
Kısıtlamalar: Bir süreç, ebeveyninin sahip olmadığı yetenekleri kazanamaz.
Effective (CapEff):
Amaç: Bir sürecin herhangi bir anda kullandığı gerçek yetenekleri temsil eder.
Fonksiyon: Çeşitli işlemler için izin vermek üzere çekirdek tarafından kontrol edilen yetenekler setidir. Dosyalar için, bu set dosyanın izin verilen yeteneklerinin etkili sayılıp sayılmayacağını belirten bir bayrak olabilir.
Önemi: Etkili set, anlık ayrıcalık kontrolleri için kritik öneme sahiptir ve bir sürecin kullanabileceği aktif yetenekler seti olarak işlev görür.
Permitted (CapPrm):
Amaç: Bir sürecin sahip olabileceği maksimum yetenek setini tanımlar.
Fonksiyon: Bir süreç, izin verilen setten bir yeteneği etkili setine yükseltebilir, bu da ona o yeteneği kullanma yetkisi verir. Ayrıca, izin verilen setinden yetenekleri düşürebilir.
Sınır: Bir sürecin sahip olabileceği yetenekler için üst sınır olarak işlev görür ve bir sürecin önceden tanımlanmış ayrıcalık kapsamını aşmadığından emin olur.
Bounding (CapBnd):
Amaç: Bir sürecin yaşam döngüsü boyunca edinebileceği yetenekler için bir tavan koyar.
Fonksiyon: Bir süreç, miras alınabilir veya izin verilen setinde belirli bir yeteneğe sahip olsa bile, o yeteneği yalnızca bounding setinde de varsa edinebilir.
Kullanım durumu: Bu set, bir sürecin ayrıcalık yükseltme potansiyelini kısıtlamak için özellikle kullanışlıdır ve ek bir güvenlik katmanı ekler.
Ambient (CapAmb):
Amaç: Belirli yeteneklerin, tipik olarak sürecin yeteneklerinin tamamen sıfırlanmasına neden olacak bir execve
sistem çağrısı sırasında korunmasına olanak tanır.
Fonksiyon: İlgili dosya yeteneklerine sahip olmayan SUID olmayan programların belirli ayrıcalıkları korumasını sağlar.
Kısıtlamalar: Bu set içindeki yetenekler, miras alınabilir ve izin verilen setlerin kısıtlamalarına tabidir, böylece sürecin izin verilen ayrıcalıklarını aşmazlar.
Daha fazla bilgi için kontrol edin:
Belirli bir süreç için yetenekleri görmek için, /proc dizinindeki status dosyasını kullanın. Daha fazla ayrıntı sağladığı için, bunu yalnızca Linux yetenekleri ile ilgili bilgilere sınırlayalım. Tüm çalışan süreçler için yetenek bilgisi her bir iş parçacığı başına korunur, dosya sistemindeki ikili dosyalar için ise genişletilmiş niteliklerde saklanır.
Yetenekleri /usr/include/linux/capability.h dosyasında bulabilirsiniz.
Mevcut sürecin yeteneklerini cat /proc/self/status
komutunu kullanarak veya capsh --print
komutunu çalıştırarak, diğer kullanıcıların yeteneklerini ise /proc/<pid>/status
dosyasında bulabilirsiniz.
Bu komut, çoğu sistemde 5 satır döndürmelidir.
CapInh = Miras alınan yetenekler
CapPrm = İzin verilen yetenekler
CapEff = Etkili yetenekler
CapBnd = Sınır seti
CapAmb = Ortam yetenekleri seti
Bu onaltılık sayılar mantıklı değil. capsh aracını kullanarak bunları yetenek adlarına çözebiliriz.
Şimdi ping
tarafından kullanılan capabilities'leri kontrol edelim:
Although that works, there is another and easier way. To see the capabilities of a running process, simply use the getpcaps tool followed by its process ID (PID). You can also provide a list of process IDs.
Bunun işe yaradığını bilsek de, başka ve daha kolay bir yol var. Çalışan bir sürecin yeteneklerini görmek için, getpcaps aracını kullanarak ardından süreç kimliğini (PID) yazmanız yeterlidir. Ayrıca bir süreç kimliği listesi de verebilirsiniz.
Burada tcpdump
'ın yeteneklerini kontrol edelim, ikili dosyaya yeterli yetenekler (cap_net_admin
ve cap_net_raw
) verildikten sonra ağı dinlemek için (tcpdump işlem 9562'de çalışıyor):
Görüldüğü gibi, verilen yetenekler, bir ikili dosyanın yeteneklerini elde etmenin 2 yolunun sonuçlarıyla örtüşmektedir. getpcaps aracı, belirli bir iş parçacığı için mevcut yetenekleri sorgulamak üzere capget() sistem çağrısını kullanır. Bu sistem çağrısı, daha fazla bilgi almak için yalnızca PID sağlamayı gerektirir.
İkili dosyalar, yürütme sırasında kullanılabilecek yeteneklere sahip olabilir. Örneğin, cap_net_raw
yeteneğine sahip ping
ikili dosyasını bulmak oldukça yaygındır:
Becerilere sahip ikili dosyaları aramak için:
Eğer ping için CAP_NET_RAW yetkilerini düşürürsek, ping aracı artık çalışmamalıdır.
Bunun yanı sıra, capsh çıktısının yanı sıra, tcpdump komutu da bir hata vermelidir.
/bin/bash: /usr/sbin/tcpdump: İşlem izin verilmedi
Hata, ping komutunun bir ICMP soketi açmasına izin verilmediğini açıkça gösteriyor. Artık bunun beklendiği gibi çalıştığını kesin olarak biliyoruz.
Bir ikili dosyanın yeteneklerini kaldırabilirsiniz.
Görünüşe göre yetenekler kullanıcılarla da atanabilir. Bu muhtemelen, kullanıcının yürüttüğü her sürecin kullanıcı yeteneklerini kullanabileceği anlamına geliyor.
Bu, bu ve bu temelinde, bir kullanıcıya belirli yetenekler vermek için yapılandırılması gereken birkaç dosya var, ancak yetenekleri her kullanıcıya atayan dosya /etc/security/capability.conf
olacaktır.
Dosya örneği:
Aşağıdaki programı derleyerek yetenekler sağlayan bir ortamda bir bash shell başlatmak mümkündür.
Derlenmiş ortam ikili dosyası tarafından yürütülen bash içinde, "mevcut" bölümünde herhangi bir yeteneği olmayan bir normal kullanıcının aksine, yeni yeteneklerin gözlemlenmesi mümkündür.
Sadece hem izin verilen hem de miras alınan setlerde bulunan yetenekleri ekleyebilirsiniz.
Yetenek farkında ikili dosyalar, ortam tarafından verilen yeni yetenekleri kullanmayacak, ancak yetenek cahil ikili dosyalar bunları kullanacak çünkü reddetmeyeceklerdir. Bu, yetenek cahil ikili dosyaları, ikili dosyalara yetenek veren özel bir ortamda savunmasız hale getirir.
Varsayılan olarak, root olarak çalışan bir hizmet tüm yetenekleri atayacaktır ve bazı durumlarda bu tehlikeli olabilir. Bu nedenle, bir hizmet yapılandırma dosyası, hizmetin sahip olmasını istediğiniz yetenekleri belirlemenize ve hizmeti çalıştıracak kullanıcıyı tanımlamanıza olanak tanır; böylece gereksiz ayrıcalıklara sahip bir hizmet çalıştırmaktan kaçınılır:
Varsayılan olarak Docker, konteynerlere birkaç yetenek atar. Bu yeteneklerin hangileri olduğunu kontrol etmek çok kolaydır:
RootedCON İspanya'daki en önemli siber güvenlik etkinliği ve Avrupa'daki en önemli etkinliklerden biridir. Teknik bilgiyi teşvik etme misyonu ile bu kongre, her disiplindeki teknoloji ve siber güvenlik profesyonelleri için kaynayan bir buluşma noktasıdır.
Yetkiler, ayrıcalıklı işlemler gerçekleştirdikten sonra kendi süreçlerinizi kısıtlamak istediğinizde (örneğin, chroot kurduktan ve bir sokete bağlandıktan sonra) faydalıdır. Ancak, kötü niyetli komutlar veya argümanlar geçirerek istismar edilebilir ve bu komutlar root olarak çalıştırılır.
setcap
kullanarak programlara yetki zorlayabilir ve bunları getcap
ile sorgulayabilirsiniz:
+ep
demek, yeteneği ekliyorsunuz (“-” onu kaldırır) Etkili ve İzinli olarak.
Bir sistemde veya klasörde yeteneklere sahip programları tanımlamak için:
Aşağıdaki örnekte, ikili dosya /usr/bin/python2.6
privesc için savunmasız bulunmuştur:
Herhangi bir kullanıcının paketleri dinlemesine izin vermek için tcpdump
tarafından gereken Yetenekler:
Belgelerden: Boş yetenek setlerinin bir program dosyasına atanabileceğini unutmayın, bu nedenle, programı yürüten sürecin etkili ve kaydedilmiş set-kullanıcı-ID'sini 0 olarak değiştiren bir set-kullanıcı-ID-root programı oluşturmak mümkündür, ancak bu sürece hiçbir yetenek kazandırmaz. Ya da basitçe ifade etmek gerekirse, eğer bir ikili dosyanız varsa:
root tarafından sahiplenilmemiş
SUID
/SGID
bitleri ayarlanmamış
boş yetenek setine sahip (örneğin: getcap myelf
myelf =ep
döner)
o zaman o ikili dosya root olarak çalışacaktır.
CAP_SYS_ADMIN
, geniş yönetim ayrıcalıkları nedeniyle genellikle neredeyse root seviyesine eşitlenen son derece güçlü bir Linux yeteneğidir; örneğin, cihazları monte etme veya çekirdek özelliklerini manipüle etme gibi. Tüm sistemleri simüle eden konteynerler için vazgeçilmez olsa da, CAP_SYS_ADMIN
önemli güvenlik zorlukları ortaya çıkarır, özellikle ayrıcalık yükseltme ve sistemin tehlikeye atılma potansiyeli nedeniyle konteynerleştirilmiş ortamlarda. Bu nedenle, kullanımı sıkı güvenlik değerlendirmeleri ve dikkatli yönetim gerektirir; uygulama özel konteynerlerde bu yeteneğin bırakılması, en az ayrıcalık ilkesi ile uyum sağlamak ve saldırı yüzeyini en aza indirmek için güçlü bir tercih olmalıdır.
İkili dosya ile örnek
Python kullanarak gerçek passwd dosyasının üzerine değiştirilmiş bir passwd dosyası monte edebilirsiniz:
Ve sonunda mount edilmiş passwd
dosyasını /etc/passwd
üzerine yerleştirin:
Ve "password" şifresi ile su
olarak root olabileceksiniz.
Ortam ile örnek (Docker breakout)
Docker konteyneri içinde etkinleştirilen yetenekleri kontrol edebilirsiniz:
İlk çıktıda SYS_ADMIN yetkisinin etkin olduğunu görebilirsiniz.
Mount
Bu, docker konteynerinin ana makine diskini bağlamasına ve buna serbestçe erişmesine olanak tanır:
Tam erişim
Önceki yöntemde docker ana bilgisayar diskine erişmeyi başardık. Eğer ana bilgisayarın bir ssh sunucusu çalıştığını bulursanız, docker ana bilgisayar diskinde bir kullanıcı oluşturabilir ve buna SSH üzerinden erişebilirsiniz:
Bu, bir shellcode'u ana makinede çalışan bir süreç içine enjekte ederek konteynerden çıkabileceğiniz anlamına gelir. Ana makinede çalışan süreçlere erişmek için konteynerin en az --pid=host
ile çalıştırılması gerekir.
CAP_SYS_PTRACE
, ptrace(2)
tarafından sağlanan hata ayıklama ve sistem çağrısı izleme işlevlerini kullanma yeteneğini ve process_vm_readv(2)
ve process_vm_writev(2)
gibi bellekler arası ekleme çağrılarını kullanma yeteneğini verir. Hata ayıklama ve izleme amaçları için güçlü olmasına rağmen, CAP_SYS_PTRACE
kısıtlayıcı önlemler olmadan, örneğin ptrace(2)
üzerinde bir seccomp filtresi olmadan etkinleştirildiğinde, sistem güvenliğini önemli ölçüde zayıflatabilir. Özellikle, diğer güvenlik kısıtlamalarını, özellikle seccomp tarafından dayatılanları aşmak için kullanılabilir; bu, bu tür kanıtlar (PoC) ile gösterilmiştir.
Binary ile örnek (python)
Örnek ile ikili (gdb)
gdb
ile ptrace
yetkisi:
Debug bir root sürecini gdb ile yapın ve daha önce oluşturulan gdb satırlarını kopyalayıp yapıştırın:
Örnek ile ortam (Docker breakout) - Başka bir gdb Suistimali
Eğer GDB yüklüyse (veya örneğin apk add gdb
veya apt install gdb
ile yükleyebilirsiniz) bir süreci ana makineden hata ayıklayabilir ve system
fonksiyonunu çağırmasını sağlayabilirsiniz. (Bu teknik ayrıca SYS_ADMIN
yeteneğini de gerektirir).
Komutun çıktısını göremeyeceksiniz ama bu işlem tarafından yürütülecektir (bu yüzden bir rev shell alın).
Eğer "No symbol "system" in current context." hatasını alırsanız, gdb aracılığıyla bir programda shellcode yükleyen önceki örneği kontrol edin.
Ortam ile örnek (Docker breakout) - Shellcode Enjeksiyonu
Docker konteyneri içinde etkinleştirilmiş yetenekleri kontrol edebilirsiniz:
List processes running in the host ps -eaf
Get the architecture uname -m
Find a shellcode for the architecture (https://www.exploit-db.com/exploits/41128)
Find a program to inject the shellcode into a process memory (https://github.com/0x00pf/0x00sec_code/blob/master/mem_inject/infect.c)
Modify the shellcode inside the program and compile it gcc inject.c -o inject
Inject it and grab your shell: ./inject 299; nc 172.17.0.1 5600
CAP_SYS_MODULE
bir sürece çekirdek modüllerini yükleme ve kaldırma (init_module(2)
, finit_module(2)
ve delete_module(2)
sistem çağrıları) yetkisi verir, bu da çekirdeğin temel işlemlerine doğrudan erişim sağlar. Bu yetenek, çekirdekte değişiklik yaparak tüm Linux güvenlik mekanizmalarını, Linux Güvenlik Modülleri ve konteyner izolasyonu dahil olmak üzere, atlayarak ayrıcalık yükseltme ve toplam sistem tehlikesi oluşturma riski taşır.
Bu, ana makinenin çekirdeğine çekirdek modüllerini ekleyip kaldırabileceğiniz anlamına gelir.
Binary ile örnek
Aşağıdaki örnekte python
adlı binary bu yetkiye sahiptir.
Varsayılan olarak, modprobe
komutu bağımlılık listesini ve harita dosyalarını /lib/modules/$(uname -r)
dizininde kontrol eder.
Bunu kötüye kullanmak için, sahte bir lib/modules klasörü oluşturalım:
Sonra aşağıda bulabileceğiniz 2 örneği derleyin ve bunu bu klasöre kopyalayın:**
Son olarak, bu çekirdek modülünü yüklemek için gerekli python kodunu çalıştırın:
Örnek 2 ikili ile
Aşağıdaki örnekte kmod
ikilisi bu yetkiye sahiptir.
Bu, insmod
komutunu kullanarak bir çekirdek modülü eklemenin mümkün olduğu anlamına gelir. Bu yetkiden yararlanarak bir reverse shell almak için aşağıdaki örneği takip edin.
Ortam ile örnek (Docker breakout)
Docker konteyneri içinde etkinleştirilen yetenekleri kontrol etmek için:
İlk çıktıda SYS_MODULE yetkisinin etkin olduğunu görebilirsiniz.
Ters kabuk çalıştıracak kernel modülünü ve bunu derlemek için Makefile'ı oluşturun:
Makefile'deki her make kelimesinden önceki boş karakter bir sekme olmalıdır, boşluk değil!
Bunu derlemek için make
komutunu çalıştırın.
Son olarak, bir shell içinde nc
başlatın ve diğer bir shell'den modülü yükleyin ve nc sürecinde shell'i yakalayacaksınız:
Bu tekniğin kodu, https://www.pentesteracademy.com/ adresindeki "SYS_MODULE Yetkisini Kötüye Kullanma" laboratuvarından kopyalanmıştır.
Bu tekniğin bir başka örneği https://www.cyberark.com/resources/threat-research-blog/how-i-hacked-play-with-docker-and-remotely-ran-code-on-the-host adresinde bulunabilir.
CAP_DAC_READ_SEARCH bir sürecin dosyaları okuma ve dizinleri okuma ve yürütme izinlerini atlamasına olanak tanır. Birincil kullanımı dosya arama veya okuma amaçları içindir. Ancak, bu aynı zamanda bir sürecin open_by_handle_at(2)
fonksiyonunu kullanmasına da izin verir; bu fonksiyon, sürecin montaj ad alanının dışındaki dosyalar da dahil olmak üzere herhangi bir dosyaya erişebilir. open_by_handle_at(2)
'de kullanılan tanıtıcı, name_to_handle_at(2)
aracılığıyla elde edilen şeffaf olmayan bir tanımlayıcı olmalıdır, ancak değiştirmeye karşı savunmasız olan inode numaraları gibi hassas bilgileri içerebilir. Bu yetkinin kötüye kullanılma potansiyeli, özellikle Docker konteynerleri bağlamında, Sebastian Krahmer tarafından şok edici bir istismar ile gösterilmiştir; bu konu burada analiz edilmiştir.
Bu, dosya okuma izin kontrolünü ve dizin okuma/yürütme izin kontrolünü atlayabileceğiniz anlamına gelir.
İkili ile örnek
İkili, herhangi bir dosyayı okuyabilecektir. Yani, eğer tar gibi bir dosya bu yetkiye sahipse, gölge dosyasını okuyabilecektir:
Örnek binary2 ile
Bu durumda python
ikili dosyasının bu yetkiye sahip olduğunu varsayalım. Kök dosyalarını listelemek için şunu yapabilirsiniz:
Ve bir dosyayı okumak için şunu yapabilirsiniz:
Örnek Ortamda (Docker breakout)
Docker konteyneri içindeki etkinleştirilmiş yetenekleri kontrol etmek için:
İlk çıktıda DAC_READ_SEARCH yetkisinin etkin olduğunu görebilirsiniz. Sonuç olarak, konteyner işlemleri hata ayıklayabilir.
Aşağıdaki istismar yönteminin nasıl çalıştığını https://medium.com/@fun_cuddles/docker-breakout-exploit-analysis-a274fff0e6b3 adresinden öğrenebilirsiniz, ancak özetle CAP_DAC_READ_SEARCH yalnızca dosya sisteminde izin kontrolleri olmadan gezinmemize izin vermekle kalmaz, aynı zamanda open_by_handle_at(2) için herhangi bir kontrolü açıkça kaldırır ve işlemimizin diğer işlemler tarafından açılan hassas dosyalara erişmesine izin verebilir.
Bu izinleri kullanarak ana bilgisayardan dosyaları okumak için kullanılan orijinal istismarı burada bulabilirsiniz: http://stealth.openwall.net/xSports/shocker.c, aşağıda okumak istediğiniz dosyayı ilk argüman olarak belirtmenizi ve bir dosyaya dökmenizi sağlayan değiştirilmiş bir versiyon bulunmaktadır.
Sömürü, ana makinede monte edilmiş bir şeye işaretçi bulmalıdır. Orijinal sömürü /.dockerinit dosyasını kullanıyordu ve bu değiştirilmiş versiyon /etc/hostname kullanıyor. Sömürü çalışmıyorsa, belki farklı bir dosya ayarlamanız gerekebilir. Ana makinede monte edilmiş bir dosyayı bulmak için sadece mount komutunu çalıştırın:
Bu tekniğin kodu, https://www.pentesteracademy.com/ adresinden "DAC_READ_SEARCH Yetkisini Kötüye Kullanma" laboratuvarından kopyalanmıştır.
RootedCON İspanya'daki en önemli siber güvenlik etkinliği ve Avrupa'daki en önemli etkinliklerden biridir. Teknik bilgiyi teşvik etme misyonuyla, bu kongre, her disiplinde teknoloji ve siber güvenlik profesyonelleri için kaynayan bir buluşma noktasıdır.
Bu, herhangi bir dosya üzerindeki yazma izin kontrollerini atlayabileceğiniz anlamına gelir, böylece herhangi bir dosyayı yazabilirsiniz.
Yetkileri artırmak için üzerine yazabileceğiniz birçok dosya vardır, buradan fikir alabilirsiniz.
İkili ile örnek
Bu örnekte vim bu yetkiye sahiptir, bu nedenle passwd, sudoers veya shadow gibi herhangi bir dosyayı değiştirebilirsiniz:
Örnek 2 ile
Bu örnekte python
ikili dosyası bu yetkiye sahip olacaktır. Herhangi bir dosyayı geçersiz kılmak için python kullanabilirsiniz:
Örnek ile ortam + CAP_DAC_READ_SEARCH (Docker breakout)
Docker konteyneri içinde etkinleştirilen yetenekleri kontrol etmek için:
Öncelikle, ev sahibinin rastgele dosyalarını okumak için DAC_READ_SEARCH yetkisini kötüye kullanır bölümünü okuyun ve istismarı derleyin. Ardından, ev sahibinin dosya sisteminin içine rastgele dosyalar yazmanıza olanak tanıyacak şok edici istismarın aşağıdaki sürümünü derleyin:
Docker konteynerinden çıkmak için, ana bilgisayardan /etc/shadow
ve /etc/passwd
dosyalarını indirin, onlara yeni bir kullanıcı ekleyin ve bunları üzerine yazmak için shocker_write
kullanın. Ardından, ssh üzerinden erişim sağlayın.
Bu tekniğin kodu, https://www.pentesteracademy.com adresindeki "DAC_OVERRIDE Yetkisini Kötüye Kullanma" laboratuvarından kopyalanmıştır.
Bu, herhangi bir dosyanın sahipliğini değiştirmenin mümkün olduğu anlamına gelir.
İkili ile örnek
Diyelim ki python
ikilisi bu yetkiye sahip, shadow dosyasının sahibini değiştirebilir, root şifresini değiştirebilir ve ayrıcalıkları yükseltebilirsiniz:
Veya ruby
ikili dosyasının bu yetkiye sahip olması:
Bu, herhangi bir dosyanın izinlerini değiştirme olanağına sahip olduğunuz anlamına gelir.
İkili ile örnek
Eğer python bu yetkiye sahipse, gölge dosyasının izinlerini değiştirebilir, root şifresini değiştirebilir ve ayrıcalıkları artırabilirsiniz:
Bu, oluşturulan sürecin etkili kullanıcı kimliğini ayarlamanın mümkün olduğu anlamına gelir.
İkili ile örnek
Eğer python bu yetkiye sahipse, bunu kök yetkilerine yükseltmek için çok kolay bir şekilde kötüye kullanabilirsiniz:
Başka bir yol:
Bu, oluşturulan sürecin etkili grup kimliğini ayarlamanın mümkün olduğu anlamına gelir.
Yetkileri artırmak için üzerine yazabileceğiniz birçok dosya var, buradan fikir alabilirsiniz.
İkili ile örnek
Bu durumda, herhangi bir grubu taklit edebileceğiniz için bir grubun okuyabileceği ilginç dosyaları aramalısınız:
Bir dosya bulduğunuzda (okuma veya yazma yoluyla) ayrıcalıkları artırmak için istismar edebilirsiniz, ilginç grubu taklit eden bir shell alabilirsiniz:
Bu durumda grup shadow taklit edildi, böylece /etc/shadow
dosyasını okuyabilirsiniz:
Eğer docker yüklüyse, docker grubunu taklit edebilir ve bunu docker soketi ile iletişim kurmak ve ayrıcalıkları artırmak için kötüye kullanabilirsiniz.
Bu, dosyalar ve süreçler üzerinde yetenekler ayarlamanın mümkün olduğu anlamına gelir.
İkili ile örnek
Eğer python bu yeteneke sahipse, bunu kök ayrıcalıklarını artırmak için çok kolay bir şekilde kötüye kullanabilirsiniz:
Yeni bir yetkiyi CAP_SETFCAP ile ikili dosyaya ayarlarsanız, bu yetkiyi kaybedeceksiniz.
Bir SETUID yetkisi aldıktan sonra, ayrıcalıkları nasıl artıracağınızı görmek için ilgili bölümüne gidebilirsiniz.
Ortam ile örnek (Docker breakout)
Varsayılan olarak, CAP_SETFCAP yetkisi Docker'daki konteyner içindeki işlemlere verilir. Bunu kontrol etmek için şöyle bir şey yapabilirsiniz:
Bu yetenek, binaries'e herhangi bir başka yetenek verme imkanı tanır, bu nedenle bu sayfada bahsedilen diğer yetenek kaçışlarını istismar ederek konteynerden kaçmayı düşünebiliriz. Ancak, örneğin gdb binary'sine CAP_SYS_ADMIN ve CAP_SYS_PTRACE yeteneklerini vermeye çalışırsanız, bunları verebileceğinizi göreceksiniz, ancak binary bundan sonra çalıştırılamayacaktır:
From the docs: Permitted: Bu, bir iş parçacığının üstlenebileceği etkili yetenekler için sınırlayıcı bir süper kümedir. Ayrıca, CAP_SETPCAP yeteneğine sahip olmayan bir iş parçacığı tarafından miras alınabilir sete eklenebilecek yetenekler için de sınırlayıcı bir süper kümedir. Görünüşe göre, İzin verilen yetenekler kullanılabilecek olanları sınırlar. Ancak, Docker varsayılan olarak CAP_SETPCAP verir, bu nedenle miras alınabilir olanların içine yeni yetenekler ayarlayabilirsiniz. Ancak, bu yeteneğin belgelerinde: CAP_SETPCAP : […] çağrılan iş parçacığının sınırlayıcı kümesinden miras alınabilir sete herhangi bir yetenek ekler. Görünüşe göre, yalnızca sınırlayıcı kümeden miras alınabilir set yeteneklerine ekleme yapabiliyoruz. Bu da yeni yetenekleri, örneğin CAP_SYS_ADMIN veya CAP_SYS_PTRACE'ı miras setine koyamayacağımız anlamına geliyor.
CAP_SYS_RAWIO, /dev/mem
, /dev/kmem
veya /proc/kcore
erişimi, mmap_min_addr
'ı değiştirme, ioperm(2)
ve iopl(2)
sistem çağrılarına erişim ve çeşitli disk komutları dahil olmak üzere bir dizi hassas işlem sağlar. FIBMAP ioctl(2)
de bu yetenek aracılığıyla etkinleştirilmiştir ve bu, geçmişte sorunlara neden olmuştur. Man sayfasına göre, bu aynı zamanda sahibine diğer cihazlarda tanımlayıcı bir şekilde bir dizi cihaz spesifik işlemi gerçekleştirme
yetkisi verir.
Bu, yetki yükseltme ve Docker kırılması için faydalı olabilir.
Bu, herhangi bir süreci öldürmenin mümkün olduğu anlamına gelir.
İkili ile örnek
Diyelim ki python
ikilisi bu yeteneğe sahip. Eğer bir hizmet veya soket yapılandırma (veya bir hizmetle ilgili herhangi bir yapılandırma dosyası) dosyasını da değiştirebilirseniz, arka kapı oluşturabilir ve ardından o hizmetle ilgili süreci öldürebilir ve yeni yapılandırma dosyasının arka kapınızla çalıştırılmasını bekleyebilirsiniz.
Privesc with kill
Eğer kill yetkileriniz varsa ve root olarak çalışan bir node programı (veya farklı bir kullanıcı olarak) varsa, muhtemelen ona SIGUSR1 sinyalini gönderebilir ve node hata ayıklayıcısını açmasını sağlayabilirsiniz.
RootedCON İspanya'daki en önemli siber güvenlik etkinliği ve Avrupa'daki en önemli etkinliklerden biridir. Teknik bilgiyi teşvik etme misyonu ile bu kongre, her disiplinde teknoloji ve siber güvenlik profesyonelleri için kaynayan bir buluşma noktasıdır.
Bu, herhangi bir portta (hatta ayrıcalıklı olanlarda) dinlemenin mümkün olduğu anlamına gelir. Bu yetenekle doğrudan ayrıcalıkları yükseltmek mümkün değildir.
İkili ile örnek
Eğer python
bu yeteneğe sahipse, herhangi bir portta dinleyebilir ve hatta bu porttan başka bir porta bağlanabilir (bazı hizmetler belirli ayrıcalıklı portlardan bağlantılar gerektirir)
CAP_NET_RAW yetkisi, süreçlerin RAW ve PACKET soketleri oluşturmasına izin verir, bu da onların rastgele ağ paketleri oluşturup göndermesine olanak tanır. Bu, konteynerleştirilmiş ortamlarda paket sahteciliği, trafik enjeksiyonu ve ağ erişim kontrollerinin atlatılması gibi güvenlik risklerine yol açabilir. Kötü niyetli aktörler, bu durumu konteyner yönlendirmesini etkilemek veya ana makine ağ güvenliğini tehlikeye atmak için kullanabilir, özellikle yeterli güvenlik duvarı korumaları yoksa. Ayrıca, CAP_NET_RAW, ayrıcalıklı konteynerlerin RAW ICMP istekleri aracılığıyla ping gibi işlemleri desteklemesi için kritik öneme sahiptir.
Bu, trafiği dinlemenin mümkün olduğu anlamına gelir. Bu yetki ile doğrudan ayrıcalıkları artırmak mümkün değildir.
Binary ile örnek
Eğer tcpdump
binary'si bu yetkiye sahipse, ağ bilgilerini yakalamak için bunu kullanabileceksiniz.
Not edin ki eğer environment bu yeteneği veriyorsa, tcpdump
kullanarak trafiği dinleyebilirsiniz.
Binary 2 ile örnek
Aşağıdaki örnek, "lo" (localhost) arayüzünün trafiğini yakalamak için yararlı olabilecek python2
kodudur. Kod, https://attackdefense.pentesteracademy.com/ adresindeki "The Basics: CAP-NET_BIND + NET_RAW" laboratuvarından alınmıştır.
CAP_NET_ADMIN yetkisi, sahibine ağ yapılandırmalarını değiştirme gücü verir; bu, güvenlik duvarı ayarları, yönlendirme tabloları, soket izinleri ve maruz kalan ağ ad alanları içindeki ağ arayüzü ayarlarını içerir. Ayrıca, ağ arayüzlerinde promiscuous mode'u açma yeteneği sağlar, bu da ad alanları arasında paket dinlemeye olanak tanır.
Binary ile örnek
Diyelim ki python binary'sinin bu yetenekleri var.
Bu, inode niteliklerini değiştirmenin mümkün olduğu anlamına gelir. Bu yetenekle doğrudan ayrıcalıkları artırmak mümkün değildir.
Binary ile örnek
Bir dosyanın değiştirilemez olduğunu ve python'un bu yeteneğe sahip olduğunu bulursanız, değiştirilemez niteliği kaldırabilir ve dosyayı değiştirilebilir hale getirebilirsiniz:
Genellikle bu değiştirilemez özellik şu şekilde ayarlanır ve kaldırılır:
CAP_SYS_CHROOT, chroot(2)
sistem çağrısının yürütülmesini sağlar ve bu, bilinen güvenlik açıkları aracılığıyla chroot(2)
ortamlarından kaçışa olanak tanıyabilir:
CAP_SYS_BOOT, belirli donanım platformları için özelleştirilmiş LINUX_REBOOT_CMD_RESTART2
gibi komutlar da dahil olmak üzere sistem yeniden başlatmaları için reboot(2)
sistem çağrısının yürütülmesine izin verir. Ayrıca, kexec_load(2)
ve Linux 3.17'den itibaren yeni veya imzalı çökme çekirdeklerini yüklemek için kexec_file_load(2)
kullanımını da sağlar.
CAP_SYSLOG, Linux 2.6.37'de daha geniş CAP_SYS_ADMIN'den ayrılmıştır ve syslog(2)
çağrısını kullanma yetkisini özel olarak vermektedir. Bu yetenek, kptr_restrict
ayarı 1 olduğunda, çekirdek adreslerinin /proc
ve benzeri arayüzler aracılığıyla görüntülenmesini sağlar. Linux 2.6.39'dan itibaren, kptr_restrict
için varsayılan değer 0'dır, bu da çekirdek adreslerinin açığa çıktığı anlamına gelir; ancak birçok dağıtım bunu güvenlik nedenleriyle 1 (uid 0 dışındaki adresleri gizle) veya 2 (her zaman adresleri gizle) olarak ayarlamaktadır.
Ayrıca, CAP_SYSLOG, dmesg_restrict
1 olarak ayarlandığında dmesg
çıktısına erişim sağlar. Bu değişikliklere rağmen, CAP_SYS_ADMIN, tarihsel nedenlerden dolayı syslog
işlemlerini gerçekleştirme yeteneğini korumaktadır.
CAP_MKNOD, mknod
sistem çağrısının işlevselliğini, normal dosyalar, FIFO'lar (adlandırılmış borular) veya UNIX alan soketleri oluşturmanın ötesine taşır. Özellikle, aşağıdakiler de dahil olmak üzere özel dosyaların oluşturulmasına izin verir:
S_IFCHR: Terminal gibi karakter özel dosyaları.
S_IFBLK: Diskler gibi blok özel dosyaları.
Bu yetenek, cihaz dosyaları oluşturma yeteneğine ihtiyaç duyan süreçler için gereklidir ve karakter veya blok cihazları aracılığıyla doğrudan donanım etkileşimini kolaylaştırır.
Bu, varsayılan bir docker yeteneğidir (https://github.com/moby/moby/blob/master/oci/caps/defaults.go#L6-L19).
Bu yetenek, aşağıdaki koşullar altında ana makinede ayrıcalık yükseltmelerine (tam disk okuma yoluyla) izin verir:
Ana makineye başlangıç erişimine sahip olmak (Ayrıcalıksız).
Konteynere başlangıç erişimine sahip olmak (Ayrıcalıklı (EUID 0) ve etkili CAP_MKNOD
).
Ana makine ve konteyner aynı kullanıcı ad alanını paylaşmalıdır.
Konteynerde Bir Blok Cihazı Oluşturma ve Erişim Sağlama Adımları:
Ana Makinede Standart Kullanıcı Olarak:
id
ile mevcut kullanıcı kimliğinizi belirleyin, örneğin, uid=1000(standartuser)
.
Hedef cihazı belirleyin, örneğin, /dev/sdb
.
Konteyner İçinde root
Olarak:
Ana Makinede:
Bu yaklaşım, standart kullanıcının /dev/sdb
'den veri okuma ve erişim sağlama imkanı tanır, bu da paylaşılan kullanıcı ad alanları ve cihaz üzerindeki izinlerin istismarını içerir.
CAP_SETPCAP, bir sürecin başka bir sürecin yetenek setlerini değiştirmesine olanak tanır ve böylece etkili, miras alınabilir ve izin verilen setlerden yeteneklerin eklenmesine veya kaldırılmasına izin verir. Ancak, bir süreç yalnızca kendi izin verilen setinde sahip olduğu yetenekleri değiştirebilir, bu da başka bir sürecin ayrıcalıklarını kendi seviyesinin ötesine yükseltmesini engeller. Son zamanlardaki çekirdek güncellemeleri bu kuralları sıkılaştırmış, CAP_SETPCAP
'ı yalnızca kendi veya alt süreçlerinin izin verilen setlerindeki yetenekleri azaltmakla sınırlı hale getirmiştir; bu, güvenlik risklerini azaltmayı amaçlamaktadır. Kullanım, etkili set içinde CAP_SETPCAP
ve izin verilen set içinde hedef yeteneklere sahip olmayı gerektirir; değişiklikler için capset()
kullanılmalıdır. Bu, CAP_SETPCAP
'ın temel işlevini ve sınırlamalarını özetler, ayrıcalık yönetimi ve güvenlik artırımı konusundaki rolünü vurgular.
CAP_SETPCAP
, bir sürecin başka bir sürecin yetenek setlerini değiştirmesine olanak tanıyan bir Linux yeteneğidir. Diğer süreçlerin etkili, miras alınabilir ve izin verilen yetenek setlerinden yetenek ekleme veya kaldırma yeteneği verir. Ancak, bu yeteneğin nasıl kullanılacağına dair bazı kısıtlamalar vardır.
CAP_SETPCAP
'a sahip bir süreç yalnızca kendi izin verilen yetenek setinde bulunan yetenekleri verebilir veya kaldırabilir. Diğer bir deyişle, bir süreç, kendisinde bulunmayan bir yeteneği başka bir sürece veremez. Bu kısıtlama, bir sürecin başka bir sürecin ayrıcalıklarını kendi ayrıcalık seviyesinin ötesine yükseltmesini engeller.
Ayrıca, son zamanlardaki çekirdek sürümlerinde, CAP_SETPCAP
yeteneği daha da kısıtlanmıştır. Artık bir sürecin diğer süreçlerin yetenek setlerini keyfi olarak değiştirmesine izin vermemektedir. Bunun yerine, bir sürecin yalnızca kendi izin verilen yetenek setindeki veya alt süreçlerinin izin verilen yetenek setindeki yetenekleri azaltmasına izin verilmektedir. Bu değişiklik, yetenekle ilişkili potansiyel güvenlik risklerini azaltmak için getirilmiştir.
CAP_SETPCAP
'ı etkili bir şekilde kullanmak için, yeteneği etkili yetenek setinizde ve hedef yetenekleri izin verilen yetenek setinizde bulundurmanız gerekir. Daha sonra, diğer süreçlerin yetenek setlerini değiştirmek için capset()
sistem çağrısını kullanabilirsiniz.
Özetle, CAP_SETPCAP
, bir sürecin diğer süreçlerin yetenek setlerini değiştirmesine olanak tanır, ancak kendisinde bulunmayan yetenekleri veremez. Ayrıca, güvenlik endişeleri nedeniyle, son zamanlardaki çekirdek sürümlerinde yalnızca kendi izin verilen yetenek setindeki veya alt süreçlerinin izin verilen yetenek setlerindeki yetenekleri azaltmaya izin verecek şekilde işlevselliği sınırlanmıştır.
Bu örneklerin çoğu https://attackdefense.pentesteracademy.com/ laboratuvarlarından alınmıştır, bu nedenle bu privesc tekniklerini uygulamak istiyorsanız bu laboratuvarları öneririm.
Diğer referanslar:
RootedCON İspanya'daki en ilgili siber güvenlik etkinliği ve Avrupa'daki en önemli etkinliklerden biridir. Teknik bilgiyi teşvik etme misyonuyla, bu kongre, her disiplinde teknoloji ve siber güvenlik profesyonelleri için kaynayan bir buluşma noktasıdır.
AWS Hacking'i öğrenin ve uygulayın:HackTricks Training AWS Red Team Expert (ARTE) GCP Hacking'i öğrenin ve uygulayın: HackTricks Training GCP Red Team Expert (GRTE)