Geniş İçerikli Nessus Raporlarının İşlenmesi

Global firmalara yönelik gerçekleştirilen sızma testlerinde teste tabi tutulan sistem sayısı onbinlerce olabilmektedir. Bu gibi durumlarda Nmap, Nessus gibi otomatik güvenlik zafiyet tarama araçları vazgeçilmez olmaktadır.
Her ne kadar otomatik araçlarla temel taramalar yapılabilse de sonuçların incelenmesi, false positive olabilecek açıkların ayıklanması, belirli açıklığa ait istatistiki bilgilerin alınması gibi ihtiyaçlar Nessus, Nmap gibi araçların varsayılan özellikleriyle gerçekleştirilememektedir.

Bu yazıda 25-30 bin sayfalık Nessus çıktılarından  istenilen bilgilerin kolaylıkla nasıl elde edileceği hakkında bilgiler verilmektedir.
Nessus, tarama sonuçlarını .nessus uzantısı ile rapor olarak sunabilmektedir. Bu şekilde, bir nessus raporunu, nessus kurulu bir başka bilgisayara import edilmektedir.

Pentest raporlarının hazırlanması sürecinde, nessus’un elde ettiği bulgular arasında spesifik bir arama gerçekleştirmek ve dataları direk elde etmek zordur.

Problem: Penetration test raporunda, zafiyetin ismi ve bu zafiyeti barındıran sunucuların ip listesi şeklinde bir dökümantasyonun bulunması gerekmektedir.

Çözüm: nessus raporunu SQLite veri tabanı sistemine aktardıktan sonra verileri, ihtiyaca göre işleyecek sorguların yazılması.

Risu ile Nessus Raporlarının Veri Tabanına Aktarılması:


Risu, nessus raporunu işledikten sonra, MySQL yada SQLite veri tabanı sistemlerine aktaran bir araçtır.

Risu Kurulumu:


Risu uygulamasının sitesinde kurulum detaylıca anlatılmıştır. Ulaşmak için;
http://hammackj.com/projects/risu/
http://hammackj.com/2011/06/09/installing-risu-on-backtrack5/

Risu Kullanımı:


Risu’nun nessus raporunu işledikten sonra dataları nereye yazacağı ile ilgili bilgilerini tuttuğu risu.cfg isimli dosya bulunmaktadır.

mince@mince-BGA:/tmp$ risu –create-config-file


Komutunun çalıştırıldığı dizinde risu.cfg dosyası oluşmaktadır. Bu dosyanın içeriğinin default hali aşağıda ki gibidir.
report:
  author: 
  title: 
  company: 
  classification: 

database:
  adapter: 
  host: 
  port: 
  database: 
  username: 
  password: 
  timeout: 

Eğer dataları MySQL’e aktarmak istiyorsanız gerekli bilgileri bu alanlara doldurmanız gerekmektedir. Bu yazıda nessus datalarının aktarılacağı veri tabanı sistemi SQLite olarak belirlenmiştir.
report:
  author: 
  title: 
  company: 
  classification: 

database:
  adapter: sqlite3
  database: PARSED.db

Yukarıda ki ayarlar SQLite3 için yazılması gerekli olan ayarlardır. PARSED.db ismi tercihe göre değişebilir.
Risu.cfg dosyasında gerekli düzenlemeler yapıldıktan sonra;
mince@mince-BGA:/tmp/risu$ risu –create-tables
[*] Creating tables
mince@mince-BGA:/tmp/risu$ ls
PARSED.db  risu.cfg

PARSED.db dosyası oluşturulmuştur. Bu ön hazırlıkların tamamlanmasının ardından sıra nessus raporunun işlenmesi gelmektedir.
mince@mince-BGA:/tmp/risu$ risu “~/Desktop/nessus-pentest/reports/nessus_report_XXX.nessus”
[*] Parsing /home/mince/Desktop/nessus-pentest/reports/nessus_report_XXX.nessus…
[*] Fixing IP Address field
[*] Finished parsing /home/mince/Desktop/nessus-pentest/reports/nessus_report_XXX.nessus. Parse took 2.26 seconds
Raporun işlenmesi ve SQLite’a aktarlması 2.26 saniye sürmüştür. BGA olarak yaptığımız testlerde 80mb boyutu olan nessus raporunun risu tarafından işlenmesi 520sn almıştır.
SQLite Üzerinde Çalışmak:

SQLite verisini işlemek için Ubuntu’da 

mince@mince-BGA:~$ sudo apt-get install sqliteman
mince@mince-BGA:~$ sudo apt-get install sqlitebrowser
Yazılımlarını kullanabilirsiniz. Bu yazılımların yanı sıra, SQLite datalarını işleyebilmek için Firefox’un sqlite-manager isimli addons’unu kullanabilirsiniz.

