errecepe's personal website. the start point

networking

Monitorizando cambios de apertura o cierre de puertos en una red

Imaginemos el siguiente escenario: tenemos varias redes, equipos, IP’s, incluso rangos o máscaras de red completas, de los que queremos controlar diariamente los cambios respecto a los puertos abiertos o cerrados en esos hosts.

Pues gracias a la utilidad Nmap y otra que viene incluida con ésta, llamada Ndiff y un pequeño script, podemos obtener los resultados de una manera bastante sencilla.

Vamos a ver como. Para facilitar la tarea, haremos que el script, se ‘alimente’ de un archivo llamado ipes.txt en que indicaremos varias ips, rangos o máscaras de la siguiente manera:

     192.168.1.200
     192.168.1.0/26

Añadiendo tantas lineas como necesitemos. Según la ayuda de Nmap, se aceptan tanto hosts como networks (al menos es lo que indica cuando se pasan archivos con el parámetro -iL):

     scanme.nmap.org
     10.10.24.56
     192.168.0.1/24

Luego crearemos un archivo llamado script.cmd, ya que estamos haciendo el ejemplo en windows (para linux sería modificar el comand move por un comand mv o un cp y un rm), con nmap ya descargado.

Al lio, el contenido del script es:

     ::hace un scaneo y vuelca a result2.xml
     nmap -iL ipes.txt -oX result2.xml
     ::al acabar compara los datos con result1.xml (generado anteriormente habiendo ejecutado ya este script)
     ndiff result1.xml result2.xml > report.txt
     ::al finalizar la comparación, renombro resultado para siguiente ejecución
     move /Y result2.xml result1.xml

Es un script, que está pensado para ejecutarse con cierta frecuencia. El resultado que da, en el archivo report.txt es el resultado de la comparación de puertos e IP’s abiertos actual, con el resultado de la ejecución previa.

Es decir, si programamos en el sistema operativo una tarea programada, en la que ejecutamos este script cada mañana a las 7am, en ese momento realizará un escaneo (según archivo ipes.txt) y almacenará el resultado en un archivo, que comparará con ese mismo archivo de la anterior ejecución.

Estas 3 simples lineas se encargan de todo, y a partir de una 2ª ejecución del script (en cuanto tengamos un result1.xml) empezaremos a obtener resultados en el archivo report.txt, que nos da la información deseada: reports con la información de los puertos que se han abierto o cerrado de varios grupos o rangos de IP’s a diario, pudiendo editar esas IP’s de una manera más o menos sencilla.

 

Tal y como está, el resultado, sería algo parecido a esto:

     -Nmap 7.60 scan initiated Sat Dec 16 01:33:45 2017 as: nmap -iL ipes.txt -oX result2.xml
     +Nmap 7.60 scan initiated Sat Dec 16 01:35:26 2017 as: nmap -iL ipes.txt -oX result2.xml

     192.168.1.200, C8:6C:87:78:0C:B4:
     PORT STATE SERVICE VERSION
     +8080/tcp open http-proxy

Donde nos está indicando que entre el escaneo iniciado a la 1:33:45 y el segundo escaneo iniciado a la 1:35:26, en el equipo 192.168.1.200 se ha abierto el puerto 8080/tcp

 

Por supuesto, todo esto es muy mejorable. Se pueden optimizar los escaneos con nmap, para especificar ciertos puertos, los n puertos comúnmente más abiertos, etc… así como otras opciones si tenemos firewalls de por medio (por supuesto en el equipo que esta ejecutando el script, el firewall estará previamente configurado para que nmap tenga acceso libre).

Además, podriamos tener la lista de IP’s y rangos en un sistema externo (una BBDD, una TWiki, un ftp…) para facilitar su edición. En este caso necesitariamos un proceso previo a la ejecución del script, que refrescase ese archivo ipes.txt con la información del origen deseado.

De la misma manera, junto con el report.txt, podriamos modificar el script, para que también dejase una copia con el resultado del escaneo con, por ejemplo, la fecha y hora como nombre de archivo, de manera que podamos almacenar con la frecuencia que queramos (diariamente estamos diciendo en este caso) tanto los cambios que han habido a nivel de apertura y cierre de puertos, como el detalle completo de puertos abiertos para cada host.

Y este par de archivos se podrían subir a un ftp, una bbdd o enviar por email, sin mucha dificultad, generando un registro y una documentación, que, podría resultar muy útil.

 

Próximamente, pondré este sistema a funcionar, en un entorno real, con varios miles de posibles hosts a escanear, y veré que tal resulta.

edit: consultar aqui para ver este ‘proyecto’ en mi github, con la última actualización