From 166febddc034baab4549465e5032761581dddac8 Mon Sep 17 00:00:00 2001 From: devploit Date: Wed, 4 Feb 2026 19:17:06 +0100 Subject: [PATCH] feat: debugHunter v2.0.0 - Complete rewrite with MV3 support ## Major Changes - Migrated from Manifest V2 to Manifest V3 - Complete rewrite of detection engine with multi-factor analysis - New dark UI with GitHub-inspired theme ## New Features - Severity classification (Critical/High/Medium/Low) - Response diff viewer for params and headers - Search and filter findings - Smart rate limiting with exponential backoff - Dynamic content filtering (timestamps, CSRF tokens, sessions) - 4 detection modes: Smart, Aggressive, Conservative, Keywords-only - HEAD requests optimization for path checking - Domain baseline caching to reduce requests ## Detection Coverage - 25+ debug parameters - 7 sensitive headers - 46 sensitive paths (up from 17) ## Other - Added test environment for verifying extension functionality - Updated icons with FontAwesome bug design - Comprehensive README with full documentation Co-Authored-By: Claude Opus 4.5 --- .gitignore | 13 + README.md | 215 +++++-- background.js | 965 ++++++++++++++++++++++++++++++++ debugHunter.js | 553 ------------------ images/banner.png | Bin 83965 -> 0 bytes images/icon.png | Bin 40208 -> 2227 bytes images/icon.svg | 9 + images/icon128.png | Bin 0 -> 7688 bytes images/icon16.png | Bin 0 -> 663 bytes images/icon32.png | Bin 0 -> 1444 bytes images/icon48.png | Bin 0 -> 2139 bytes manifest.json | 30 +- options.html | 654 +++++++++++++++++++--- options.js | 344 +++++++++--- popup.html | 779 +++++++++++++++++++++++--- popup.js | 519 +++++++++++++---- similarity.js | 33 ++ test/.env | 25 + test/config.json | 30 + test/debug | 35 ++ test/index.html | 241 ++++++++ test/phpinfo.php | 22 + test/start-server-macos.command | 41 ++ test/start-server.sh | 35 ++ 24 files changed, 3571 insertions(+), 972 deletions(-) create mode 100644 .gitignore create mode 100644 background.js delete mode 100755 debugHunter.js delete mode 100755 images/banner.png create mode 100644 images/icon.svg create mode 100644 images/icon128.png create mode 100644 images/icon16.png create mode 100644 images/icon32.png create mode 100644 images/icon48.png create mode 100644 similarity.js create mode 100644 test/.env create mode 100644 test/config.json create mode 100644 test/debug create mode 100644 test/index.html create mode 100644 test/phpinfo.php create mode 100755 test/start-server-macos.command create mode 100755 test/start-server.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f441c96 --- /dev/null +++ b/.gitignore @@ -0,0 +1,13 @@ +# macOS +.DS_Store + +# IDE +.idea/ +.vscode/ +*.swp +*.swo + +# Logs +*.log + +# Note: test/ folder is included in the repo for testing the extension functionality diff --git a/README.md b/README.md index 6b45a36..10c2e02 100755 --- a/README.md +++ b/README.md @@ -1,64 +1,201 @@ -# debugHunter - Chrome Extension +# debugHunter

- + debugHunter

