Herkese merhaba
Bu konumda sizlerle beraber adım adım ilerleyerek bir Zaafiyet Tarama (Vulnerability Scanner) aracı geliştireceğiz.Projemizde Python ve az bir miktar Html kullanacağız.
Aracımız da odak sadece temel tarama,SSH taraması,CVE sorgulama ve rapor oluşturma olacaktır.Daha fazla zaman kaybetmeden başlayalım.
İlk olarak projemizin temel dosya yapısını gösterelim.
Daha sonra projemizde kullanacağımız Python paketlerini requirements.txt dosyasına listeleyelip yazalım.
Requirements dosyasına paketleri yazmamızın amacı projede kullandığımız paketlerin diğer kullanıcılar için anlaşılır bir şekilde görünmesi ve terminal paket kurulumlarında tüm paketleri tek tek kurma zahmetinden kurtulmaktır.
Tüm paketleri kurmak için
Şimdi kodlayama başlayalım. İlk olarak tarama ekranını oluşturalım bunun için Shodan web sitesinden Shodan API key almamız gerekiyor.
Bunun için Shodan web sitesine gidelim ve giriş yapalım.Hesabınız yoksa ücretsiz üye olabilirsiniz.
Giriş yaptıktan sonra sağ üst menüden Account butonuna basıyoruz.


Açılan sayfada Show API key butonuna tıklıyoruz

Harika Api key'i aldık şimdi tarama ekranımızı kodlayalım.Sizlerde konuyla beraber kodlarken girişte anlattığım dosya yapısına uygun bir şekilde kodlayınız.
scanners/shodan_scanner.py dosyasını oluşturup kodları yazalım.Bu arada Shodan için aldığımız api keyi kaybetmeyin sakın ileride kullancağız
Bu konumda sizlerle beraber adım adım ilerleyerek bir Zaafiyet Tarama (Vulnerability Scanner) aracı geliştireceğiz.Projemizde Python ve az bir miktar Html kullanacağız.
Aracımız da odak sadece temel tarama,SSH taraması,CVE sorgulama ve rapor oluşturma olacaktır.Daha fazla zaman kaybetmeden başlayalım.
İlk olarak projemizin temel dosya yapısını gösterelim.
Kod:
vulnerability_scanner/
│
├── scanners/
│ ├── __init__.py
│ ├── shodan_scanner.py
│ ├── cve_scanner.py
│ └── ssh_scanner.py
│
├── reports/
│ ├── __init__.py
│ ├── report.py
│ └── templates/
│ └── report_template.html
│
├── main.py
├── requirements.txt
└── README.md
Daha sonra projemizde kullanacağımız Python paketlerini requirements.txt dosyasına listeleyelip yazalım.
Kod:
shodan
requests
pdfkit
jinja2
paramiko
Requirements dosyasına paketleri yazmamızın amacı projede kullandığımız paketlerin diğer kullanıcılar için anlaşılır bir şekilde görünmesi ve terminal paket kurulumlarında tüm paketleri tek tek kurma zahmetinden kurtulmaktır.
Tüm paketleri kurmak için
Kod:
pip install -r requirements.txt
Şimdi kodlayama başlayalım. İlk olarak tarama ekranını oluşturalım bunun için Shodan web sitesinden Shodan API key almamız gerekiyor.
Bunun için Shodan web sitesine gidelim ve giriş yapalım.Hesabınız yoksa ücretsiz üye olabilirsiniz.
Kod:
https://www.shodan.io/


Açılan sayfada Show API key butonuna tıklıyoruz

