GPT_Vuln-analyzer / gpt_vuln.py
enotkrutoy's picture
Upload 13 files
53ee5fd verified
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()