Spaces:
Running
Running
Create app.py
Browse files
app.py
ADDED
@@ -0,0 +1,261 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import os
|
2 |
+
from dotenv import load_dotenv
|
3 |
+
import requests
|
4 |
+
from bs4 import BeautifulSoup
|
5 |
+
import whois
|
6 |
+
from openai import OpenAI
|
7 |
+
import gradio as gr
|
8 |
+
from playwright.sync_api import sync_playwright
|
9 |
+
import time
|
10 |
+
import json
|
11 |
+
|
12 |
+
load_dotenv()
|
13 |
+
|
14 |
+
class PhishingToolkit:
|
15 |
+
"""toolkit sınıfı"""
|
16 |
+
|
17 |
+
def __init__(self, api_key=None, model="gpt-4o"):
|
18 |
+
# API anahtarı ve model bilgisini sakla
|
19 |
+
self.api_key = api_key or os.getenv('OPENAI_API_KEY')
|
20 |
+
self.model = model
|
21 |
+
# OpenAI istemcisini oluştur
|
22 |
+
self.client = OpenAI(api_key=self.api_key) if self.api_key else None
|
23 |
+
|
24 |
+
def fetch_content(self, url):
|
25 |
+
"""Verilen URL'nin içeriğini döndürür."""
|
26 |
+
try:
|
27 |
+
headers = {
|
28 |
+
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
|
29 |
+
}
|
30 |
+
response = requests.get(url, headers=headers, timeout=10)
|
31 |
+
response.raise_for_status() # HTTP hatalarını kontrol et
|
32 |
+
soup = BeautifulSoup(response.text, "html.parser")
|
33 |
+
|
34 |
+
# Sadece görünür metin içeriğini al
|
35 |
+
for script in soup(["script", "style"]):
|
36 |
+
script.decompose()
|
37 |
+
|
38 |
+
text = soup.get_text(separator=' ', strip=True)
|
39 |
+
# İçeriği makul bir uzunlukta tut
|
40 |
+
return text[:5000] + "..." if len(text) > 5000 else text
|
41 |
+
except requests.exceptions.RequestException as e:
|
42 |
+
return f"URL erişim hatası: {e}"
|
43 |
+
except Exception as e:
|
44 |
+
return f"İçerik çekme hatası: {e}"
|
45 |
+
|
46 |
+
def capture_screenshot(self, url):
|
47 |
+
"""Verilen URL'nin ekran görüntüsünü alır."""
|
48 |
+
try:
|
49 |
+
# Temiz bir dosya adı oluştur
|
50 |
+
domain = url.split("//")[-1].split("/")[0]
|
51 |
+
timestamp = int(time.time())
|
52 |
+
filename = f"{domain.replace('.', '_')}_{timestamp}.png"
|
53 |
+
screenshot_path = os.path.join("screenshots", filename)
|
54 |
+
|
55 |
+
# Klasörün var olduğundan emin ol
|
56 |
+
os.makedirs("screenshots", exist_ok=True)
|
57 |
+
|
58 |
+
with sync_playwright() as p:
|
59 |
+
browser = p.chromium.launch()
|
60 |
+
page = browser.new_page()
|
61 |
+
page.goto(url, wait_until="networkidle", timeout=30000)
|
62 |
+
page.screenshot(path=screenshot_path)
|
63 |
+
browser.close()
|
64 |
+
|
65 |
+
return screenshot_path
|
66 |
+
except Exception as e:
|
67 |
+
print(f"Ekran görüntüsü hatası: {e}")
|
68 |
+
return None
|
69 |
+
|
70 |
+
def get_whois_info(self, url):
|
71 |
+
"""Verilen URL'nin WHOIS bilgilerini alır."""
|
72 |
+
try:
|
73 |
+
# URL'den domain adını çıkar
|
74 |
+
domain = url.split("//")[-1].split("/")[0]
|
75 |
+
w = whois.whois(domain)
|
76 |
+
|
77 |
+
# WHOIS verilerini düzenle
|
78 |
+
whois_info = {
|
79 |
+
"Domain Adı": w.domain_name,
|
80 |
+
"Kayıt Tarihi": w.creation_date,
|
81 |
+
"Son Kullanma Tarihi": w.expiration_date,
|
82 |
+
"Kayıt Eden": w.registrar,
|
83 |
+
"WHOIS Sunucusu": w.whois_server,
|
84 |
+
"Durum": w.status
|
85 |
+
}
|
86 |
+
|
87 |
+
# None değerleri filtrele ve formatla
|
88 |
+
formatted_info = {}
|
89 |
+
for key, value in whois_info.items():
|
90 |
+
if value is not None:
|
91 |
+
if isinstance(value, list):
|
92 |
+
formatted_info[key] = str(value[0]) if value else "Bilgi yok"
|
93 |
+
else:
|
94 |
+
formatted_info[key] = str(value)
|
95 |
+
else:
|
96 |
+
formatted_info[key] = "Bilgi yok"
|
97 |
+
|
98 |
+
# Dictionary'yi okunabilir formata çevir
|
99 |
+
return json.dumps(formatted_info, indent=2, ensure_ascii=False)
|
100 |
+
except Exception as e:
|
101 |
+
return f"WHOIS bilgisi alınamadı: {e}"
|
102 |
+
|
103 |
+
def analyze_phishing(self, url, content, whois_info):
|
104 |
+
"""Verilen içerik ve WHOIS bilgileri ile phishing analizi yapar."""
|
105 |
+
# API anahtarı kontrolü
|
106 |
+
if not self.api_key:
|
107 |
+
return "API anahtarı girilmediği için analiz yapılamıyor. Lütfen OpenAI API anahtarınızı girin."
|
108 |
+
|
109 |
+
# İçeriği kısalt
|
110 |
+
content_summary = content[:3000] + "..." if len(content) > 3000 else content
|
111 |
+
|
112 |
+
prompt = f"""
|
113 |
+
Aşağıdaki site için phishing analizi yap:
|
114 |
+
|
115 |
+
URL: {url}
|
116 |
+
İçerik: {content_summary}
|
117 |
+
WHOIS Bilgileri: {whois_info}
|
118 |
+
|
119 |
+
Aşağıdaki kriterlere göre değerlendir:
|
120 |
+
1. Domain adının yaşı ve güvenilirliği
|
121 |
+
2. SSL sertifikası varlığı ("https" kullanımı)
|
122 |
+
3. URL yapısındaki şüpheli karakterler veya yönlendirmeler
|
123 |
+
4. İçerikte bulunan şüpheli formlar, giriş alanları
|
124 |
+
5. İçerikteki dil ve yazım hataları
|
125 |
+
6. Profesyonel görünüm eksikliği
|
126 |
+
7. WHOIS bilgilerinin gizliliği veya şüpheli durumu
|
127 |
+
|
128 |
+
Analizini şu formatta döndür:
|
129 |
+
Risk Seviyesi: [Düşük/Orta/Yüksek]
|
130 |
+
Tespitler: [Kısa ve net maddeler halinde]
|
131 |
+
Sonuç: [Phishing olup olmadığı hakkında nihai karar]
|
132 |
+
"""
|
133 |
+
try:
|
134 |
+
response = self.client.chat.completions.create(
|
135 |
+
model=self.model,
|
136 |
+
messages=[{"role": "user", "content": prompt}],
|
137 |
+
temperature=0.5,
|
138 |
+
max_tokens=800
|
139 |
+
)
|
140 |
+
return response.choices[0].message.content
|
141 |
+
except Exception as e:
|
142 |
+
return f"AI analiz hatası: {e}"
|
143 |
+
|
144 |
+
def analyze_url(url, api_key, model):
|
145 |
+
"""URL'yi analiz edip sonuçları döndürür"""
|
146 |
+
if not url or url.strip() == "":
|
147 |
+
return "Lütfen bir URL girin.", None, "URL girin.", "URL girin."
|
148 |
+
|
149 |
+
if not url.startswith(('http://', 'https://')):
|
150 |
+
url = 'https://' + url
|
151 |
+
|
152 |
+
try:
|
153 |
+
# API anahtarı kontrolü
|
154 |
+
if not api_key or api_key.strip() == "":
|
155 |
+
api_key = os.getenv('OPENAI_API_KEY')
|
156 |
+
if not api_key:
|
157 |
+
return ("API anahtarı eksik. Lütfen ayarlar bölümünden OpenAI API anahtarınızı girin veya .env dosyasına ekleyin.",
|
158 |
+
None, "API anahtarı eksik.", "API anahtarı eksik.")
|
159 |
+
|
160 |
+
# Toolkit oluştur
|
161 |
+
toolkit = PhishingToolkit(api_key=api_key, model=model)
|
162 |
+
|
163 |
+
# Adım 1: İçerik çek
|
164 |
+
content = toolkit.fetch_content(url)
|
165 |
+
|
166 |
+
# Adım 2: WHOIS bilgisi al
|
167 |
+
whois_info = toolkit.get_whois_info(url)
|
168 |
+
|
169 |
+
# Adım 3: Ekran görüntüsü al
|
170 |
+
screenshot_path = toolkit.capture_screenshot(url)
|
171 |
+
|
172 |
+
# Adım 4: Phishing analizi yap
|
173 |
+
analysis = toolkit.analyze_phishing(url, content, whois_info)
|
174 |
+
|
175 |
+
return content, screenshot_path, whois_info, analysis
|
176 |
+
except Exception as e:
|
177 |
+
error_message = f"Analiz sırasında hata oluştu: {str(e)}"
|
178 |
+
return error_message, None, error_message, error_message
|
179 |
+
|
180 |
+
# Gradio arayüzü oluştur
|
181 |
+
def create_interface():
|
182 |
+
with gr.Blocks(title="Gelişmiş Phishing Tespit Sistemi") as iface:
|
183 |
+
gr.Markdown("## 🛡️ Gelişmiş Phishing Tespit Sistemi")
|
184 |
+
gr.Markdown("Bir URL girerek phishing analizi yapın. Sistem web sitesinin içeriğini, ekran görüntüsünü ve alan adı bilgilerini analiz ederek phishing olasılığını değerlendirir.")
|
185 |
+
|
186 |
+
# Ayarlar sekmesi
|
187 |
+
with gr.Accordion("⚙️ AI Ayarları", open=False):
|
188 |
+
with gr.Row():
|
189 |
+
api_key = gr.Textbox(
|
190 |
+
label="OpenAI API Anahtarı",
|
191 |
+
placeholder="sk-...",
|
192 |
+
type="password",
|
193 |
+
value=os.getenv('OPENAI_API_KEY', ""),
|
194 |
+
info="API anahtarınızı girin (varsa .env dosyasından yüklenir)"
|
195 |
+
)
|
196 |
+
model = gr.Dropdown(
|
197 |
+
label="Model Seçimi",
|
198 |
+
choices=["gpt-4o", "gpt-3.5-turbo", "gpt-4", "gpt-4-turbo"],
|
199 |
+
value="gpt-4o",
|
200 |
+
info="Kullanılacak OpenAI modelini seçin"
|
201 |
+
)
|
202 |
+
|
203 |
+
with gr.Row():
|
204 |
+
url_input = gr.Textbox(
|
205 |
+
label="URL (örn: example.com veya https://example.com)",
|
206 |
+
placeholder="example.com"
|
207 |
+
)
|
208 |
+
analyze_button = gr.Button("🔍 Analiz Et", variant="primary")
|
209 |
+
|
210 |
+
with gr.Row():
|
211 |
+
with gr.Column(scale=1):
|
212 |
+
gr.Markdown("### 🖼️ Site Görünümü")
|
213 |
+
screenshot_output = gr.Image(label="Ekran Görüntüsü", type="filepath")
|
214 |
+
|
215 |
+
gr.Markdown("### 📋 WHOIS Bilgileri")
|
216 |
+
whois_output = gr.Textbox(label="", lines=10)
|
217 |
+
|
218 |
+
with gr.Column(scale=1):
|
219 |
+
gr.Markdown("### 🔒 Güvenlik Analizi")
|
220 |
+
analysis_output = gr.Textbox(label="", lines=15)
|
221 |
+
|
222 |
+
gr.Markdown("### 📄 Site İçeriği")
|
223 |
+
content_output = gr.Textbox(
|
224 |
+
label="",
|
225 |
+
lines=10,
|
226 |
+
max_lines=20,
|
227 |
+
show_copy_button=True
|
228 |
+
)
|
229 |
+
|
230 |
+
# Analiz fonksiyonunu bağla
|
231 |
+
analyze_button.click(
|
232 |
+
fn=analyze_url,
|
233 |
+
inputs=[url_input, api_key, model],
|
234 |
+
outputs=[content_output, screenshot_output, whois_output, analysis_output]
|
235 |
+
)
|
236 |
+
|
237 |
+
# Örnek URL'ler
|
238 |
+
gr.Examples(
|
239 |
+
examples=["google.com", "amazon.com", "facebook.com"],
|
240 |
+
inputs=url_input
|
241 |
+
)
|
242 |
+
|
243 |
+
gr.Markdown("---")
|
244 |
+
gr.Markdown("### ℹ️ Nasıl Kullanılır")
|
245 |
+
gr.Markdown("""
|
246 |
+
1. '⚙️ AI Ayarları' bölümünden OpenAI API anahtarınızı girin ve istediğiniz modeli seçin
|
247 |
+
2. Analiz etmek istediğiniz web sitesinin URL'sini girin
|
248 |
+
3. 'Analiz Et' butonuna tıklayın
|
249 |
+
4. Sistem web sitesinin ekran görüntüsünü, WHOIS bilgilerini ve içerik analizini gösterecektir
|
250 |
+
5. Phishing analizi sonucunu değerlendirin
|
251 |
+
""")
|
252 |
+
|
253 |
+
return iface
|
254 |
+
|
255 |
+
if __name__ == "__main__":
|
256 |
+
# Uygulama başlatılmadan önce klasör kontrolü
|
257 |
+
os.makedirs("screenshots", exist_ok=True)
|
258 |
+
|
259 |
+
# Arayüzü oluştur ve başlat
|
260 |
+
iface = create_interface()
|
261 |
+
iface.launch()
|