Harika Api key'i aldık şimdi tarama ekranımızı kodlayalım.Sizlerde konuyla beraber kodlarken girişte anlattığım dosya yapısına uygun bir şekilde kodlayınız.
scanners/shodan_scanner.py dosyasını oluşturup kodları yazalım.Bu arada Shodan için aldığımız api keyi kaybetmeyin sakın ileride kullancağız
Python:
import shodan
class ShodanScanner:
def __init__(self, api_key):
self.api = shodan.Shodan(api_key)
def scan(self, target):
try:
result = self.api.host(target)
return result
except shodan.APIError as e:
print(f"Shodan tarama hatası: {e}")
return None
Tarama sayfamızın kodlarını yazdıktan sonra CVE (Common Vulnerabilities and Exposures) taraması ile hedefteki potansiyel zafiyetleri araştıracağız. CVE sonuçlarını CVSS puanlarına göre sıralayacağız. Bu özellik için scanners/cve_scanner.py dosyasını oluşturuyoruz ve kodluyoruz.
Python:
import requests
class CVEScanner:
def __init__(self):
self.cve_api_url = "https://cve.circl.lu/api/search/"
def scan(self, target):
response = requests.get(f"{self.cve_api_url}{target}")
if response.status_code == 200:
return response.json()
else:
return None
def sort_vulnerabilities_by_cvss(self, vulnerabilities):
return sorted(vulnerabilities, key=lambda x: x.get("cvss", 0), reverse=True)
Bu yazdığımız kod, hedefteki yazılımlara veya sistemlere bağlı CVE verilerini getirir ve CVSS puanlarına göre sıralar.
Şimdi SSH taraması yaparak zayıf şifreleri test edip hedefte SSH bağlantıları ile güvenlik açıklarını keşfedeceğiz. Bunun için scanners/ssh_scanner.py dosyasını oluşturuyoruz.
Şimdi SSH taraması yaparak zayıf şifreleri test edip hedefte SSH bağlantıları ile güvenlik açıklarını keşfedeceğiz. Bunun için scanners/ssh_scanner.py dosyasını oluşturuyoruz.
Python:
import paramiko
class SSHScanner:
def __init__(self):
pass
def scan(self, target, username="root", password_list=None):
if password_list is None:
password_list = ["123456", "password", "admin"]
for password in password_list:
try:
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(target, username=username, password=password)
print(f"SSH giriş başarılı: {username}@{target} - {password}")
return True
except paramiko.AuthenticationException:
continue
print(f"SSH brute force başarısız: {target}")
return False
Sizler daha güçlü bir passwdlist oluşturabilirsiniz. Şimdi sırada ne var diye konu öncesi bir prova yapmıştım kontrol ediyorum veeeee şimdi sırada rapor ooluşturma var.Tarama sonuçlarını bir rapor olarak sunmak için HTML şablonları ile PDF raporları oluşturacağız. Bunun için reports/report.py ve HTML şablonunu içeren reports/templates/report_template.html dosyalarını oluşturuyoruz ardından kodluyoruz.
report.py
report.py
Python:
import pdfkit
from jinja2 import Environment, FileSystemLoader
def generate_html_report(vulns, file_name="report.html"):
env = Environment(loader=FileSystemLoader('reports/templates'))
template = env.get_template('report_template.html')
html_content = template.render(vulnerabilities=vulns)
with open(file_name, "w") as file:
file.write(html_content)
print(f"HTML raporu oluşturuldu: {file_name}")
return file_name
def generate_pdf_report(vulns, file_name="report.pdf"):
html_file = generate_html_report(vulns)
pdfkit.from_file(html_file, file_name)
print(f"PDF raporu oluşturuldu: {file_name}")
Bu yazdığımız kod tarama sonuçlarını HTML ve PDF formatında bir rapora dönüştürür.
Html ve Pdf formatına dönüştürdüğümüz dosyaların nasıl görüneceğini belirleyelim şimdi bu bölümün kodlarını da report_template.html dosyasına yazıyoruz.
report_template.html
Html ve Pdf formatına dönüştürdüğümüz dosyaların nasıl görüneceğini belirleyelim şimdi bu bölümün kodlarını da report_template.html dosyasına yazıyoruz.
report_template.html
HTML:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Vulnerability Report</title>
<style>
body { font-family: Arial, sans-serif; margin: 20px; }
h1 { color: #4CAF50; }
table { width: 100%; border-collapse: collapse; }
table, th, td { border: 1px solid black; }
th, td { padding: 15px; text-align: left; }
th { background-color: #f2f2f2; }
</style>
</head>
<body>
<h1>Vulnerability Report</h1>
<table>
<tr>
<th>Vulnerability ID</th>
<th>Description</th>
<th>CVSS Score</th>
</tr>
{% for vuln in vulnerabilities %}
<tr>
<td>{{ vuln.id }}</td>
<td>{{ vuln.summary }}</td>
<td>{{ vuln.cvss }}</td>
</tr>
{% endfor %}
</table>
</body>
</html>
Şimdi tüm bu modülleri bir araya getiren ana dosyayı yani main.py dosyasını oluşturalım. Bu dosya, hedeflerin taranmasını, CVE sonuçlarının alınmasını ve SSH güvenlik testlerini çalıştıracaktır.
Python:
from scanners.shodan_scanner import ShodanScanner
from scanners.cve_scanner import CVEScanner
from scanners.ssh_scanner import SSHScanner
from reports.report import generate_pdf_report
"""Shodan api anahtarımızı buraya girelim"""
SHODAN_API_KEY = "SHODAN_API_KEY"
def main():
target = "1.1.1.1" # Tarayacağımız hedef
"""Shodan taraması"""
shodan_scanner = ShodanScanner(SHODAN_API_KEY)
shodan_result = shodan_scanner.scan(target)
if shodan_result:
print(f"Shodan sonuçları: {shodan_result}")
""CVE taraması""
cve_scanner = CVEScanner()
cve_results = cve_scanner.scan(target)
if cve_results:
sorted_vulns = cve_scanner.sort_vulnerabilities_by_cvss(cve_results)
print(f"CVE sonuçları (sıralı): {sorted_vulns}")
else:
sorted_vulns = []
"""ssh taraması"""
ssh_scanner = SSHScanner()
ssh_scanner.scan(target)
"""PDF rapor oluşturma"""
generate_pdf_report(sorted_vulns, file_name="vulnerability_report.pdf")
if __name__ == "__main__":
main()
if __name__ == "__main__" 'siz hali 
Python:
from scanners.shodan_scanner import ShodanScanner
from scanners.cve_scanner import CVEScanner
from scanners.ssh_scanner import SSHScanner
from reports.report import generate_pdf_report
"""Shodan API anahtarımızı buraya girelim"""
SHODAN_API_KEY = "SHODAN_API_KEY"
def main():
target = "1.1.1.1" # Tarayacağımız hedef
"""Shodan taraması"""
shodan_scanner = ShodanScanner(SHODAN_API_KEY)
shodan_result = shodan_scanner.scan(target)
if shodan_result:
print(f"Shodan sonuçları: {shodan_result}")
"""CVE taraması"""
cve_scanner = CVEScanner()
cve_results = cve_scanner.scan(target)
if cve_results:
sorted_vulns = cve_scanner.sort_vulnerabilities_by_cvss(cve_results)
print(f"CVE sonuçları (sıralı): {sorted_vulns}")
else:
sorted_vulns = []
"""SSH taraması"""
ssh_scanner = SSHScanner()
ssh_scanner.scan(target)
"""PDF rapor oluşturma"""
generate_pdf_report(sorted_vulns, file_name="vulnerability_report.pdf")
main() """Doğrudan main fonksiynunu çağıralım :)"""
Şimdi ne yaptık diye bakalım.
Projede Shodan API kullanarak hedef sistemleri taradık, CVE taramaları gerçekleştirdik ve CVSS puanına göre zafiyetleri sıraladık. SSH brute force saldırılarıyla zayıf şifreleri test ettik ve tüm bu verileri bir PDF raporu olarak oluşturduk ve her şeyi bitirdik.Konuyu bitirmeden önce dikkatinizi çekmişse proje dosya yapısında __init__.py adlı bir dosyamız var ama biz bu dosyaya hiç bir kod yazmadık o zaman neden bu dosya var değil mi? Hemen açıklayalım
__init__.py

__init__.py dosyaları, bir Python klasörünü modül olarak tanımlar ve bu klasör içindeki Python dosyalarını başka dosyalarda kullanmanıza olanak sağlar. Bu dosyalar, Python’a ilgili klasörün bir paket olduğunu söyler ve klasör içinde yer alan Python dosyalarına kolayca erişim sağlar.
Proje dosyalarımızda ki rolü ise
Projede Shodan API kullanarak hedef sistemleri taradık, CVE taramaları gerçekleştirdik ve CVSS puanına göre zafiyetleri sıraladık. SSH brute force saldırılarıyla zayıf şifreleri test ettik ve tüm bu verileri bir PDF raporu olarak oluşturduk ve her şeyi bitirdik.Konuyu bitirmeden önce dikkatinizi çekmişse proje dosya yapısında __init__.py adlı bir dosyamız var ama biz bu dosyaya hiç bir kod yazmadık o zaman neden bu dosya var değil mi? Hemen açıklayalım
__init__.py

__init__.py dosyaları, bir Python klasörünü modül olarak tanımlar ve bu klasör içindeki Python dosyalarını başka dosyalarda kullanmanıza olanak sağlar. Bu dosyalar, Python’a ilgili klasörün bir paket olduğunu söyler ve klasör içinde yer alan Python dosyalarına kolayca erişim sağlar.
Proje dosyalarımızda ki rolü ise
- Modül tanımı: Bir klasörün Python modülü olarak tanımlanmasını sağlar.
- İçe aktarma kolaylığı: Klasör içindeki dosyalara erişimi organize eder ve dışarıdan hangi fonksiyonların veya sınıfların kullanılacağını kontrol eder.
- Boş olabilirlik: Eğer basit bir modül yapısı oluşturuyorsak , __init__.py dosyası boş olabilir. Bu durumda sadece klasörün bir Python modülü olduğunu belirtmiş oluruz.
Peki biz neden bu dosyaya bir şeyler yazmadık?
Çünkü yalnızca klasörlerin bir Python modülü olduğunu belirtmek istiyoruz. Bizim için bu dosyalarda herhangi bir kod yazmaya gerek yoktu. Yalnızca klasör yapısında belirttiğimiz scanners ve reports klasörleri birer Python modülü olarak tanımlandı.Biraz daha anlaşılması için şöyle yapalım.
Çünkü yalnızca klasörlerin bir Python modülü olduğunu belirtmek istiyoruz. Bizim için bu dosyalarda herhangi bir kod yazmaya gerek yoktu. Yalnızca klasör yapısında belirttiğimiz scanners ve reports klasörleri birer Python modülü olarak tanımlandı.Biraz daha anlaşılması için şöyle yapalım.
Kod:
vulnerability_scanner/
│
├── scanners/
│ ├── __init__.py # Boş olabilir
│ ├── shodan_scanner.py
│ ├── cve_scanner.py
│ └── ssh_scanner.py
│
├── reports/
│ ├── __init__.py # Boş olabilir
│ ├── report.py
│ └── templates/
│ └── report_template.html
Son düzenleme:







