Hacker Olmak İster misiniz?
Öncelikle “hack” kavramının aslında ne olduğunu açıklamaya çalışayım. Hack kelimesi ingilizce bir kelimedir ve Türkçe’ye doğramak, kıymak, kesmek, darbe, vuruş, yermek olarak çevrilebilir. Daha çok bilgisayar bilimlerinde kullanılan bir kelimedir. Revolution Os belgeselinde Richard Stallman’ın deyimiyle hack, bir sistemi (sadece bilgisayar değil sosyal bir ekosistem dahil) değiştirmek, sistemin işleyişini bozmak yada istediğiniz gibi yönlendirmek. Bildiğiniz gibi kendisi GNU Vakfı’nın kurucusudur ve o dönemde Microsoft’un tekelleşme çabalarına ve Unix’in kodlarının kapatılmasına karşılık olarak tamamen açık kaynaklı olan Linux çekirdeğine destek vermek amacıyla kurulmuş bir kuruluştur. Harbiden de günümüzde bu hacking girişiminin ne kadar doğru bir adım olduğunu görmekteyiz. Eğer linux güçlenmeseydi şuan 5 USD’ye aldığımız bulut sunucuyu 50 USD’den aşağıya alamazdık. Çünkü arka planda linux değil MS ürünleri çalışır olacaktı ve MS’in fiyatları gerçekten can yakıcı. Bu MS ve onun gibilerine karşı yapılmış gerçek bir hacking saldırısıdır.
Kavram olarak hacking kelimesini biraz eşeledik. Şimdi gelelim yazılımsal olarak hacking nedir bunu sorgulamaya. Günümüzde bütün işler teknoloji üzerinden yürüyor. Kargomuzu takip etmek için kargo şirketini aramıyoruz. Bize bir takip numarası veriyor ve bilgisayarımızı kullanarak başka bir bilgisayarda kayıtlı olan kargo bilgilerine bu takip numarası üzerinden sorgulayıp kargomuzun durumunu öğrenebiliyoruz. Bu sayede hem daha hızlı bilgiye erişebiliyor hem daha çok bilgi kaydedip öğrenebiliyor hem de hız kazanmış oluyorduk. Kargomuzu bilgisayar ortamında değil de 100 yıl önce olduğu gibi kağıtlar üzerinde kaydedilseydi bu bilgilere ulaşmamız ya mümkün olmazdı yada çok uzun zaman alırdı. Teknoloji mümkün olmayan şeyleri mümkün hale getiren bir araçtır. Fakat teknoloji yine de insan yapımı birşeydir ve insanlar mutlaka hata yaparlar. Kargo firmasının kullandığı yazılımları da insanlar yazdı ve onbinlerce satır kod yazmak zorunda kaldılar. Bu yazılımda yüzlerce bilgi giriş noktası, bilgileri kayıt yapan kısımlar ve sogrulama yapan kısımlar mevcut. Dediğim gibi insanoğlu hatasız olmadığı için mutlaka yazılımlarda hatalar mevcut. Bazen gözünden kaçan bazen programcının eringenliğinden kaynaklanan hatalar bunlar. Hacking olayı işte burada başlıyor. Bir programcının bilerek yada bilmeyerek yaptığı hatayı kullanarak o sistemden beklenmeyen davranışlar sergilemesini sağlamak. Bu beklenmeyen davranışlar arasında başkasının bilmemesi gereken bilgilere erişmek, değiştirilmemesi gereken bilgileri değiştirmek, yeni bilgi eklemek, bazı dosyaları değiştirmek yada silmek vs. Yazılım dünyasında hacking, bir sistemdeki programcı hatalarını bulup bu hataları kullanarak işlemler yapan programların yazılması ve kullanılması olarak açıklayabiliriz.
Bu açıkları bulmak pek zor değil. Sırf bu iş için yazılmış birsürü program var piyasada. Bu yazılımlara erişmek de çok kolay. Bu konularla biraz ilgilenen bir insan bile çok kolay şekilde bu tarz programları indirip kullanabilir. Hacking eskisi kadar zor değil artık. Biraz yazılım bilgisi, biraz google kullanma becerisi, birkaç foruma üye olmak bu tarz programlara erişmek için yeterli. Tabiki kodlama tecrübeniz ne kadar iyiyse o kadar hızlı ve net çözümler bulup üretebilirsiniz.
Ben yazılım geliştirme camiasında birsürü yazılımcı gördüm. Java EE sertifikalı programcıdan tamamen spagetti kod yazarak dandik dundik paneller yazan programcılara kadar beceriklisiyle beceriksiziyle karşılaştım. On binlerce satır kod okuyup yazdım. 9 yıl içerisinde o kadar basit çözümleri ihmal ederek sisteminde birsürü açık bırakan ve bunu önemsemeyen programcılar gördüm. Bu hataları bulup çıkar sağlamak o kadar basit ki. Bunlardan birsürü para kazanmak bile mümkün. Fakat şunu söyleyebilirim, eğer bir sistemi 5 yıllık bir programcı yazmışsa o sistemdeki açıkları bulmak için en az 5 yıllık yazılım tecrübesine ihtiyacınız var. Her ne kadar piyasada birsürü hacking programları mevcut olsa bile bunlar genelde bilindik sistemler üzerine yazılmış olan programlar ve farklı bir sistemde denenince o kadar verimli olamıyorlar. O yüzden gerçek bir hacking işi yapmak istiyorsanız kendi programınızı kendiniz yazmanız gerekiyor.
Teknoloji dünyasında hacking kavramı içerisinde bilindik birkaç terim vardır. Virüs, trojan, XSS, CSRF, sosyal mühendislik, DOS, DDOS, SQL Injection falan filan. Bunlarla ilgili bilgiyi ufak bir google aramasında bulabilirsiniz. Ben bu klişe muhabbetlerden sıyrılıp kendi tecrübe ve bilgi birikimlerimi kullanarak hacking nasıl yapılır bunu anlatmaya çalışacağım. Daha doğrusu kendi adıma hacking girişimi yapmak isteseydim nasıl yapardım onu anlatacağım. Gerçi bu yazımdan dolayı birsürü şikayet alırım belki hatta mahkemelik bile olabilirim. Bu yüzden şu notu düşmem gerekiyor. Bu yazıdan sonra sizin yaptıklarınızdan ben sorumlu değilim. Bunları okuyup kendi kafasına göre birşeyler yapmaya çalışıp eline yüzüne bulaştırdıktan sonra bu yazıdan etkilendiğini falan söyleyip benim başımı yakmaya çalışırsanız ne ben sizi tanırım ne de siz beni. Kimseyi birşeye teşvik etmiyorum kimseyi tehdit falan etmiyorum. Sadece bilgilerimi paylaşmak istiyorum. Burda yazdıklarım beni suçlu yapmaz çünkü kimseye “senin tipin at hırsızına benziyo o zaman sen at çalmadan seni tutuklayacağız” diyemezsiniz.
Web Site Hacking
Buradaki yazılanları tam olarak anlayabilmek için basit seviyede Web, HTTP, Javascript, HTML, SQL bilgilerine sahip olmanız gerekiyor. Hadi başlayalım. Ben herhangi bir web yazılımını hacklemek isteseydim önce ne yapardım? Öncelikle web sitesinin adını web tarayıcısına yazıp neymiş neyin nesiymiş bakardım. Formları incelerdim. Google Chrome ile siteye girince herhangi biryere sağ tıklayıp “Inspect Element” deyince görüntüyü sağlayan kodlara bakabiliyorsunuz. Tüm sayfaları gezip nerede form var bakardım. Form girişlerinde nasıl kontroller var? Örneğin iletişim formu varsa mail adres doğrulama işlemi sadece client side’da mı yapılıyor yoksa server tarafında da bir kontrol var mı? Eğer herhangi bir kontrol yoksa şöyle birşey yapılabilir. Form elemanlarının “name” etiketlerini yazılımsal olarak rastgele değerlerle oluşturup o formun POST (yada GET) edildiği adrese göndermemiz mümkün. Bu işi sonsuz döngüye sokarsak birkaç saat yada birkaç gün içerisinde sitenin serverdaki harddisk yada veritabanı kotasını doldurmak mümkün. İşte bu otomatik bilgi gönderip sitedeki kaynakları tüketme işlemine “flood” deniyor. Serverların çoğunda flood koruması vardır. Yani sürekli bilgi girişi olduğunu tespit edip bu bilgi girişini engelleme mekanizmaları bulunan yazılımlar kurulmuş olabilir. Bu engelleme işini çeşitli yöntemlerle yaparlar. O ip’den gelen requestleri engelleyerek yada o sitenin serverdaki hesabını dondurarak. Dondurulduğu zaman zaten site tüm dünyaya erişilmez olur 😉 İp’nizden gelen requestleri engelliyorsa o zaman ip değiştirmeniz gerekir. İp değiştirmek için ya modeme reset atarsınız ya da TOR network gibi ağlar üzerinden bu işlemi yaparak yine yazılımsal olarak farklı bir TOR networkündeki ip’den internete çıkıp işleme kaldığınız yerden devam edebilirsiniz. Bu işlemi şuna benzetebiliriz. Karşınızda bir elinde kılıç bir elinde kalkan olan bir gladyatör duruyor ve o adama elinizdeki keserle birkaç kez vuruyorsunuz. Eğer gladyatör kendini korumazsa zarar verebilirsiniz. Fakat o kadar acemi gladyatör biraz zor bulursunuz. O yüzden bu şekilde bir zarar vermeniz çoğu site için mümkün değildir fakat yine de düşünülmeye ve geliştirilmeye değer bir konu bu. Flood işlemi çok kullanılan bir işlemdir ve bunu birsürü farklı yöntem geliştirerek yapabilirsiniz. Ne kadar farklı yöntem denerseniz amacınıza ulaşma ihtimaliniz o kadar artar.
Sitemizi araştırmaya ve saldırı yöntemleri geliştirmeye devam ediyoruz. Sitede başka bir form bulduk. “Sitemizden haberdar olmak için mail adresinizi yazınız” şeklinde bir form var diyelim. Burada sadece mail adresi isteyen bir alan var. Şimdi buraya birşey yazıp gönder butonuna tıklayınca arka planda ne olduğunu anlatayım. Mail adres kontrolü mutlaka vardır burada. Yoksa bile var farzedelim sonuç değişmeyecek çünkü. Ama sadece mail adres kontrolü var. Bu kontrolü yapmanın birsürü yöntemi var. Eğer kişi bu kontrolü kendisi yazmışsa ve tek tırnak gibi problem çıkartabilecek bir karakteri kontrol etmemişse o zaman tam dişimize göre bir balık yakaladık demektir. Neden mi? Kısaca açıklayayım. Siz mail adresi yazıp gönderdiğiniz zaman o mail adresi veritabanına kaydedilir. Kayıt sorgusu şudur: “insert into bulten (mail) values ( ‘$mailAdresi’ )” Burada $mailAdresi değişkeni eğer tırnak kontrolü gerçekleştirilmeden bu sorguya gelirse bu sorguyu şu hale getirebiliriz: “insert into bulten (mail) values ( ‘[email protected]’ ); update users set password = ‘e10adc3949ba59abbe56e057f20f883e’; —‘ )” Hedef siteyi yazan programcı sadece bir insert sorgusu olacağını zanneder ama tek tırnağı kontrol etmediği için biz bu sorguyu hem insert hem update sorguları olarak iki sorgu haline getirdik. Önce mail adresini ekliyor sonra da users tablosundaki tüm kullanıcıların şifrelerini MD5 ile encrypt edilmiş olan “123456” değeri olarak güncelliyor. ” –” ifadesinden sonraki bölümü ise yorum satırı olarak görüldüğü için veritabanı sunucusu tarafından işleme alınmıyor. Burada yine şansımızın biraz yaver gitmesi gerekiyor. Standart SQL destekleyen bir sistemde bu kodun çalışması mümkün. Bu PHP-Mysql yada CSharp-MSSql ikilileri yada kombinasyonları olabilir. Ayrıca bu çok basit bir yöntem. Daha karmaşık sistemlerde, bir request sonucu birçok SQL işlemi yapan yerlerde duruma göre daha farklı SQL Injection saldırıları üretmek mümkün.
Şimdi biraz daha derinlere inelim. Düz form yerine biraz da Javascript ile Ajax işlemleri yapılıyor mu ona bakalım. Bunun için yine siteye sağ tıklayıp Inspect Element diyoruz ve Javascript kodlarına bakıyoruz. Burada XMLHttp nesnesinin kullanılıp kullanılmadığına bakıyoruz. Bu düz formlardan daha önemli çünkü genelde programcılar XMLHttp ile yapılan requestlerde “olim kim bilecek buraya ajax ile request yapıldığını” diye düşünürler ve server tarafında en basit kontrolleri bile yapmazlar. Satürn’ün güçlü yer çekimine güvenen dünyanın uzaydan gelen göktaşlarına karşı kendisini Satürn’ün koruyacağını zannetmesi üzerine bir göktaşının Satürn’den kurtulup dünyaya çarpması sonucu dinazorların neslinin yok olması gibi web sitesine buradan gelecek olan saldırıları gözardı etmesinden dolayı web site sahibinin yada programcısının başına büyük felaketler açabiliriz. Senaryomuz şu şekilde. Hedef site çok kullanıcılı bir panel. Sizin de bu panelde hesabınız var ve panele normal şekilde kendi şifrenizle giriş yapıyorsunuz. Diğer kullanıcıların hesaplarını ele geçirmek istiyorsunuz. Hemen sağ tıklayıp “Inspect Element” diyoruz ve arkada çalışan javascript kodlarını açıyorsunuz. Kodları okurken biryere gözünüz çarpıyor. Arkada sessiz sedasız çalışan bir Ajax kodu var. Belli bir adrese bazı veriler gönderiyor. Adres (atıyorum) şu şekilde: “/kullanici/onlinetime” ve buraya client side’daki tarih saati gönderiyor. Bizim süper zeki programcımız server tarihini kullanmamış onun yerine kullanıcının tarih saatini kullanmayı uygun görmüş. Yani burada client’tan server’a bir veri girişi var. Tarih alanının ismi “sontarih” olarak görünüyor ve formatı “DD-MM-YY HH:ii:SS” şeklinde ve POST metoduyla gönderiliyor. Hemen ufak bir SQL injection denemesi yapıyoruz. Burada programcının amacı hangi kullanıcının şuan online olduğunu görmek olabilir. Programcı Türk olduğuna göre tablonun adı “kullanici” yada “kullanicilar” olması kuvvetle muhtemeldir. Eğer bunlar değilse “user” yada “users” diye koymuştur tablonun adını. Neyse. Biz “kullanicilar” olduğunu düşünerek sorgumuzu hazırlıyoruz. Tahminen update sorgusu şu şekildedir: “update kullanicilar set sontarih = ‘$sontarih’” Buradaki $sontarih değişkeni bizim gönderdiğimiz bilgidir. Biz bu “/kullanici/onlinetime” adresine aynı bilgileri sorguyu şu hale getirecek şekilde göndereceğiz: “update kullanicilar set sontarih = ‘24-02-16 14:54′; update kullanicilar set kullaniciadi = ‘user1’, parola = ‘e10adc3949ba59abbe56e057f20f883e’ LIMIT 1 OFFSET 0‘” Kırmızıyla işaretlenmiş bilgiyi doğrudan bu adrese ajax koduyla aynı olacak şekilde POST edersek ilk kullanıcının şifresini 123456 olarak ayarlamış oluruz. Hatta “user1” değerini ve “OFFSET 0” değerlerini bir döngü içerisinde arttırarak bu POST işlemini yaparsak her kullanıcının kullanıcı adını ve parolasını değiştirmiş oluruz. Böylece gerçek kullanıcılar kendi hesaplarına giremez ve siz örneğin user50 kullanıcı adı ve 123456 şifresiyle o kişinin paneline giriş yapıp sanki oymuş gibi işlemler yapabilirsiniz.
Ne kadar anlatabildim bilmiyorum. Konu çok uzun. Daha virüsler, DOS ve DDOS saldırıları, XSS, CSRF falan gibi konular var. Bunların her biri kendi başlarına makale konusu. Ben sadece hacker nasıl düşünür, programcı hataları nasıl değerlendirilir, hacking kavramsal ve yöntem olarak nasıldır sorularına açıklık kazandırmaya çalıştım. Zaten google’da tüm bu terimler için açıklayıcı metinler hatta hacking için Türkçe kitaplar bile mevcut. Ben bu kitaplardan birtane almıştım. İsterse hacking programları yazabilecek kapasiteye sahip bir programcı olarak bana çok basit geldi ama bu işlerle yeni yeni ilgilenen biri için aydınlatıcı olabilir.
Son olarak şunu söylemek istiyorum. İyi bir programcıysanız bir sistemin arkasında neler olduğunu tahmin edebilir, tahminlerinizde doğru olabilir ve kendi saldırı yöntemleriniz geliştirip amacınıza uygun programlar yazabilirsiniz. Yani gerçek bir hacker olmak için gerçek bir programcı olmanız gerekmektedir. Herkese bol güvenlikli günler dilerim.
0 yorum