Yukarıda ki resimde görüldüğü üzere nessus raporu tamamiyle SQLite veritabanına aktarılmıştır.

Problem: Penetration test raporunda, zafiyetin ismi ve bu zafiyeti barındıran sunucuların ip listesi şeklinde bir dökümantasyonun bulunması gerekmektedir.
Çözüm:
  1. items tablosunda ki severity kolonunda ki rakamlar, zafiyetin risk seviyesini belirtmektedir.
    2 = Normal, 3 = High, 4 = Critical
  2. hosts tablosunda ki name kolonunda taranan sunucuların ip’leri bulunmaktadır.
  3. hosts tablosunda ki id kolonu her host’a atanan uniq bir değeri ifade etmektedir.
  4. items tablosnda ki plugin_name tespit edilen zafiyetin ismini belirtmektedir.
  5. items tablosunda ki host_id , tespit edilen zafiyetin hangi id’li host’a ait olduğunu belirtmektedir.
Bu bilgiler ışığında aşağıda ki sorgu; host tablosunda ki id kolonu ile items tablosunda ki host_id kolonunu eşleştir ve ekrana items tablosundan severity ve plugin_name, hosts tablosunda name kolonlarında ki değerleri yaz! demektedir.
SELECT items.severity,hosts.name,items.plugin_name FROM items INNER JOIN hosts ON items.host_id = hosts.id WHERE items.severity >= 2 ORDER BY hosts.name
Çoklu Nessus Dosyaları İle Çalışmak

Aynı problemi bir çok nessus raporuna aynı anda uygulamak isteyebilirsiniz. Bu durumu çözmek için kullanmak üzere geliştirdiğimiz bash script aşağıda bulunmaktadır. Script’in yaptığı işlemler adım adım aşağıda ki gibidir.
  1. Her nessus dosyasını işleyip SQLite’e aktarmak.
  2. Aktarılan SQLite veri tabanından gerekli dataları query’ler ile çekip bir dosyaya yazmak.
  3. Bu dosyada ki zafiyet isimlerini parse etmek.
  4. Parse edilen zafiyet isimlerini içeren host isimlerini parse etmek.
  5. Tüm dataları bir dosyaya işlemek.
#!/bin/bash
# Bilgi Guvenligi Akademisi
# Nessus Parser v0.1 Public Script – 14 Aug 2012
# Mehmet INCE
#Mevcut dosyalari sil
DosyalariSil(){
if [ -f PARSED.db ];then 
rm -rf PARSED.db 
fi
if [ -f ZAFIYETLER.txt ];then 
rm -rf ZAFIYETLER.txt 
fi
if [ -f SIRALAMA.txt ];then 
rm -rf SIRALAMA.txt 
fi
if [ -f SONUC.txt ];then 
rm -rf SIRALAMA.txt 
fi
}
#Datalar SQLite’dan Cekiliyor..!
SQLiteSor() {
for i in $(ls reports/|grep -r ‘.nessus$’)
do
risu –create-tables
echo “[*] Nessus raporu parse ediliyor”
risu “reports/$i”
echo “[*] SQL Quqery calistiriliyor”
sqlite3 PARSED.db ‘SELECT items.severity,hosts.name,items.plugin_name FROM items INNER JOIN hosts ON items.host_id = hosts.id WHERE items.severity >= 2 ORDER BY name’ >> SIRALAMA.txt
if [ -f PARSED.db ]
then
rm -rf PARSED.db
echo “[*] PARSED.db silindi!”
fi
done
}
#SQLite’dan gelen datalar icinden Zafiyet İsimleri cekiliyor.
ZafiyetOlustur(){
cat SIRALAMA.txt|awk -F”|” ‘{print $3}’|sort|uniq > ZAFIYETLER.txt
}
#Zafiyetler isimleri SIRALAMA.txt’de aranıyor ve ip’ler uniq sort’a tabi tutulmus oluyor.
ZafiyetIsle() {
while read line; 
do 
echo $line
cat SIRALAMA.txt|grep “$line”|awk -F”|” ‘{print $2}’|sort|uniq
done < ZAFIYETLER.txt
}
DosyalariSil
SQLiteSor
ZafiyetOlustur
ZafiyetIsle > SONUC.txt
echo “[*] Islemler Bitti! SONUC.txt dosyasina bakabilirsiniz:)”
Yazar: Mehmet Dursun INCE
Mail  : mehmet.ince@bga.com.tr

PS: Bu dökümanda kullanılan ve anlatılan tüm uygulamalar Ubuntu 12.04 x86_64 sisteminde test edilmiştir.