Merhabalar, bugün iç ağınızda uygulayabileceğiniz bazı web shell tespit etme yöntemlerini ele alacağım. Öncelikle “Web Shell nedir?” sorusuna ufak bir cevap vereyim.
Günümüz APT gruplarının saldırılarını analiz ettiğimizde saldırıların ilk olarak “DMZ” dediğimiz yani ağımızın dışarıya açık olan kısmından ve ne yazık ki en zayıf halka olarak görülen biz insanlardan yani “Sosyal Mühendislik” saldırılarından başladığını görüyoruz. DMZ dediğimiz alanlarda genelde mail sunucular ve web sunucular yer almaktadır. Saldırganların ise iç ağımıza sızmak için ilk tercih edeceği yer de doğal olarak DMZ alanıdır. Saldırgan DMZ alanında bulunan web sunucuyu hedef aldığını ve bu web sunucu üzerinde ise kurumumuzun websitesini veya dışarı açık bir API servisinin çalıştığını düşünelim. Saldırgan Local File Inclusion, Remote File Inclusion veya Unrestricted File Upload güvenlik açıklarını kullanarak sistem içerisine yani DMZ alanına düşecektir. Sisteme düşebilmek için ise “Web Shell” dediğimiz kod dosyasını sistem üzerine yükler veya uzaktan çağırır. Sonra yüklediği kod dosyasını çağırarak sistem üzerinde shell dediğimiz komut ekranını elde eder. Web Shell konusu aslında derin bir konudur. Bir çok web shell kodu vardır ve her patforma ayrı yazılmaktadır. Genel olarak PHP, Perl, Python, ASP/ASPX vb programlama dilleri kullanılarak yazılabilir. Local, Remote, Root vb. çeşitleri bulunmaktadır. Tabi ek olarak her APT grubu kendine özel obfuscate edilmiş web shell yazabilir. Bunları tespit etmek haliyle daha zor olmaktadır.
Genel olarak sitelere yapılan saldırılarda kullanılan shellere örnek vermek gerekirse:
- C99
- R57
- Kali işletim sisteminde hazır bulunan web sheller vb.
Shelleri incelemek isterseniz Google yazarak bulabilirsiniz.
NOT: Shelleri cihazınıza indirmemenizi ve çalıştırmamanızı öneririm.
APT gruplarının web shell yükleme tekniklerini aşağıdaki linke giderek inceleyebilirsiniz.
https://www.us-cert.gov/ncas/alerts/TA15-314A
Saldırgan DMZ alanına girdikten sonra iç ağa geçmek isteyecektir. İşte burada saldırgan iç ağa geçmeden müdahale edilmesi gereklidir. Bunun içinde ara ara çalıştırabileceğiniz bazı web shell tespit araçlarını sizlerle paylaşacağım. Bu araçları web dizinlerinizde çalıştırdığınızda web shell tespit etmeniz kolaylaşacaktır. Bu araçlarla taradınız, araçlar bir şey bulamadı buradan web shell yüklenmemiş tamam anlamını çıkarmak yanlış olur.Çünkü saldırganlarda bu araçların farkında ve shell’leri bu araçlardan kaçırmak için ufak dokunuşlar yapabiliyorlar. Ama bu da çalıştırmayın anlamına gelmemelidir. Eğer sisteminize yüklenmiş bir web shell tespit ederseniz öncelikle yükleme tarihini kontrol etmenizi sonrasında ise hemen ağınızı kontrol etmenizi öneririm.
1-) Neopi
Link:
https://github.com/Neohapsis/NeoPI
Araca taramak istediğiniz dizini -A ve -a parametreleri ile verdiğinizde tarama işlemi başlayacaktır. Tarama işlemi bittiğinde tespit ettiği web shelleri size listeyeleyecektir.
Yukarıdaki ekran görüntüsünde Linux işletim sistemi kullandım. Bu aracı Windows makinelerde de çalıştırabilirsiniz. Onun için Windows makinenizde Python 2.7 yüklü olması gereklidir. Python yükledikten sonra Bilgisayarım’a sağ tıklayıp sırasıyla Özellikler – Gelişmiş Sistem Ayarları – Ortam Değişkenleri – Alt kısımdan Path kısmını bulup Yeni butonuna tıklayınız. Değiken adı kısmına Path, Değişken kısmına ise yüklemiş olduğunuz Python 2.7’nin bulunduğu dizinin adresini yapıştırınız.
Sonrasında CMD açarak aracın bulunduğu dizine geçiniz ve aşağıdaki komut ile çalıştırınız.
2-) Backdoorman
Bu araç sadece Linux cihazlarda çalışmaktadır. Virustotal vb. apileri kullanarak web shell tespit etmeye çalışmaktadır.
Link:
https://github.com/cys3c/BackdoorMan
Aşağıdaki ekran görüntüsünde gördüğünüz gibi komutu verdiğinizde web shell tespit işlemi başlayacaktır.
3-) Webshell Detector
Bu araç yukarıdaki araçlara oranla daha fazla web shell tespit edebilmektedir. Sadece PHP dosyaları değil perl,aspx gibi web shell dosyalarınıda tespit edebilmektedir.
Link:
https://github.com/emposha/Shell-Detector
CMD açarak aracın dizinine geçiş yapınız. Geçiş yaptıktan sonra aşağıdaki ekran görüntüsünde gördüğünüz gibi komut vererek aracı çalıştırabilirsiniz.
Şimdi otomatize araçları kenara bırakarak manuel olarak nasıl tespit yöntemleri uygulayabiliriz ona bakalım.
Linux sistemlerde terminale aşağıdaki komutu girerseniz son 24 saat içerisinde web sunucu üzerinde değiştirilen veya yeni yüklenen “PHP” uzantılı dosyalar listelenecektir.
find . -type f -name '*.php' -mtime -1
Aynı komutu perl, python, aspx, asp, txt, jpg vb. uzantılar içinde uygulayabilirsiniz.
Yukarıdaki ekran görüntüsünde görüldüğü gibi en son eklenen php uzantılı dosyalar listelenmiştir.
Yukarıdaki komutu daha da geliştirerek dosyaların içerisinde belirlediğimiz anahtar kelimelerin geçip geçmediğine de bakabiliriz. Shell’lerin içerisinde bazı anahtar kelimeler geçmektedir. Mesela fsock, base64, eval vb. Fsock ile soket açıp kapatma işlemleri yapılmaktadır. Shell’in içerisinde fsock ie başlayan bir fonksiyon kullanılmışsa bunu tespit edebiliriz. Kodu base64 ile şifreleyerek tespit işlemini zorlaştırmak isteyebilirler. Shell’in bir yerlerinde içerisinde “base64” geçen fonksiyonların kullanılmış olabilir. İçerisinde base64 geçenleri tararsak tespit etme olasılığımız artabilir.
find . -type f -name '*.php' -mtime -1 | xargs grep -l "fsock"
find . -type f -name '*.php' -mtime -1 | xargs grep -l "shell"
find . -type f -name '*.php' -mtime -1 | xargs grep -l "base64"
Bu örnekler çoğaltılabilir. Araştırarak anahtar kelimeleri bulabilirsiniz.
Yukarıdaki işlemleri tek bir satır kod ile de yapabilirsiniz.
find . -type f -name '*.php' -mtime -1 | xargs egrep -i ' (fsockopen|pfsockopen|exec|base64|shell|system)'
Burada aklınızda bulunması gereken en önemli şey shell dosyalarının sadece PHP olarak yüklenmediğidir. Saldırganlar shell dosyalarını resim formatları veya TXT formatlarında da yükleyebilmektedirler. O yüzden yukarıdaki komutları resim formatlarına ve TXT formatına görede çalıştırmalısınız.
Peki yukarıda anlatılan komutları Windows üzerinde yapamaz mıyız? Tabiki yaparız onun içinde yardımımıza Powershell yetişiyor.
Get-ChildItem -recurse -include "*.php" |select-string "(fsock|shell|exec)"|%{"$_.file-name):$($_.line)"}|out-gridview
Yukardaki komut ile içerisinde “fsock, shell, exec” kelimeleri geçen dosyaları tespit ettim. Bu anahtar kelimeler dediğim gibi arttırılabilir.
Ben taramaların kısa sürmesi için bütün işlemlerde direkt olarak “uploads” klasörünü hedef gösterdim. Siz direkt olarak ana dizini verebilirsiniz, daha kapsamlı tarama yapılacaktır.
Sormak istediğiniz bir yer olursa sosyal medya hesaplarımdan veya yorum kısmından sorabilirsiniz. Güvenli günler dilerim.
Bahsettiğim güvenlik açıkları için:
https://www.owasp.org/index.php/Unrestricted_File_Upload
https://www.owasp.org/index.php/Testing_for_Local_File_Inclusion
https://www.owasp.org/index.php/Testing_for_Remote_File_Inclusion