errecepe's personal website. the start point

sysadmin

Creación de archivos .RDP automática con batch

Son días de teletrabajo, y si por ese motivo necesitásemos crear multitud de archivos de configuración para conectar vía Remote Desktop Protocol para nuestros usuarios, os voy a contar como hacerlo de una manera fácil y rápida.

Me estoy refiriendo a la creación automatizada de archivos .rdp para el cliente de Terminal Server de Microsoft:

Hasta hoy nunca me había dado por visualizar el contenido de estos archivos, y me ha sorprendido gratamente comprobar que eran simples lineas con los parámetros necesarios para la conexión.

Una vez llegados a este punto, está claro el mecanismo. Un simple script en batch nos va a resultar más que suficiente para nuestro fín.

Procedimiento práctico

En primer lugar, ejecutaremos el comando mstsc para abrir el cliente de Escritorio remoto, desplegaremos con la opción Mostrar opciones situado en la parte inferior izquierda del cliente, e indicaremos cualquier dato para Equipo y Usuario. En el ejemplo he usado las palabras EQUIPO y USUARIO:

Por supuesto, y muy importante, revisaremos el resto de pestañas de configuración: Pantalla, Recursos locales, Rendimiento y Opciones avanzadas, donde configuraremos según los datos de nuestra organización, la configuración del servidor de puerta de enlace, el rendimiento de la conexión para optimizar el ancho de banda si se prevén más accesos de lo normal, si se trasladan las impresoras del cliente, etc etc…

Ahora clickaremos sobre el botón Guardar como… para generar un archivo .rdp que usaremos como plantilla. Para ello editaremos con un editor de texto (notepad.exe nos valdría) el archivo .rdp que acabamos de generar.

Buscaremos en el, dos lineas. Una con el nombre del equipo:

full address:s:EQUIPO

Y la del usuario, que la encontrareis del siguiente modo:

username:s:USUARIO

Bien, pues una vez localizadas, las borraremos y guardaremos el archivo, al que a partir de ahora, por llamarlo de alguna manera, lo llamaremos plantilla.rdp.

Ahora, crearemos con el editor de texto, un archivo que guardaremos como crea_rdp.cmd con el siguiente contenido:

@echo off
set destino=»Conectar %1 a %2.rdp»
set fulladdress=full address:s:%2
set usernme=username:s:%1
more plantilla.rdp > %destino%
echo %fulladdress% >> %destino%
echo %usernme% >> %destino%
echo Archivo %destino% creado

Una vez llegado a este punto, con el script crea_rdp.cmd y el archivo plantilla.rdp en un mismo directorio, si ejecutamos el comando: crea_rdp pepito equipo_remoto obtendremos un nuevo archivo .rdp de nombre «Conectar pepito a equipo_remoto.rdp» con la configuración predeterminada que usamos para plantilla.rdp pero pre-configurado para conectar al equipo indicado como el usuario también indicado. De ahí a generar un segundo script con tantas lineas como archivos .rdp a generar con la configuración de equipo y usuarios deseado mediante múltiples llamadas a nuestro script crea_rdp.

Y obtendremos con estas 3 simples líneas, al ejecutar este segundo script, 3 bonitos archivos .rdp preconfigurados a nuestro gusto y listos para ser enviados a los usuarios.

Explicación del script

El script usado es muy sencillo de modificar a nuestro gusto y necesidades.

Por ejemplo, en la segunda linea, estableceremos la variable destino como el nombre de los archivos .rdp generados usando los valores de los parámetros %1 y %2, es decir USUARIO y EQUIPO para la composición del nombre del archivo resultante. Podemos usar el nombre de archivo que queramos, mientras mantenga la extensión .rdp y use los valores %1 y %2, para evitar que se generen archivos .rdp con el mismo nombre, siendo sobrescritos (el script elimina la existencia de un posible archivo .rdp existente previamente al generar el nuevo).

En la cuarta linea, en la variable usernme, almacenaremos el nombre de usuario. En algún caso, podríais necesitar establecer un dominio para las cuentas de usuario, y prestablecerlo modificando la cuarta linea indicando el dominio de la siguiente manera: set usernme=username:s:DOMINIO\%1. O incluso podríamos ir más allá y que el dominio fuese un tercer parámetro pasado al script, por si se diese el caso de que necesitásemos crear archivos .rdp masivamente para varios dominios, quedando la linea del siguiente modo: set usernme=username:s:%3\%1, suponiendo que los parámetros fuesen USUARIO EQUIPO DOMINIO, en ese orden.

Y poco más que añadir, ya que el script, como indicaba al principio, es muy sencillo.

Espero que os resulte práctico en estos días de #teletrabajo !

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