euid, ruid, suid
Reading time: 7 minutes
tip
AWS Hacking'i öğrenin ve pratik yapın:
HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın:
HackTricks Training GCP Red Team Expert (GRTE)
Azure Hacking'i öğrenin ve pratik yapın:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter'da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.
Kullanıcı Tanımlama Değişkenleri
ruid: gerçek kullanıcı kimliği, süreci başlatan kullanıcıyı belirtir.euid: etkili kullanıcı kimliği olarak bilinir, sistemin süreç ayrıcalıklarını belirlemek için kullandığı kullanıcı kimliğini temsil eder. Genel olarak,euidruidile aynıdır, SetUID ikili yürütmesi gibi durumlar dışında, buradaeuiddosya sahibinin kimliğini alır ve böylece belirli operasyonel izinler verir.suid: Bu kaydedilmiş kullanıcı kimliği, yüksek ayrıcalıklı bir sürecin (genellikle root olarak çalışan) belirli görevleri yerine getirmek için geçici olarak ayrıcalıklarını bırakması gerektiğinde kritik öneme sahiptir, daha sonra başlangıçtaki yükseltilmiş durumunu geri alır.
Önemli Not
Root altında çalışmayan bir süreç yalnızca euid'sini mevcut ruid, euid veya suid ile eşleştirebilir.
set*uid Fonksiyonlarını Anlamak
setuid: İlk varsayımların aksine,setuidesasenruidyerineeuid'yi değiştirir. Özellikle, ayrıcalıklı süreçler için,ruid,euidvesuid'yi belirtilen kullanıcı ile, genellikle root ile eşleştirir, bu da bu kimliklerisuid'nin geçersiz kılması nedeniyle sağlamlaştırır. Ayrıntılı bilgiler setuid man sayfasında bulunabilir.setreuidvesetresuid: Bu fonksiyonlarruid,euidvesuid'nin ince ayarını yapmaya olanak tanır. Ancak, yetenekleri sürecin ayrıcalık seviyesine bağlıdır. Root olmayan süreçler için, değişiklikler mevcutruid,euidvesuiddeğerleri ile sınırlıdır. Buna karşılık, root süreçleri veyaCAP_SETUIDyeteneğine sahip olanlar bu kimliklere keyfi değerler atayabilir. Daha fazla bilgi setresuid man sayfasında ve setreuid man sayfasında bulunabilir.
Bu işlevler, bir güvenlik mekanizması olarak değil, bir programın etkili kullanıcı kimliğini değiştirerek başka bir kullanıcının kimliğini benimsemesi gibi istenen operasyonel akışı kolaylaştırmak için tasarlanmıştır.
Özellikle, setuid root'a ayrıcalık yükseltmek için yaygın bir yöntem olabilir (çünkü tüm kimlikleri root ile eşleştirir), ancak bu fonksiyonlar arasındaki farkları ayırt etmek, farklı senaryolarda kullanıcı kimliği davranışlarını anlamak ve manipüle etmek için kritik öneme sahiptir.
Linux'ta Program Yürütme Mekanizmaları
execve Sistem Çağrısı
- Fonksiyon:
execve, ilk argümanla belirlenen bir programı başlatır. İki dizi argümanı alır,argvargümanlar için veenvportam için. - Davranış: Çağıranın bellek alanını korur ancak yığın, yığın ve veri segmentlerini yeniler. Programın kodu yeni programla değiştirilir.
- Kullanıcı Kimliği Koruma:
ruid,euidve ek grup kimlikleri değişmeden kalır.- Yeni programın SetUID biti ayarlanmışsa
euid'de ince değişiklikler olabilir. suid, yürütme sonrasıeuid'den güncellenir.- Dokümantasyon: Ayrıntılı bilgi
execveman sayfasında bulunabilir.
system Fonksiyonu
- Fonksiyon:
execve'nin aksine,systembir çocuk süreç oluşturur ve bu çocuk süreç içinde bir komutuforkkullanarak yürütür. - Komut Yürütme: Komutu
sharacılığıylaexecl("/bin/sh", "sh", "-c", command, (char *) NULL);ile yürütür. - Davranış:
execl,execve'nin bir biçimi olduğundan benzer şekilde çalışır ancak yeni bir çocuk süreç bağlamında. - Dokümantasyon: Daha fazla bilgi
systemman sayfasında bulunabilir.
SUID ile bash ve sh Davranışı
bash:euidveruid'nin nasıl ele alındığını etkileyen bir-pseçeneğine sahiptir.-polmadan,basheuid'yiruidile eşleştirir eğer başlangıçta farklılarsa.-pile, başlangıçtakieuidkorunur.- Daha fazla detay
bashman sayfasında bulunabilir. sh:bash'deki-pseçeneğine benzer bir mekanizmaya sahip değildir.- Kullanıcı kimlikleri ile ilgili davranış açıkça belirtilmemiştir, yalnızca
-iseçeneği altındaeuidveruideşitliğinin korunmasına vurgu yapılmaktadır. - Ek bilgi
shman sayfasında bulunabilir.
Bu mekanizmalar, farklı işleyişleri ile programları yürütmek ve geçiş yapmak için çok çeşitli seçenekler sunar, kullanıcı kimliklerinin nasıl yönetildiği ve korunduğu konusunda belirli nüanslarla birlikte.
Yürütmelerde Kullanıcı Kimliği Davranışlarını Test Etme
Örnekler https://0xdf.gitlab.io/2022/05/31/setuid-rabbithole.html#testing-on-jail adresinden alınmıştır, daha fazla bilgi için kontrol edin.
Durum 1: setuid'yi system ile Kullanma
Amaç: setuid'nin system ve bash ile sh olarak birleşimindeki etkisini anlamak.
C Kodu:
#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>
int main(void) {
setuid(1000);
system("id");
return 0;
}
Derleme ve İzinler:
oxdf@hacky$ gcc a.c -o /mnt/nfsshare/a;
oxdf@hacky$ chmod 4755 /mnt/nfsshare/a
bash-4.2$ $ ./a
uid=99(nobody) gid=99(nobody) groups=99(nobody) context=system_u:system_r:unconfined_service_t:s0
Analiz:
ruidveeuidsırasıyla 99 (nobody) ve 1000 (frank) olarak başlar.setuidher ikisini de 1000'e ayarlar.system, sh'den bash'e olan symlink nedeniyle/bin/bash -c idkomutunu çalıştırır.bash,-polmadan,euid'yiruidile eşleştirir, bu da her ikisinin de 99 (nobody) olmasına neden olur.
Durum 2: system ile setreuid kullanma
C Kodu:
#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>
int main(void) {
setreuid(1000, 1000);
system("id");
return 0;
}
Derleme ve İzinler:
oxdf@hacky$ gcc b.c -o /mnt/nfsshare/b; chmod 4755 /mnt/nfsshare/b
İcra ve Sonuç:
bash-4.2$ $ ./b
uid=1000(frank) gid=99(nobody) groups=99(nobody) context=system_u:system_r:unconfined_service_t:s0
Analiz:
setreuid, hem ruid hem de euid'yi 1000 olarak ayarlar.system, kullanıcı kimliklerinin eşitliği nedeniyle bash'i çağırır ve bu da frank olarak etkili bir şekilde çalışmasını sağlar.
Durum 3: execve ile setuid kullanımı
Amaç: setuid ve execve arasındaki etkileşimi keşfetmek.
#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>
int main(void) {
setuid(1000);
execve("/usr/bin/id", NULL, NULL);
return 0;
}
İcra ve Sonuç:
bash-4.2$ $ ./c
uid=99(nobody) gid=99(nobody) euid=1000(frank) groups=99(nobody) context=system_u:system_r:unconfined_service_t:s0
Analiz:
ruid99 olarak kalır, ancak euid 1000 olarak ayarlanır, setuid'nin etkisiyle uyumlu olarak.
C Kod Örneği 2 (Bash Çağrısı):
#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>
int main(void) {
setuid(1000);
execve("/bin/bash", NULL, NULL);
return 0;
}
İcra ve Sonuç:
bash-4.2$ $ ./d
bash-4.2$ $ id
uid=99(nobody) gid=99(nobody) groups=99(nobody) context=system_u:system_r:unconfined_service_t:s0
Analiz:
euid1000 olaraksetuidile ayarlanmış olmasına rağmen,bash-peksikliği nedeniyleeuid'yiruid(99) olarak sıfırlar.
C Kodu Örneği 3 (bash -p Kullanarak):
#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>
int main(void) {
char *const paramList[10] = {"/bin/bash", "-p", NULL};
setuid(1000);
execve(paramList[0], paramList, NULL);
return 0;
}
İcra ve Sonuç:
bash-4.2$ $ ./e
bash-4.2$ $ id
uid=99(nobody) gid=99(nobody) euid=100
Referanslar
tip
AWS Hacking'i öğrenin ve pratik yapın:
HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın:
HackTricks Training GCP Red Team Expert (GRTE)
Azure Hacking'i öğrenin ve pratik yapın:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter'da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.
HackTricks