mstkyvz commited on
Commit
34d1b87
·
verified ·
1 Parent(s): 36457bc

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +261 -0
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()