#!/usr/bin/env python3 """ noauth_finder.py — Find unauthenticated web UIs during authorized testing. """ import argparse import concurrent.futures import csv import hashlib import html as html_escape import ipaddress import json import random import re import socket import ssl import sys import threading import time from collections import Counter from datetime import datetime, timezone from pathlib import Path from urllib.parse import urljoin, urlparse try: import requests from requests.packages.urllib3.exceptions import InsecureRequestWarning requests.packages.urllib3.disable_warnings(InsecureRequestWarning) except ImportError: print("[-] Install requests: pip install requests") sys.exit(1) COMMON_WEB_PORTS = [ 80, 443, 8080, 8443, 8888, 9090, 3000, 5000, 8000, 8001, 8081, 8444, 9000, 9001, 9200, 5601, 7070, 7443, 9443, 10000, 1234, 4443, 9999, 8880, 8082, 8083, 8084, 9002, 18080, 18081, 8889, 9091, 7474, 7687, 5432, 3306, 27017, 15672, 15692, 3001, 9092, 9990, 9991, 4848, 8686, 8834, 8333, 8123, ] TOP10_PORTS = [80, 443, 8080, 8443, 8888, 9090, 3000, 5000, 8000, 9000] ADMIN_PATHS = [ "/", "/login", "/admin", "/dashboard", "/panel", "/index.html", "/index.php", "/status", "/api/status", "/api/v1/status", "/api/health", "/health", "/healthz", "/manage", "/manager", "/console", "/admin/status", "/device", "/webui", "/cgi-bin/status", ] CRITICAL_PATHS = [ "/config", "/config.js", "/config.json", "/api/config", "/api", "/api/v1", "/graphql", "/status", "/logs", "/backup", "/backups", "/export", "/api/export", "/api/state", "/api/findings", "/api/creds", "/api/credentials", "/api/tokens", "/api/keys", "/api/endpoints", "/shell", "/cmd", "/api/cmd", "/api/command", "/api/execute", "/api/upload", "/api/files", "/api/query", "/api/exec", "/api/shell", "/terminal", "/proxy", "/api/proxy", "/api/run", "/prometheus", "/metrics", "/api/agent", "/deployment", "/environment", "/secrets", "/.env", "/api/control", "/dump", "/api/dump", "/swagger", "/swagger-ui", "/swagger-ui.html", "/v2/api-docs", "/v3/api-docs", "/openapi.json", "/actuator", "/actuator/env", "/actuator/health", "/actuator/metrics", "/actuator/configprops", "/debug", "/debug/vars", ] SENSITIVE_PATH_HINTS = [ "api/state", "api/control", "api/command", "api/exec", "shell", "cmd", "config", "secrets", "keys", "export", "dump", "api/creds", "api/findings", "terminal", ".env", "actuator/env", "v3/api-docs", "openapi", "graphql", "metrics", ] SECRET_PATTERNS = [ r"AKIA[0-9A-Z]{16}", r"ASIA[0-9A-Z]{16}", r"(?i)aws_secret_access_key", r"(?i)secret[_-]?key", r"(?i)api[_-]?key", r"(?i)access[_-]?token", r"(?i)refresh[_-]?token", r"(?i)bearer\s+[a-z0-9._\-]{20,}", r"(?i)password\s*[:=]", r"(?i)passwd\s*[:=]", r"(?i)private[_-]?key", r"-----BEGIN [A-Z ]*PRIVATE KEY-----", r"(?i)mongodb://", r"(?i)postgres://", r"(?i)mysql://", r"(?i)redis://", r"(?i)jdbc:", r"\b10\.\d{1,3}\.\d{1,3}\.\d{1,3}\b", r"\b192\.168\.\d{1,3}\.\d{1,3}\b", r"\b172\.(1[6-9]|2\d|3[0-1])\.\d{1,3}\.\d{1,3}\b", ] AUTH_STRONG_PATTERNS = [ r"]+type=[\"']?password", r"