-[![contributions welcome](https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat)](https://github.com/devploit/debugHunter/issues/) +

Discover Hidden Debug Endpoints & Development Environments

-Discover hidden debugging parameters and uncover web application secrets with debugHunter. This Chrome extension scans websites for debugging parameters and notifies you when it finds a URL with modified responses. The extension utilizes a binary search algorithm to efficiently determine the parameter responsible for the change in the response. +

+ Release + License + Contributions Welcome +

+ +

+ The essential Chrome extension for bug bounty hunters and penetration testers
+ Passively detect debug parameters, sensitive headers, and exposed paths while you browse. +

+ +--- + +## Why debugHunter? + +Finding debug endpoints and exposed configuration files is a common technique in bug bounty hunting. **debugHunter** automates this process by passively scanning every website you visit, alerting you when it discovers: + +- πŸ”§ **Debug Parameters** β€” `?debug=1`, `?env=dev`, `?XDEBUG_SESSION_START=phpstorm` +- πŸ“¨ **Sensitive Headers** β€” `X-Forwarded-Host: localhost`, `X-Original-URL: /admin` +- πŸ“ **Exposed Paths** β€” `/.env`, `/.git/config`, `/actuator/env`, `/phpinfo.php` + +All findings are classified by severity so you can focus on critical issues first. ## Features -- Compare responses with and without query parameters to identify changes. -- Compare responses with and without custom headers to identify changes. -- Check for sensitive paths. -- Avoid dynamic URLs and it's false positives. -- Avoid soft 404 URLs. -- Track and display the number of modified URLs in the browser action badge. -- Allow the user to view and clear the list of found URLs. +| Feature | Description | +|---------|-------------| +| **Multi-Factor Detection** | Combines status codes, content analysis, headers, and debug indicators | +| **Severity Classification** | Critical, High, Medium, Low β€” prioritize what matters | +| **Smart Rate Limiting** | Exponential backoff prevents WAF blocks | +| **Response Diff Viewer** | Compare original vs modified responses side-by-side | +| **Search & Filter** | Find specific domains or keywords across all findings | +| **Configurable Modes** | Smart, Aggressive, Conservative, Keywords-only | +| **Low False Positives** | Dynamic content filtering removes timestamps, tokens, sessions | + +## Detection Coverage + +
+Debug Parameters (25+) + +``` +?debug=1 ?_debug=true ?debug_mode=1 +?XDEBUG_SESSION_START ?XDEBUG_SESSION=1 ?debugbar=1 +?profiler=1 ?trace=1 ?verbose=1 +?show_errors=1 ?display_errors=1 ?dev_mode=1 +?phpinfo=1 ?error_reporting=E_ALL ?env=dev +?env=staging ?env=pre ?env=sandbox +?environment=dev ?staging=1 ?beta=1 +?internal=1 ?test=1 ?admin=1 +``` +
+ +
+Sensitive Headers (7) + +``` +X-Debug: 1 +X-Forwarded-Host: localhost +X-Forwarded-For: 127.0.0.1 +X-Original-URL: /admin +X-Env: dev +Env: pre +Env: dev +``` +
+ +
+Sensitive Paths (46) + +**Critical** +``` +/.env /.git/config /config.json +/.env.local /.env.production /credentials.json +/auth.json /secrets.json /database.yml +/wp-config.php.bak /.aws/credentials /backup.sql +/dump.sql /.htpasswd /actuator/env +/actuator/heapdump +``` + +**High** +``` +/.git/HEAD /.git/logs/HEAD /.svn/entries +/phpinfo.php /info.php /graphiql +/__debug__ /debug /server-status +/elmah.axd /trace.axd /rails/info/properties +/package.json /composer.json +``` + +**Medium** +``` +/swagger-ui.html /swagger.json /api-docs +/openapi.json /robots.txt /.well-known/security.txt +/web.config /.htaccess /Dockerfile +/docker-compose.yml +``` +
## Installation -### Option 1: Clone the repository +### Option 1: Clone Repository + +```bash +git clone https://github.com/devploit/debugHunter.git +``` -1. Download or clone this repository to your local machine. -2. Open Google Chrome, and go to `chrome://extensions/`. -3. Enable "Developer mode" in the top right corner if it's not already enabled. -4. Click the "Load unpacked" button on the top left corner. -5. Navigate to the directory where you downloaded or cloned the repository, and select the folder. -6. The debugHunter extension should now be installed and ready to use. +1. Open `chrome://extensions/` +2. Enable **Developer mode** (top right) +3. Click **Load unpacked** +4. Select the `debugHunter` folder +5. Pin the extension to your toolbar -### Option 2: Download the release (.zip) +### Option 2: Download Release -1. Download the latest release `.zip` file from the "Releases" section of this repository. -2. Extract the contents of the `.zip` file to a folder on your local machine. -3. Open Google Chrome, and go to `chrome://extensions/`. -4. Enable "Developer mode" in the top right corner if it's not already enabled. -5. Click the "Load unpacked" button on the top left corner. -6. Navigate to the directory where you extracted the `.zip` file, and select the folder. -7. The debugHunter extension should now be installed and ready to use. +1. Download the latest `.zip` from [Releases](https://github.com/devploit/debugHunter/releases) +2. Extract and load via `chrome://extensions/` β†’ **Load unpacked** ## Usage -It is recommended to pin the extension to the toolbar to check if a new modified URL by debug parameter is found. -1. Navigate to any website. -2. Click on the debugHunter extension icon in the Chrome toolbar. -3. If the extension detects any URLs with modified responses due to debugging parameters, they will be listed in the popup. -4. Click on any URL in the list to open it in a new tab. -5. To clear the list, click on the trash can icon in the top right corner of the popup. +1. **Browse normally** β€” debugHunter scans passively in the background +2. **Check the badge** β€” Number indicates findings count (color = severity) +3. **Click the icon** β€” View findings by category: Paths, Headers, Parameters +4. **Review & verify** β€” Click any finding to open in new tab + +## Configuration + +Access settings via the **gear icon** in the popup: + +| Setting | Default | Description | +|---------|---------|-------------| +| Detection Mode | Smart | Smart / Aggressive / Conservative / Keywords-only | +| Similarity Threshold | 0.90 | How similar responses must be to ignore | +| Min Length Diff | 200 | Minimum bytes difference to flag | +| Check Interval | 8 hours | Re-check interval for same URL | +| Base Delay | 300ms | Delay between requests (auto-adjusts) | +| Whitelist | Empty | Domains to skip | -## Options/Customization +## Testing -To modify the similarity threshold using the options page of the extension, follow these steps: -1. Click on the debugHunter extension icon in the Chrome toolbar. -2. Click on the gear icon in the top right corner of the popup to open the options page. -3. In the options page, use the slider to set the similarity threshold to the desired value (default 0.95). +A test environment is included to verify the extension works correctly: + +```bash +cd test/ +./start-server-macos.command # macOS (opens browser automatically) +./start-server.sh # Linux/other +``` + +This starts a local server on port 9000 with fake sensitive files and debug endpoints. + +## Technical Details + +- **Manifest V3** β€” Chrome MV3 compliant +- **Permissions** β€” `storage`, `tabs`, `` +- **Background** β€” Service Worker (event-driven) +- **Privacy** β€” All analysis happens locally, no external requests + +## Changelog + +### v2.0.0 +- Complete rewrite with Manifest V3 +- Multi-factor detection engine +- Severity classification system +- Response diff viewer +- Search and filter functionality +- Smart rate limiting with exponential backoff +- Dynamic content filtering +- 4 configurable detection modes +- New dark UI +- 46 sensitive paths (up from 17) +- Optimized requests with HEAD checks and caching + +### v1.x +- Initial release with basic parameter detection ## Contributing -We welcome contributions! Please feel free to submit pull requests or open issues to improve debugHunter. +- **Report bugs** β€” Open an issue with reproduction steps +- **Add patterns** β€” Submit PRs with new parameters, headers, or paths +- **Improve docs** β€” Help make the README clearer ## License -This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details. +MIT License. See [LICENSE](LICENSE) for details. + +## Disclaimer + +This tool is for authorized security testing only. Always obtain proper authorization before testing web applications you do not own. + +--- + +

+ debugHunter β€” Exposing what should stay hidden
+ Made with β™₯ for the bug bounty community +

diff --git a/background.js b/background.js new file mode 100644 index 0000000..e27da57 --- /dev/null +++ b/background.js @@ -0,0 +1,965 @@ +/** + * debugHunter v2.0.0 - Background Service Worker + * Multi-factor detection with configurable comparison strategies + */ + +import { stringSimilarity } from './similarity.js'; + +// ============================================================================ +// DETECTION PATTERNS +// ============================================================================ + +const debugParams = { + high: [ + { key: "_debug", value: "1" }, + { key: "debug", value: "1" }, + { key: "debug", value: "true" }, + { key: "debug_mode", value: "1" }, + { key: "XDEBUG_SESSION_START", value: "phpstorm" }, + { key: "XDEBUG_SESSION", value: "1" }, + { key: "debugbar", value: "1" }, + { key: "profiler", value: "1" }, + { key: "trace", value: "1" }, + { key: "verbose", value: "1" }, + { key: "show_errors", value: "1" }, + { key: "display_errors", value: "1" }, + { key: "dev_mode", value: "1" }, + { key: "phpinfo", value: "1" }, + { key: "error_reporting", value: "E_ALL" }, + ], + medium: [ + { key: "env", value: "dev" }, + { key: "env", value: "staging" }, + { key: "env", value: "pre" }, + { key: "env", value: "sandbox" }, + { key: "environment", value: "dev" }, + { key: "staging", value: "1" }, + { key: "beta", value: "1" }, + { key: "internal", value: "1" }, + { key: "test", value: "1" }, + { key: "admin", value: "1" }, + ] +}; + +const customHeaders = [ + { key: "X-Debug", value: "1" }, + { key: "X-Forwarded-Host", value: "localhost" }, + { key: "X-Forwarded-For", value: "127.0.0.1" }, + { key: "X-Original-URL", value: "/admin" }, + { key: "X-Env", value: "dev" }, + { key: "Env", value: "pre" }, + { key: "Env", value: "dev" }, +]; + +// Sensitive paths organized by priority (critical first, checked with HEAD before GET) +const sensitivePaths = { + // Critical - secrets, credentials (always check these) + critical: [ + "/.env", + "/.git/config", + "/config.json", + "/.env.local", + "/.env.production", + "/.env.development", + "/credentials.json", + "/auth.json", + "/secrets.json", + "/database.yml", + "/wp-config.php.bak", + "/wp-config.php.old", + "/.aws/credentials", + "/backup.sql", + "/dump.sql", + "/.htpasswd", + "/actuator/env", + "/actuator/heapdump", + ], + // High - debug endpoints, source code + high: [ + "/.git/HEAD", + "/.git/logs/HEAD", + "/.svn/entries", + "/phpinfo.php", + "/info.php", + "/graphiql", + "/__debug__", + "/debug", + "/server-status", + "/elmah.axd", + "/trace.axd", + "/rails/info/properties", + "/package.json", + "/composer.json", + ], + // Medium - documentation, configs + medium: [ + "/swagger-ui.html", + "/swagger.json", + "/api-docs", + "/openapi.json", + "/web.config", + "/.htaccess", + "/Dockerfile", + "/docker-compose.yml", + ], +}; + +// Default patterns to filter dynamic content +const DEFAULT_DYNAMIC_PATTERNS = [ + /\b\d{10,13}\b/g, // Unix timestamps + /\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/g, // ISO dates + /[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}/gi, // UUIDs + /csrf[_-]?token["']?\s*[:=]\s*["']?[^"'\s]+/gi, + /nonce["']?\s*[:=]\s*["']?[^"'\s]+/gi, + /_token["']?\s*[:=]\s*["']?[^"'\s]+/gi, + /session[_-]?id["']?\s*[:=]\s*["']?[^"'\s]+/gi, + /PHPSESSID=[^;\s]+/gi, + /JSESSIONID=[^;\s]+/gi, + /\?v=\d+/g, + /\?_=\d+/g, + /data-request-id="[^"]+"/g, + /data-nonce="[^"]+"/g, +]; + +// Soft 404 indicators +const soft404Indicators = [ + "404", "not found", "page not found", "no encontrado", + "doesn't exist", "does not exist", "cannot be found", + "error 404", "oops", "sorry, we couldn't find" +]; + +// Debug indicators for content validation +const debugIndicators = { + critical: [ + /DB_PASSWORD\s*[=:]\s*['"]?[^'"}\s]+/i, + /API_KEY\s*[=:]\s*['"]?[a-zA-Z0-9_-]{20,}/i, + /SECRET_KEY\s*[=:]\s*['"]?[^'"}\s]+/i, + /AWS_SECRET_ACCESS_KEY/i, + /-----BEGIN (RSA |DSA |EC )?PRIVATE KEY-----/, + /password\s*[=:]\s*['"]?[^'"}\s]{4,}/i, + /mysql:\/\/[^:]+:[^@]+@/i, + /postgres:\/\/[^:]+:[^@]+@/i, + /mongodb(\+srv)?:\/\/[^:]+:[^@]+@/i, + ], + high: [ + /stack\s*trace/i, + /Traceback \(most recent call last\)/, + /at [A-Za-z0-9_$]+\.[A-Za-z0-9_$]+\([^)]*:\d+\)/, + /Fatal error:/i, + /Parse error:/i, + /java\.lang\.\w+Exception/, + /xdebug/i, + /debugbar/i, + /\[core\]\s*\n\s*repositoryformatversion/i, + ], + medium: [ + /PHP\/\d+\.\d+/, + /Apache\/\d+\.\d+/, + /nginx\/\d+\.\d+/, + /\/home\/[a-z]+\//i, + /\/var\/www\//i, + /debug\s*[=:]\s*true/i, + ], + low: [ + /Warning:/i, + /Notice:/i, + /Deprecated:/i, + ] +}; + +// Response headers that indicate debug mode +const debugHeaders = [ + 'x-debug', 'x-debug-token', 'x-debug-link', + 'x-debugbar', 'x-powered-by', 'server', + 'x-aspnet-version', 'x-aspnetmvc-version' +]; + +// ============================================================================ +// SETTINGS +// ============================================================================ + +async function getSettings() { + const result = await chrome.storage.sync.get([ + 'detectionMode', + 'requireDebugIndicators', + 'detectStatusChanges', + 'detectHeaderChanges', + 'filterDynamicContent', + 'similarityThreshold', + 'minLengthDiff', + 'checkInterval', + 'dynamicPatterns', + 'baseDelay', + 'maxConcurrent', + 'whitelist' + ]); + + return { + detectionMode: result.detectionMode || 'smart', + requireDebugIndicators: result.requireDebugIndicators !== false, + detectStatusChanges: result.detectStatusChanges !== false, + detectHeaderChanges: result.detectHeaderChanges !== false, + filterDynamicContent: result.filterDynamicContent !== false, + similarityThreshold: result.similarityThreshold || 0.90, + minLengthDiff: result.minLengthDiff || 200, + checkInterval: (result.checkInterval || 480) * 60 * 1000, + dynamicPatterns: result.dynamicPatterns || [], + baseDelay: result.baseDelay || 300, + maxConcurrent: parseInt(result.maxConcurrent) || 3, + whitelist: result.whitelist || [] + }; +} + +// ============================================================================ +// RATE LIMITING +// ============================================================================ + +const rateLimitState = new Map(); + +async function rateLimitedFetch(url, options = {}) { + const settings = await getSettings(); + const domain = new URL(url).hostname; + + if (!rateLimitState.has(domain)) { + rateLimitState.set(domain, { delay: settings.baseDelay, lastRequest: 0 }); + } + + const state = rateLimitState.get(domain); + const now = Date.now(); + const timeSince = now - state.lastRequest; + + if (timeSince < state.delay) { + await new Promise(r => setTimeout(r, state.delay - timeSince)); + } + + state.lastRequest = Date.now(); + + try { + const response = await fetch(url, { ...options, signal: AbortSignal.timeout(15000) }); + + if ([429, 503, 502].includes(response.status)) { + state.delay = Math.min(state.delay * 2, 10000); + const retryAfter = response.headers.get('Retry-After'); + if (retryAfter) { + await new Promise(r => setTimeout(r, parseInt(retryAfter) * 1000)); + } + throw new Error(`Rate limited: ${response.status}`); + } + + // Recover delay on success + state.delay = Math.max(state.delay * 0.9, settings.baseDelay); + return response; + } catch (error) { + if (error.name === 'TimeoutError') { + state.delay = Math.min(state.delay * 1.5, 10000); + } + throw error; + } +} + +// ============================================================================ +// CONTENT FILTERING & COMPARISON +// ============================================================================ + +function filterDynamicContent(text, customPatterns = []) { + let filtered = text; + + // Apply default patterns + for (const pattern of DEFAULT_DYNAMIC_PATTERNS) { + filtered = filtered.replace(pattern, '[DYNAMIC]'); + } + + // Apply custom patterns + for (const patternStr of customPatterns) { + try { + const pattern = new RegExp(patternStr, 'gi'); + filtered = filtered.replace(pattern, '[CUSTOM_DYNAMIC]'); + } catch (e) { + // Invalid regex, skip + } + } + + return filtered; +} + +function containsDebugIndicators(text) { + for (const level of ['critical', 'high', 'medium', 'low']) { + for (const pattern of debugIndicators[level]) { + if (pattern.test(text)) { + return { found: true, level }; + } + } + } + return { found: false, level: null }; +} + +function extractInterestingHeaders(response) { + const found = {}; + for (const header of debugHeaders) { + const value = response.headers.get(header); + if (value) { + found[header] = value; + } + } + return found; +} + +function compareHeaders(original, modified) { + const changes = []; + + // Check for new headers in modified response + for (const [key, value] of Object.entries(modified)) { + if (!original[key]) { + changes.push({ type: 'added', header: key, value }); + } else if (original[key] !== value) { + changes.push({ type: 'changed', header: key, from: original[key], to: value }); + } + } + + return changes; +} + +// ============================================================================ +// MULTI-FACTOR COMPARISON +// ============================================================================ + +async function analyzeResponseDifference(originalResponse, modifiedResponse, originalText, modifiedText, settings) { + const result = { + isDifferent: false, + confidence: 0, + reasons: [], + severity: 'low', + debugIndicators: null, + headerChanges: [], + }; + + // 1. Status code change detection + if (settings.detectStatusChanges && originalResponse.status !== modifiedResponse.status) { + result.reasons.push(`Status changed: ${originalResponse.status} β†’ ${modifiedResponse.status}`); + result.confidence += 30; + + // Special cases + if (originalResponse.status === 403 && modifiedResponse.status === 200) { + result.confidence += 40; // Bypass! + result.severity = 'critical'; + } else if (modifiedResponse.status >= 500) { + result.confidence += 20; // Server error triggered + result.severity = 'high'; + } + } + + // 2. Header changes + if (settings.detectHeaderChanges) { + const originalHeaders = extractInterestingHeaders(originalResponse); + const modifiedHeaders = extractInterestingHeaders(modifiedResponse); + result.headerChanges = compareHeaders(originalHeaders, modifiedHeaders); + + if (result.headerChanges.length > 0) { + result.reasons.push(`Header changes detected: ${result.headerChanges.length}`); + result.confidence += 15 * result.headerChanges.length; + } + } + + // 3. Content length difference + const lengthDiff = Math.abs(modifiedText.length - originalText.length); + if (lengthDiff >= settings.minLengthDiff) { + result.reasons.push(`Content length diff: ${lengthDiff} bytes`); + result.confidence += Math.min(lengthDiff / 100, 25); + } + + // 4. Debug indicator detection + const debugCheck = containsDebugIndicators(modifiedText); + if (debugCheck.found) { + result.debugIndicators = debugCheck; + result.reasons.push(`Debug indicators found: ${debugCheck.level}`); + result.confidence += debugCheck.level === 'critical' ? 50 : debugCheck.level === 'high' ? 35 : 20; + + if (debugCheck.level === 'critical') result.severity = 'critical'; + else if (debugCheck.level === 'high' && result.severity !== 'critical') result.severity = 'high'; + else if (debugCheck.level === 'medium' && !['critical', 'high'].includes(result.severity)) result.severity = 'medium'; + } + + // 5. Similarity check (after filtering dynamic content) + let originalFiltered = originalText; + let modifiedFiltered = modifiedText; + + if (settings.filterDynamicContent) { + originalFiltered = filterDynamicContent(originalText, settings.dynamicPatterns); + modifiedFiltered = filterDynamicContent(modifiedText, settings.dynamicPatterns); + } + + const similarity = stringSimilarity.compareTwoStrings(originalFiltered, modifiedFiltered); + if (similarity < settings.similarityThreshold) { + result.reasons.push(`Similarity: ${(similarity * 100).toFixed(1)}%`); + result.confidence += (1 - similarity) * 30; + } + + // Determine if response is different based on mode + switch (settings.detectionMode) { + case 'aggressive': + // Any signal counts + result.isDifferent = result.confidence >= 15; + break; + + case 'conservative': + // Needs debug indicators AND other signals + result.isDifferent = result.confidence >= 50 && debugCheck.found; + break; + + case 'keywords-only': + // Only debug indicators matter + result.isDifferent = debugCheck.found; + break; + + case 'smart': + default: + // Multi-factor: needs significant confidence + // If debug indicators found, lower threshold + if (settings.requireDebugIndicators) { + result.isDifferent = result.confidence >= 40 && debugCheck.found; + } else { + result.isDifferent = result.confidence >= 50; + } + break; + } + + return result; +} + +// ============================================================================ +// STORAGE +// ============================================================================ + +async function getFindings() { + const result = await chrome.storage.local.get(['findings']); + return result.findings || { params: [], headers: [], paths: [] }; +} + +async function saveFindings(findings) { + await chrome.storage.local.set({ findings }); + updateBadge(findings); +} + +async function addFinding(type, data) { + const findings = await getFindings(); + + const exists = findings[type].some(f => { + if (type === 'params') return f.url === data.url; + if (type === 'headers') return f.url === data.url && f.header === data.header; + return f.path === data.path; + }); + + if (!exists) { + findings[type].push({ ...data, timestamp: Date.now() }); + findings[type].sort((a, b) => { + const scores = { critical: 4, high: 3, medium: 2, low: 1 }; + return (scores[b.severity] || 0) - (scores[a.severity] || 0); + }); + await saveFindings(findings); + + const colors = { critical: '#e74c3c', high: '#e67e22', medium: '#f1c40f', low: '#3498db' }; + console.log(`%c[debugHunter] [${data.severity?.toUpperCase()}] ${type}: ${data.url || data.path}`, + `background: ${colors[data.severity] || '#27ae60'}; color: white; padding: 2px 6px; border-radius: 3px`); + } +} + +async function removeFinding(type, identifier) { + const findings = await getFindings(); + findings[type] = findings[type].filter(f => { + if (type === 'params') return f.url !== identifier; + if (type === 'headers') return `${f.url}|${f.header}` !== identifier; + return f.path !== identifier; + }); + await saveFindings(findings); +} + +async function clearFindings(type = null) { + if (type) { + const findings = await getFindings(); + findings[type] = []; + await saveFindings(findings); + } else { + await saveFindings({ params: [], headers: [], paths: [] }); + } +} + +function updateBadge(findings) { + const total = findings.params.length + findings.headers.length + findings.paths.length; + const all = [...findings.params, ...findings.headers, ...findings.paths]; + const hasCritical = all.some(f => f.severity === 'critical'); + const hasHigh = all.some(f => f.severity === 'high'); + + let color = '#3498db'; + if (hasCritical) color = '#e74c3c'; + else if (hasHigh) color = '#e67e22'; + + chrome.action.setBadgeText({ text: total > 0 ? total.toString() : '' }); + chrome.action.setBadgeBackgroundColor({ color }); +} + +// ============================================================================ +// SCAN STATUS +// ============================================================================ + +let scanStatus = { active: false, domain: '' }; + +function updateScanStatus(status) { + scanStatus = { ...scanStatus, ...status }; + try { chrome.runtime.sendMessage({ action: 'scanStatus', status: scanStatus }); } catch (e) {} +} + +// ============================================================================ +// URL VALIDATION +// ============================================================================ + +async function shouldScanUrl(url) { + if (url.startsWith('chrome://') || url.startsWith('chrome-extension://') || + url.startsWith('about:') || url.startsWith('file://')) { + return false; + } + + const settings = await getSettings(); + const { hostname } = new URL(url); + + // Check whitelist + for (const pattern of settings.whitelist) { + const parts = pattern.split('.').reverse(); + const hostParts = hostname.split('.').reverse(); + let match = true; + for (let i = 0; i < parts.length && match; i++) { + if (parts[i] !== '*' && parts[i] !== hostParts[i]) match = false; + } + if (match) return false; + } + + // Check interval + const result = await chrome.storage.local.get(['checkedUrls']); + const checked = result.checkedUrls || {}; + const lastChecked = checked[url]; + + if (lastChecked && (Date.now() - lastChecked < settings.checkInterval)) { + return false; + } + + checked[url] = Date.now(); + await chrome.storage.local.set({ checkedUrls: checked }); + return true; +} + +function isSoft404(text) { + const lower = text.toLowerCase(); + return soft404Indicators.some(i => lower.includes(i.toLowerCase())); +} + +function truncateForStorage(text, max = 5000) { + return text.length <= max ? text : text.substring(0, max) + '\n... [truncated]'; +} + +// ============================================================================ +// BASELINE CACHE FOR PARAMS/HEADERS (avoid duplicate requests) +// ============================================================================ + +const urlBaselineCache = new Map(); + +async function getUrlBaseline(url) { + if (urlBaselineCache.has(url)) { + const cached = urlBaselineCache.get(url); + if (Date.now() - cached.timestamp < 60000) { // 1 min cache + return cached; + } + } + + try { + const response = await rateLimitedFetch(url); + const text = await response.text(); + + const cached = { + response: { + status: response.status, + headers: Object.fromEntries([...response.headers.entries()]), + }, + text, + timestamp: Date.now(), + }; + + // Mock response object for analysis + cached.mockResponse = { + status: cached.response.status, + headers: { get: (key) => cached.response.headers[key.toLowerCase()] }, + }; + + urlBaselineCache.set(url, cached); + return cached; + } catch (e) { + return null; + } +} + +// ============================================================================ +// PARAMETER CHECKING (uses cached baseline) +// ============================================================================ + +function appendParam(url, param) { + const u = new URL(url); + u.searchParams.set(param.key, param.value); + return u.href; +} + +async function checkParams(url, baseline = null) { + const settings = await getSettings(); + const allParams = [...debugParams.high, ...debugParams.medium]; + + try { + // Use provided baseline or fetch new one + if (!baseline) { + baseline = await getUrlBaseline(url); + } + if (!baseline) return; + + // Check high-confidence params first + const sortedParams = [ + ...debugParams.high.map(p => ({ ...p, confidence: 'high' })), + ...debugParams.medium.map(p => ({ ...p, confidence: 'medium' })), + ]; + + for (const param of sortedParams) { + const modifiedUrl = appendParam(url, param); + + try { + const modifiedResponse = await rateLimitedFetch(modifiedUrl); + const modifiedText = await modifiedResponse.text(); + + const analysis = await analyzeResponseDifference( + baseline.mockResponse, modifiedResponse, + baseline.text, modifiedText, + settings + ); + + if (analysis.isDifferent) { + await addFinding('params', { + url: modifiedUrl, + baseUrl: url, + param: `${param.key}=${param.value}`, + confidence: param.confidence, + severity: analysis.severity, + reasons: analysis.reasons, + originalResponse: truncateForStorage(baseline.text), + modifiedResponse: truncateForStorage(modifiedText), + }); + } + } catch (e) { + // Skip this param on error + } + } + } catch (error) { + console.error(`[debugHunter] Params check failed: ${error.message}`); + } +} + +// ============================================================================ +// HEADER CHECKING (uses cached baseline) +// ============================================================================ + +async function checkHeaders(url, baseline = null) { + const settings = await getSettings(); + + try { + // Use provided baseline or fetch new one + if (!baseline) { + baseline = await getUrlBaseline(url); + } + if (!baseline) return; + + for (const header of customHeaders) { + try { + const headers = new Headers(); + headers.set(header.key, header.value); + + const modifiedResponse = await rateLimitedFetch(url, { headers }); + const modifiedText = await modifiedResponse.text(); + + const analysis = await analyzeResponseDifference( + baseline.mockResponse, modifiedResponse, + baseline.text, modifiedText, + settings + ); + + if (analysis.isDifferent) { + await addFinding('headers', { + url, + header: `${header.key}: ${header.value}`, + severity: analysis.severity, + reasons: analysis.reasons, + originalResponse: truncateForStorage(baseline.text), + modifiedResponse: truncateForStorage(modifiedText), + }); + } + } catch (e) { + // Skip this header on error + } + } + } catch (error) { + console.error(`[debugHunter] Headers check failed: ${error.message}`); + } +} + +// ============================================================================ +// PATH CHECKING (Optimized with HEAD requests + domain caching) +// ============================================================================ + +// Cache for domain baselines and soft-404 fingerprints +const domainCache = new Map(); + +async function getDomainBaseline(baseUrl) { + if (domainCache.has(baseUrl)) { + const cached = domainCache.get(baseUrl); + if (Date.now() - cached.timestamp < 300000) { // 5 min cache + return cached; + } + } + + try { + // Get baseline response + const baseResponse = await rateLimitedFetch(baseUrl); + const baseText = await baseResponse.text(); + + // Get soft-404 fingerprint (request a random non-existent path) + const randomPath = `/${Math.random().toString(36).substring(7)}-${Date.now()}`; + let soft404Fingerprint = null; + let soft404Length = 0; + + try { + const soft404Response = await rateLimitedFetch(baseUrl + randomPath); + const soft404Text = await soft404Response.text(); + soft404Length = soft404Text.length; + // Create a fingerprint based on content structure, not exact content + soft404Fingerprint = { + status: soft404Response.status, + length: soft404Text.length, + hasTitle: //i.test(soft404Text), + isSoft404: isSoft404(soft404Text), + }; + } catch (e) { + // Couldn't get soft-404, that's fine + } + + const cached = { + baseText, + baseLength: baseText.length, + soft404Fingerprint, + soft404Length, + timestamp: Date.now(), + }; + + domainCache.set(baseUrl, cached); + return cached; + } catch (e) { + return null; + } +} + +function matchesSoft404(response, text, fingerprint) { + if (!fingerprint) return false; + + // If it returned the same status as our random 404 probe + if (fingerprint.status === response.status && fingerprint.status !== 200) { + return true; + } + + // If content length is very similar to soft-404 (within 10%) + const lengthDiff = Math.abs(text.length - fingerprint.length); + if (lengthDiff < fingerprint.length * 0.1 && fingerprint.isSoft404) { + return true; + } + + return false; +} + +async function checkPathWithHead(baseUrl, path, settings) { + const testUrl = baseUrl + path; + + try { + // First, try HEAD request to check existence (saves bandwidth) + const headResponse = await rateLimitedFetch(testUrl, { method: 'HEAD' }); + + // Only proceed if status indicates potential content + if (headResponse.status === 200 || headResponse.status === 403) { + const contentLength = parseInt(headResponse.headers.get('content-length') || '0'); + + // Skip if too small (likely empty or error) + if (contentLength > 0 && contentLength < 30) return null; + + // Now do full GET to analyze content + const response = await rateLimitedFetch(testUrl); + if (response.status === 200) { + return { response, url: testUrl }; + } + } + } catch (e) { + // Try direct GET if HEAD fails (some servers don't support HEAD) + try { + const response = await rateLimitedFetch(testUrl); + if (response.status === 200) { + return { response, url: testUrl }; + } + } catch (e2) { + // Skip this path + } + } + + return null; +} + +async function checkPaths(url) { + const settings = await getSettings(); + + try { + const urlObj = new URL(url); + const baseUrl = `${urlObj.protocol}//${urlObj.hostname}`; + + // Get cached domain baseline + const baseline = await getDomainBaseline(baseUrl); + if (!baseline) return; + + // Flatten paths with severity, checking critical first + const allPaths = [ + ...sensitivePaths.critical.map(p => ({ path: p, severity: 'critical' })), + ...sensitivePaths.high.map(p => ({ path: p, severity: 'high' })), + ...sensitivePaths.medium.map(p => ({ path: p, severity: 'medium' })), + ]; + + // Check paths in batches to reduce concurrent requests + const batchSize = 3; + for (let i = 0; i < allPaths.length; i += batchSize) { + const batch = allPaths.slice(i, i + batchSize); + + const results = await Promise.all( + batch.map(({ path, severity }) => + checkPathWithHead(baseUrl, path, settings).then(result => + result ? { ...result, severity, path } : null + ) + ) + ); + + for (const result of results.filter(Boolean)) { + try { + const pathText = await result.response.text(); + + // Skip if matches soft-404 fingerprint + if (matchesSoft404(result.response, pathText, baseline.soft404Fingerprint)) { + continue; + } + + // Skip common soft-404 indicators + if (isSoft404(pathText)) continue; + if (pathText.length < 50) continue; + + // Check for debug indicators (upgrades severity if found) + const debugCheck = containsDebugIndicators(pathText); + const severity = debugCheck.found ? debugCheck.level : result.severity; + + // Path exists and is not soft-404 - report it! + // No diff comparison needed since these are different paths + await addFinding('paths', { + path: result.url, + severity, + contentLength: pathText.length, + hasDebugInfo: debugCheck.found, + modifiedResponse: truncateForStorage(pathText), + }); + } catch (e) { + // Skip on error + } + } + } + } catch (error) { + console.error(`[debugHunter] Paths check failed: ${error.message}`); + } +} + +// ============================================================================ +// MAIN SCANNER +// ============================================================================ + +async function scanUrl(url) { + if (!await shouldScanUrl(url)) return; + + const domain = new URL(url).hostname; + updateScanStatus({ active: true, domain }); + + console.log(`%c[debugHunter] Scanning: ${url}`, 'background: #9b59b6; color: white; padding: 2px 6px; border-radius: 3px'); + + const settings = await getSettings(); + + // Get baseline once for params and headers (saves 1 request) + const baseline = await getUrlBaseline(url); + + // Run checks based on maxConcurrent setting + if (settings.maxConcurrent >= 3) { + await Promise.all([ + checkParams(url, baseline), + checkHeaders(url, baseline), + checkPaths(url) // Paths uses domain baseline, not URL baseline + ]); + } else { + await checkParams(url, baseline); + await checkHeaders(url, baseline); + await checkPaths(url); + } + + updateScanStatus({ active: false, domain: '' }); +} + +// ============================================================================ +// EVENT LISTENERS +// ============================================================================ + +chrome.tabs.onUpdated.addListener(async (tabId, changeInfo, tab) => { + if (changeInfo.status === 'complete' && tab.url) { + try { + const url = new URL(tab.url); + url.hash = ''; + await scanUrl(url.toString()); + } catch (e) {} + } +}); + +chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { + (async () => { + switch (message.action) { + case 'getFindings': + sendResponse(await getFindings()); + break; + case 'removeFinding': + await removeFinding(message.type, message.identifier); + sendResponse(await getFindings()); + break; + case 'clearFindings': + await clearFindings(message.type); + sendResponse(await getFindings()); + break; + case 'clearAll': + await clearFindings(); + sendResponse(await getFindings()); + break; + case 'getScanStatus': + sendResponse(scanStatus); + break; + default: + sendResponse({ error: 'Unknown action' }); + } + })(); + return true; +}); + +chrome.runtime.onInstalled.addListener(async () => { + const findings = await getFindings(); + updateBadge(findings); +}); + +chrome.runtime.onStartup.addListener(async () => { + const findings = await getFindings(); + updateBadge(findings); +}); + +console.log('[debugHunter] Service worker v2.0.0 - Multi-factor detection'); diff --git a/debugHunter.js b/debugHunter.js deleted file mode 100755 index e6d7a54..0000000 --- a/debugHunter.js +++ /dev/null @@ -1,553 +0,0 @@ -/* -QUERY PARAMS -*/ - -// List of query params to be tested -const queryParams = [ - { key: "_debug", value: "1" }, - { key: "admin", value: "1" }, - { key: "analysis", value: "1" }, - { key: "beta", value: "1" }, - { key: "console", value: "1" }, - { key: "debug", value: "1" }, - { key: "debug_flag", value: "1" }, - { key: "debug_mode", value: "1" }, - { key: "debug_output", value: "1" }, - { key: "debug_status", value: "1" }, - { key: "debuginfo", value: "1" }, - { key: "debuglevel", value: "1" }, - { key: "dev", value: "1" }, - { key: "dev_mode", value: "1" }, - { key: "development", value: "1" }, - { key: "diagnostic", value: "1" }, - { key: "env", value: "pre" }, - { key: "error_reporting", value: "1" }, - { key: "experiment", value: "1" }, - { key: "internal", value: "1" }, - { key: "log", value: "1" }, - { key: "mode", value: "debug" }, - { key: "monitoring", value: "1" }, - { key: "performance", value: "1" }, - { key: "profiler", value: "1" }, - { key: "qa", value: "1" }, - { key: "sandbox", value: "1" }, - { key: "show_errors", value: "1" }, - { key: "staging", value: "1" }, - { key: "test", value: "1" }, - { key: "test_mode", value: "1" }, - { key: "testing", value: "1" }, - { key: "trace", value: "1" }, - { key: "validate", value: "1" }, - { key: "verbose", value: "1" }, -]; - -// Store modified URLs -const modifiedUrls = new Set(); - -// Function to append a specific query parameter to a URL -function appendQueryParam(url, param) { - const urlObj = new URL(url); - urlObj.searchParams.set(param.key, param.value); - return urlObj.href; -} - - -// Function to add a Query Params URL -function addModifiedUrl(url) { - if (!modifiedUrls.add(url)) { - modifiedUrls.add(url); - incrementCount(); - - // Log for debugging - console.log("addModifiedUrl: added url " + url + " to modified URLs"); - } -} - -// Function to get Query Params URLs -function getModifiedUrls() { - return Array.from(modifiedUrls); -} - -// Function to remove a specific found sensitive path -function removeModifiedUrl(url) { - modifiedUrls.delete(url); - incrementCount(); - - // Log for debugging - console.log("removeModifiedUrl: removed url " + path + " from modified URLs"); -} - -// Function to clear Query Params URLs -function clearModifiedUrls() { - modifiedUrls.clear(); - chrome.browserAction.setBadgeText({ text: '' }); // Clear the badge text - - // Log for debugging - console.log("clearModifiedUrls: cleared list of modified URLs"); -} - -// Function to fetch URL and compare responses with and without each parameter -async function checkUrlWithParameters(url) { - try { - const originalResponse = await fetch(url); - const originalText = await originalResponse.text(); - - // Check all parameters combined - const combinedUrl = queryParams.reduce((currentUrl, param) => { - return appendQueryParam(currentUrl, param); - }, url); - - // Add delay between requests - await new Promise(resolve => setTimeout(resolve, 1000)); - - const combinedResponse = await fetch(combinedUrl); - const combinedText = await combinedResponse.text(); - - if (await isDifferentResponse(originalText, combinedText)) { - // Check each parameter individually - for (const param of queryParams) { - const modifiedUrl = appendQueryParam(url, param); - - const modifiedResponse = await fetch(modifiedUrl); - const modifiedText = await modifiedResponse.text(); - - if (await isDifferentResponse(originalText, modifiedText)) { - console.log('%cParam query found: ' + modifiedUrl, 'background-color: green; color: white'); - addModifiedUrl(modifiedUrl); - break; - } - } - } - } catch (error) { - console.error(`Failed to fetch ${url}: ${error}`); - } -} - -// Expose functions to popup -window.getModifiedUrls = getModifiedUrls; -window.clearModifiedUrls = clearModifiedUrls; - -/* -CUSTOM HEADERS -*/ - -// List of custom headers to be tested -const customHeaders = [ - { key: "Env", value: "pre" }, - { key: "X-Forwarded-For", value: "127.0.0.1" } -]; - -const foundCustomHeaders = new Set(); - -// Function add custom header -function addCustomHeader(url, headerToAdd) { - if (!headerToAdd || !headerToAdd.key || !headerToAdd.value) { - console.error("Invalid header:", headerToAdd); - return; - } - let headerString = url + " - " + headerToAdd.key + ": " + headerToAdd.value; - foundCustomHeaders.add(headerString); - incrementCount(); - - console.log("addCustomHeader: added header " + headerToAdd.key + ": " + headerToAdd.value + " to found custom headers"); -} - -// Function to get the list of found custom headers -function getCustomHeaders() { - return foundCustomHeaders; -} - -// Function to remove a custom header from the set of found headers -function removeCustomHeader(headerToRemove) { - // Remove the header directly, no need to loop through all headers - if(foundCustomHeaders.has(headerToRemove)) { - foundCustomHeaders.delete(headerToRemove); - incrementCount(); - - // Log for debugging - console.log("removeCustomHeader: removed header " + headerToRemove + " from found custom headers"); - } -} - -// Function to clear the list of found custom headers -function clearCustomHeaders() { - foundCustomHeaders.clear(); - chrome.browserAction.setBadgeText({ text: '' }); - - // Log for debugging - console.log("clearCustomHeaders: cleared list of found custom headers"); -} - -// Function to probe URL with custom headers -async function probeUrlWithHeaders(url, headers) { - let fetchHeaders = new Headers(); - for(let key in headers) { - fetchHeaders.append(key, headers[key]); - } - - let response; - try { - response = await fetch(url, { headers: fetchHeaders }); - } catch (err) { - console.error(`Error fetching ${url}: ${err.message}`); - return null; - } - return response.text(); -} - -// Function to test URL with each custom header -async function probeHeaders(url) { - const initialContent = await probeUrlWithHeaders(url, {}); - - if (initialContent === null) return; - - let headers = {}; - customHeaders.forEach(header => { - headers[header.key] = header.value; - }); - - const allHeadersContent = await probeUrlWithHeaders(url, headers); - - if (allHeadersContent === null) return; - - if (await isDifferentResponse(initialContent, allHeadersContent)) { - for (let i = 0; i < customHeaders.length; i++) { - let singleHeader = {}; - singleHeader[customHeaders[i].key] = customHeaders[i].value; - - const singleHeaderContent = await probeUrlWithHeaders(url, singleHeader); - - if (singleHeaderContent === null) continue; - - if (await isDifferentResponse(initialContent, singleHeaderContent)) { - console.log('%cCustom header found in ' + url + ': ' + customHeaders[i].key + ": " + customHeaders[i].value, 'background-color: green; color: white'); - addCustomHeader(url, customHeaders[i]); - break; - } - } - } -} - -// Expose function to popup -window.getCustomHeaders = getCustomHeaders; -window.removeCustomHeader = removeCustomHeader; -window.clearCustomHeaders = clearCustomHeaders; - -/* -SENSITIVE PATHS -*/ - -// List of sensitive paths to be tested -const sensitivePaths = [ - "/.git/config", - "/.env", "/auth.json", - "/config.json", - "/bitbucket-pipelines.yml" -]; - -// Store found sensitive paths -const foundSensitivePaths = new Set(); - -// Function to add a found sensitive path -function addFoundSensitivePath(url) { - if (!foundSensitivePaths.has(url)) { - foundSensitivePaths.add(url); - incrementCount(); - - // Log for debugging - console.log("addFoundSensitivePath: added path " + url + " to found sensitive paths"); - } -} - -// Function to get found sensitive paths -function getFoundSensitivePaths() { - return Array.from(foundSensitivePaths); -} - -// Function to remove a specific found sensitive path -function removeSensitivePath(path) { - foundSensitivePaths.delete(path); - incrementCount(); - - // Log for debugging - console.log("getFoundSensitivePaths: returning list of found sensitive paths"); -} - -// Function to clear found sensitive paths -function clearFoundSensitivePaths() { - foundSensitivePaths.clear(); - chrome.browserAction.setBadgeText({ text: '' }); // Clear the badge text - - // Log for debugging - console.log("clearFoundSensitivePaths: cleared list of found sensitive paths"); -} - -// Function to check sensitive paths for a domain -async function checkSensitivePaths(url) { - const urlObj = new URL(url); - const domain = urlObj.protocol + '//' + urlObj.hostname; - - let originalResponse = await fetch(domain); - let originalText = await originalResponse.text(); - - for (let path of sensitivePaths) { - let urlToCheck = domain + path; - - let response = await fetch(urlToCheck); - - if (response.status === 200) { - let pathText = await response.text(); - - // Check if the original response contains "soft 404" keywords - let isSoft404 = [ - "no encontrado", - "error 404", - "pΓ‘gina no existe", - "no se pudo encontrar", - "not found", - "failed to connect to", - ].some(keyword => pathText.toLowerCase().includes(keyword.toLowerCase())); - - if(await isDifferentResponse(originalText, pathText)) { - if (isSoft404) { - console.log('%cThe server responded with a status of 200, but it might be a "soft 404": ' + domain, 'background-color: yellow; color: black'); - } else { - console.log('%cThe server responded with a status of 200: ' + response.url, 'background-color: green; color: white'); - addFoundSensitivePath(urlToCheck); - } - } - } - } -} - -// Expose functions to popup -window.getFoundSensitivePaths = getFoundSensitivePaths; -window.removeSensitivePath = removeSensitivePath; -window.clearFoundSensitivePaths = clearFoundSensitivePaths; - -/* -GLOBAL FUNCTIONS -*/ - -// Counter for the number of modified URLs and sensitive paths -let countModifiedUrls = 0; -let countSensitivePaths = 0; - -// Function to increment the counter and update the badge text -function incrementCount() { - countModifiedUrls = modifiedUrls.size; - countCustomHeaders = foundCustomHeaders.size; - countSensitivePaths = foundSensitivePaths.size; - - const totalCount = countModifiedUrls + countCustomHeaders + countSensitivePaths; - chrome.browserAction.setBadgeText({ text: totalCount.toString() }); - chrome.browserAction.setBadgeBackgroundColor({ color: 'red' }); - - // Log for debugging - console.log("incrementCount: total count is now " + totalCount); -} - -// Check if a hostname matches a pattern -function matchesPattern(pattern, hostname) { - const patternParts = pattern.split('.').reverse(); - const hostnameParts = hostname.split('.').reverse(); - - // Check if the pattern is longer than the hostname. If so, it's not a match. - if (patternParts.length > hostnameParts.length) { - return false; - } - - // Check each part of the pattern against the hostname. - for (let i = 0; i < patternParts.length; i++) { - if (patternParts[i] === '*') { - return true; // Wildcard matches all remaining hostname parts. - } - if (patternParts[i] !== hostnameParts[i]) { - return false; // Mismatch. - } - } - - return true; -} - -// Check if a URL is in the whitelist -async function isInWhitelist(url) { - const urlObj = new URL(url); - const { hostname } = urlObj; - - let storedSettings; - try { - storedSettings = await new Promise((resolve, reject) => { - chrome.storage.sync.get('whitelist', (result) => { - if (chrome.runtime.lastError) { - reject(chrome.runtime.lastError); - } else { - resolve(result); - } - }); - }); - } catch (err) { - console.error(err); - } - - const whitelist = storedSettings.whitelist || []; - - for (let i = 0; i < whitelist.length; i++) { - const pattern = whitelist[i]; - if (matchesPattern(pattern, hostname)) { - return true; - } - } - - return false; -} - -// Check if URL is valid -async function isValidURL(url) { - if (url.startsWith('chrome://')) { - console.log("%cisValidUrl: skipping unsupported URL: " + url, 'background-color: yellow; color: black'); - return false; - } - - let storedSettings; - try { - storedSettings = await new Promise((resolve, reject) => { - chrome.storage.sync.get('checkInterval', (result) => { - if (chrome.runtime.lastError) { - reject(chrome.runtime.lastError); - } else { - resolve(result); - } - }); - }); - } catch (err) { - console.error(err); - } - const check_interval = storedSettings.checkInterval * 60 * 1000 || 300 * 60 * 1000; - console.log("isValidUrl: checking interval of " + storedSettings.checkInterval + " minutes"); - - // Check when was the last time this URL was checked - const lastChecked = localStorage.getItem(url); - const now = Date.now(); - - if (lastChecked !== null && (now - lastChecked < check_interval)) { - console.log("%cisValidUrl: skipping recently checked URL: " + url, 'background-color: yellow; color: black'); - return true; - } - - console.log("isValidUrl: url not analyzed in the lasts " + storedSettings.checkInterval + " minutes"); - localStorage.setItem(url, now.toString()); - - return false; -} - -// Check if URL is dynamic -async function isDynamicContent(url) { - console.log("isDynamicContent: checking if " + url + " is dynamic..."); - const checks = 4; - let lastLength = null; - let lastText = null; - let totalDifference = 0; - - for (let i = 0; i < checks; i++) { - let response = await fetch(url); - let text = await response.text(); - - let currentLength = text.length; - - if (lastLength !== null) { - totalDifference += Math.abs(currentLength - lastLength); - } - - if (lastLength && totalDifference > 150) { - console.log("%cisDynamicContent: skipping dynamic url: " + url + ". Total difference is " + totalDifference, 'background-color: yellow; color: black'); - - return true; - } else if (lastText && await isDifferentResponseDynamic(lastText, text)) { - console.log("%cisDynamicContent: skipping dynamic url: " + url + ". The similarity is under the threshold", 'background-color: yellow; color: black'); - - return true; - } else { - console.log("isDynamicContent: not dynamic url: " + url + ". Total difference is " + totalDifference); - } - - lastLength = currentLength; - lastText = text; - - // Add delay between checks - await new Promise(resolve => setTimeout(resolve, 1000)); - } - - return false; -} - -// Function to check if two responses are meaningfully different -async function isDifferentResponseDynamic(originalText, modifiedText) { - // Calculate the similarity between the two responses - const similarity = stringSimilarity.compareTwoStrings(originalText, modifiedText); - - const similarityThreshold = 0.97; - console.log("isDifferentResponseDynamic: similarityThreshold is " + similarityThreshold + " and similarity is " + similarity); - - // Return true if the similarity is below the threshold - return similarity < similarityThreshold; -} - -// Function to check if two responses are meaningfully different -async function isDifferentResponse(originalText, modifiedText) { - // Calculate the similarity between the two responses - const similarity = stringSimilarity.compareTwoStrings(originalText, modifiedText); - - let storedSettings; - try { - storedSettings = await new Promise((resolve, reject) => { - chrome.storage.sync.get('similarityThreshold', (result) => { - if (chrome.runtime.lastError) { - reject(chrome.runtime.lastError); - } else { - resolve(result); - } - }); - }); - } catch (err) { - console.error(err); - } - const similarityThreshold = storedSettings.similarityThreshold || 0.95; - console.log("isDifferentResponse: similarityThreshold is " + similarityThreshold + " and similarity is " + similarity); - - // Return true if the similarity is below the threshold - return similarity < similarityThreshold; -} - -// Update the tabs onUpdated listener to also call checkSensitivePaths -chrome.tabs.onUpdated.addListener(async (tabId, changeInfo, tab) => { - if (changeInfo.status === "complete") { - const url = new URL(tab.url); - url.hash = ''; - const sanitizedUrl = url.toString(); - const isInWhitelistResult = await isInWhitelist(sanitizedUrl); - if (!isInWhitelistResult) { - console.log("%c[+] LAUNCHING DEBUGHUNTERPRO ON " + sanitizedUrl, 'background-color: purple; color: white'); - try { - // Check if valid URL - if (await isValidURL(sanitizedUrl)) { - return; - } else { - // Skip dynamic content - if (await isDynamicContent(sanitizedUrl)) { - return; - } else { - await checkUrlWithParameters(sanitizedUrl, queryParams); - await probeHeaders(sanitizedUrl); - } - await checkSensitivePaths(sanitizedUrl); - } - } catch (error) { - console.error("Error processing URL " + tab.url + ": " + error, "background-color: red; color: white"); - } - } else { - console.log("%cURL whitelisted, not making requests: " + sanitizedUrl, "background-color: yellow; color: black"); - } - } -}); - diff --git a/images/banner.png b/images/banner.png deleted file mode 100755 index f4e46b9fee6637c9520869cd9c5b8a5fb0ca3e1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 83965 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 Grw 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 diff --git a/images/icon.png b/images/icon.png index a0fbcafd5a3e8039a240d77a046c9e85910707db..596f5ca1624e602860d27df9785976837a8a36af 100644 GIT binary patch literal 2227 zcmV;k2u$~hP)<h;3K|Lk000e1NJLTq003YB003YJ1^@s6;+S_h000PRNkl<ZcmeF2 zJ!~9B6vt-|J93ahLy^KXh>uWFr3I>pk`koYN&^Lngm4OIk}4Gx4nj&OLKEAOpo0>n z0@_qG5I#hMixf186i2r4@_w5eYwvD9W_CVy&z|UBc6R2yH~;tl@9gdDB_q}G&*s|R z8yjmoS2orjf48x=^Q+jy&9$BUI2g5xNzFy=SKy)}jmk=ZJ0CrHW$W^j&xGWEl-mC( zQ|el#vUf72UK2aj6~w&7QLC8LT-1IIF5m=i;K-&PBLQw-dieb2$2&I<p2>gD^ZXN; zU|B4ECK*_U8#sb1IGY@<K5G@=_T|U#W+xW^R+;*+Iz{T8VL-SV31@IOGd9)HC;&@p zlxN?_ayvG+mnnW+PEWxd95yAX6+rH3n=GlO;563G035<)ooA&0<A9aApww^8z{;4@ znZOwV#!DuVKSPys$I6)7i9{0u@TI|$nea#_-WY&eI4&nV6oAJj`O>&m9!zcj3}ktB z3$AtMLjgvMi?X3m$Kz>7SKq^tC(1F`#q5Ou#qLd>U5lRdS9k`5>w<HcsSqGvQ1457 z@SoE!j}&(9(g}sFtS>2y_UmsiC~WXWi~(xSp9+xY=g0knJwWogi$c8E>6b(ZF%6b; z$j1<bqaGXTQNEB1&PU@nd4qko!xayykZejO0uaN|G^Pi?Ww;;ZYX7YsCO4WA0=epq zoGYA&$0~*f(FON%3(C(90?iZ%h{LA3txw6pDzXlY5|E!20kShu=CYgw;w(dI-C0G$ z6d^k!0;s{=|9z6LRSA((=XN+QkJuPEBnT23f-Jtohqemfo)r*;#I8w0klz(cjJSvb z#3-kEjv<OWI01%sn`oBQeROyNly<o8<xOVbdtkDs|Fd8M6t52Coy{EVNGnx{g+GV@ zkj~YHQ62Z*qEB9?ao%JP{yJzHb{aFu%`LFNDl4%Iep`Uv1%T{25GEU<Uw+uH3wQ2+ z@Mp8QkPpVXiJEGwi)rhRDga<8kV0u!86+Ws$<<mFU)4vhyEk_gd8@|h0~6S2*O^`s zb>m(7y$fIhf<h^{&KIKY-q=<0BeoYK7sA%f2Np2Zjfd>_E&x}X31AAQa1-B<K41Wg z$sAl5CVn<P-UYA$N#PJ+1K6i8bA!P&r%i39IlT+OQs;ha3IGBi!qnfFA9FIdX+E2p z$~oKG-UVPn7ZD%^D?f+xSlHEcp7Ik+kzan=1gnWbJ~f&6+WG_$01yBMIBgT-YAnbS zVrcWkftkcM`H%xc07T?S{-&7n7&TB!xzA@im;itTI0eu)F^DqpbMZj{(|E8`gQ<TP zzn}sDhyo~t_B<Jw!5$iOZ~-WQLMVv#JQ!HP90O|<0VsrmD2(=y4UAxog)y1{6hvVZ zNPCC|HZaD-7F7TWqreaw8gjcBJ9x0U<meI`T>wDZJc;06We~;{i_xy~vFYOpjQxR4 zj1S-F0{9@G!dXRJu^4UoTn!OibJ)g57r@t52JyPsa=Ym3_?ItiHq*x!Kz?bm0eIAX zy$HaSQ@lnP{|3yKzs`nCD7T<G+~s~>w^6w8A^`7J0FROMs2c(x2p67ft<C}f#udc8 z#`~x}3E-f<j}`AMfRATz2M*>w)LDSJXTYHVANvny0epaP;Gow~AGJFRz$S=)KH>vR zuWVXO&TW@hAQmCDuFeAJ%m{!GZKnN)dThhbc-y}-vZ>9R07{un%hhA%8Q-f9Y|#aX zPwTK}Oahej;rpy~8l@Rs0KO}tR5mA*L>FMly!3H#L>GW%-p7|+oA7;MiY@>|^l_yz zZ<BFhG>wNE>qP(`FR^?Ra%@%r@6dg`#`P^g@tcOh|6%hzZ`2h4`4sBA2w(ZY21Z}` zO!7n%fWj!y1XQ0sU<9iv23Nl*0#Fczxq^)q4^}Y8m@l{h6hc8Uit#xIn8EHdXH~AC z0#E>jR82e&ePE}CkXVBW0B{O01<(8S82ba}U@lW!)Icq!{<eNW1OPC=O~F728zIQS zOyg|*n1}q#McXu<TBym?-^MS9001@x0TB?Q{UL}SJviz<*CV;eS)PYBbDQR-rVt`{ z7r<td1pyFIMS>=cW7T+DA3Ix&IqGsSH{)%&^terJI;QQ|n*bCJ0c`*wkE<7d+8D%6 z$I*u|jxRqOVr_FUj{kJNs`C)9P`nFJ1$?@Xf+>8uzv&!*$i*Ob+Lu0zaeSx8o6hkE zQ<G1qG4BF!6*hsTPzrAH>0=B`U~8Hiaht}wjCmKJ2_ywlXcwRpF@a9N2FAMdO|{j< zwDo%zfFihOYp|>cj6TNN0QEf%MzCu9-~oS=F!*#e?*eEb6hI-|moeQxFGr1E*MKk~ zu#a-39)(Dpa<(%7_pE^JcGu()h=FYpAip0dc}m;LKz?5Y$nLfJC5J!^WcNmyTKF+g z_LR1T0k|KnUSIrK{L=S;kP!K^4fk>jQYy=`J1YH&%7EtlsQ~-x>!`D*$y7Gxyb$30 zmrH-BTz%EdOB(gYfN))KE(r?(<fsnz_O7xqpq(rz1CQWZ&u}Qfg&WWPn`ik4dLSLc zFmNCo!?n(SC;%N7)}Q@Wz8pTMoy<Q2a0|!f%o74Iu(H1NsT{Y&(#J0YTVrk~vd##= z=<4;8t8z>t2nn7(TVqaV(p3t87Xd68+R3^z0Eci{m!Vbw0$4KgrSYD$(<^Hs!REsg zCEUSbQ(U6}1oEYEu)FtS+9$w<p~-W8E}X$#TSTh>B;c`W^^21iNB?E7vZSOhy*m;T zras$n14nQLXH(;qr$z$kNOo^5DY>V;pwz;fvdm=jmVYnD-^7mOZA#Z(K2ocg)Lhhl z6)xZeZs4fw+t&Uc00960KopQ-00006Nkl<Z0|38SRS`X6seS+e002ovPDHLkV1j+f B0J8u9 literal 40208 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 diff --git a/images/icon.svg b/images/icon.svg new file mode 100644 index 0000000..e6c0c69 --- /dev/null +++ b/images/icon.svg @@ -0,0 +1,9 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="48" height="48"> + <!-- Purple background with rounded corners --> + <rect width="48" height="48" rx="10" fill="#a371f7"/> + + <!-- FontAwesome Bug Icon (scaled to fit) --> + <g transform="translate(8, 6) scale(0.0625)" fill="white"> + <path d="M256 0c53 0 96 43 96 96l0 3.6c0 15.7-12.7 28.4-28.4 28.4l-135.1 0c-15.7 0-28.4-12.7-28.4-28.4l0-3.6c0-53 43-96 96-96zM41.4 105.4c12.5-12.5 32.8-12.5 45.3 0l64 64c.7 .7 1.3 1.4 1.9 2.1c14.2-7.3 30.4-11.4 47.5-11.4l112 0c17.1 0 33.2 4.1 47.5 11.4c.6-.7 1.2-1.4 1.9-2.1l64-64c12.5-12.5 32.8-12.5 45.3 0s12.5 32.8 0 45.3l-64 64c-.7 .7-1.4 1.3-2.1 1.9c6.2 12 10.1 25.3 11.1 39.5l64.3 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-64 0c0 24.6-5.5 47.8-15.4 68.6c2.2 1.3 4.2 2.9 6 4.8l64 64c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0l-63.1-63.1c-24.5 21.8-55.8 36.2-90.3 39.6L272 240c0-8.8-7.2-16-16-16s-16 7.2-16 16l0 239.2c-34.5-3.4-65.8-17.8-90.3-39.6L86.6 502.6c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3l64-64c1.9-1.9 3.9-3.4 6-4.8C101.5 367.8 96 344.6 96 320l-64 0c-17.7 0-32-14.3-32-32s14.3-32 32-32l64.3 0c1.1-14.1 5-27.5 11.1-39.5c-.7-.6-1.4-1.2-2.1-1.9l-64-64c-12.5-12.5-12.5-32.8 0-45.3z"/> + </g> +</svg> diff --git a/images/icon128.png b/images/icon128.png new file mode 100644 index 0000000000000000000000000000000000000000..ca44c6f0c9c51670f58d23231d7b1a60e2d4e1c9 GIT binary patch literal 7688 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 C(INr> literal 0 HcmV?d00001 diff --git a/images/icon16.png b/images/icon16.png new file mode 100644 index 0000000000000000000000000000000000000000..d18349713a431f319655dbeb319a33390210a653 GIT binary patch literal 663 zcmV;I0%-k-P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0007BNkl<Zc${sM zziSmi5XV2Wx3}-*jJ_Z-X@sPRm4#8P1TCTv3q}8dfQ@LQm|$UT9a33{rTGU$jDm`l zpr9rZ>>`OEh!MmD%*)H&?XAq-d%>U!d(6%3cYb_lMgZn#+A}V3w~MkI4pagnVxaPB z1(QIiR0=^bA+>fr_xbG9Ts9{UZ*5Iy&1^0&N_<rSiidIsT&5Vv+hCiute?cBxYW|_ zv}a^~diz&ml9u;n05Ot4(Seb1!^z7jA;99}f-lPzX#+ycDpW~g#aDjQ00X`%HLTIJ zeF4_NnJbR{gTjGB5@pq?O#>ieY77Hb-H8$D{0^L+a<qnpm-ll%y(q~B^bNE(0wOSZ z)3NzI@OnO{(J#tN&<sRtvrbrB^bC#~&RusgQex|?nVr4n7#uOIeefhsx_ls-L6nv0 zl{Z>o&g2cp@R-@t1wGI2<*dB*G0PecR#Pi;ICxl?xaw&1*X>jN=jafQoJt~@CoWo! zPFR+n6#V=eA}^-vD7H>}ojQpr>ovB%z5lc+(b3<>sv>c)@hz}0yTj0!;nJN(blrQb zj#Ym3Am_(wMb?stQJtw@)REFm7#&Y`qiXGXd-CY<gtSkhy+?wr+lb^_fn(=Wj$g1W zEtIr|gnT<_WvssQY_5lB)2JVx6}YT!qt)s|2s%diBJloE!Sd5Gw$<tQ3gp{LbikKN za2;APac6c%xhg}^5u^IXzHaTl+v0j!*xBlm*$7o)x}zLIb=Re-BqlX!Ux?sHnr>g* x%bG0xS6kYQ%VZRz*f^{ITj#ya>Yabr`41>L4$?5W1`hxL002ovPDHLkV1jVZLP!7r literal 0 HcmV?d00001 diff --git a/images/icon32.png b/images/icon32.png new file mode 100644 index 0000000000000000000000000000000000000000..e9fadcdbe9b223879415cb797cf405c21e7d4233 GIT binary patch literal 1444 zcmV;V1zY-wP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F8000GRNkl<Zc$~#o zTZmOv82<jX*WTxxnKAFq)YwI9jLN)_Le$WMno2#CLOm7ILqQireOF1JE2*G|h%kGp zpdc_pDry*sh{)1REh8JRqcJ(n%$c(<>yLk}v(M~vW}h=d3H@+5=j^rq@B8m-Z2|z^ z&5B+mvw!PYZz1qsNDMz<IPL<7a7~0+k-q3D>Z^p&>swxJ>rXl9{m0mQ`~yl3Y#-aD zmA_MaT8BvlV-j3TQOZN$`ACvDj!d-o$yeI;2)Ffc|F)5xv)kMETpb%{1{(rYEAP{l z)JCPnN%6CF6c{iBQZw6%G&DN8Ys<clz4Z3BvHJth>u2V~7^8?<hh0|V(2*58+;?RJ zAO+|Gz@~L1n3<JQhKRf{NqV&=><GL7<*1D5kVhdfr<<_iA&q%AD@!<d+ThsdG5#E2 z_=VPy5DvozC0&9s<sBMKy<rmDNKS`*?m~qPTYUtj30oJf^3c6h;m~WLHA4GSr31=x zGW9AZo^MPHYRI|$R|QE|*f8#1?^$vaSJx%6F%T39D<Ag3Npt-gHi(2%xK$%@bqA8j z<yFMy96)IXq4QSdijSO^)>Co?IcFiEIKw>?otnO2<s?_Qbso8Zm1YvwJQIKv<M6u? zuAE_b+8L(2Nh(%cCV{XF%wI(4eIkHK7=8OA3=ig~M(0*}h0(df!`vGMn(*NB0X};p z#Km8X{hl$8Y(!Gx^!L?4#^?~+D6M-gK(WK=&%Rz^=v)jPNZ9K6RHFe>)so|ZV+qdw z<a$bg);$~GhT9d4ab9F2nn^c0Z_APc14j-1IGR|@ycVSc+sm961qr9*aLv;Jy6;r= zgQp<{so26!+&mCDciiBMH(ddVPF`oIJRsSq182yWZ-v$iu7X$~i9*Jk^uN@I9Yzcc z95Yr|FuWFRshSy38FiIBe1&oPo5TXuNXbR#_wN(?vDKa#&$3sZ4_{`BAy~~s=aGvi z-FGPXMY08X*V<~#8>;S9zst!jD<v!whKcmt>sehXyl9+p{)B`ngOO(dDIgqWEZ^i~ z+4`IgZB!1>bWc~0LRZhkhM&KR@%4KV3T^eps3#-12uw$&7`JsIsc3A$Ne0*!ED(+y zjB)8#V^a`S7)#e`ELf~u`%Q60N%su?<_;*oKu98&0>Nu+MLh|jT5M;I7=Rd+5k}`? zWev#7;baTk9&zAQe~dzhkP`f2zVRv-gn*z8D6|twGZoGrcWpQ&c~w`8IDgVuUBM`{ zH;<fZ>PWS>rIP2}q#SN_3O3b|!>L;AGR8%>ab`^003u*~gt2_1#yyYd+8|2jLDrCz zSk~;6WMI{!K9+6N7Nb?&s9bVs$1>YiT(!w};0id=7u&-|?tlVnfvey0?C&dV+fDY0 z&T47r4I0sS^AzYj&qblD$HVH)6Xf516yeAxF=lloSaP3-g-aEpid!2xZ|uQ!qA$VF z1!Ikr2&6{*b%E`AP{K63fG38GCI2wOkB4Hk&mxqE8Q*;z;pic`-@5$=UkdF2lQ!#^ zP59x{*pYAcEk-PcW{=D)-8<XI<f=@0H=+fLlqI=vvU;4R<2HLPWJa)Eug(EUVb>DR zUP7cJ<UndPfWfSZ>9X?lg2Y5zGeph<AGmbdu>{%i*?9l2-4`>!>~v%n$ZweeS#lxv zluss!FDnrD2X6M(XGatZ?laY0KTkwQbS3XOp*NP3xL?JLm%}84A{n*yU0%C%{!2;Q zv;LX9Cn^Z1aI2^GwH=O=XxDY6f+z1KZ0|Jxg|@jlf-M}vC7i;o<ONaQ(XNh_cl$~w yCBNh;rLWOj@q`GbU~8ol;S$c;%jy65dj1d5@X%s78cdS_0000<MNUMnLSTZ0!Mch7 literal 0 HcmV?d00001 diff --git a/images/icon48.png b/images/icon48.png new file mode 100644 index 0000000000000000000000000000000000000000..3e91087a1aa5a1a00ff83fa41e14270f4df73076 GIT binary patch literal 2139 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 RJUajY002ovPDHLkV1jwOE)D<y literal 0 HcmV?d00001 diff --git a/manifest.json b/manifest.json index db3957e..a5f3257 100755 --- a/manifest.json +++ b/manifest.json @@ -1,26 +1,32 @@ { - "manifest_version": 2, + "manifest_version": 3, "name": "debugHunter", - "version": "1.1.1", - "description": "Discover hidden debugging parameters/headers and uncover web application secrets", + "version": "2.0.0", + "description": "Discover hidden debugging parameters, headers, and sensitive paths to access dev/sandbox/pre-production environments", "options_page": "options.html", "icons": { - "48": "images/icon.png" + "16": "images/icon16.png", + "32": "images/icon32.png", + "48": "images/icon48.png", + "128": "images/icon128.png" }, "permissions": [ - "webRequest", - "webRequestBlocking", "storage", - "<all_urls>", "tabs" ], + "host_permissions": [ + "<all_urls>" + ], "background": { - "scripts": ["similarity.min.js", "debugHunter.js"], - "persistent": true + "service_worker": "background.js", + "type": "module" }, - "browser_action": { - "default_icon": "images/icon.png", + "action": { + "default_icon": { + "16": "images/icon16.png", + "32": "images/icon32.png", + "48": "images/icon48.png" + }, "default_popup": "popup.html" } } - diff --git a/options.html b/options.html index bf223ed..52caa63 100755 --- a/options.html +++ b/options.html @@ -1,105 +1,627 @@ <!DOCTYPE html> -<html lang="en"> +<html> <head> <meta charset="UTF-8"> - <meta name="viewport" content="width=device-width, initial-scale=1.0"> - <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@300;400&display=swap" rel="stylesheet"> + <title>debugHunter - Settings + - Options -

Options

- - -

Current value: 0.95

-

The similarity threshold determines the minimum similarity score required for a pair of URLs to be considered the same. The value ranges from 0 to 1, where 0 means that any pair of URLs is considered the same, and 1 means that only identical URLs are considered the same. The closer the value is to 1, the more similar the URLs need to be to be considered the same.

-

Default value is: 0.95

-

- -

Current value: 480

-

Check Interval determines the frequency at which the extension checks for changes on the websites you visit. It is expressed in minutes, with a minimum of 1 minute and a maximum of 5000 minutes. Adjusting the slider will immediately save the new interval to your settings. Note: Lower intervals may impact performance.

-

Default value is: 480 minutes (8 hours)

-

-
    -
    - - -
    +
    + +
    +
    + +
    +
    +

    debugHunter Settings

    +

    Configure detection behavior and reduce false positives

    +
    +
    + + +
    +
    + +

    Detection Strategy

    +
    +
    +
    + + +

    Smart mode combines multiple signals: status code changes, content length, debug keywords, and similarity.

    +
    + +
    + +
    + +
    + + + + +
    +
    +
    +
    + + +
    +
    + +

    Thresholds

    +
    +
    +
    + +
    + + 0.90 +
    +

    How similar two responses must be to be considered "the same". Lower = more aggressive (more FPs). Used as secondary check in Smart mode.

    +
    + +
    + +
    + +
    + + 200 +
    +

    Minimum bytes difference to consider a response "changed". Higher = fewer false positives from minor dynamic content.

    +
    + +
    + +
    + +
    + + 480 +
    +

    How often to re-check the same URL. Default: 480 minutes (8 hours).

    +
    +
    +
    + + +
    +
    + +

    Dynamic Content Filters

    +
    +
    +
    + + +

    Regex patterns for dynamic content to strip before comparing responses. Examples: timestamps, CSRF tokens, nonces.

    +
    + +
    + +

    + Default patterns include: Unix timestamps, ISO dates, UUIDs, CSRF tokens, session IDs, nonces, and common cache busters. + Add custom patterns here if you're seeing false positives from specific dynamic content. +

    +
    +
    +
    + + +
    +
    + +

    Rate Limiting

    +
    +
    +
    + +
    + + 300 +
    +

    Minimum delay between requests to the same domain. Auto-increases on rate limiting.

    +
    + +
    + +
    + + +

    How many different check types can run in parallel (params, headers, paths).

    +
    +
    +
    + + +
    +
    + +

    Whitelist

    +
    +
    +
    + +

    Domains to skip scanning. Supports wildcards (*.example.com).

    +
    +
    +
    + + +
    +
    +
    +
    +
    + + + +
    + diff --git a/options.js b/options.js index 8351d92..57da819 100755 --- a/options.js +++ b/options.js @@ -1,108 +1,268 @@ -document.addEventListener('DOMContentLoaded', () => { - // Get the similarity threshold slider and display elements - const similarityThresholdSlider = document.getElementById('similarityThreshold'); - const similarityThresholdValue = document.getElementById('similarityThresholdValue'); +/** + * debugHunter v2.0.0 - Options Script + * Advanced settings management + */ + +// Default dynamic content patterns to filter before comparison +const DEFAULT_DYNAMIC_PATTERNS = [ + '\\b\\d{10,13}\\b', // Unix timestamps + '\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}', // ISO dates + '[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}', // UUIDs + 'csrf[_-]?token["\']?\\s*[:=]\\s*["\']?[^"\'\\s]+', // CSRF tokens + 'nonce["\']?\\s*[:=]\\s*["\']?[^"\'\\s]+', // Nonces + '_token["\']?\\s*[:=]\\s*["\']?[^"\'\\s]+', // Laravel tokens + 'session[_-]?id["\']?\\s*[:=]\\s*["\']?[^"\'\\s]+', // Session IDs + 'PHPSESSID=[^;\\s]+', // PHP session + 'JSESSIONID=[^;\\s]+', // Java session + 'ASP\\.NET_SessionId=[^;\\s]+', // .NET session + '\\?v=\\d+', // Cache busters + '\\?_=\\d+', // jQuery cache buster + 'data-request-id="[^"]+"', // Request IDs + 'data-nonce="[^"]+"', // Data nonces +]; + +// ============================================================================ +// UTILITY FUNCTIONS +// ============================================================================ - // Function to update the display value - function updateDisplayValue(value, displayElement) { - displayElement.textContent = value; +function showSaved(elementId) { + const el = document.getElementById(elementId); + if (el) { + el.classList.add('show'); + setTimeout(() => el.classList.remove('show'), 2000); + } +} + +function saveOption(key, value, savedIndicatorId = null) { + chrome.storage.sync.set({ [key]: value }, () => { + console.log(`[debugHunter] Saved ${key}:`, value); + if (savedIndicatorId) { + showSaved(savedIndicatorId); } + }); +} - // Load the saved similarity threshold value - chrome.storage.sync.get('similarityThreshold', (data) => { - const value = data.similarityThreshold || 0.95; - similarityThresholdSlider.value = value; - updateDisplayValue(value, similarityThresholdValue); - }); +function loadOptions(callback) { + chrome.storage.sync.get([ + 'detectionMode', + 'requireDebugIndicators', + 'detectStatusChanges', + 'detectHeaderChanges', + 'filterDynamicContent', + 'similarityThreshold', + 'minLengthDiff', + 'checkInterval', + 'dynamicPatterns', + 'baseDelay', + 'maxConcurrent', + 'whitelist' + ], callback); +} - // Save the similarity threshold value when the slider changes - similarityThresholdSlider.addEventListener('input', (e) => { - const value = e.target.value; - updateDisplayValue(value, similarityThresholdValue); - chrome.storage.sync.set({ similarityThreshold: value }, () => { - console.log('Similarity threshold saved:', value); - }); - }); +// ============================================================================ +// RANGE INPUTS +// ============================================================================ - // Get the check interval slider and display elements - const checkIntervalRange = document.getElementById('checkInterval'); - const checkIntervalValue = document.getElementById('checkIntervalValue'); +function setupRangeInput(inputId, valueId, savedId, storageKey, defaultValue, transform = (v) => v) { + const input = document.getElementById(inputId); + const value = document.getElementById(valueId); - // Load the saved check interval value - chrome.storage.sync.get('checkInterval', (data) => { - const value = data.checkInterval || 480; - checkIntervalRange.value = value; - updateDisplayValue(value, checkIntervalValue); - }); + if (!input || !value) return; - // Save the check interval value when the slider changes - checkIntervalRange.addEventListener('input', (e) => { - const value = e.target.value; - updateDisplayValue(value, checkIntervalValue); - chrome.storage.sync.set({ checkInterval: value }, () => { - console.log('Check interval saved:', value); - }); - }); + // Load saved value + chrome.storage.sync.get(storageKey, (data) => { + const val = data[storageKey] !== undefined ? data[storageKey] : defaultValue; + input.value = val; + value.textContent = val; + }); - // Get the whitelist display, form, and input elements - const whitelistDisplay = document.getElementById('whitelistDisplay'); - const addWhitelistForm = document.getElementById('addWhitelistForm'); - const newWhitelistDomain = document.getElementById('newWhitelistDomain'); + // Save on change + input.addEventListener('input', (e) => { + const val = transform(e.target.value); + value.textContent = e.target.value; + saveOption(storageKey, val, savedId); + }); +} - // Load the saved whitelist - chrome.storage.sync.get('whitelist', (data) => { - const whitelist = data.whitelist || []; - displayWhitelist(whitelist); - }); +// ============================================================================ +// CHECKBOXES +// ============================================================================ + +function setupCheckbox(inputId, storageKey, defaultValue = true) { + const input = document.getElementById(inputId); + if (!input) return; - // Display the whitelist - function displayWhitelist(whitelist) { - // Clear the current display - whitelistDisplay.innerHTML = ''; - - // Add each domain to the display - whitelist.forEach(domain => { - const listItem = document.createElement('li'); - listItem.textContent = domain; - const removeButton = document.createElement('button'); - removeButton.textContent = 'Remove'; - removeButton.className = 'remove'; - removeButton.addEventListener('click', () => { - removeDomainFromWhitelist(domain); - }); - listItem.appendChild(removeButton); - whitelistDisplay.appendChild(listItem); - }); + // Load saved value + chrome.storage.sync.get(storageKey, (data) => { + input.checked = data[storageKey] !== undefined ? data[storageKey] : defaultValue; + }); + + // Save on change + input.addEventListener('change', (e) => { + saveOption(storageKey, e.target.checked); + }); +} + +// ============================================================================ +// SELECT INPUTS +// ============================================================================ + +function setupSelect(inputId, storageKey, defaultValue) { + const input = document.getElementById(inputId); + if (!input) return; + + // Load saved value + chrome.storage.sync.get(storageKey, (data) => { + input.value = data[storageKey] !== undefined ? data[storageKey] : defaultValue; + }); + + // Save on change + input.addEventListener('change', (e) => { + saveOption(storageKey, e.target.value); + }); +} + +// ============================================================================ +// TEXTAREA (Dynamic Patterns) +// ============================================================================ + +function setupDynamicPatterns() { + const textarea = document.getElementById('dynamicPatterns'); + if (!textarea) return; + + // Load saved patterns + chrome.storage.sync.get('dynamicPatterns', (data) => { + if (data.dynamicPatterns && data.dynamicPatterns.length > 0) { + textarea.value = data.dynamicPatterns.join('\n'); + } else { + textarea.placeholder = DEFAULT_DYNAMIC_PATTERNS.slice(0, 5).join('\n') + '\n...'; } + }); + + // Save on change (debounced) + let timeout; + textarea.addEventListener('input', (e) => { + clearTimeout(timeout); + timeout = setTimeout(() => { + const patterns = e.target.value + .split('\n') + .map(p => p.trim()) + .filter(p => p.length > 0); + saveOption('dynamicPatterns', patterns); + }, 500); + }); +} + +// ============================================================================ +// WHITELIST +// ============================================================================ - // Remove a domain from the whitelist - function removeDomainFromWhitelist(domain) { - chrome.storage.sync.get('whitelist', (data) => { - let whitelist = data.whitelist || []; - whitelist = whitelist.filter(d => d !== domain); - chrome.storage.sync.set({ whitelist: whitelist }, () => { - console.log('Domain removed from whitelist:', domain); - displayWhitelist(whitelist); - }); - }); +function renderWhitelist(whitelist) { + const container = document.getElementById('whitelistItems'); + if (!container) return; + + container.innerHTML = ''; + + if (!whitelist || whitelist.length === 0) { + container.innerHTML = '
    No whitelisted domains
    '; + return; + } + + whitelist.forEach(domain => { + const item = document.createElement('div'); + item.className = 'whitelist-item'; + item.innerHTML = ` + ${domain} + + `; + container.appendChild(item); + }); + + // Add remove handlers + container.querySelectorAll('button').forEach(btn => { + btn.addEventListener('click', () => { + const domain = btn.dataset.domain; + removeFromWhitelist(domain); + }); + }); +} + +function removeFromWhitelist(domain) { + chrome.storage.sync.get('whitelist', (data) => { + let whitelist = data.whitelist || []; + whitelist = whitelist.filter(d => d !== domain); + chrome.storage.sync.set({ whitelist }, () => { + console.log('[debugHunter] Removed from whitelist:', domain); + renderWhitelist(whitelist); + }); + }); +} + +function addToWhitelist(domain) { + if (!domain) return; + + chrome.storage.sync.get('whitelist', (data) => { + let whitelist = data.whitelist || []; + if (!whitelist.includes(domain)) { + whitelist.push(domain); + chrome.storage.sync.set({ whitelist }, () => { + console.log('[debugHunter] Added to whitelist:', domain); + renderWhitelist(whitelist); + }); } + }); +} + +function setupWhitelist() { + // Load initial whitelist + chrome.storage.sync.get('whitelist', (data) => { + renderWhitelist(data.whitelist || []); + }); - // Add a new domain to the whitelist when the form is submitted - addWhitelistForm.addEventListener('submit', (e) => { - e.preventDefault(); - const domain = newWhitelistDomain.value.trim(); - if (domain) { - chrome.storage.sync.get('whitelist', (data) => { - let whitelist = data.whitelist || []; - if (!whitelist.includes(domain)) { - whitelist.push(domain); - chrome.storage.sync.set({ whitelist: whitelist }, () => { - console.log('Domain added to whitelist:', domain); - displayWhitelist(whitelist); - }); - } - }); - newWhitelistDomain.value = ''; - } + // Handle add form + const form = document.getElementById('addWhitelistForm'); + const input = document.getElementById('newWhitelistDomain'); + + if (form && input) { + form.addEventListener('submit', (e) => { + e.preventDefault(); + const domain = input.value.trim().toLowerCase(); + if (domain) { + addToWhitelist(domain); + input.value = ''; + } }); + } +} + +// ============================================================================ +// INITIALIZATION +// ============================================================================ + +document.addEventListener('DOMContentLoaded', () => { + // Detection mode + setupSelect('detectionMode', 'detectionMode', 'smart'); + + // Checkboxes + setupCheckbox('requireDebugIndicators', 'requireDebugIndicators', true); + setupCheckbox('detectStatusChanges', 'detectStatusChanges', true); + setupCheckbox('detectHeaderChanges', 'detectHeaderChanges', true); + setupCheckbox('filterDynamicContent', 'filterDynamicContent', true); + + // Range inputs + setupRangeInput('similarityThreshold', 'similarityValue', 'similaritySaved', 'similarityThreshold', 0.90, parseFloat); + setupRangeInput('minLengthDiff', 'lengthValue', 'lengthSaved', 'minLengthDiff', 200, parseInt); + setupRangeInput('checkInterval', 'intervalValue', 'intervalSaved', 'checkInterval', 480, parseInt); + setupRangeInput('baseDelay', 'delayValue', 'delaySaved', 'baseDelay', 300, parseInt); + + // Select inputs + setupSelect('maxConcurrent', 'maxConcurrent', '3'); + + // Dynamic patterns textarea + setupDynamicPatterns(); + + // Whitelist + setupWhitelist(); + + console.log('[debugHunter] Options page loaded'); }); diff --git a/popup.html b/popup.html index aef50bd..a041754 100755 --- a/popup.html +++ b/popup.html @@ -5,97 +5,700 @@ - -
    - - - - + +
    + +
    + + + +
    -
    -

    Sensitive Paths

    -
      -

      Custom Headers

      -
        -

        Query Params

        -
          - + + +
          +
          + Scanning ... +
          + + + + + +
          + Showing 0 matching findings +
          + + +
          +
          +
          + 0 + Critical +
          +
          +
          + 0 + High +
          +
          +
          + 0 + Medium +
          +
          +
          + 0 + Low +
          +
          + + +
          + +
          +
          + + Sensitive Paths + 0 + +
          +
          +
          + + +
          +
          + + Custom Headers + 0 + +
          +
          +
          + + +
          +
          + + Debug Parameters + 0 + +
          +
          +
          +
          + + + + + - \ No newline at end of file + diff --git a/popup.js b/popup.js index dc870f7..0e0d043 100755 --- a/popup.js +++ b/popup.js @@ -1,156 +1,431 @@ -// QUERY PARAMS +/** + * debugHunter v2.0.0 - Popup Script + * Features: Diff viewer, Severity stats, Scan status + */ -// This function populates the modified URLs list in the popup -function updateModifiedUrlsList() { - const modifiedUrls = chrome.extension.getBackgroundPage().getModifiedUrls(); - const list = document.getElementById("queryParams"); +// ============================================================================ +// MESSAGING +// ============================================================================ - list.innerHTML = ""; +async function sendMessage(action, data = {}) { + return new Promise((resolve) => { + chrome.runtime.sendMessage({ action, ...data }, (response) => { + resolve(response || { params: [], headers: [], paths: [] }); + }); + }); +} + +async function getFindings() { + return await sendMessage('getFindings'); +} + +async function removeFinding(type, identifier) { + return await sendMessage('removeFinding', { type, identifier }); +} + +async function clearFindings(type = null) { + return await sendMessage(type ? 'clearFindings' : 'clearAll', { type }); +} + +async function getScanStatus() { + return await sendMessage('getScanStatus'); +} + +// ============================================================================ +// SEVERITY STATS +// ============================================================================ + +function updateSeverityStats(findings) { + const allFindings = [ + ...(findings.params || []), + ...(findings.headers || []), + ...(findings.paths || []) + ]; + + const counts = { critical: 0, high: 0, medium: 0, low: 0 }; + + allFindings.forEach(f => { + if (f.severity && counts.hasOwnProperty(f.severity)) { + counts[f.severity]++; + } + }); + + document.getElementById('stat-critical').textContent = counts.critical; + document.getElementById('stat-high').textContent = counts.high; + document.getElementById('stat-medium').textContent = counts.medium; + document.getElementById('stat-low').textContent = counts.low; +} + +// ============================================================================ +// SCAN STATUS +// ============================================================================ + +function updateScanStatusUI(status) { + const statusBar = document.getElementById('status-bar'); + const statusDomain = document.getElementById('status-domain'); + + if (status && status.active) { + statusBar.classList.add('active'); + statusDomain.textContent = status.domain || 'unknown'; + } else { + statusBar.classList.remove('active'); + } +} + +// Listen for scan status updates +chrome.runtime.onMessage.addListener((message) => { + if (message.action === 'scanStatus') { + updateScanStatusUI(message.status); + } +}); + +// ============================================================================ +// SEARCH / FILTER +// ============================================================================ - // Iterate over each modified URL - for (const url of modifiedUrls) { - // Create a new list item - const listItem = document.createElement("li"); - listItem.style.position = "relative"; +let currentSearchTerm = ''; - // Create a new anchor tag - const link = document.createElement("a"); - link.href = url; - link.target = "_blank"; +function filterFindings(searchTerm) { + currentSearchTerm = searchTerm.toLowerCase().trim(); + const clearBtn = document.getElementById('search-clear'); + const resultsInfo = document.getElementById('search-results-info'); + const searchCount = document.getElementById('search-count'); - // Trim the displayed URL if it is too long - if (url.length > 60) { - link.textContent = url.substring(0, 57) + "..."; + // Show/hide clear button + clearBtn.classList.toggle('visible', currentSearchTerm.length > 0); + + // Get all finding items + const allItems = document.querySelectorAll('.finding-item'); + let visibleCount = 0; + + allItems.forEach(item => { + if (!currentSearchTerm) { + item.classList.remove('hidden'); + visibleCount++; } else { - link.textContent = url; + // Search in URL, path, header, param, and other data attributes + const url = item.querySelector('.finding-url'); + const meta = item.querySelector('.finding-meta'); + const searchText = [ + url?.textContent || '', + url?.title || '', + meta?.textContent || '' + ].join(' ').toLowerCase(); + + const matches = searchText.includes(currentSearchTerm); + item.classList.toggle('hidden', !matches); + if (matches) visibleCount++; } + }); - listItem.appendChild(link); - - // Create the remove icon - const removeIcon = document.createElement('i'); - removeIcon.className = "fa fa-times"; - removeIcon.style.position = "absolute"; - removeIcon.style.right = "10px"; - removeIcon.style.top = "50%"; - removeIcon.style.transform = "translateY(-50%)"; - removeIcon.style.cursor = "pointer"; - removeIcon.onclick = function() { - // Remove the URL from the modified URLs list in the background page - chrome.extension.getBackgroundPage().removeModifiedUrl(url); - updateModifiedUrlsList(); + // Show results info + if (currentSearchTerm) { + resultsInfo.classList.add('visible'); + searchCount.textContent = visibleCount; + } else { + resultsInfo.classList.remove('visible'); + } + + // Update category counts to show filtered counts + ['paths', 'headers', 'params'].forEach(type => { + const list = document.getElementById(`${type}-list`); + if (list) { + const visibleInCategory = list.querySelectorAll('.finding-item:not(.hidden)').length; + const countEl = document.getElementById(`${type}-count`); + if (countEl && currentSearchTerm) { + countEl.textContent = visibleInCategory; + } } - // Add the remove icon to the list item - listItem.appendChild(removeIcon); + }); +} + +function clearSearch() { + const searchInput = document.getElementById('search-input'); + searchInput.value = ''; + filterFindings(''); + updateUI(); // Restore original counts +} - // Add the list item to the list - list.appendChild(listItem); +// ============================================================================ +// DIFF VIEWER +// ============================================================================ + +let currentDiffData = null; + +function showDiffModal(finding, type) { + const modal = document.getElementById('diff-modal'); + const title = document.getElementById('modal-title'); + const originalContent = document.getElementById('diff-original'); + const modifiedContent = document.getElementById('diff-modified'); + + currentDiffData = finding; + + // Set title based on type + if (type === 'paths') { + title.textContent = `Content: ${finding.path}`; + } else if (type === 'headers') { + title.textContent = `Diff: ${finding.header}`; + } else { + title.textContent = `Diff: ${finding.param}`; + } + + // Set content (paths don't have originalResponse since they're different URLs) + if (type === 'paths') { + originalContent.textContent = '(Sensitive path found - no comparison needed)'; + modifiedContent.textContent = finding.modifiedResponse || 'No response stored'; + } else { + originalContent.textContent = finding.originalResponse || 'No original response stored'; + modifiedContent.textContent = finding.modifiedResponse || 'No modified response stored'; } + + modal.classList.add('active'); } -// Call updateModifiedUrlsList when the popup is loaded -document.addEventListener("DOMContentLoaded", updateModifiedUrlsList); +function hideDiffModal() { + const modal = document.getElementById('diff-modal'); + modal.classList.remove('active'); + currentDiffData = null; +} -// CUSTOM HEADERS -function updateCustomHeadersList() { - const foundCustomHeaders = chrome.extension.getBackgroundPage().getCustomHeaders(); - const list = document.getElementById("customHeaders"); +// ============================================================================ +// UI RENDERING +// ============================================================================ - list.innerHTML = ""; +function truncateUrl(url, maxLength = 55) { + if (!url) return ''; + if (url.length <= maxLength) return url; + return url.substring(0, maxLength - 3) + '...'; +} - for (const header of foundCustomHeaders) { - const listItem = document.createElement("li"); - listItem.style.position = "relative"; +function createFindingItem(data, type, identifier) { + const item = document.createElement('div'); + item.className = 'finding-item'; - const textNode = document.createTextNode(header); - listItem.appendChild(textNode); + // Severity bar + const severityBar = document.createElement('div'); + severityBar.className = `finding-severity ${data.severity || 'medium'}`; + item.appendChild(severityBar); - const removeIcon = document.createElement('i'); - removeIcon.className = "fa fa-times"; - removeIcon.style.position = "absolute"; - removeIcon.style.right = "10px"; - removeIcon.style.top = "50%"; - removeIcon.style.transform = "translateY(-50%)"; - removeIcon.style.cursor = "pointer"; - removeIcon.onclick = function() { - // Remove the URL from the modified URLs list in the background page - chrome.extension.getBackgroundPage().removeCustomHeader(header); - updateCustomHeadersList(); - } - // Add the remove icon to the list item - listItem.appendChild(removeIcon); + // Content + const content = document.createElement('div'); + content.className = 'finding-content'; + + // URL link + const urlLink = document.createElement('a'); + urlLink.className = 'finding-url'; + urlLink.target = '_blank'; - // Add the list item to the list - list.appendChild(listItem); + if (type === 'paths') { + urlLink.href = data.path; + urlLink.textContent = truncateUrl(data.path); + urlLink.title = data.path; + } else if (type === 'headers') { + urlLink.href = data.url; + urlLink.textContent = truncateUrl(`${data.url}`); + urlLink.title = `${data.url}\nHeader: ${data.header}`; + } else { + urlLink.href = data.url; + urlLink.textContent = truncateUrl(data.url); + urlLink.title = `${data.url}\nParam: ${data.param}`; } + + content.appendChild(urlLink); + + // Meta info + const meta = document.createElement('div'); + meta.className = 'finding-meta'; + + // Severity tag + if (data.severity) { + const severityTag = document.createElement('span'); + severityTag.className = `finding-tag ${data.severity}`; + severityTag.textContent = data.severity.toUpperCase(); + meta.appendChild(severityTag); + } + + // Additional info + const info = document.createElement('span'); + info.className = 'finding-info'; + + if (type === 'params' && data.param) { + info.textContent = data.param; + } else if (type === 'headers' && data.header) { + info.textContent = data.header; + } else if (type === 'paths' && data.contentLength) { + info.textContent = `${data.contentLength} bytes`; + } + + if (info.textContent) { + meta.appendChild(info); + } + + content.appendChild(meta); + item.appendChild(content); + + // Actions + const actions = document.createElement('div'); + actions.className = 'finding-actions'; + + // View button (diff for params/headers, content for paths) + if (data.originalResponse || data.modifiedResponse) { + const viewBtn = document.createElement('button'); + viewBtn.className = 'action-btn diff'; + viewBtn.title = type === 'paths' ? 'View Content' : 'View Diff'; + viewBtn.innerHTML = type === 'paths' ? '' : ''; + viewBtn.onclick = (e) => { + e.stopPropagation(); + showDiffModal(data, type); + }; + actions.appendChild(viewBtn); + } + + // Remove button + const removeBtn = document.createElement('button'); + removeBtn.className = 'action-btn remove'; + removeBtn.title = 'Remove'; + removeBtn.innerHTML = ''; + removeBtn.onclick = async (e) => { + e.stopPropagation(); + await removeFinding(type, identifier); + updateUI(); + }; + actions.appendChild(removeBtn); + + item.appendChild(actions); + + return item; } -// Call updateCustomHeadersList when the popup is loaded -document.addEventListener("DOMContentLoaded", updateCustomHeadersList); +function updateCount(type, count) { + const countEl = document.getElementById(`${type}-count`); + if (countEl) { + countEl.textContent = count.toString(); + countEl.classList.toggle('has-items', count > 0); + } +} + +function renderList(type, items) { + const list = document.getElementById(`${type}-list`); + if (!list) return; + + list.innerHTML = ''; -// SENSITIVE PATHS -function updateSensitivePaths() { - const urlList = document.getElementById('sensitivePaths'); - while (urlList.firstChild) { - urlList.firstChild.remove(); + if (!items || items.length === 0) { + const empty = document.createElement('div'); + empty.className = 'empty-state'; + empty.innerHTML = 'No findings yet'; + list.appendChild(empty); + return; } - // Get updated found sensitive paths - const paths = chrome.extension.getBackgroundPage().getFoundSensitivePaths(); - - // Iterate over each found sensitive path - for (let path of paths) { - // Create a new list item - const listItem = document.createElement('li'); - listItem.style.position = "relative"; - - // Create a new anchor tag - const anchor = document.createElement('a'); - anchor.href = path; - anchor.target = '_blank'; - anchor.textContent = path; - listItem.appendChild(anchor); - - // Create the remove icon - const removeIcon = document.createElement('i'); - removeIcon.className = "fa fa-times"; - removeIcon.style.position = "absolute"; - removeIcon.style.right = "10px"; - removeIcon.style.top = "50%"; - removeIcon.style.transform = "translateY(-50%)"; - removeIcon.style.cursor = "pointer"; - removeIcon.onclick = function() { - // Remove the path from the found sensitive paths list in the background page - chrome.extension.getBackgroundPage().removeSensitivePath(path); - updateSensitivePaths(); + items.forEach((item) => { + let identifier; + if (type === 'paths') { + identifier = item.path; + } else if (type === 'headers') { + identifier = `${item.url}|${item.header}`; + } else { + identifier = item.url; } - // Add the remove icon to the list item - listItem.appendChild(removeIcon); - // Add the list item to the list - urlList.appendChild(listItem); + const itemEl = createFindingItem(item, type, identifier); + list.appendChild(itemEl); + }); +} + +async function updateUI() { + const findings = await getFindings(); + + renderList('paths', findings.paths || []); + renderList('headers', findings.headers || []); + renderList('params', findings.params || []); + + updateCount('paths', (findings.paths || []).length); + updateCount('headers', (findings.headers || []).length); + updateCount('params', (findings.params || []).length); + + updateSeverityStats(findings); + + // Update scan status + const status = await getScanStatus(); + updateScanStatusUI(status); + + // Reapply search filter if active + if (currentSearchTerm) { + filterFindings(currentSearchTerm); } } -// Call updateSensitivePaths when the popup is loaded -document.addEventListener("DOMContentLoaded", updateSensitivePaths); +// ============================================================================ +// EVENT HANDLERS +// ============================================================================ -// Get the current options from storage -document.getElementById('info-icon').addEventListener('click', () => { - chrome.tabs.create({ url: 'https://github.com/devploit/debugHunterPro' }); -}); +document.addEventListener('DOMContentLoaded', () => { + updateUI(); -// Open the options page when the options link is clicked -document.getElementById('options-link').addEventListener('click', () => { - chrome.runtime.openOptionsPage(); -}); + // Category collapse toggle + document.querySelectorAll('.category-header').forEach((header) => { + header.addEventListener('click', () => { + header.parentElement.classList.toggle('collapsed'); + }); + }); + + // Options link + document.getElementById('options-link').addEventListener('click', (e) => { + e.preventDefault(); + chrome.runtime.openOptionsPage(); + }); + + // GitHub info link + document.getElementById('info-icon').addEventListener('click', (e) => { + e.preventDefault(); + chrome.tabs.create({ url: 'https://github.com/devploit/debugHunter' }); + }); + + // Clear all button + document.getElementById('clear-all').addEventListener('click', async (e) => { + e.preventDefault(); + await clearFindings(); + updateUI(); + }); -// Clear all found sensitive paths, custom headers, and modified URLs -document.getElementById('clear-all').addEventListener('click', () => { - chrome.extension.getBackgroundPage().clearFoundSensitivePaths(); - updateSensitivePaths(); - chrome.extension.getBackgroundPage().clearCustomHeaders(); - updateCustomHeadersList(); - chrome.extension.getBackgroundPage().clearModifiedUrls(); - updateModifiedUrlsList(); + // Modal close button + document.getElementById('modal-close').addEventListener('click', hideDiffModal); + + // Close modal on overlay click + document.getElementById('diff-modal').addEventListener('click', (e) => { + if (e.target.id === 'diff-modal') { + hideDiffModal(); + } + }); + + // Close modal on Escape key + document.addEventListener('keydown', (e) => { + if (e.key === 'Escape') { + hideDiffModal(); + } + }); + + // Search functionality + const searchInput = document.getElementById('search-input'); + const searchClear = document.getElementById('search-clear'); + + searchInput.addEventListener('input', (e) => { + filterFindings(e.target.value); + }); + + searchClear.addEventListener('click', () => { + clearSearch(); + }); + + // Clear search on Escape when focused + searchInput.addEventListener('keydown', (e) => { + if (e.key === 'Escape') { + clearSearch(); + searchInput.blur(); + } + }); }); + +// Refresh UI periodically to catch new findings +setInterval(updateUI, 5000); diff --git a/similarity.js b/similarity.js new file mode 100644 index 0000000..49973e4 --- /dev/null +++ b/similarity.js @@ -0,0 +1,33 @@ +// String similarity comparison +// ES Module wrapper + +function compareTwoStrings(first, second) { + first = first.replace(/\s+/g, ""); + second = second.replace(/\s+/g, ""); + + if (first === second) return 1; + if (first.length < 2 || second.length < 2) return 0; + + let firstBigrams = new Map(); + for (let i = 0; i < first.length - 1; i++) { + const bigram = first.substring(i, i + 2); + const count = firstBigrams.has(bigram) ? firstBigrams.get(bigram) + 1 : 1; + firstBigrams.set(bigram, count); + } + + let intersectionSize = 0; + for (let i = 0; i < second.length - 1; i++) { + const bigram = second.substring(i, i + 2); + const count = firstBigrams.has(bigram) ? firstBigrams.get(bigram) : 0; + if (count > 0) { + firstBigrams.set(bigram, count - 1); + intersectionSize++; + } + } + + return (2.0 * intersectionSize) / (first.length + second.length - 2); +} + +export const stringSimilarity = { + compareTwoStrings +}; diff --git a/test/.env b/test/.env new file mode 100644 index 0000000..008e77f --- /dev/null +++ b/test/.env @@ -0,0 +1,25 @@ +# Environment Configuration - EXPOSED! +APP_ENV=production +APP_DEBUG=true +APP_KEY=base64:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + +DB_CONNECTION=mysql +DB_HOST=127.0.0.1 +DB_PORT=3306 +DB_DATABASE=production_app +DB_USERNAME=root +DB_PASSWORD=super_secret_password_123 + +REDIS_HOST=127.0.0.1 +REDIS_PASSWORD=redis_secret_pass +REDIS_PORT=6379 + +AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE +AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY +AWS_DEFAULT_REGION=us-east-1 +AWS_BUCKET=my-secret-bucket + +STRIPE_KEY=sk_live_1234567890abcdef +STRIPE_SECRET=sk_live_secret_key_here + +JWT_SECRET=my-super-secret-jwt-key-do-not-share diff --git a/test/config.json b/test/config.json new file mode 100644 index 0000000..89d7bc5 --- /dev/null +++ b/test/config.json @@ -0,0 +1,30 @@ +{ + "app": { + "name": "Internal Application", + "version": "2.5.3", + "environment": "production", + "debug": true + }, + "database": { + "host": "db.internal.company.com", + "port": 3306, + "name": "prod_database", + "user": "app_user", + "password": "database_password_123!" + }, + "api": { + "key": "api_key_1234567890abcdef", + "secret": "api_secret_key_do_not_expose", + "endpoint": "https://api.internal.company.com" + }, + "redis": { + "host": "redis.internal.company.com", + "port": 6379, + "password": "redis_pass_123" + }, + "aws": { + "region": "us-east-1", + "access_key": "AKIAIOSFODNN7EXAMPLE", + "secret_key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" + } +} diff --git a/test/debug b/test/debug new file mode 100644 index 0000000..f7d9d96 --- /dev/null +++ b/test/debug @@ -0,0 +1,35 @@ + + +Debug Console + +

          Debug Console - Internal Use Only

          +
          +=== Application Debug Info ===
          +Timestamp: 2024-01-15T10:30:00Z
          +Environment: PRODUCTION (debug=true)
          +Server: app-server-01.internal.com
          +
          +=== Stack Trace ===
          +at Application.initialize (app.js:142)
          +at Bootstrap.run (bootstrap.js:58)
          +at main (index.js:12)
          +
          +=== Database Connection ===
          +Host: db-master.internal.com
          +Database: production_db
          +User: app_user
          +Password: db_password_exposed!
          +
          +=== Session Data ===
          +user_id: 1
          +role: superadmin
          +permissions: ["*"]
          +
          +=== Environment Variables ===
          +NODE_ENV=production
          +SECRET_KEY=super_secret_key_12345
          +API_TOKEN=tok_live_abcdefghijklmnop
          +AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
          +
          + + diff --git a/test/index.html b/test/index.html new file mode 100644 index 0000000..0064940 --- /dev/null +++ b/test/index.html @@ -0,0 +1,241 @@ + + + + + + debugHunter Test Page + + + +
          +

          debugHunter Test Page

          +

          This page simulates debug parameter and header detection

          + +
          +

          Current Request Status

          +
          Normal Mode - No debug parameters detected
          +
          
          +    
          + +
          +

          Detected Parameters

          +
          +
          +
          + +
          +

          Detected Headers

          +
          +
          + +
          +

          Debug Output (only shown when debug is active)

          +
          
          +    
          + +
          +

          Test Links

          +

          + Click these links to test debugHunter detection: +

          + +
          + +
          +

          Sensitive Paths (for path detection)

          +

          + These paths exist on this test server: +

          + +
          +
          + + + + diff --git a/test/phpinfo.php b/test/phpinfo.php new file mode 100644 index 0000000..8c9885c --- /dev/null +++ b/test/phpinfo.php @@ -0,0 +1,22 @@ + + +PHP Info - Debug Page + +

          PHP Version 8.2.0

          + + + + + + + + + + + + + + +
          DirectiveValue
          SystemLinux server.internal.com 5.4.0-150-generic
          Server APIApache 2.0 Handler
          Document Root/var/www/html
          DOCUMENT_ROOT/var/www/html
          User/Groupwww-data(33)/33
          display_errorsOn
          error_reportingE_ALL
          DB_PASSWORDsecret_db_pass_123
          API_KEYsk_live_abcdef1234567890
          + + diff --git a/test/start-server-macos.command b/test/start-server-macos.command new file mode 100755 index 0000000..21e039b --- /dev/null +++ b/test/start-server-macos.command @@ -0,0 +1,41 @@ +#!/bin/bash + +# debugHunter Test Server for macOS +# Usage: ./start-server-macos.command [port] +# Default port: 9000 + +PORT=${1:-9000} +DIR="$(cd "$(dirname "$0")" && pwd)" + +clear +echo "" +echo " ╔══════════════════════════════════════════════════════════╗" +echo " β•‘ πŸ› debugHunter Test Server β•‘" +echo " ╠══════════════════════════════════════════════════════════╣" +echo " β•‘ Server: http://localhost:$PORT β•‘" +echo " β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•" +echo "" +echo " πŸ“‹ Test URLs:" +echo " ─────────────────────────────────────────────────────────" +echo " Main page: http://localhost:$PORT/" +echo " With debug: http://localhost:$PORT/?debug=1" +echo " With env: http://localhost:$PORT/?env=dev" +echo "" +echo " πŸ” Sensitive paths (debugHunter should detect these):" +echo " ─────────────────────────────────────────────────────────" +echo " /.env Credentials, API keys" +echo " /.git/config Git repository info" +echo " /config.json Database passwords" +echo " /phpinfo.php PHP configuration" +echo " /debug Debug console" +echo "" +echo " ⏹ Press Ctrl+C to stop the server" +echo "" + +cd "$DIR" + +# Open browser after short delay +(sleep 2 && open "http://localhost:$PORT") & + +# Start server +python3 -m http.server $PORT diff --git a/test/start-server.sh b/test/start-server.sh new file mode 100755 index 0000000..d83bc52 --- /dev/null +++ b/test/start-server.sh @@ -0,0 +1,35 @@ +#!/bin/bash + +# debugHunter Test Server +# Usage: ./start-server.sh [port] +# Default port: 9000 + +PORT=${1:-9000} +DIR="$(cd "$(dirname "$0")" && pwd)" + +echo "" +echo " ╔══════════════════════════════════════════════════════════╗" +echo " β•‘ debugHunter Test Server β•‘" +echo " ╠══════════════════════════════════════════════════════════╣" +echo " β•‘ Starting server on http://localhost:$PORT β•‘" +echo " β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•" +echo "" +echo " Test URLs:" +echo " ─────────────────────────────────────────────────────────" +echo " Main page: http://localhost:$PORT/" +echo " With debug: http://localhost:$PORT/?debug=1" +echo " With env: http://localhost:$PORT/?env=dev" +echo "" +echo " Sensitive paths (should be detected):" +echo " ─────────────────────────────────────────────────────────" +echo " /.env http://localhost:$PORT/.env" +echo " /.git/config http://localhost:$PORT/.git/config" +echo " /config.json http://localhost:$PORT/config.json" +echo " /phpinfo.php http://localhost:$PORT/phpinfo.php" +echo " /debug http://localhost:$PORT/debug" +echo "" +echo " Press Ctrl+C to stop the server" +echo "" + +cd "$DIR" +python3 -m http.server $PORT