import json import re import socket import ssl import urllib.parse import urllib.request def renk(metin, kod): return f"\033[{kod}m{metin}\033[0m" def baslik(): print( renk( """ ██████╗ ███████╗██╗███╗ ██╗████████╗ ██╔═══██╗██╔════╝██║████╗ ██║╚══██╔══╝ ██║ ██║███████╗██║██╔██╗ ██║ ██║ ██║ ██║╚════██║██║██║╚██╗██║ ██║ ╚██████╔╝███████║██║██║ ╚████║ ██║ ╚═════╝ ╚══════╝╚═╝╚═╝ ╚═══╝ ╚═╝ ULTRA OSINT TOOL """, "36", ) ) # 1. Kullanıcı Adı Taraması def username_search(username): print(renk(f"\n[+] SOSYAL MEDYA TARAMASI: '{username}'", "33")) sites = { "GitHub": f"https://github.com/{username}", "Instagram": f"https://www.instagram.com/{username}", "Twitter/X": f"https://x.com/{username}", "Pinterest": f"https://www.pinterest.com/{username}", "Reddit": f"https://www.reddit.com/user/{username}", "Telegram": f"https://t.me/{username}", "TikTok": f"https://www.tiktok.com/@{username}", "Medium": f"https://medium.com/@{username}", "GitLab": f"https://gitlab.com/{username}", } headers = { "User-Agent": ( "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" ) } for site, url in sites.items(): try: req = urllib.request.Request(url, headers=headers) with urllib.request.urlopen(req, timeout=4) as response: if response.status == 200: print( f" [{renk('BULDUM', '32')}] {site}: {renk(url, '34')}" ) except urllib.error.HTTPError as e: if e.code == 404: print(f" [{renk('YOK', '31')}] {site}") else: print(f" [{renk('ENGEL', '33')}] {site} (Kod: {e.code})") except Exception: print(f" [{renk('HATA', '31')}] {site} erişilemedi.") # 2. Domain & IP Coğrafi Konum Analizi def domain_ip_lookup(target): print(renk(f"\n[+] AĞ VE IP ANALİZİ: '{target}'", "33")) try: ip = socket.gethostbyname(target) print(f" • Hedef / Domain: {target}") print(f" • Çözümlenen IP: {renk(ip, '32')}") except socket.gaierror: ip = target print(f" • Doğrudan IP İşleniyor: {ip}") try: url = f"http://ip-api.com/json/{ip}" req = urllib.request.urlopen(url, timeout=5) data = json.loads(req.read().decode()) if data.get("status") == "success": print(f" • Ülke: {data.get('country')} ({data.get('countryCode')})") print(f" • Şehir / Bölge: {data.get('city')} / {data.get('regionName')}") print(f" • İnternet Sağlayıcı (ISP): {data.get('isp')}") print(f" • AS Numarası: {data.get('as')}") print( f" • Harita Konumu:" f" https://maps.google.com/?q={data.get('lat')},{data.get('lon')}" ) else: print(f" [{renk('HATA', '31')}] IP detayları çekilemedi.") except Exception as e: print(f" [{renk('HATA', '31')}] Bağlantı hatası: {e}") # 3. Subdomain Tespiti (crt.sh Sertifika Günlükleri) def subdomain_lookup(domain): print(renk(f"\n[+] SUBDOMAIN TESPİTİ (crt.sh): '{domain}'", "33")) url = f"https://crt.sh/?q=%.{domain}&output=json" headers = {"User-Agent": "Mozilla/5.0"} try: req = urllib.request.Request(url, headers=headers) with urllib.request.urlopen(req, timeout=8) as response: if response.status == 200: data = json.loads(response.read().decode("utf-8")) subdomains = set() for entry in data: name_value = entry.get("name_value", "") for sub in name_value.split("\n"): sub = sub.strip() if sub and not sub.startswith("*"): subdomains.add(sub) print( f" • Bulunan Toplam Alt Domain:" f" {renk(len(subdomains), '32')}" ) print(" --- İlk 10 Alt Domain ---") for sub in list(subdomains)[:10]: print(f" - {sub}") if len(subdomains) > 10: print( f" ... ve {len(subdomains)-10} adet daha bulundu." ) except Exception as e: print(f" [{renk('HATA', '31')}] Subdomain sorgusu yapılamadı: {e}") # 4. SSL/TLS Sertifika İncelemesi def ssl_checker(hostname): print(renk(f"\n[+] SSL/TLS SERTİFİKA İNCELEMESİ: '{hostname}'", "33")) context = ssl.create_default_context() try: with socket.create_connection((hostname, 443), timeout=5) as sock: with context.wrap_socket(sock, server_hostname=hostname) as ssock: cert = ssock.getpeercert() issuer = dict(x[0] for x in cert.get("issuer", [])) subject = dict(x[0] for x in cert.get("subject", [])) print( f" • Sertifika Sağlayıcı:" f" {issuer.get('organizationName', 'Bilinmiyor')}" ) print( f" • Sertifika Sahibi:" f" {subject.get('commonName', 'Bilinmiyor')}" ) print(f" • Başlangıç Tarihi: {cert.get('notBefore')}") print(f" • Bitiş Tarihi: {cert.get('notAfter')}") except Exception as e: print(f" [{renk('HATA', '31')}] SSL portuna (443) erişilemedi: {e}") # 5. Robots.txt ve Sitemap İnceleme def robots_sitemap_check(domain): print(renk(f"\n[+] ROBOTS.TXT & SITEMAP KONTROLÜ: '{domain}'", "33")) base_url = ( domain if domain.startswith("http") else f"https://{domain}" ).rstrip("/") files = ["/robots.txt", "/sitemap.xml"] headers = {"User-Agent": "Mozilla/5.0"} for file in files: target_url = base_url + file try: req = urllib.request.Request(target_url, headers=headers) with urllib.request.urlopen(req, timeout=4) as response: if response.status == 200: print( f" [{renk('MEVCUT', '32')}] {file} dosyası bulundu:" f" {renk(target_url, '34')}" ) except Exception: print(f" [{renk('YOK', '31')}] {file} bulunamadı.") # 6. E-Posta & Telefon OSINT Modülü def email_phone_osint(query): print(renk(f"\n[+] E-POSTA / TELEFON ANALİZİ: '{query}'", "33")) if "@" in query: user, domain = query.split("@", 1) print(f" • Kullanıcı Adı: {user}") print(f" • Domain: {domain}") encoded = urllib.parse.quote(query) print( f" • HaveIBeenPwned (Sızıntı Kontrolü):\n " f" https://haveibeenpwned.com/account/{encoded}" ) print( f" • Google Dork Arama:\n " f" https://www.google.com/search?q=%22{encoded}%22" ) else: clean = re.sub(r"[^\d+]", "", query) raw = re.sub(r"\D", "", clean) print(f" • Temizlenmiş Numara: {clean}") print(f" • WhatsApp Doğrudan Mesaj:\n https://wa.me/{raw}") print(f" • Telegram Arama:\n https://t.me/+{raw}") # 7. Harici Tehdit İstihbarat Linkleri Üretici def threat_intel_links(target): print(renk(f"\n[+] TEHDİT İSTİHBARATİ & ANALİZ LİNKLERİ", "33")) encoded = urllib.parse.quote(target) print( f" • VirusTotal:\n " f" https://www.virustotal.com/gui/search/{encoded}" ) print(f" • Shodan:\n https://www.shodan.io/search?query={encoded}") print(f" • Censys:\n https://search.censys.io/search?q={encoded}") print( f" • SecurityTrails:\n " f" https://securitytrails.com/domain/{encoded}/dns" ) # Ana Menü def main(): baslik() while True: print("\n" + "=" * 50) print(renk("1.", "32") + " Sosyal Medya Kullanıcı Adı Taraması") print(renk("2.", "32") + " IP & Coğrafi Konum Sorgusu") print(renk("3.", "32") + " Subdomain Tespiti (crt.sh)") print(renk("4.", "32") + " SSL Sertifika & Sanal Host Bilgisi") print(renk("5.", "32") + " Robots.txt & Sitemap Kontrolü") print(renk("6.", "32") + " E-Posta / Telefon OSINT") print(renk("7.", "32") + " Harici Tehdit İstihbarat Bağlantıları") print(renk("8.", "32") + " HEPSİ BİR ARADA (Tam Domain/IP Taraması)") print(renk("0.", "31") + " Çıkış") print("=" * 50) secim = input(renk("Seçiminiz (0-8): ", "36")).strip() if secim == "1": u = input("Kullanıcı Adı: ").strip() if u: username_search(u) elif secim == "2": d = input("Domain veya IP: ").strip() if d: domain_ip_lookup(d) elif secim == "3": d = input("Domain (Örn: example.com): ").strip() if d: subdomain_lookup(d) elif secim == "4": d = input("Domain (Örn: example.com): ").strip() if d: ssl_checker(d) elif secim == "5": d = input("Domain (Örn: example.com): ").strip() if d: robots_sitemap_check(d) elif secim == "6": q = input("E-Posta veya Telefon (+90...): ").strip() if q: email_phone_osint(q) elif secim == "7": t = input("Domain / IP / Hash: ").strip() if t: threat_intel_links(t) elif secim == "8": d = input("Hedef Domain / Hostname: ").strip() if d: domain_ip_lookup(d) subdomain_lookup(d) ssl_checker(d) robots_sitemap_check(d) threat_intel_links(d) elif secim == "0": print(renk("Çıkış yapılıyor...", "31")) break else: print(renk("Geçersiz seçim!", "31")) if __name__ == "__main__": main()