Herkesin başına gelebilecek bir durum olan ve halk arasında “shell yedim, hacklendim, virüs bulaştı” şeklinde ifade edilen PHP web sitelerinin kabusu olan WebShell’lerinin nasıl tespit edilebileceğinden kısaca bahsedeceğim.
Genellikle hosting kullanan arkadaşlarımızın sık sık başına gelen bu olaylar kimi zaman can sıkıcı olabiliyor. Özellikle günümüzde Shell’ler aracılığı ile Link ekleme, Başka web sitelerine reklam amacıyla yönlendirme, Uzaktan içerik çağırma vb saldırılar gerçekleştirilmektedir.
Ancak aynı zamanda kullanılan yazılımlarda bulunan güvenlik açıklıklarıyla ve(veya) yanlış dosya ve(veya) klasör izinleri ile gene bu gizi kötücül yazılımlar sistemlere bulaşabiliyor.
Dosyaların Taranması İşlemi
Manuel olarak aksiyon alamayacak durumda olanlar için bir takım araçlar kullanarak shell taraması yapabilirsiniz. Bütün dosyalarınızda tarama yapmanızı şiddetle öneririm. Shellboy projesi yardımıyla taramayı gerçekleştireceğiz.
wget https://github.com/c1982/shellboy/releases/download/v0.0.1-beta/shellboy_linux_amd64
./shellboy_linux_amd64 --directory=/home/public
Her hangi bir bulgu olması durumunda uygulama sizi uyaracaktır.
Dosya değişikliklerinin tespit edilmesi
Sistem üzerinde tespit ettiğiniz anormallikleri çözmek için anında işleme geçip sunucu üzerinde son değiştirilen dosyaları kontrol etmeniz gerekir. Bu bize direk Shell’in yolunu verebilir.
Son 7 güne ait php dosyalarında değişiklik yapılan dosya tespiti
find . -type f -name '*.php' -mtime -7
Dosya içerisinde uzak kaynak kontrolü
Kimi zaman sitenizde bir takım alanlar değiştirilmiş olabilir. Bunlar genellikle yönlendirme kodları veya dışarıdan getirilmiş içerikler olabilir. Bunun tespiti için
find . -type f -name '*.php' | xargs egrep -i "preg_replace *\((['|\"])(.).*[a-z]*e[^]* *," --color
Orijinal Dosyalar ile Mevcut Dosyaların Kontrolü
Wordpress, Drupal, Magento vb hazır sistemler kullanıyorsanız. diff komutu aracılığı ile sisteminizde dosyalarını kontrol edebilirsiniz.
diff -r wordpress/ /var/www/sites/ -x wp-content
- -x den hemen sonra gelen klasör diff ile kontrol edilmeyecektir. Biz bu örneğimizde wp-content adlı klasöre bakılmaması gerektiğini söyledik.
- -r ile klasör içinde ne kadar dosya ve klasör içeriyorsa değişiklik kontrolü için dahil edilmesini istedik
Yazma İzinli Klasörlerin Tespit Edilmesi
Kimi zaman sistemde dosyalarınızın izinleri karışmış olabilir, genelde en çok karşılaşılan bu durumu çözmek her ne kadar kolay olsa da tehlikelidir.
find . -type d -perm 0777
Görsel İçerik Görünümlü Web Shell’lerin Tespiti
Kimi zaman uploads klasörüne eklenmiş bir görsel içerik(jpeg, png, gif vb) bile sizin web sitenize etki eden bir shell olabilir. Bu yüzden mevcut görsellerimiz içerisinde bile tarama işlemi gerçekleştirmemiz gerekir.
find uploads -type f -iname '*.jpg' | xargs grep -i php
.htaccess Kontrolü
Kimi zaman saldırganlar web sitenizde bulunan dosyalara ekleme yaparak kancalama atakları yapabilir. Bu gibi durumlarda mevcut dosyalarınızın başına yada sonuna kötü amaçlı yazılım kodları eklenebilir.
find . -type f -name '\.htaccess' | xargs grep -i auto_prepend_file
find . -type f -name '\.htaccess' | xargs grep -i auto_append_file
Şüpheli Kod Tespiti
Dosyaların içerisinde php’de kullanımı şüpheli olan kodlar olabilir. Bunları tespit etmemiz ve gerekeni yapmamız gerekebilir, wordpress veya drupal gibi hazır sistemler kullanıyorsanız sizi yanıltacak sonuçlar çıkartabilir.
find . -type f -name '*.php' | xargs egrep -i "(fsockopen|pfsockopen|stream\_socket\_client|exec|system|passthru|eval|base64_decode) *\("
- fsockopen: DDos için kullanılabilir, uzak soket açmaya yarar
- pfsockopen: uzak soket açar fsockopen ile aynıdır.
- exec, system ve passthru: sunucuda komut çalıştırmaya yarar
- stream_socket_client: Uzak bağlantı oluşturur.
- Her ne kadar komutlar arasına eklememiş olsam da mail fonksiyonu da kullanılabilir. Özellikle spam e-posta gönderimi için oldukça popüler bir kullanımı vardır.
Aramaları tek tek yapmak isterseniz aşağıdaki komutlardan faydalanabilirsiniz.
find . -type f -name '*.php' | xargs grep -l "eval *(" --color
find . -type f -name '*.php' | xargs grep -l "base64_decode *(" --color
find . -type f -name '*.php' | xargs grep -l "gzinflate *(" --color
find . -type f -name '*.php' | xargs grep -l "eval *(str_rot13 *(base64_decode *(" --color
find . -type f -name '*.php' | xargs grep -l "stream_socket_client *(" --color
find . -type f -name '*.php' | xargs grep -l "pfsockopen *(" --color
find . -type f -name '*.php' | xargs grep -l "mail *(" --color
Açık bağlantıların kontrolü
Sunucunuz da şüphelenmemiz gereken durumlardan bir tanesi de açık portlar ve servisler, sizin network kaynaklarınızı olumsuz yönde kullanıyor olabilir
netstat -na | grep -i LISTEN
Aynı zamanda sistem kaynaklarınızı kripto para kazımak için kullanabileceklerini unutmayın. Yukarıdaki bağlantı kontrolüne ek sunucunuzun CPU durumuna da bakmayı unutmayınız.