Spaces:
Paused
Paused
| import argparse | |
| import os | |
| import cowsay | |
| import hashlib | |
| from dotenv import load_dotenv | |
| from rich.console import Console | |
| from components.dns_recon import DNSRecon | |
| from components.geo import geo_ip_recon | |
| from components.port_scanner import NetworkScanner | |
| from components.jwt import JWTAnalyzer | |
| from components.packet_analysis import PacketAnalysis | |
| from components.subdomain import SubEnum | |
| from components.menus import Menus | |
| from components.assets import Assets | |
| from components.passbeaker import PasswordCracker | |
| CURRENT_DIR = os.getcwd() | |
| DEFAULT_OUTPUT_LOC = os.path.join(CURRENT_DIR, 'outputs', 'output.json') | |
| DEFAULT_LIST_LOC = 'lists/default.txt' | |
| DEFAULT_THREADS = 200 | |
| console = Console() | |
| load_dotenv() | |
| dns_enum = DNSRecon() | |
| geo_ip = geo_ip_recon() | |
| packet_analysis = PacketAnalysis() | |
| port_scanner = NetworkScanner() | |
| jwt_analyzer = JWTAnalyzer() | |
| sub_recon = SubEnum() | |
| asset_codes = Assets() | |
| def parse_arguments(): | |
| parser = argparse.ArgumentParser( | |
| description='Python-Nmap and chatGPT integrated Vulnerability scanner') | |
| parser.add_argument('--target', type=str, help='Target IP, hostname, JWT token or pcap file location') | |
| parser.add_argument('--profile', type=int, default=1, help='Enter Profile of scan 1-13 (Default: 1)') | |
| parser.add_argument('--attack', type=str, help='Attack type: nmap, dns, sub, jwt, pcap, passcracker') | |
| parser.add_argument('--sub_list', type=str, default=DEFAULT_LIST_LOC, help='Path to the subdomain list file (txt)') | |
| parser.add_argument('--output', type=str, default=DEFAULT_OUTPUT_LOC, help='Pcap analysis output file') | |
| parser.add_argument('--rich_menu', type=str, help='Shows a clean help menu using rich') | |
| parser.add_argument('--menu', type=bool, default=False, help='Terminal Interactive Menu') | |
| parser.add_argument('--ai', type=str, default='openai', help='AI options: openai, bard, llama, llama-api') | |
| parser.add_argument('--password_hash', help='Password hash') | |
| parser.add_argument('--wordlist_file', help='Wordlist File') | |
| parser.add_argument('--algorithm', choices=hashlib.algorithms_guaranteed, required=True, help='Hash algorithm') | |
| parser.add_argument('--salt', help='Salt Value') | |
| parser.add_argument('--parallel', action='store_true', help='Use parallel processing') | |
| parser.add_argument('--complexity', action='store_true', help='Check for password complexity') | |
| parser.add_argument('--brute_force', action='store_true', help='Perform a brute force attack') | |
| parser.add_argument('--min_length', type=int, default=1, help='Minimum password length for brute force attack') | |
| parser.add_argument('--max_length', type=int, default=6, help='Minimum password length for brute force attack') | |
| parser.add_argument('--character_set', default='abcdefghijklmnopqrstuvwxyz0123456789', | |
| help='Character set for brute force attack') | |
| return parser.parse_args() | |
| def get_api_keys(): | |
| return { | |
| 'geoip_api_key': os.getenv('GEOIP_API_KEY'), | |
| 'openai_api_key': os.getenv('OPENAI_API_KEY'), | |
| 'bard_api_key': os.getenv('BARD_API_KEY'), | |
| 'runpod_api_key': os.getenv('RUNPOD_API_KEY'), | |
| 'runpod_endpoint_id': os.getenv('RUNPOD_ENDPOINT_ID') | |
| } | |
| def handle_attack(attack_type, target, ai, api_keys, additional_params=None): | |
| additional_params = additional_params or {} | |
| if attack_type == 'geo': | |
| output = geo_ip.geoip(api_keys['geoip_api_key'], target) | |
| asset_codes.print_output(attack_type.capitalize(), str(output), ai) | |
| elif attack_type == 'nmap': | |
| output = port_scanner.scanner( | |
| ip=target, | |
| profile=additional_params.get('profile'), | |
| akey=api_keys['openai_api_key'], | |
| bkey=api_keys['bard_api_key'], | |
| lkey=api_keys['runpod_api_key'], | |
| lendpoint=api_keys['runpod_endpoint_id'], | |
| AI=ai | |
| ) | |
| asset_codes.print_output(attack_type.capitalize(), str(output), ai) | |
| elif attack_type == 'dns': | |
| output = dns_enum.dns_resolver( | |
| target=target, | |
| akey=api_keys['openai_api_key'], | |
| bkey=api_keys['bard_api_key'], | |
| lkey=api_keys['runpod_api_key'], | |
| lendpoint=api_keys['runpod_endpoint_id'], | |
| AI=ai | |
| ) | |
| asset_codes.print_output(attack_type.capitalize(), str(output), ai) | |
| elif attack_type == 'sub': | |
| output = sub_recon.sub_enumerator(target, additional_params.get('list_loc')) | |
| console.print(output, style="bold underline") | |
| asset_codes.print_output(attack_type.capitalize(), str(output), ai) | |
| elif attack_type == 'jwt': | |
| output = jwt_analyzer.analyze( | |
| token=target, | |
| openai_api_token=api_keys['openai_api_key'], | |
| bard_api_token=api_keys['bard_api_key'], | |
| llama_api_token=api_keys['runpod_api_key'], | |
| llama_endpoint=api_keys['runpod_endpoint_id'], | |
| AI=ai | |
| ) | |
| asset_codes.print_output("JWT", output, ai) | |
| elif attack_type == 'pcap': | |
| packet_analysis.perform_full_analysis( | |
| pcap_path=target, | |
| json_path=additional_params.get('output_loc'), | |
| ) | |
| return "Done" | |
| elif attack_type == 'passcracker': | |
| hash = additional_params.get('password_hash') | |
| wordlist = additional_params.get('wordlist_file') | |
| salt = additional_params.get('salt') | |
| parallel = additional_params.get('parallel') | |
| complexity = additional_params.get('complexity') | |
| min_length = additional_params.get('min_length') | |
| max_length = additional_params.get('max_length') | |
| character_set = additional_params.get('charecter_set') | |
| brute_force = additional_params.get('brute_force') | |
| algorithm = additional_params.get('algorithm') | |
| Cracker = PasswordCracker( | |
| password_hash=hash, | |
| wordlist_file=wordlist, | |
| algorithm=algorithm, | |
| salt=salt, | |
| parallel=parallel, | |
| complexity_check=complexity | |
| ) | |
| if brute_force: | |
| Cracker.crack_passwords_with_brute_force(min_length, max_length, character_set) | |
| else: | |
| Cracker.crack_passwords_with_wordlist() | |
| Cracker.print_statistics() | |
| def main() -> None: | |
| args = parse_arguments() | |
| api_keys = get_api_keys() | |
| cowsay.cow('GVA Usage in progress...') | |
| target = args.target or '127.0.0.1' | |
| try: | |
| if args.rich_menu == "help": | |
| asset_codes.help_menu() | |
| elif args.menu: | |
| Menus( | |
| lkey=api_keys['runpod_api_key'], | |
| threads=args.threads, | |
| output_loc=args.output, | |
| lendpoint=api_keys['runpod_endpoint_id'], | |
| keyset="", | |
| t="", | |
| profile_num="", | |
| ai_set="", | |
| akey_set="", | |
| bkey_set="", | |
| ai_set_args="", | |
| llamakey="", | |
| llamaendpoint="" | |
| ) | |
| else: | |
| additional_params = { | |
| 'profile': args.profile, | |
| 'list_loc': args.sub_list, | |
| 'output_loc': args.output, | |
| 'password_hash': args.password_hash, | |
| 'salt': args.salt, | |
| 'parallel': args.parallel, | |
| 'complexity': args.complexity, | |
| 'brute_force': args.brute_force, | |
| 'min_length': args.min_length, | |
| 'max_lenght': args.max_length, | |
| 'character_set': args.character_set, | |
| 'algorithm': args.algorithm, | |
| 'wordlist_file': args.wordlist_file | |
| } | |
| handle_attack(args.attack, target, args.ai, api_keys, additional_params) | |
| except KeyboardInterrupt: | |
| console.print_exception("Bye") | |
| quit() | |
| if __name__ == "__main__": | |
| main() | |