Independiente del rol desempeñando por un administrador/responsable de sistemas o el de un hacker malicioso, en ocasiones es necesario tener control de forma distribuida o paralela sobre varias maquinas, teniendo la capacidad de ejecutar comandos que se repliquen a estas y que a su vez cada una retorne los resultados correspondientes al comando ejecutado. Esto es especialmente útil desde el punto de vista de un administrador de sistemas cuando un segmento de red con varias maquinas se han visto involucradas en un ataque y posiblemente ahora se encuentran comprometidas, utilizando una herramienta que le permita ejecutar comandos de forma paralela le permitirá tomar acciones y reaccionar de una forma mucho mas adecuada y rápida sobre todas las maquinas en un segmento de red. Por otro lado, desde la perspectiva de un atacante o pentester, es muy útil poder ejecutar comandos de forma paralela sobre un conjunto de maquinas comprometidas, esto le permitirá ejecutar con mayor rapidez y eficiencia las etapas correspondientes al proceso de post-explotación, que puede incluir acciones como establecimiento de puertas traseras o instalación de rootkits, realizar estas tareas de forma paralela sobre un conjunto de maquinas comprometidas facilita muchísimo las cosas.

Para realizar estas operaciones existen algunas herramientas libres disponibles en el mercado (también existen herramientas privadas, pero el enfoque de este blog se centra en el uso de software libre).

A continuación se explica el uso de algunas de ellas y su posterior integración con SSH.

PDSH (Parallel Distributed Shell)

Se trata de una herramienta libre licenciada bajo la GNU/GPL y permite la ejecución de múltiples comandos de forma paralela sobre múltiples hosts. A continuación se indica el procedimiento de instalación y uso de esta utilidad.

Instalación

Como en la mayoría de utilidades, existe un paquete DEB disponible para Debian en los repositorios oficiales ejecutando un simple comando apt-get

>apt-get install pdsh

Sin embargo la versión que viene incluida en los repositorios no se encuentra actualizada, por este motivo es recomendable descargarla e instalarla desde código, esta herramienta se puede encontrar desde sourceforge en: http://code.google.com/p/pdsh/ Una vez descargado y descomprimido el “tarball” es necesario realizar el procedimiento de instalación clásico en programas escritos en C

>./configure

>make

>make install

Después de esto es posible comenzar a utilizar este programa sin problemas.

Utilización de PDSH

El uso de esta herramienta es sencillo, consta de un conjunto de opciones junto con la especificación de los hosts a los que se debe aplicar el comando de forma paralela y finalmente el comando propiamente dicho. PDSH utiliza módulos para establecer la conexión remota con los hosts indicados en la ejecución del comando, permitiendo establecer distintos mecanismos de conexión, sin embargo en esta entrada el enfoque principal será SSH. Para visualizar los módulos disponibles se utiliza la opción -L

>pdsh -L

2 modules loaded:

Module: rcmd/exec

Author: Mark Grondona <mgrondona@llnl.gov>

Descr: arbitrary command rcmd connect method

Active: yes

Module: rcmd/rsh

Author: Jim Garlick <garlick@llnl.gov>

Descr: BSD rcmd connect method

Active: yes

Para ver los módulos por defecto utilizados por PDSH se utiliza la opción -V

>pdsh -V

pdsh-2.26

rcmd modules: rsh,exec (default: rsh)

misc modules: (none)

Para especificar el modulo que se debe de utilizar para el establecimiento de la conexión con los host remotos se utiliza la opción -R, en concreto para seleccionar que se debe utilizar SSH como mecanismo de autenticación se establece el modulo “exec”.

NOTA: Antes de continuar es necesario aclarar que para que sea posible utilizar SSH para el establecimiento de la conexión en todos los hosts es necesario cumplir con las siguientes condiciones:

  1. El host remoto debe tener un servicio SSH en ejecución y esperando conexiones

  2. Se debe establecer un mecanismo de autenticación basado en claves privada/publica entre la maquina local donde se ejecuta el comando “pdsh” y las maquinas remotas. Para cumplir con este requisito el lector puede ver una entrada anterior sobre claves privada/publica aquí

  3. Finalmente, en la maquina local donde se ejecuta el comando “pdsh” se debe carga la clave privada del cliente en el agente de autenticación “ssh-agent” para que la conexión se realice de forma automática. Para cumplir con este requisito el lector puede ver una entrada anterior sobre el uso de comandos “ssh-agent” y “ssh-add” aquí

Ahora para definir los hosts a los que se van a ejecutar los comandos de forma paralela se declara la opción “-w”, esta opción permite definir algo similar a un pequeño lenguaje de expresiones regulares donde se pueden establecer las direcciones IP o los nombres de los hosts donde se puede establecer la conexión, definiendo algunos ejemplos puede quedar lo suficientemente claro para el lector:

  1. Todos los host desde el 192.168.1.1 hasta el 192.168.1.20

>pdsh -w 192.168.1.[1-20]

  1. Los host desde el 33 hasta el 45 y del 60 hasta el 73

    >pdsh -w 192.168.1.[33-45,60-73]

  2. Para los host debian01-hackway, debian02-hackway, debian03-hackway, debian04-hackway

    >pdsh -w debian[01-04]-hackway

Ahora, se procede a indicar algunos ejemplos prácticos utilizando esta herramienta con SSH, (recordar que antes de ejecutar los comandos anteriores es necesario que la clave publica se encuentre correctamente cargada en el sistema tal como se ha indicado anteriormente)

>pdsh -R exec -w 192.168.1.3[4-5] ssh %h hostname | dshbak -c

—————-

192.168.1.34

—————-

adastra-debian2

—————-

192.168.1.35

—————-

adastra-debian1

>pdsh -R exec -w 192.168.1.3[4-5] ssh %h pwd | dshbak -c

—————-

192.168.1.[34-35]

—————-

/root

Como puede apreciarse, tras la ejecución de los comandos anteriores, se ha formateado la salida para que pueda ser fácilmente leída, esto gracias al comando dshbak que se encuentra incluido en la instalación de PDSH, Como se puede ver, es muy fácil ejecutar comandos de forma paralela con esta utilidad además de que el uso de SSH permite que la comunicación viaje cifrada entre la maquina donde se ejecuta el comando y las maquinas destino.

Por otra parte también es posible excluir solamente algunos host que pueden cumplir con el criterio definido en la opción “-w” utilizando la opción “-x” del siguiente modo

>pdsh -R exec -w 192.168.1.3[3-5] -x 192.168.1.33 ssh %h id | dshbak -c

—————-

192.168.1.34

—————-

uid=0(root) gid=0(root) grupos=0(root)

—————-

192.168.1.35

—————-

uid=0(root) gid=0(root) groups=0(root)

En la ejecución del comando anterior, el listado de host debía incluir todas las maquinas desde la 192.168.1.33 hasta la 192.168.1.35, sin embargo al especificar la opción “-x” con el host 192.168.1.33 el comando remoto solamente se ha ejecutado en las maquinas 192.168.1.34 y 192.168.1.35