Insights de Segurança das Varreduras do Nmap
Agora que podemos analisar dados XML do Nmap, vamos estender nosso script para extrair informações relevantes para segurança. Isso inclui:
- Identificar portas abertas potencialmente arriscadas
- Detectar versões de serviço desatualizadas
- Resumir preocupações de segurança
Vamos criar uma versão aprimorada do nosso analisador que se concentra na análise de segurança.
Criando um Script de Análise de Segurança
Crie um novo arquivo chamado security_analysis.py:
nano ~/project/security_analysis.py
Copie e cole o seguinte código:
#!/usr/bin/env python3
import xml.etree.ElementTree as ET
import sys
import datetime
## Define potentially risky ports
HIGH_RISK_PORTS = {
'21': 'FTP - File Transfer Protocol (often unencrypted)',
'23': 'Telnet - Unencrypted remote access',
'25': 'SMTP - Email transfer (may allow relay)',
'445': 'SMB - Windows file sharing (potential target for worms)',
'3389': 'RDP - Remote Desktop Protocol (target for brute force)',
'1433': 'MSSQL - Microsoft SQL Server',
'3306': 'MySQL - Database access',
'5432': 'PostgreSQL - Database access'
}
## Services with known security issues
OUTDATED_SERVICES = {
'ssh': [
{'version': '1', 'reason': 'SSHv1 has known vulnerabilities'},
{'version': 'OpenSSH 7', 'reason': 'Older OpenSSH versions have multiple CVEs'}
],
'http': [
{'version': 'Apache httpd 2.2', 'reason': 'Apache 2.2.x is end-of-life'},
{'version': 'Apache httpd 2.4.1', 'reason': 'Apache versions before 2.4.30 have known vulnerabilities'},
{'version': 'nginx 1.14', 'reason': 'Older nginx versions have security issues'}
]
}
def analyze_security(xml_file):
try:
## Parse the XML file
tree = ET.parse(xml_file)
root = tree.getroot()
## Prepare the report
report = []
report.append("NMAP SECURITY ANALYSIS REPORT")
report.append("=" * 50)
report.append(f"Report generated on: {datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
report.append(f"Scan started at: {root.get('startstr')}")
report.append(f"Scan command: {root.get('args')}")
report.append("=" * 50)
## Track security findings
high_risk_services = []
potentially_outdated = []
exposed_services = []
## Process each host in the scan
for host in root.findall('host'):
## Get host addresses
ip_address = None
for addr in host.findall('address'):
if addr.get('addrtype') == 'ipv4':
ip_address = addr.get('addr')
hostname = "Unknown"
hostnames = host.find('hostnames')
if hostnames is not None:
hostname_elem = hostnames.find('hostname')
if hostname_elem is not None:
hostname = hostname_elem.get('name')
report.append(f"\nHOST: {ip_address} ({hostname})")
report.append("-" * 50)
## Process ports
ports = host.find('ports')
if ports is None:
report.append("No port information available")
continue
open_ports = 0
for port in ports.findall('port'):
port_id = port.get('portid')
protocol = port.get('protocol')
## Get port state
state = port.find('state')
if state is None or state.get('state') != "open":
continue
open_ports += 1
## Get service information
service = port.find('service')
if service is None:
service_name = "unknown"
service_product = ""
service_version = ""
else:
service_name = service.get('name', 'unknown')
service_product = service.get('product', '')
service_version = service.get('version', '')
service_full = f"{service_product} {service_version}".strip()
## Check if this is a high-risk port
if port_id in HIGH_RISK_PORTS:
high_risk_services.append(f"{ip_address}:{port_id} ({service_name}) - {HIGH_RISK_PORTS[port_id]}")
## Check for outdated services
if service_name in OUTDATED_SERVICES:
for outdated in OUTDATED_SERVICES[service_name]:
if outdated['version'] in service_full:
potentially_outdated.append(f"{ip_address}:{port_id} - {service_name} {service_full} - {outdated['reason']}")
## Track all exposed services
exposed_services.append(f"{ip_address}:{port_id}/{protocol} - {service_name} {service_full}")
report.append(f"Open ports: {open_ports}")
## Add security findings to report
report.append("\nSECURITY FINDINGS")
report.append("=" * 50)
## High-risk services
report.append("\nHIGH-RISK SERVICES")
report.append("-" * 50)
if high_risk_services:
for service in high_risk_services:
report.append(service)
else:
report.append("No high-risk services detected")
## Potentially outdated services
report.append("\nPOTENTIALLY OUTDATED SERVICES")
report.append("-" * 50)
if potentially_outdated:
for service in potentially_outdated:
report.append(service)
else:
report.append("No potentially outdated services detected")
## Exposed services inventory
report.append("\nEXPOSED SERVICES INVENTORY")
report.append("-" * 50)
if exposed_services:
for service in exposed_services:
report.append(service)
else:
report.append("No exposed services detected")
## Write the report to a file
report_file = "security_report.txt"
with open(report_file, 'w') as f:
f.write('\n'.join(report))
print(f"Security analysis complete. Report saved to {report_file}")
## Display a summary
print("\nSummary:")
print(f"- High-risk services: {len(high_risk_services)}")
print(f"- Potentially outdated services: {len(potentially_outdated)}")
print(f"- Total exposed services: {len(exposed_services)}")
except ET.ParseError as e:
print(f"Error parsing XML file: {e}")
return False
except Exception as e:
print(f"Error: {e}")
return False
return True
if __name__ == "__main__":
if len(sys.argv) != 2:
print(f"Usage: {sys.argv[0]} <nmap_xml_file>")
sys.exit(1)
xml_file = sys.argv[1]
if not analyze_security(xml_file):
sys.exit(1)
Salve o arquivo pressionando Ctrl+O, depois Enter e saia do nano com Ctrl+X.
Torne o script executável:
chmod +x ~/project/security_analysis.py
Executando a Análise de Segurança
Vamos executar nosso script de análise de segurança no arquivo XML do Nmap:
cd ~/project
./security_analysis.py localhost_scan.xml
O script analisará os resultados da varredura e gerará um relatório de segurança focado em potenciais vulnerabilidades, salvando-o em um arquivo chamado security_report.txt.
Vamos olhar o conteúdo do relatório:
cat ~/project/security_report.txt
Compreendendo a Análise de Segurança
O script de análise de segurança executa várias funções importantes:
-
Identificação de Portas de Alto Risco: Ele identifica portas comumente exploradas, como FTP (21), Telnet (23) e RDP (3389), que são alvos frequentes de invasores.
-
Detecção de Serviços Desatualizados: Ele verifica versões mais antigas de serviços como SSH, Apache e nginx que podem ter vulnerabilidades de segurança conhecidas.
-
Inventário de Serviços Expostos: Ele cria um inventário completo de todas as portas e serviços abertos, o que é valioso para auditoria de segurança.
-
Categorização de Risco: Ele organiza as descobertas por nível de risco para ajudar a priorizar as melhorias de segurança.
Este tipo de análise é crucial para que os profissionais de segurança identifiquem potenciais vulnerabilidades em uma rede antes que os invasores possam explorá-las.
Estendendo a Análise
Em um cenário do mundo real, você pode querer estender esta análise:
- Adicionando mais portas de alto risco à lista de detecção
- Atualizando as definições de serviço desatualizadas com as informações de vulnerabilidade mais recentes
- Integrando com bancos de dados de vulnerabilidades para verificar CVEs (Common Vulnerabilities and Exposures) conhecidas
- Adicionando recomendações para a correção de problemas detectados
A capacidade de analisar programaticamente dados XML do Nmap é uma habilidade poderosa para profissionais de segurança cibernética, pois permite a avaliação automatizada de vulnerabilidades e a integração com sistemas maiores de monitoramento de segurança.