Linux Capabilities
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-L_2uGJGU7AVNRcqRvEi%252Fuploads%252FelPCTwoecVdnsfjxCZtN%252Fimage.png%3Falt%3Dmedia%26token%3D9ee4ff3e-92dc-471c-abfe-1c25e446a6ed&width=768&dpr=4&quality=100&sign=9c8fe74f&sv=1)
RootedCON en ilgili siber güvenlik etkinliğidir İspanya'da ve Avrupa'nın en önemli etkinliklerinden 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 Capabilities
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.
Problem:
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.
Yetenek Setleri:
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 yararlı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 sınır setinde de varsa edinebilir.
Kullanım durumu: Bu set, bir sürecin ayrıcalık yükseltme potansiyelini kısıtlamak için özellikle yararlıdır ve ek bir güvenlik katmanı ekler.
Ambient (CapAmb):
Amaç: Belirli yeteneklerin
execve
sistem çağrısı sırasında korunmasına izin verir; bu genellikle sürecin yeteneklerinin tamamen sıfırlanmasına neden olur.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:
Süreçler & İkili Dosyalar Yetenekleri
Süreçler 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, 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ığı için 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 ve diğer kullanıcıların yeteneklerini /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ğ dinlemesi 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ın Yetenekleri
İ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 şunu kullanabilirsiniz:
Dropping capabilities with capsh
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.
Yetenekleri Kaldırma
Bir ikili dosyanın yeteneklerini kaldırabilirsiniz.
Kullanıcı Yetenekleri
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.
Buna dayanarak bu, bu ve bu birkaç dosyanın yapılandırılması gerekiyor, böylece bir kullanıcıya belirli yetenekler verilebilir, ancak yetenekleri her kullanıcıya atayan dosya /etc/security/capability.conf
olacaktır.
Dosya örneği:
Çevre Yetenekleri
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 yeni yeteneklerin gözlemlenmesi mümkündür (normal bir kullanıcının "mevcut" bölümde herhangi bir yeteneği olmayacaktır).
Sadece hem izin verilen hem de miras alınan setlerde bulunan yetenekleri ekleyebilirsiniz.
Yetenek farkında/Yetenek cahil ikili dosyalar
Yetenek farkında ikili dosyalar, ortam tarafından verilen yeni yetenekleri kullanmayacaktır, ancak yetenek cahil ikili dosyalar bunları reddetmeyecekleri için kullanacaktır. Bu, yetenek cahil ikili dosyaları, ikili dosyalara yetenekler veren özel bir ortamda savunmasız hale getirir.
Hizmet Yetenekleri
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 ve hizmeti çalıştırması gereken kullanıcıyı belirtmenize olanak tanır, böylece gereksiz ayrıcalıklara sahip bir hizmet çalıştırmaktan kaçınılır:
Docker Konteynerlerinde Yetenekler
Varsayılan olarak Docker, konteynerlere birkaç yetenek atar. Bu yeteneklerin hangileri olduğunu kontrol etmek çok kolaydır:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-L_2uGJGU7AVNRcqRvEi%252Fuploads%252FelPCTwoecVdnsfjxCZtN%252Fimage.png%3Falt%3Dmedia%26token%3D9ee4ff3e-92dc-471c-abfe-1c25e446a6ed&width=768&dpr=4&quality=100&sign=9c8fe74f&sv=1)
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.
Privesc/Konteyner Kaçışı
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 (“-” bunu kaldırır) Etkili ve İzinli olarak.
Bir sistemde veya klasörde yeteneklere sahip programları tanımlamak için:
Sömürü örneği
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:
"Boş" yeteneklerin özel durumu
Belgelerden: Boş yetenek setlerinin bir program dosyasına atanabileceğini unutmayın, bu nedenle 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
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 nihayet mount edilmiş passwd
dosyasını /etc/passwd
üzerine:
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:
CAP_SYS_PTRACE
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 sömürülebilir; 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 apk add gdb
veya apt install gdb
ile yükleyebilirsiniz) host'tan bir süreci debug'layabilir 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
CAP_SYS_MODULE
, bir sürecin çekirdek modüllerini yüklemesine ve kaldırmasına (init_module(2)
, finit_module(2)
ve delete_module(2)
sistem çağrıları) olanak tanır ve ç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.
Example with binary
Aşağıdaki örnekte, ikili python
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 ikili kmod
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 modülü başka bir shell'den yükleyin, böylece shell'i nc sürecinde 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
CAP_DAC_READ_SEARCH bir sürecin dosyaları okuma ve dizinleri okuma/çalıştırma izinlerini atlamasına olanak tanır. Temel kullanımı dosya arama veya okuma amaçlıdır. Ancak, aynı zamanda bir sürecin open_by_handle_at(2)
fonksiyonunu kullanmasına 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şı hassas 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 kontrollerini ve dizin okuma/çalıştırma izin kontrollerini atlayabileceğiniz anlamına gelir.
İkili ile örnek
İkili, herhangi bir dosyayı okuyabilecektir. Yani, tar gibi bir dosya bu yetkiye sahipse, shadow 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 diğer işlemler tarafından açılan hassas dosyalara erişim sağlayabilir.
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 ilk argüman olarak okumak istediğiniz dosyayı belirtmenize ve bir dosyaya dökmenize olanak tanıyan 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. Eğer 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/ adresindeki "DAC_READ_SEARCH Yetkisini Kötüye Kullanma" laboratuvarından kopyalanmıştır.
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-L_2uGJGU7AVNRcqRvEi%252Fuploads%252FelPCTwoecVdnsfjxCZtN%252Fimage.png%3Falt%3Dmedia%26token%3D9ee4ff3e-92dc-471c-abfe-1c25e446a6ed&width=768&dpr=4&quality=100&sign=9c8fe74f&sv=1)
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.
CAP_DAC_OVERRIDE
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 ikili dosya
Bu örnekte python
ikili dosyası bu yetkiye sahip olacaktır. Python'u herhangi bir dosyayı geçersiz kılmak için kullanabilirsiniz:
Örnek: ortam + CAP_DAC_READ_SEARCH (Docker breakout)
Docker konteyneri içindeki 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, bunlara yeni bir kullanıcı ekleyin ve shocker_write
kullanarak üzerlerini yazı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.
CAP_CHOWN
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ı artırabilirsiniz:
Veya ruby
ikilisinin bu yetkiye sahip olması:
CAP_FOWNER
Bu, herhangi bir dosyanın izinlerini değiştirmenin mümkün olduğu 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:
CAP_SETUID
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:
CAP_SETGID
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 edebileceğiniz, 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 yetkileri artırmak için kötüye kullanabilirsiniz.
CAP_SETFCAP
Bu, dosyalar ve süreçler üzerinde yetkilerin ayarlanmasını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:
Yeni bir yetkiyi CAP_SETFCAP ile ikili dosyaya ayarlarsanız, bu yetkiyi kaybedeceğinizi unutmayın.
Bir SETUID yetkisi aldıktan sonra, yetkileri 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 kümesine herhangi bir yetenek ekler. Görünüşe göre, yalnızca sınırlayıcı kümeden miras alınabilir küme 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
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 cihazlar üzerinde tanımlayıcı bir şekilde bir dizi cihaz özel işlemi gerçekleştirme
yetkisi verir.
Bu, yetki yükseltme ve Docker kırılması için faydalı olabilir.
CAP_KILL
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ürüp 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.
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-L_2uGJGU7AVNRcqRvEi%252Fuploads%252FelPCTwoecVdnsfjxCZtN%252Fimage.png%3Falt%3Dmedia%26token%3D9ee4ff3e-92dc-471c-abfe-1c25e446a6ed&width=768&dpr=4&quality=100&sign=9c8fe74f&sv=1)
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.
CAP_NET_BIND_SERVICE
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
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 + 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 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.
CAP_LINUX_IMMUTABLE
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
CAP_SYS_CHROOT, chroot(2)
sistem çağrısının yürütülmesini sağlar; bu, bilinen güvenlik açıkları aracılığıyla chroot(2)
ortamlarından kaçışa olanak tanıyabilir:
CAP_SYS_BOOT
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 yeni veya imzalı çökme çekirdeklerini yüklemek için kexec_load(2)
ve Linux 3.17'den itibaren kexec_file_load(2)
kullanımını da sağlar.
CAP_SYSLOG
CAP_SYSLOG, Linux 2.6.37'de daha geniş CAP_SYS_ADMIN'dan 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; bu ayar, çekirdek adreslerinin maruziyetini kontrol eder. Linux 2.6.39'dan itibaren, kptr_restrict
için varsayılan değer 0'dır, bu da çekirdek adreslerinin maruz kaldığı 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 korur.
CAP_MKNOD
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 genişletir. Ö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 (Yetkisiz).
Konteynıra başlangıç erişimine sahip olmak (Yetkili (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 Makineye Dönüş:
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
CAP_SETPCAP, bir sürecin başka bir sürecin yetenek setlerini değiştirmesine olanak tanır; bu, etkili, miras alınabilir ve izin verilen setlerden yeteneklerin eklenmesi veya kaldırılmasını sağlar. 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 zamanlarda yapılan ç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ırlamıştır; 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 yetkisi 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. Başka 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 ç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 verir. 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 bulundurmalısınız. 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 ç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.
Referanslar
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:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2Ffiles.gitbook.com%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252F-L_2uGJGU7AVNRcqRvEi%252Fuploads%252FelPCTwoecVdnsfjxCZtN%252Fimage.png%3Falt%3Dmedia%26token%3D9ee4ff3e-92dc-471c-abfe-1c25e446a6ed&width=768&dpr=4&quality=100&sign=9c8fe74f&sv=1)
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.
Last updated