Automação de scan de vulnerabilidades de URL
Publicado por Dionata Suzin (última atualização em 26/11/2024)
[ Hits: 596 ]
Automação de scan de vulnerabilidades de URL
import os import subprocess import tempfile import csv import re import openpyxl from openpyxl.styles import Font from datetime import datetime from concurrent.futures import ProcessPoolExecutor, as_completed # Função para executar um comando de shell e capturar a saída def run_command(command): result = subprocess.run(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) return result.stdout, result.returncode # Função para escanear uma URL def scan_url(url): with tempfile.NamedTemporaryFile(delete=False) as nmap_output: nmap_cmd = f"nmap -sV -O -R --script nmap-vulners/ --open -Pn -oN {nmap_output.name} {url}" output, return_code = run_command(nmap_cmd) html_content = f"<h2>Resultados do Scan para {url}</h2><table><thead><tr><th>Porta</th><th>Serviço</th><th>Versão</th><th>Vulnerabilidade</th><th>Criticidade</th><th>Exploit Disponível</th></tr></thead><tbody>" host_score = 0 total_ports = 0 total_vulnerabilities = 0 total_exploits = 0 os_version = "N/A" hostname = "N/A" if return_code == 0: with open(nmap_output.name, "r") as output_file: for line in output_file: if "open" in line: parts = line.split() if len(parts) >= 3: port = parts[0] service = parts[2] version = ' '.join(parts[3:]) if len(parts) > 3 else 'N/A' html_content += f"<tr><td>{port}</td><td>{service}</td><td>{version}</td><td></td><td></td><td></td></tr>" total_ports += 1 host_score += 1 if "OS details" in line: os_version = line.split("OS details: ")[1].strip() if "Running: " in line: os_version = line.split("Running: ")[1].strip() if "Computer name" in line: hostname = line.split("Computer name: ")[1].strip() if "VULNERABLE:" in line or "CVE" in line: vuln_match = re.search(r'(CVE-\d{4}-\d{4,7})\s+(\d+\.\d+)\s+(https?://\S+)', line) if vuln_match: cve_id = vuln_match.group(1).replace("-", "_") score = vuln_match.group(2) link = vuln_match.group(3) html_content += f"<tr><td></td><td></td><td></td><td>{cve_id}</td><td>{score}</td><td><a href='{link}'>Link</a></td></tr>" total_vulnerabilities += 1 host_score += 1 if "EXPLOIT" in line.upper(): exploit_match = re.search(r'(\S+)\s+(\d+\.\d+)\s+(https?://\S+)\s+\*EXPLOIT\*', line) if exploit_match: exploit_id = exploit_match.group(1) exploit_score = float(exploit_match.group(2)) exploit_link = exploit_match.group(3) html_content += f"<tr><td></td><td></td><td></td><td>{exploit_id}</td><td>{int(exploit_score)}</td><td><a href='{exploit_link}'>Link</a></td></tr>" total_exploits += 1 host_score += 10 html_content += f"</tbody></table><p><strong>Sistema Operacional:</strong> {os_version}<br><strong>Nome do Host:</strong> {hostname}<br><strong>Quantidade de Portas Abertas:</strong> {total_ports}<br><strong>Quantidade de Vulnerabilidades:</strong> {total_vulnerabilities}<br><strong>Exploits Encontrados:</strong> {total_exploits}</p><hr>" return html_content, host_score, total_ports, total_vulnerabilities, total_exploits else: return f"<h2>Falha no scan para {url}</h2><p>Código de retorno: {return_code}</p><hr>", 0, 0, 0, 0 # Excluir diretório nmap-vulners se existir if os.path.exists('nmap-vulners'): os.system('rm -rf nmap-vulners') # Baixar nmap-vulners atualizado run_command('git clone https://github.com/vulnersCom/nmap-vulners.git') # Atualizar banco de dados de scripts do Nmap run_command('nmap --script-updatedb') # Lista de URLs urls_to_scan = [ "exemplo.com.br", "exemplo2.com.br", "ftp.exemplo.com.br", "gitlab.exemplo.com.br" ] # Diretório para salvar os relatórios report_dir = "/home/<Seu Usuario>/Desktop/VM" if not os.path.exists(report_dir): os.makedirs(report_dir) timestamp = datetime.now().strftime('%Y%m%d_%H%M%S') summary_report_html = os.path.join(report_dir, f"summary_report_{timestamp}.html") csv_report = os.path.join(report_dir, f"summary_report_{timestamp}.csv") excel_report = os.path.join(report_dir, "scan_history.xlsx") html_content = """ <!DOCTYPE html> <html lang="pt-BR"> <head> <meta charset="UTF-8"> <title>Relatório de Scan</title> <style> body { font-family: Arial, sans-serif; margin: 20px; background-color: #f4f4f4; } h1 { color: #333; } table { width: 100%; border-collapse: collapse; margin: 20px 0; background-color: #fff; box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); } th, td { padding: 10px; text-align: left; border: 1px solid #ddd; } th { background-color: #4CAF50; color: white; } tr:nth-child(even) { background-color: #f9f9f9; } tr:hover { background-color: #f1f1f1; } p { font-size: 14px; color: #555; } hr { border: 0; height: 1px; background-color: #ccc; margin: 20px 0; } </style> </head> <body> <h1>Relatório de Scan de Rede</h1> """ csv_data = [["Host", "Porta", "Serviço", "Versão", "Vulnerabilidade", "Criticidade", "Exploit Disponível", "Score Total"]] if not os.path.exists(excel_report): workbook = openpyxl.Workbook() sheet = workbook.active sheet.title = "Histórico de Scans" sheet.append(["Host", "Data/Hora", "Portas Abertas", "Vulnerabilidades", "Exploits", "Score Total"]) else: workbook = openpyxl.load_workbook(excel_report) sheet = workbook.active # Processa os resultados do scan de cada URL em paralelo with ProcessPoolExecutor() as executor: future_to_url = {executor.submit(scan_url, url): url for url in urls_to_scan} for future in as_completed(future_to_url): url = future_to_url[future] try: html_result, score, total_ports, total_vulnerabilities, total_exploits = future.result() html_content += html_result sheet.append([url, datetime.now().strftime("%Y-%m-%d %H:%M:%S"), total_ports, total_vulnerabilities, total_exploits, score]) except Exception as e: print(f"Erro ao processar a URL {url}: {e}") html_content += f"<h2>Erro ao processar a URL {url}</h2><p>{str(e)}</p><hr>" html_content += "</body></html>" # Salva o relatório HTML with open(summary_report_html, "w") as f: f.write(html_content) # Salva o CSV with open(csv_report, mode='w', newline='', encoding='utf-8') as f: writer = csv.writer(f) writer.writerows(csv_data) # Salva o Excel workbook.save(excel_report) print(f"Relatório HTML salvo em: {summary_report_html}") print(f"Relatório CSV salvo em: {csv_report}") print(f"Histórico de scans salvo em: {excel_report}")
Como mudar o IP aleatoriamente em Python
DSearch - (Dir Search): script python para descobrir diretórios de servidores.
Cracker De Senha (cupp.py) 1.0
RT CRASH - "Quebrando" hash MD5, SHA1, SHA224, SHA256, SHA384 e SHA512
Script básico de um ransomware
Atualizando o Passado: Linux no Lenovo G460 em 2025
aaPanel - Um Painel de Hospedagem Gratuito e Poderoso
O macete do Warsaw no Linux Mint e cia
Visualizar arquivos em formato markdown (ex.: README.md) pelo terminal
Dando - teoricamente - um gás no Gnome-Shell do Arch Linux
Como instalar o Google Cloud CLI no Ubuntu/Debian
Mantenha seu Sistema Leve e Rápido com a Limpeza do APT!
Procurando vídeos de YouTube pelo terminal e assistindo via mpv (2025)
Pastas da raiz foram para a área de trabalho [RESOLVIDO] (10)
Será que eu deveria apreender C/C++ para desenvolver para Linux? (4)