Linux Capabilities
Linux Yetenekleri
RootedCON, İspanya'daki en önemli siber güvenlik etkinliği ve Avrupa'nın en önemli etkinliklerinden biridir. Teknik bilginin yayılmasını amaçlayan bu kongre, her disiplindeki teknoloji ve siber güvenlik profesyonelleri için kaynayan bir buluşma noktasıdır.\
Linux Yetenekleri
Linux yetenekleri, kök ayrıcalıklarını daha küçük, farklı birimlere böler ve işlemlerin bir alt kümesine sahip olmasına izin verir. Bu, gereksiz yere tam kök ayrıcalıklarının verilmemesiyle riskleri en aza indirir.
Sorun:
Normal kullanıcıların sınırlı izinleri vardır, bu da kök erişimi gerektiren ağ soketi açma gibi görevleri etkiler.
Yetenek Kümesi:
Devralınan (CapInh):
Amaç: Ebeveyn süreçten aktarılan yetenekleri belirler.
İşlevsellik: Yeni bir süreç oluşturulduğunda, bu kümedeki yetenekleri ebeveyninden devralır. Belirli ayrıcalıkları süreç oluşturulduğunda korumak için kullanışlıdır.
Kısıtlamalar: Bir süreç, ebeveyninin sahip olmadığı yetenekleri kazanamaz.
Etkin (CapEff):
Amaç: Bir sürecin herhangi bir anda kullandığı gerçek yetenekleri temsil eder.
İşlevsellik: Çeşitli işlemler için izin vermek için çekirdek tarafından kontrol edilen yetenek kümesidir. Dosyalar için, bu küme, dosyanın izin verilen yeteneklerinin etkin olarak kabul edilip edilmeyeceğini belirten bir bayrak olabilir.
Önemi: Etkin küme, anlık ayrıcalık kontrolü için önemlidir ve bir sürecin kullanabileceği yeteneklerin etkin kümesi olarak hareket eder.
İzinli (CapPrm):
Amaç: Bir sürecin sahip olabileceği maksimum yetenek kümesini tanımlar.
İşlevsellik: Bir süreç, izinli kümesinden bir yeteneği etkin kümesine yükseltebilir ve bu yeteneği kullanabilme yeteneğine sahip olur. Ayrıca, izinli kümesinden yetenekleri düşürebilir.
Sınır: Bir sürecin belirlenmiş ayrıcalık kapsamını aşmamasını sağlayarak, bir sürecin sahip olabileceği yetenekler için bir üst sınırdır.
Sınırlayıcı (CapBnd):
Amaç: Bir sürecin yaşam döngüsü boyunca elde edebileceği yeteneklere bir sınır koyar.
İşlevsellik: Bir sürecin devralınabilir veya izinli kümesinde belirli bir yeteneği olsa bile, bu yeteneği sınırlayıcı kümesinde de bulunmadıkça elde edemez.
Kullanım Alanı: Bu küme, bir sürecin ayrıcalık yükseltme potansiyelini sınırlamak için özellikle kullanışlıdır ve ek bir güvenlik katmanı ekler.
Ortam (CapAmb):
Amaç: Genellikle bir sürecin yeteneklerinin tamamen sıfırlanmasıyla sonuçlanan bir
execve
sistem çağrısının üzerinde belirli yeteneklerin korunmasına izin verir.İşlevsellik: Dosya yetenekleri olmayan SUID olmayan programların belirli ayrıcalıklarını korumasını sağlar.
Kısıtlamalar: Bu kümedeki yetenekler, devralınabilir ve izinli küme kısıtlamalarına tabidir ve sürecin izin verilen ayrıcalıklarını aşmamasını sağlar.
Daha fazla bilgi için şu kaynaklara bakabilirsiniz:
Süreçler ve İkili Yetenekleri
Süreç Yetenekleri
Belirli bir sürecin yeteneklerini görmek için, /proc dizinindeki status dosyasını kullanın. Daha fazla ayrıntı sağladığı için, Linux yetenekleriyle ilgili bilgilere sınırlayalım. Not: Tüm çalışan süreçler için yetenek bilgisi, dosya sistemindeki ikili dosyalar için genişletilmiş özniteliklerde saklanır.
Yetenekler, /usr/include/linux/capability.h dosyasında tanımlanmıştır.
Mevcut sürecin yeteneklerini cat /proc/self/status
veya capsh --print
komutunu kullanarak bulabilirsiniz. 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 = Devralınan yetenekler
CapPrm = İzin verilen yetenekler
CapEff = Etkili yetenekler
CapBnd = Sınırlayıcı küme
CapAmb = Ortam yetenekleri kümesi
Bu onaltılık sayılar anlamsız görünüyor. capsh aracını kullanarak bunları yetenek adına çözebiliriz.
Şimdi ping
tarafından kullanılan yetenekleri kontrol edelim:
Bu çalışır, ancak başka ve daha kolay bir yol daha vardır. Bir çalışan işlemin yeteneklerini görmek için sadece getpcaps aracını kullanmanız yeterlidir, ardından işlem kimlik numarasını (PID) ekleyin. Ayrıca bir işlem kimlik numarası listesi de sağlayabilirsiniz.
İşte tcpdump
'ın yeterli yeteneklere (cap_net_admin
ve cap_net_raw
) sahip olduğu durumda ağ trafiğini dinlemek için kullanılan yetenekleri (tcpdump, 9562 numaralı işlemde çalışıyor) kontrol edelim:
Verilen yeteneklerin, bir ikili dosyanın yeteneklerini elde etmenin 2 yolunun sonuçlarıyla eşleştiğini görebilirsiniz. getpcaps aracı, belirli bir iş parçacığı için kullanılabilir yetenekleri sorgulamak için capget() sistem çağrısını kullanır. Bu sistem çağrısı daha fazla bilgi elde etmek için yalnızca PID sağlamak zorundadır.
İkili Dosyaların Yetenekleri
İkili dosyalar, yürütme sırasında kullanılabilecek yeteneklere sahip olabilir. Örneğin, ping
ikili dosyasının genellikle cap_net_raw
yeteneğiyle birlikte olduğunu görmek çok yaygındır:
Yeteneklerle ikili dosyaları arayabilirsiniz için şu komutu kullanabilirsiniz:
capsh ile yetenekleri düşürme
Eğer ping için CAP_NET_RAW yeteneklerini düşürürsek, ping aracı artık çalışmayacaktır.
capsh komutunun çıktısı dışında, tcpdump komutu da bir hata oluşturmalıdır.
/bin/bash: /usr/sbin/tcpdump: İzin verilmedi
Bu hata açıkça ping komutunun bir ICMP soketi açmasına izin verilmediğini göstermektedir. Şimdi kesin olarak bunun beklenildiğini biliyoruz.
Yetkileri Kaldırma
Bir ikili dosyanın yetkilerini kaldırabilirsiniz.
Kullanıcı Yetenekleri
Görünüşe göre yetenekler ayrıca kullanıcılara da atanabilir. Bu muhtemelen kullanıcı tarafından yürütülen her işlemin kullanıcı yeteneklerini kullanabilmesi anlamına gelir.
Buna göre bu, bu ve bu birkaç dosyanın yapılandırılması gerekmektedir, ancak yetenekleri her kullanıcıya atayan dosya /etc/security/capability.conf
olacaktır.
Dosya örneği:
Ortam Yetenekleri
Aşağıdaki programı derleyerek, yetenekler sağlayan bir ortamda bir bash kabuğu başlatmak mümkündür.
Derlenmiş ortam ikili tarafından yürütülen bash içinde, yeni yetenekler gözlemlenebilir ("geçerli" bölümde düzenli bir kullanıcının herhangi bir yeteneği olmayacaktır).
Sadece izin verilen ve devralınabilir kümelere ait yetenekleri ekleyebilirsiniz.
Yetenek-farkında/Yetenek-sağırdırlar
Yetenek-farkında olan ikili dosyalar, çevreden gelen yeni yetenekleri kullanmayacak, ancak yetenek-sağırdırlar bunları reddetmeyecek şekilde kullanacaklardır. Bu, yetenek-sağırdırların yetenekleri veren özel bir ortam içinde savunmasız olmasına neden olur.
Hizmet Yetenekleri
Varsayılan olarak, kök olarak çalışan bir hizmete tüm yetenekler atanır ve bazı durumlarda bu tehlikeli olabilir. Bu nedenle, bir hizmet yapılandırma dosyası, hizmetin gereksiz ayrıcalıklarla çalışmasını önlemek için sahip olmasını istediğiniz yetenekleri ve kullanıcıyı belirtmenize olanak tanır.
Docker Konteynerlerinde Yetenekler
Varsayılan olarak Docker, konteynerlere birkaç yetenek atar. Bu yeteneklerin hangileri olduğunu kontrol etmek çok kolaydır, şu komutu çalıştırarak kontrol edebilirsiniz:
RootedCON İspanya'daki en önemli siber güvenlik etkinliklerinden biridir ve Avrupa'da da en önemlilerden biridir. Teknik bilginin yayılmasını amaçlayan bu kongre, her disiplindeki teknoloji ve siber güvenlik profesyonelleri için kaynayan bir buluşma noktasıdır.
Privesc/Container Escape
Yetenekler, ayrıcalıklı işlemler gerçekleştirdikten sonra kendi süreçlerinizi sınırlamak istediğinizde (örneğin, chroot ve sokete bağlandıktan sonra) kullanışlıdır. Bununla birlikte, kötü niyetli komutları veya argümanları geçirerek bunlar root olarak çalıştırılabilir.
setcap
kullanarak programlara yetenekleri zorlayabilir ve bunları getcap
kullanarak sorgulayabilirsiniz:
+ep
yeteneğin eklenmesi anlamına gelir ("-" ise onu kaldırır) ve Etkin ve İzinli olarak eklenir.
Sistemde veya bir klasörde yetenekleri olan programları belirlemek için:
Sömürü Örneği
Aşağıdaki örnekte, /usr/bin/python2.6
ikili dosyasının ayrıcalık yükseltme saldırısına karşı savunmasız olduğu tespit edilmiştir:
tcpdump
tarafından gereken yetenekler, herhangi bir kullanıcının paketleri dinlemesine izin vermek için:
This command sets the capabilities CAP_NET_RAW and CAP_NET_ADMIN as effective, inheritable, and permitted for the tcpdump
binary located at /usr/sbin/tcpdump
.
After granting these capabilities, any user will be able to run tcpdump
and sniff packets without requiring root privileges.
Bu komut, /usr/sbin/tcpdump
konumunda bulunan tcpdump
ikili dosyası için CAP_NET_RAW ve CAP_NET_ADMIN yeteneklerini etkin, miras alınabilir ve izin verilen olarak ayarlar.
Bu yetenekleri sağladıktan sonra, herhangi bir kullanıcı, kök ayrıcalıklarına ihtiyaç duymadan tcpdump
'ı çalıştırabilir ve paketleri dinleyebilir.
"Boş" yeteneklerin özel durumu
Belgelerden: Boş yetenek kümesi bir program dosyasına atanabilir ve bu şekilde, bir sürecin etkin ve kaydedilmiş kullanıcı kimliğini 0 olarak değiştiren ancak bu sürece hiçbir yetenek sağlamayan bir set-user-ID-root programı oluşturmak mümkündür. Yani, şu durumu düşünelim:
root tarafından sahiplenilmeyen bir ikili dosya
SUID
/SGID
bitleri ayarlanmamışboş yetenek kümesine sahip (örneğin:
getcap myelf
komutumyelf =ep
sonucunu veriyor)
o zaman bu ikili dosya root olarak çalışacaktır.
CAP_SYS_ADMIN
CAP_SYS_ADMIN
, genellikle kapsamlı yönetici yetkileri olan bir Linux yeteneğidir ve sıklıkla neredeyse root seviyesine eşitlenir. Bu yetenek, cihazları bağlama veya çekirdek özelliklerini manipüle etme gibi işlemleri gerçekleştirmek için gereklidir. Tüm sistemleri taklit eden konteynerler için vazgeçilmez olsa da, CAP_SYS_ADMIN
yeteneği, ayrıcalık yükseltme ve sistem tehlikesi potansiyeli nedeniyle önemli güvenlik zorlukları oluşturur, özellikle konteynerleştirilmiş ortamlarda. Bu nedenle, bu yeteneğin kullanımı sıkı güvenlik değerlendirmeleri ve dikkatli yönetim gerektirir. Uygulama özel konteynerlerinde bu yeteneğin bırakılması, en az ayrıcalık ilkesine uyum sağlamak ve saldırı yüzeyini en aza indirmek için tercih edilir.
İkili dosya ile örnek
Python kullanarak gerçek passwd dosyasının üzerine değiştirilmiş bir passwd dosyası bağlayabilirsiniz:
Ve son olarak /etc/passwd
üzerine değiştirilmiş passwd
dosyasını mount edin:
Ve root olarak "password" şifresini kullanarak su
yapabileceksiniz.
Ortam ile örnek (Docker kaçışı)
Docker konteyneri içinde etkinleştirilmiş yetenekleri kontrol edebilirsiniz:
Önceki çıktıda SYS_ADMIN yeteneğinin etkinleştirildiğini görebilirsiniz.
Mount
Bu, docker konteynerinin ana diski bağlamasına ve özgürce erişmesine izin verir:
Tam erişim
Önceki yöntemde, docker ana bilgisayar diski erişimini başardık. Eğer ana bilgisayarın bir ssh sunucusu çalıştırdığını fark ederseniz, docker ana bilgisayar diski içinde bir kullanıcı oluşturabilir ve SSH üzerinden erişebilirsiniz:
CAP_SYS_PTRACE
Bu, bir kabuk kodunu ana makinede çalışan bir süreç içine enjekte ederek konteynırdan kaçabileceğiniz anlamına gelir. Ana makinede çalışan süreçlere erişmek için konteynır en azından --pid=host
ile çalıştırılmalıdır.
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ı sağlar. Tanısal ve izleme amaçları için güçlü olsa da, CAP_SYS_PTRACE
seccomp filtresi gibi kısıtlayıcı önlemler olmadan etkinleştirilirse, sistem güvenliğini önemli ölçüde zayıflatabilir. Özellikle, seccomp tarafından uygulanan diğer güvenlik kısıtlamalarını atlamak için sömürülebilir, bu gibi kanıtlarla (PoC) gösterilen gibi.
Örnek ikili (python) ile
Örnek binary (gdb ile)
ptrace
yeteneğine sahip gdb
:
gdb ile belleğe enjekte etmek için msfvenom ile bir shellcode oluşturun
Bir shellcode, hedef sistemdeki belleğe enjekte edilebilen ve istenilen işlemleri gerçekleştirebilen bir dizi makine kodudur. Bu makine kodunu oluşturmak için msfvenom aracını kullanabiliriz. Ardından, gdb (GNU Debugger) kullanarak bu shellcode'u hedef sistem belleğine enjekte edebiliriz.
İşte msfvenom kullanarak bir shellcode oluşturmanın adımları:
İlk olarak, msfvenom aracını çalıştırın ve hedef işletim sistemi ve mimarisini belirtin. Örneğin, Linux x86 için bir shellcode oluşturmak istiyorsak, aşağıdaki komutu kullanabiliriz:
<saldırgan IP adresi>
: Saldırganın IP adresini buraya yazın.<saldırgan portu>
: Saldırganın dinlemek istediği port numarasını buraya yazın.<format>
: Shellcode'un çıktı formatını belirtin. Örneğin,raw
,c
,python
,ruby
gibi formatlar kullanabilirsiniz.<badchars>
: Shellcode'da yer almasını istemediğiniz karakterleri belirtin. Bu, hedef sistemde sorunlara neden olabilecek karakterleri filtrelemek için kullanışlı olabilir.
Komutu çalıştırdıktan sonra, msfvenom shellcode'u oluşturacak ve çıktıyı ekrana yazdıracaktır. Bu çıktıyı bir metin dosyasına kaydedin.
Şimdi, hedef sistemdeki bir programı gdb ile çalıştırın. Örneğin, hedef programın adı
target
olsun. Aşağıdaki komutu kullanarak gdb'yi başlatın:Gdb başladıktan sonra, hedef programı çalıştırın:
Program çalıştığında, gdb'yi duraklatmak için
Ctrl+C
tuş kombinasyonunu kullanın.Şimdi, hedef programın belleğine shellcode'u enjekte etmek için aşağıdaki gdb komutlarını kullanın:
Kök süreci üzerinde gdb ile hata ayıklama yapın ve önceden oluşturulan gdb satırlarını kopyalayıp yapıştırın:
Örnek ile çevre (Docker kaçışı) - Başka bir gdb Kötüye Kullanımı
Eğer GDB yüklü ise (veya örneğin apk add gdb
veya apt install gdb
komutuyla yükleyebilirsiniz) ana makineden bir işlemi hata ayıklamak ve system
fonksiyonunu çağırmasını sağlayabilirsiniz. (Bu teknik ayrıca SYS_ADMIN
yetkisini gerektirir).
Komutun çıktısını göremeyeceksiniz, ancak bu işlem tarafından gerçekleştirilecektir (bu nedenle bir ters kabuk alınır).
"Etkin bağlamda sembol yok "system"." hatasını alırsanız, bir programda gdb aracılığıyla bir kabuk kodu yüklemeyi içeren önceki örneği kontrol edin.
Ortam ile örnek (Docker kaçışı) - Kabuk Kodu Enjeksiyonu
Docker konteyneri içinde etkinleştirilmiş yetenekleri kontrol etmek için aşağıdaki komutu kullanabilirsiniz:
Süreçleri ps -eaf
komutuyla ana bilgisayarda listele.
Mimariyi al
uname -m
Mimari için bir shellcode bul (https://www.exploit-db.com/exploits/41128)
Bir sürecin belleğine shellcode enjekte etmek için bir program bul (https://github.com/0x00pf/0x00sec_code/blob/master/mem_inject/infect.c)
Program içindeki shellcode'u değiştir ve derle
gcc inject.c -o inject
Enjekte et ve shell'i ele geçir:
./inject 299; nc 172.17.0.1 5600
CAP_SYS_MODULE
CAP_SYS_MODULE
, bir sürecin çekirdek modüllerini yükleme ve kaldırma (init_module(2)
, finit_module(2)
ve delete_module(2)
sistem çağrıları) yetkisini sağlar ve çekirdeğin temel işlemlerine doğrudan erişim sunar. Bu yetenek, ayrıcalık yükseltme ve Linux güvenlik mekanizmalarını, Linux Güvenlik Modülleri ve konteyner izolasyonu dahil olmak üzere tüm Linux güvenlik mekanizmalarını atlayarak çekirdeği değiştirme imkanı sağladığından, ciddi güvenlik riskleri sunar. Bu, ana makinenin çekirdeğine çekirdek modülleri ekleyip/kaldırabileceğiniz anlamına gelir.
Binary örneği
Aşağıdaki örnekte, python
binary'si 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 istismar etmek için, sahte bir lib/modules klasörü oluşturalım:
Ardından çekirdek modülünü derleyin, aşağıda 2 örnek bulabilirsiniz ve 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 - İkili Dosya ile
Aşağıdaki örnekte, kmod
ikili dosyası bu yeteneğe sahiptir.
Bu, bir çekirdek modülü eklemek için insmod
komutunu kullanmanın mümkün olduğu anlamına gelir. Bu yetkiyi kötüye kullanarak bir ters kabuk elde etmek için aşağıdaki örneği takip edin.
Ortam ile örnek (Docker kaçışı)
Docker konteyneri içinde etkinleştirilmiş yetenekleri kontrol etmek için aşağıdaki komutu kullanabilirsiniz:
Önceki çıktıda SYS_MODULE yeteneğinin etkin olduğunu görebilirsiniz.
Ters kabuk çalıştıracak olan çekirdek modülünü ve derlemek için Makefile'ı oluşturun:
Makefile'daki her kelimenin önündeki boşluk karakteri bir sekme olmalı, boşluklar olmamalıdır!
Derlemek için make
komutunu çalıştırın.
Son olarak, bir kabuk içinde nc
'yi başlatın ve başka bir kabuktan modülü yükleyin ve nc işleminde kabuğu yakalayacaksınız:
Bu teknik kodu, "SYS_MODULE Yetkisini Kötüye Kullanma" laboratuvarından kopyalanmıştır https://www.pentesteracademy.com/
Bu teknikle ilgili başka bir örnek 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
CAP_DAC_READ_SEARCH, bir işlemin dosyaları okuma ve dizinleri okuma ve çalıştırma izinlerini atlamasına olanak tanır. Temel kullanımı dosya arama veya okuma amaçlıdır. Bununla birlikte, bu yetki aynı zamanda bir işlemin open_by_handle_at(2)
işlevini kullanmasına olanak sağlar, bu işlev, işlemin bağlama ad alanının dışındaki dosyalara erişebilir. open_by_handle_at(2)
işlevinde kullanılan tanıtıcı, name_to_handle_at(2)
ile elde edilen saydam olmayan bir tanıtıcı olması gerekmektedir, ancak bu, değiştirilmeye açık olan inode numaraları gibi hassas bilgileri içerebilir. Bu yetkinin özellikle Docker konteynerleri bağlamında kötüye kullanılma potansiyeli, Sebastian Krahmer tarafından yapılan shocker saldırısıyla gösterilmiştir ve burada analiz edilmiştir. Bu, dosya okuma izin kontrolü ve dizin okuma/çalıştırma izin kontrolü atlamasına olanak sağlar.
Binary ile örnek
Binary, herhangi bir dosyayı okuyabilecektir. Bu nedenle, tar gibi bir dosyanın bu yetkiye sahip olması durumunda shadow dosyasını okuyabilecektir:
Örnek binary2 ile
Bu durumda, python
binary'sinin bu yeteneği olduğunu varsayalım. Kök dosyalarını listelemek için şunu yapabilirsiniz:
Ve bir dosyayı okumak için şunu yapabilirsiniz:
Ortamda Örnek (Docker kaçışı)
Docker konteyneri içinde etkinleştirilmiş yetenekleri kontrol etmek için şunu kullanabilirsiniz:
Önceki çıktıda, DAC_READ_SEARCH yeteneğinin etkin olduğunu görebilirsiniz. Sonuç olarak, konteyner işlemleri hata ayıklama yapabilir.
Aşağıdaki saldırıların nasıl çalıştığını https://medium.com/@fun_cuddles/docker-breakout-exploit-analysis-a274fff0e6b3 adresinden öğrenebilirsiniz, ancak özetle CAP_DAC_READ_SEARCH bize izin vermekle kalmaz, izin kontrolü olmadan dosya sistemini gezmemize de olanak tanır ve ayrıca open_by_handle_at(2) ve diğer işlemler tarafından açılan hassas dosyalara erişmemize izin verebilir.
Bu izinleri kötüye kullanan orijinal saldırıyı, dosyaları ana makineden okumak için kullanabilen bir değiştirilmiş bir sürümünü burada bulabilirsiniz: http://stealth.openwall.net/xSports/shocker.c, aşağıdaki ise okumak istediğiniz dosyayı ilk argüman olarak belirtebileceğiniz ve bir dosyaya dökmenizi sağlayan bir sürümüdür.
Exploit, bir şeyin ana bilgisayara bağlı olduğu bir işaretçi bulmalıdır. Orijinal exploit /.dockerinit dosyasını kullanırken, bu değiştirilmiş sürüm /etc/hostname kullanır. Eğer exploit çalışmıyorsa farklı bir dosya belirlemeniz gerekebilir. Ana bilgisayara bağlı bir dosyayı bulmak için sadece mount komutunu çalıştırın:
Bu teknik kodu, "Abusing DAC_READ_SEARCH Capability" laboratuvarından kopyalanmıştır https://www.pentesteracademy.com/
RootedCON İspanya'daki en önemli siber güvenlik etkinliği ve Avrupa'daki en önemli etkinliklerden biridir. Teknik bilginin yayılmasını amaçlayan bu kongre, her disiplindeki teknoloji ve siber güvenlik profesyonelleri için kaynayan bir buluşma noktasıdır.
CAP_DAC_OVERRIDE
Bu, herhangi bir dosyada yazma izni kontrolünü atlayabileceğiniz anlamına gelir, bu nedenle herhangi bir dosyaya yazabilirsiniz.
Ayrıcalıkları yükseltmek için üzerine yazabileceğiniz birçok dosya vardır, buradan fikir alabilirsiniz.
Binary ile örnek
Bu örnekte vim bu yetkiye sahiptir, bu nedenle passwd, sudoers veya shadow gibi herhangi bir dosyayı değiştirebilirsiniz:
Örnek 2 ile ilgili
Bu örnekte python
ikili dosyası bu yeteneğe sahip olacak. Python'u kullanarak herhangi bir dosyayı geçersiz kılabilirsiniz:
Ortam ile birlikte örnek + CAP_DAC_READ_SEARCH (Docker kaçışı)
Docker konteyneri içinde etkinleştirilmiş yetenekleri kontrol etmek için şunu kullanabilirsiniz:
Öncelikle, ana bilgisayardaki herhangi bir dosyayı okumak için DAC_READ_SEARCH yeteneğini kötüye kullanma bölümünü okuyun (linux-capabilities.md#cap_dac_read_search) ve saldırıyı derleyin. Ardından, ana bilgisayarın dosya sistemine keyfi dosyalar yazmanıza izin verecek aşağıdaki shocker saldırısının bir sürümünü derleyin:
Docker konteynerinden kaçmak için, ana makineden /etc/shadow
ve /etc/passwd
dosyalarını indirebilirsiniz, onlara bir yeni kullanıcı ekleyebilir ve shocker_write
kullanarak üzerlerine yazabilirsiniz. Ardından, ssh üzerinden erişebilirsiniz.
Bu teknik kodu, "Abusing DAC_OVERRIDE Capability" laboratuvarından https://www.pentesteracademy.com kopyalanmıştır.
CAP_CHOWN
Bu, herhangi bir dosyanın sahipliğini değiştirmenin mümkün olduğu anlamına gelir.
Binary ile örnek
Varsayalım ki python
binary'si bu yeteneğe sahip, shadow dosyasının sahibini değiştirebilir, root şifresini değiştirebilir ve ayrıcalıkları yükseltebilirsiniz:
Veya ruby
ikili dosyasına bu yetenek atanarak:
CAP_FOWNER
Bu, herhangi bir dosyanın iznini değiştirmenin mümkün olduğu anlamına gelir.
Örnek binary ile
Eğer python bu yeteneğe sahipse, shadow dosyasının izinlerini değiştirebilir, root şifresini değiştirebilir ve ayrıcalıkları yükseltebilirsiniz:
CAP_SETUID
Bu, oluşturulan işlemin etkin kullanıcı kimliğini ayarlamak mümkün olduğu anlamına gelir.
Binary ile örnek
Eğer python bu yeteneğe sahipse, ayrıcalıkları kök kullanıcıya yükseltmek için bunu çok kolay bir şekilde kötüye kullanabilirsiniz:
Başka bir yol:
CAP_SETGID
Bu, oluşturulan işlemin etkin grup kimliğini ayarlamak mümkün olduğu anlamına gelir.
Ayrıcalıkları yükseltmek için üzerine yazabileceğiniz birçok dosya vardır, buradan fikir alabilirsiniz.
Örnek ikili dosya ile
Bu durumda, herhangi bir grubu taklit edebileceğiniz için bir grup tarafından okunabilen ilginç dosyalar aramalısınız:
Bir dosyayı (okuma veya yazma yoluyla) kötüye kullanarak ayrıcalıkları yükselttikten sonra, ilgi çekici grubu taklit ederek bir kabuk alabilirsiniz:
Bu komut, belirtilen gruba ait izinleri geçici olarak almanızı sağlar. Bu sayede, o gruba ait dosyalara erişim sağlayabilir ve ayrıcalıkları yükseltebilirsiniz.
Bu durumda shadow grubu taklit edildi, bu nedenle /etc/shadow
dosyasını okuyabilirsiniz:
Eğer docker yüklü ise, docker grubunu taklit edebilir ve docker soketiyle iletişim kurarak ayrıcalıkları yükseltebilirsiniz.
CAP_SETFCAP
Bu, dosyalara ve işlemlere yetenekler atanabilmesi anlamına gelir
Binary ile örnek
Eğer python bu yeteneğe sahipse, ayrıcalıkları kök kullanıcıya yükseltmek için bunu çok kolay bir şekilde kötüye kullanabilirsiniz:
Not edin ki CAP_SETFCAP ile yeni bir yetenek ayarlarsanız, bu yeteneği kaybedersiniz.
SETUID yeteneğine sahip olduktan sonra, ayrıcalıkları yükseltmek için nasıl yapılacağını görmek için bölümüne gidebilirsiniz.
Ortam ile örnek (Docker kaçışı)
Varsayılan olarak, Docker içindeki sürece CAP_SETFCAP yeteneği verilir. Bunu kontrol etmek için şunu yapabilirsiniz:
Bu yetenek, ikili dosyalara herhangi bir başka yetenek vermemizi sağlar, bu yüzden bu sayfada bahsedilen diğer yetenek kaçışlarını kötüye kullanarak konteynerden kaçmak mümkün olabilir. Ancak, örneğin gdb ikili dosyasına CAP_SYS_ADMIN ve CAP_SYS_PTRACE yeteneklerini vermeye çalışırsanız, bunları verebileceğinizi fark edeceksiniz, ancak ikili dosya bundan sonra çalıştırılamaz olacaktır:
Belgelerden: İzin verilen: Bu, iş parçacığının üstlenebileceği etkin yetenekler için bir sınırlayıcı üst kümedir. Ayrıca, etkin kümesinde CAP_SETPCAP yeteneğine sahip olmayan bir iş parçacığı tarafından devralınabilir kümesine eklenen yetenekler için de bir sınırlayıcı üst kümedir. Görünüşe göre, İzin Verilen yetenekler kullanılabilecek olanları sınırlar. Ancak, Docker da varsayılan olarak CAP_SETPCAP yeteneğini verir, bu yüzden devralınabilir yetenekler içinde yeni yetenekler ayarlayabilirsiniz. Ancak, bu yetenek belgesinde şöyle denir: CAP_SETPCAP: […] çağrı yapan iş parçacığının sınırlayıcı kümesinden devralınabilir kümesine herhangi bir yetenek ekleyin. Görünüşe göre, devralınabilir kümesine CAP_SYS_ADMIN veya CAP_SYS_PTRACE gibi yeni yetenekler ekleyemeyiz, yalnızca sınırlayıcı kümesinden yetenek ekleyebiliriz, bu da ayrıcalıkları yükseltmek için devralınabilir kümesine yeni yetenekler ekleyemeyeceğimiz anlamına gelir.
CAP_SYS_RAWIO
CAP_SYS_RAWIO, /dev/mem
, /dev/kmem
veya /proc/kcore
'e erişim, mmap_min_addr
'ı değiştirme, ioperm(2)
ve iopl(2)
sistem çağrılarına erişim ve çeşitli disk komutları gibi bir dizi hassas işlemi sağlar. Bu yetenek aracılığıyla FIBMAP ioctl(2)
de etkinleştirilir, bu da geçmişte sorunlara neden olmuştur. Kılavuz sayfasına göre, bu ayrıca sahibin diğer cihazlarda açıklayıcı bir şekilde cihaz özgü işlemler gerçekleştirmesine izin verir.
Bu, ayrıcalık yükseltme ve Docker kaçışı için kullanışlı olabilir.
CAP_KILL
Bu, herhangi bir işlemi sonlandırmanın mümkün olduğu anlamına gelir.
Binary ile örnek
Haydi python
binary'sinin bu yeteneği olduğunu varsayalım. Eğer ayrıca bazı servis veya soket yapılandırmasını (veya bir servise ilişkin herhangi bir yapılandırma dosyasını) değiştirebilirseniz, ona bir arka kapı yerleştirebilir ve ardından o servisle ilişkili işlemi sonlandırabilir ve yeni yapılandırma dosyasının arka kapınızla yürütülmesini bekleyebilirsiniz.
kill ile Privilege Escalation
Eğer kill yeteneklerine sahipseniz ve kök kullanıcı olarak çalışan bir node programı (veya farklı bir kullanıcı olarak) varsa, muhtemelen ona SIGNAL SIGUSR1 sinyali gönderebilir ve onu node hata ayıklayıcısını açmaya zorlayabilirsiniz. Böylece bağlantı kurabilirsiniz.
RootedCON İspanya'daki en ilgili siber güvenlik etkinliği ve Avrupa'daki en önemli etkinliklerden biridir. Teknik bilginin yayılmasını amaçlayan bu kongre, her disiplindeki teknoloji ve siber güvenlik profesyonelleri için kaynayan bir buluşma noktasıdır.
CAP_NET_BIND_SERVICE
Bu, herhangi bir bağlantı noktasında (hatta ayrıcalıklı olanlarda bile) dinlemenin mümkün olduğu anlamına gelir. Bu yetenekle doğrudan ayrıcalıkları yükseltemezsiniz.
Örnek ikili ile
Eğer python
bu yeteneğe sahipse, herhangi bir bağlantı noktasında dinleyebilir ve hatta diğer bağlantı noktalarına bağlanabilir (bazı hizmetler belirli ayrıcalıklı bağlantı noktalarından bağlantı gerektirir)
CAP_NET_RAW
CAP_NET_RAW yeteneği, işlemlerin RAW ve PACKET soketleri oluşturmasına izin verir, böylece rastgele ağ paketleri oluşturup gönderebilirler. Bu, paket sahteciliği, trafik enjeksiyonu ve ağ erişim kontrollerini atlamak gibi güvenlik risklerine yol açabilir. Kötü niyetli aktörler, yeterli güvenlik duvarı koruması olmadan özellikle konteynerleştirilmiş ortamlarda konteyner yönlendirmesine müdahale etmek veya ana bilgisayar ağ güvenliğini tehlikeye atmak için bunu istismar edebilir. Ayrıca, CAP_NET_RAW, RAW ICMP istekleri aracılığıyla ping gibi işlemleri desteklemek için ayrıcalıklı konteynerler için önemlidir.
Bu, trafiği dinlemenin mümkün olduğu anlamına gelir. Bu yetenekle doğrudan ayrıcalıkları yükseltemezsiniz.
Örnek binary ile
Eğer tcpdump
binary'si bu yeteneğe sahipse, ağ bilgilerini yakalamak için onu kullanabilirsiniz.
Not: Eğer çevre bu yeteneği sağlıyorsa, trafiği izlemek için tcpdump
kullanabilirsiniz.
2. Örnek ile ikili
Aşağıdaki örnek, "lo" (localhost) arayüzünün trafiğini yakalamak için kullanışlı olabilecek python2
kodudur. Kod, https://attackdefense.pentesteracademy.com/ adresindeki "The Basics: CAP-NET_BIND + NET_RAW" adlı laboratuvardan alınmıştır.
CAP_NET_ADMIN + CAP_NET_RAW
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 açık ağ ad alanları içindeki ağ arayüzü ayarlarını değiştirmeyi içerir. Ayrıca, ad alanları arasında paket dinlemeye olanak tanıyan promiscuous mode'u etkinleştirme imkanı sağlar.
Örnek ikili dosya ile
Varsayalım ki python ikili dosyası bu yetkilere sahip.
CAP_LINUX_IMMUTABLE
Bu, inode özniteliklerini değiştirmenin mümkün olduğu anlamına gelir. Bu yetenekle doğrudan ayrıcalıkları yükseltemezsiniz.
Binary ile örnek
Eğer bir dosyanın değiştirilemez olduğunu ve python'ın bu yeteneğe sahip olduğunu bulursanız, değiştirilemez özniteliği kaldırabilir ve dosyayı değiştirilebilir hale getirebilirsiniz:
Genellikle bu değişmez öznitelik ayarlanır ve kaldırılırken kullanılır:
CAP_SYS_CHROOT
CAP_SYS_CHROOT, chroot(2)
sistem çağrısının yürütülmesine izin verir ve bu da bilinen güvenlik açıklarından dolayı chroot(2)
ortamlarından kaçmayı mümkün kılar:
CAP_SYS_BOOT
CAP_SYS_BOOT, sistem yeniden başlatmaları için reboot(2)
sistem çağrısının yanı sıra, belirli donanım platformları için özelleştirilmiş LINUX_REBOOT_CMD_RESTART2
gibi belirli komutları da içeren reboot(2)
sistem çağrısının yürütülmesine izin verir. Ayrıca, Linux 3.17'den itibaren yeni veya imzalı çökme çekirdeklerini yüklemek için kexec_load(2)
ve kexec_file_load(2)
kullanımını da etkinleştirir.
CAP_SYSLOG
CAP_SYSLOG, Linux 2.6.37'de daha geniş kapsamlı CAP_SYS_ADMIN'den ayrılmış olup özellikle syslog(2)
çağrısının kullanımına izin verir. Bu yetenek, kptr_restrict
ayarının 1 olduğu durumlarda /proc
ve benzeri arayüzler aracılığıyla çekirdek adreslerinin görüntülenmesini sağlar. kptr_restrict
, çekirdek adreslerinin açığa çıkmasını kontrol eden bir ayar olup Linux 2.6.39'dan itibaren varsayılan olarak 0'dır, yani çekirdek adresleri açıktır. Bununla birlikte, birçok dağıtım bu ayarı güvenlik nedenleriyle 1 (adresleri yalnızca uid 0'dan gizle) veya 2 (her zaman adresleri gizle) olarak ayarlar.
Ek olarak, CAP_SYSLOG, dmesg_restrict
1 olarak ayarlandığında dmesg
çıktısına erişimi sağlar. Bu değişikliklere rağmen, CAP_SYS_ADMIN, tarihsel öncelikler nedeniyle syslog
işlemlerini gerçekleştirme yeteneğini korur.
CAP_MKNOD
CAP_MKNOD, mknod
sistem çağrısının işlevselliğini, düzenli dosyalar, FIFO'lar (isimlendirilmiş borular) veya UNIX etki alanı soketleri oluşturmanın ötesine genişletir. Özellikle, özel dosyaların oluşturulmasına izin verir, bunlar şunları içerir:
S_IFCHR: Terminal gibi cihazlar olan karakter özel dosyaları.
S_IFBLK: Disk gibi cihazlar olan blok özel dosyaları.
Bu yetenek, karakter veya blok cihazları aracılığıyla doğrudan donanım etkileşimi sağlayan işlemler için gereklidir.
Bu, bir Docker yeteneği (https://github.com/moby/moby/blob/master/oci/caps/defaults.go#L6-L19) olarak varsayılan olarak ayarlanmıştır.
Bu yetenek, aşağıdaki koşullar altında ana bilgisayarda ayrıcalık yükseltmeleri yapılmasına izin verir (tam disk okuması yoluyla):
Ana bilgisayara başlangıç erişimi olmalıdır (Ayrıcalıksız).
Konteynere başlangıç erişimi olmalıdır (Ayrıcalıklı (EUID 0) ve etkin
CAP_MKNOD
).Ana bilgisayar ve konteyner aynı kullanıcı ad alanını paylaşmalıdır.
Bir Konteynerde Blok Cihazı Oluşturma ve Erişme Adımları:
Standart Bir Kullanıcı Olarak Ana Bilgisayarda:
Mevcut kullanıcı kimliğinizi
id
komutuyla belirleyin, örneğinuid=1000(standarduser)
.Hedef cihazı belirleyin, örneğin
/dev/sdb
.
root
Olarak Konteyner İçinde:
Ana Bilgisayarda Geri Dönün:
Bu yaklaşım, paylaşılan kullanıcı ad alanları ve cihaz üzerinde ayarlanan izinler aracılığıyla standart kullanıcının /dev/sdb
üzerinden konteyner aracılığıyla verilere erişmesine ve potansiyel olarak okumasına olanak tanır.
CAP_SETPCAP
CAP_SETPCAP, bir işlemin başka bir işlemin yetenek kümesini değiştirmesine olanak tanır ve etkin, miras alınabilir ve izin verilen kümelere yetenek eklemesine veya kaldırmasına olanak tanır. Ancak, bir işlem yalnızca kendi izin verilen kümesinde sahip olduğu yetenekleri değiştirebilir, böylece başka bir işlemin ayrıcalıklarını kendi ayrıcalık düzeyinin ötesine yükseltemez. Son kernel güncellemeleri, CAP_SETPCAP
'i yalnızca kendi veya alt işlemlerinin izin verilen kümesindeki yetenekleri azaltmak için sınırlayan bu kuralları sıkılaştırmıştır. Kullanım, etkin kümede CAP_SETPCAP
'e ve hedef yeteneklere sahip olmayı gerektirir ve değişiklikler için capset()
kullanır. Bu, CAP_SETPCAP
'in temel işlevini ve sınırlamalarını özetler ve ayrıcalık yönetimi ve güvenlik geliştirmedeki rolünü vurgular.
CAP_SETPCAP
, bir işlemin başka bir işlemin yetenek kümesini değiştirmesine olanak tanıyan bir Linux yeteneğidir. Diğer işlemlerin etkin, miras alınabilir ve izin verilen yetenek kümesine yetenek eklemesine veya kaldırmasına izin verir. Ancak, bu yeteneğin kullanımına yönelik belirli kısıtlamalar vardır.
CAP_SETPCAP
'e sahip bir işlem, yalnızca kendi izin verilen yetenek kümesinde bulunan yetenekleri verebilir veya kaldırabilir. Başka bir işleme bir yetenek veremezse, bu yeteneğe sahip değilse. Bu kısıtlama, bir işlemin başka bir işlemin ayrıcalıklarını kendi ayrıcalık düzeyinin ötesine yükseltmesini engeller.
Ayrıca, son kernel sürümlerinde CAP_SETPCAP
yeteneği daha da sınırlanmıştır. Artık bir işlemi keyfi olarak diğer işlemlerin yetenek kümesini değiştirmeye izin vermez. Bunun yerine, yalnızca bir işlemin kendi izin verilen yetenek kümesinde veya alt işlemlerinin izin verilen yetenek kümesindeki yetenekleri azaltmasına izin verir. Bu değişiklik, yetenekle ilişkili potansiyel güvenlik risklerini azaltmak için yapılmıştır.
CAP_SETPCAP
'i etkili bir şekilde kullanmak için, etkin yetenek kümenizde yeteneğe sahip olmanız ve hedef yetenekleri izin verilen yetenek kümenizde bulunmanız gerekir. Ardından, diğer işlemlerin yetenek kümesini değiştirmek için capset()
sistem çağrısını kullanabilirsiniz.
Özetlemek gerekirse, CAP_SETPCAP
, bir işlemin diğer işlemlerin yetenek kümesini değiştirmesine olanak tanır, ancak kendisinde olmayan yetenekleri veremez. Ayrıca, güvenlik endişeleri nedeniyle, son kernel sürümlerinde işlevselliği yalnızca kendi izin verilen yetenek kümesindeki yetenekleri azaltmaya veya alt işlemlerinin izin verilen yetenek kümesindeki yetenekleri azaltmaya izin vermek için sınırlanmıştır.
Referanslar
Bu örneklerin çoğu, https://attackdefense.pentesteracademy.com/ adlı bir laboratuvardan alınmıştır, bu nedenle bu ayrıcalık yükseltme tekniklerini uygulamak isterseniz bu laboratuvarları öneririm.
Diğer referanslar:
RootedCON, İspanya'daki en önemli siber güvenlik etkinliği ve Avrupa'nın en önemli etkinliklerinden biridir. Teknik bilginin yayılmasını amaçlayan bu kongre, her disiplindeki teknoloji ve siber güvenlik profesyonelleri için kaynayan bir buluşma noktasıdır.
Last updated