Ahora que podemos analizar datos XML de Nmap, ampliemos nuestro script para extraer información relevante para la seguridad. Esto incluye:
- Identificar puertos abiertos potencialmente riesgosos.
- Detectar versiones de servicio obsoletas.
- Resumir las preocupaciones de seguridad.
Creemos una versión mejorada de nuestro analizador que se centre en el análisis de seguridad.
Creación de un script de análisis de seguridad
Cree un nuevo archivo llamado security_analysis.py:
nano ~/project/security_analysis.py
Copie y pegue el siguiente 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)
Guarde el archivo presionando Ctrl+O, luego Enter, y salga de nano con Ctrl+X.
Haga que el script sea ejecutable:
chmod +x ~/project/security_analysis.py
Ejecución del análisis de seguridad
Ejecutemos nuestro script de análisis de seguridad en el archivo XML de Nmap:
cd ~/project
./security_analysis.py localhost_scan.xml
El script analizará los resultados del escaneo y generará un informe de seguridad centrado en posibles vulnerabilidades, guardándolo en un archivo llamado security_report.txt.
Veamos el contenido del informe:
cat ~/project/security_report.txt
Comprensión del análisis de seguridad
El script de análisis de seguridad realiza varias funciones importantes:
-
Identificación de puertos de alto riesgo (High-Risk Port Identification): Identifica puertos comúnmente explotados como FTP (21), Telnet (23) y RDP (3389), que son objetivos frecuentes para los atacantes.
-
Detección de servicios obsoletos (Outdated Service Detection): Comprueba si hay versiones antiguas de servicios como SSH, Apache y nginx que puedan tener vulnerabilidades de seguridad conocidas.
-
Inventario de servicios expuestos (Exposed Services Inventory): Crea un inventario completo de todos los puertos y servicios abiertos, lo cual es valioso para la auditoría de seguridad.
-
Categorización de riesgos (Risk Categorization): Organiza los hallazgos por nivel de riesgo para ayudar a priorizar las mejoras de seguridad.
Este tipo de análisis es crucial para que los profesionales de la seguridad identifiquen posibles vulnerabilidades en una red antes de que los atacantes puedan explotarlas.
Ampliación del análisis
En un escenario del mundo real, es posible que desee ampliar este análisis mediante:
- Agregar más puertos de alto riesgo a la lista de detección.
- Actualizar las definiciones de servicios obsoletos con la información de vulnerabilidad más reciente.
- Integrar con bases de datos de vulnerabilidades para buscar CVE (Common Vulnerabilities and Exposures) conocidos.
- Agregar recomendaciones para la remediación de los problemas detectados.
La capacidad de analizar mediante programación los datos XML de Nmap es una habilidad poderosa para los profesionales de la ciberseguridad, ya que permite la evaluación automatizada de vulnerabilidades y la integración con sistemas de monitoreo de seguridad más grandes.