JS-Intel Scanner, modern web uygulamalarının kalbi olan JavaScript dosyalarını saniyeler içinde analiz eden, gizli bilgileri gün yüzüne çıkaran bir Reconnaissance (Keşif) ve Vulnerability Scanning aracıdır. Karmaşık kod yığınları arasında manuel olarak kaybolmak yerine, otomatize bir filtreleme sunarak pentest süreçlerindeki en kritik aşamayı (bilgi toplama) hızlandırır.
Ne İşe Yarar?
Bu uygulama, bir web sayfasının arka planında çalışan tüm JS dosyalarını tarayarak şu kritik verileri ayıklar:
- Gizli Endpoint Keşfi: Geliştiricilerin kod içerisinde unuttuğu veya sadece belirli fonksiyonlar tetiklendiğinde çalışan API uç noktalarını (/api/v4/admin, /config/internal vb.) bulur.
- Hassas Veri Tespiti (Secret Finding): Hardcoded (sabit kodlanmış) API anahtarları, AWS token'ları, Firebase yapılandırmaları ve şifre kalıplarını regex algoritmalarıyla yakalar.
- Saldırı Yüzeyi Haritalama: Uygulamanın kullandığı tüm üçüncü taraf kütüphaneleri ve versiyonlarını listeleyerek, bilinen zafiyetlere (CVE) yönelik hızlı bir analiz yapmanı sağlar.
- İş Mantığı Analizi: İstemci tarafında çalışan doğrulama mekanizmalarını ve iş akışlarını çözümleyerek bypass yollarını tespit etmene yardımcı olur.
Nerede Kullanabiliriz?
- Web Pentest Süreçleri: Hedef uygulama hakkında bilgi toplama aşamasında, manuel incelemeden önce tüm "düşük asılı meyveleri" (low-hanging fruits) toplamak için kullanılır.
- Bug Bounty Avcılığı: Diğer avcıların gözünden kaçan gizli parametreleri ve yetkisiz erişim noktalarını bulmak için harika bir yardımcıdır.
- SOC & Defansif Güvenlik (Blue Team): Kurumun dışarıya açık web uygulamalarında yanlışlıkla sızdırılmış hassas bir veri (API key gibi) olup olmadığını düzenli olarak denetlemek için kullanılır.
- CTF Yarışmaları: Özellikle web kategorisindeki "gizli ipucu" veya "gizli sayfa" temalı sorularda saniyeler içinde sonuç verir.
JavaScript Bookmarklet Nasıl Çalışıyor?
Tarayıcıda çalışan bu kod, doğrudan sayfanın DOM (Document Object Model) yapısına müdahale eder:
- Keşif Aşaması: İlk olarak document.getElementsByTagName('script') komutuyla sayfadaki tüm <script>; etiketlerini tarar ve bunların src (kaynak) adreslerini bir liste haline getirir.
- Arayüz Oluşturma: HTML ve CSS kullanarak ekranın sağ üst köşesine dinamik bir panel yerleştirir. Bu panel, senin SOC Team Leader olarak ihtiyaç duyduğun verileri anlık görebilmen için tasarlanmıştır.
- Veri Çekme (Fetch): fetch() fonksiyonu ile her bir JS dosyasının içine girer ve kodun tamamını "metin" (text) olarak indirir.
- Regex Taraması: İndirilen bu metin yığını içinde, önceden tanımladığımız Düzenli İfadeler (Regex) çalıştırılır. Örneğin; AIza... ile başlayan bir dizi gördüğünde bunun bir Google API anahtarı olduğunu anlar.
- Sekme Mantığı: İki farklı fonksiyonu (Dosya Listesi ve Güvenlik Taraması) birbirinden ayırarak, verileri iki ayrı görünümde (Tab) organize eder.
Kullanımı
Öncelikle kullandığımız tarayıcıyı güvensiz modda çalıştırmamız gerekiyor. Bunun sebebi COMP/CSP hatalarını engellemektir. CMD'yi açıyoruz ve aşağıdaki kodu yazıyoruz:
Kod:
"C:\Program Files\Google\Chrome\Application\chrome.exe" --user-data-dir="C:/temp_chrome" --disable-web-security --disable-site-isolation-trials
Chrome açıldıktan hemen sonra CTRL + SHIFT + B yaparak "Bookmark" satırını açıyoruz. Daha sonradan yeni bir "Bookmark" oluşturuyoruz ve "URL" kısmına aşağıdaki kodu yapıştırıyoruz.
JavaScript:
javascript:(async function(){ const styles = 'position:fixed;top:10px;right:10px;width:480px;max-height:85vh;background:#111;color:#4fc1ff;z-index:9999999;border:2px solid #333;padding:0;overflow:hidden;font-family:monospace;font-size:11px;box-shadow:0 0 20px #000;border-radius:8px;display:flex;flex-direction:column;'; let mainPanel = document.getElementById('mega-js-panel-v3'); if(mainPanel) mainPanel.remove(); mainPanel = document.createElement('div'); mainPanel.id = 'mega-js-panel-v3'; mainPanel.style.cssText = styles; mainPanel.innerHTML = %60 <div style="background:#222;padding:10px;display:flex;justify-content:space-between;border-bottom:1px solid #444;"> <div style="display:flex;gap:5px;"> <button id="btn-t1" style="background:#333;color:#fff;border:1px solid #555;padding:4px 8px;cursor:pointer;">Dosyalar</button> <button id="btn-t2" style="background:#333;color:#fff;border:1px solid #555;padding:4px 8px;cursor:pointer;">Güvenlik</button> <button id="btn-t3" style="background:#333;color:#fff;border:1px solid #555;padding:4px 8px;cursor:pointer;">Endpointler</button> </div> <button onclick="this.parentElement.parentElement.remove()" style="background:#f44;color:#fff;border:none;padding:4px 10px;cursor:pointer;">X</button> </div> <div id="c-t1" style="padding:15px;overflow-y:auto;flex-grow:1;"></div> <div id="c-t2" style="padding:15px;overflow-y:auto;flex-grow:1;display:none;background:#050505;"></div> <div id="c-t3" style="padding:15px;overflow-y:auto;flex-grow:1;display:none;background:#050a05;"></div> %60; document.body.appendChild(mainPanel); const tabs = [document.getElementById('c-t1'), document.getElementById('c-t2'), document.getElementById('c-t3')]; const btns = [document.getElementById('btn-t1'), document.getElementById('btn-t2'), document.getElementById('btn-t3')]; const switchTab = (idx) => { tabs.forEach((t, i) => t.style.display = i === idx ? 'block' : 'none'); btns.forEach((b, i) => b.style.background = i === idx ? '#4fc1ff' : '#333'); btns.forEach((b, i) => b.style.color = i === idx ? '#000' : '#fff'); }; btns.forEach((b, i) => b.onclick = () => switchTab(i)); switchTab(0); /* Tanımlamalar */ const SECRETS_REG = { 'Keys': /AIza[0-9A-Za-z-_]{35}|AKIA[0-9A-Z]{16}/g, 'Secrets': /(password|secret|token|api[-_]?key)[\s]*[:=][\s]*["']([\w\.-]{10,})["']/gi }; const ENDPOINT_REG = /(?<=(\"|\'|\%60))\/[a-zA-Z0-9_?&=\/\-\#\.]*(?=(\"|\'|\%60))/g; const scripts = Array.from(document.getElementsByTagName('script')).map(s => s.src).filter(src => src); const endpointsFound = new Set(); /* Fonksiyon: Log Yazma */ const log = (tabIdx, msg, color = "#0f0") => { const d = document.createElement('div'); d.style.color = color; d.style.marginBottom = '4px'; d.innerText = msg; tabs[tabIdx].appendChild(d); }; /* 1. DOSYA LİSTESİ */ scripts.forEach(u => { const a = document.createElement('a'); a.href = u; a.target = '_blank'; a.innerText = u.split('/').pop() || u; a.style.cssText = 'display:block;color:#4fc1ff;margin-bottom:6px;text-decoration:none;border-bottom:1px solid #222;'; tabs[0].appendChild(a); }); /* 2. GÜVENLİK VE 3. ENDPOINT ANALİZİ */ log(1, "[*] Derin Tarama Başlatıldı...", "#fff"); log(2, "[*] Endpoint Keşfi (JS + HTML)...", "#fff"); /* Sayfa HTML'ini tara (Senin kodundaki mantık) */ const pageContent = document.documentElement.outerHTML; const htmlMatches = pageContent.matchAll(ENDPOINT_REG); for (const m of htmlMatches) endpointsFound.add(m[0]); for (let u of scripts) { try { const r = await fetch(u); const t = await r.text(); /* Güvenlik Taraması */ for (let [name, re] of Object.entries(SECRETS_REG)) { const matches = t.match(re); if (matches) { log(1, %60[!] ${name} -> ${u.split('/').pop()}%60, "yellow"); [...new Set(matches)].slice(0, 2).forEach(m => log(1, %60 > ${m.substring(0, 50)}%60, "#aaa")); } } /* Endpoint Taraması (Senin kodundaki fetch mantığı) */ const jsMatches = t.matchAll(ENDPOINT_REG); for (const m of jsMatches) endpointsFound.add(m[0]); } catch(e) { log(1, %60[X] CORS Engeli: ${u.split('/').pop()}%60, "#f44"); } } /* Endpointleri Sekme 3'e Yazdır */ if(endpointsFound.size > 0) { endpointsFound.forEach(e => log(2, e, "#0f0")); } else { log(2, "[-] Hiç endpoint bulunamadı.", "orange"); } log(1, "[+] Analiz Tamamlandı.", "#0f0");})();
Analiz etmek istediğimiz web sitesine gidiyoruz ve oluşturduğumuz bookmark'a tıklıyoruz.
