Ranger: Pentesting desde Python a sistemas Windows

Hace unas semanas estuve viendo una herramienta denominada Ranger, la cual estaba escrita en Python y me quedé sorprendido del potencial que ofrecía. Ranger, la cual está disponible en Github para su descarga, es una herramienta que permite acceder e interactuar con sistemas remotos basados en Microsoft Windows. Según se indica en el manifiesto de su sitio web el proyecto conceptualmente fue el de no reinventar la rueda, si no hacerlo más eficiente. A la par que sus autores intentaban realizar acciones de forma eficiente, se conseguía centralizar diferentes herramientas y funcionalidades en una, tal y como se verá más adelante.

Ranger es una herramienta de línea de comandos utilizada en test de intrusión, generalmente. Con ella podemos realizar diferentes ataques contra sistemas Windows. Por ejemplo, de un usuario del que se conoce el hash o un conjunto de hashes, podrían ser utilizados con el objetivo de ganar y obtener acceso al sistema. Este tipo de ataques lo hemos visto con Powershell Empire en un par de artículos como fueron: Powershell Empire – Post Explotación++ y Powershell Empire – El imperio contraataca.

Con Ranger podemos lograr realizar un gran número de cosas muy útiles en un pentest, sobre todo cuando nos bloquean el uso de ciertas herramientas. A continuación se enumeran algunas de las acciones que más pueden llamar la atención de un pentester:

-        Extraer credenciales en texto plano fuera del ámbito de la memoria de un sistema.
-        Acceder al contenido de la SAM.
-        Ejecutar comandos de forma remota.
-        Ejecutar scripts de Powershell o binarios de Windows.

-        Bypassear la mayoría de soluciones IPS que podemos encontrar, lo cual, solo por este hecho, merece la pena probarla.

La herramienta está relacionada con los repositorios de PowerView, Powershell Mimikatz y impacket teams. Ahora vamos a ver cómo es de fácil realizar la instalación de la herramienta. Simplemente hay que utilizar un git clone del repositorio y ejecutar python ranger.py –update para actualizar la herramienta a la última versión. Ranger utiliza dos elementos fundamentales para entender su estructura. Por un lado, nos encontramos con el método y por otro el ataque. Un método es una vía, protocolo o forma de realizar una acción. El ataque implementa la acción que se quiere llevar a cabo, por ejemplo la ejecución de un comando en la máquina remota a través de un método (o vía).

Hay un par de métodos que, además, son ataques. Estos son: scout y secrets-dump. Scout permite identificar usuarios logados en la máquina remota. Por otro lado secrets-dump nos permite extraer los hashes almacenados en la SAM, enumera usuarios del sistema y almacena en el fichero credential_matrix las credenciales obtenidas, en la mayoría de los casos hashes.   Existen cuatro métodos que se enumeran a continuación, y que son realmente conocidos por los pentesters:

-        Wmiexec. Se utiliza el protocolo de instrumentación WMI para ejecutar comandos de forma remota.
-        Psexec. Un clásico para ejecutar procesos remotos bajo autenticación SMB.
-        Smbexec. Permite ejecutar procesos y órdenes a través del protocolo SMB.
-        Atexec. Permite ejecutar un ataque o comando a través de la herramienta atexec.

Hay una gran cantidad de ataques que pueden ser utilizados con Ranger a través de los métodos. Los ataques, según los creados de la herramienta, se pueden dividir en invocadores, ejecutores y descargadores. A continuación se enumeran los diferentes ataques que se pueden llevar a cabo:
-        Invoker. Ejecuta el script de Mimikatz para Powershell sobre la máquina remota.
-        Downloader. Configura el comando para utilizar el módulo de Metasploit exploit/multi/script/web_delivery.
-        Executor. Ejecuta un script de Powershell.
-        Command. Ejecuta un comando que se indique. Por defecto se ejecuta un cmd.exe. Por esta razón, y como se verá más adelante, cuando utilizamos Psexec u otro método, por defecto se obtiene una cmd.exe remota.
-        Domain-group-members. Identifica, a través de Powershell, miembros de un dominio.
-        Local-group-members. Identifica miembros de un grupo local de la máquina.
-        
Otras funciones basadas en scripts de Powershell que interactúan con el dominio y la máquina Windows con el objetivo de recopilar más información.

PoC: Jugando con los métodos

Una de las primeras pruebas que se pueden hacer es utilizar un método clásico. Uno de los métodos más utilizados históricamente, con casi toda certeza, es el de psexec. Como se puede visualizar en la imagen es fácil conseguir una shell a través del uso de los hashes, previamente obtenidos tras la explotación de una vulnerabilidad o reutilización de hashes de una máquina. Los parámetros base son –u para el usuario, -p para el password o hashLM:hashNT, -d para el dominio o grupo de trabajo y –t para el target. Simplemente, hay que añadir el tipo de método que utilizaremos, en este caso psexec.


En el siguiente ejemplo se puede ver cómo, simplemente, modificando el método y utilizando smbexec se puede lograr el mismo resultado, es decir, obtener una shell. Hay que recordar que si utilizáramos el parámetro –c o –command podríamos indicar qué orden o instrucción debe ejecutarse por parte de Ranger en la máquina remota.


En el siguiente ejemplo utilizamos el método wmiexec para conseguir acceso a la máquina remota con el hash que se puede ver en la imagen. En este caso, en vez de ejecutar el comando por defecto, se utiliza whoami como instrucción, por lo que la salida es distinta a la que se había obtenido en casos anteriores.


PoC: Jugando con Web Delivery de Metasploit y Ranger

En esta prueba de concepto se propone un escenario dónde el pentester invoque desde Ranger la operación de descarga desde un recurso web, el cual habrá sido creado con Metasploit y el módulo exploit/multi/script/web_delivery. Con este módulo podremos configurar el código que será descargado y ejecutado en la máquina remota.

A continuación explicamos los roles y máquinas que participan en esta pequeña prueba de concepto:

-        Pentester con máquina, por ejemplo, Kali Linux en el que está ejecutando la herramienta Ranger.
-        Máquina remota un sistema Windows 7.
-        Segunda máquina, podría estar en el mismo Kali Linux, controlada por el Pentester con un Metasploit configurado con el módulo exploit/multi/script/web_delivery.

En primer lugar, hablaremos de la configuración del módulo exploit/multi/script/web_delivery. Es un módulo de tipo exploit muy sencillo de configurar. Los parámetros básicos a configurar son los siguientes:

-        La elección del payload queda de la mano del usuario, aunque para el ejemplo utilizaremos el clásico Meterpreter de tipo inverso tcp.
-        Hay que indicar por cuál interfaz de red estará a la escucha el servicio web_delivery. Esto se realiza a través del atributo SRVHOST, que por defecto tiene por valor 0.0.0.0, es decir, cualquier interfaz por la que se obtenga una petición.
-        El atributo LHOST del payload debe ser la dirección dónde se encuentre el handler de Metasploit configurado para recibir la conexión.

A continuación se puede ver un resumen de la configuración. Como se puede ver es realmente sencillo configurarlo.


Al ejecutar el comando exploit podremos ver como se configura de manera transparente el handler y, el propio Metasploit, nos indica que había que ejecutar en Python para obtener el payload. Si miramos los Jobs de Metasploit podemos ver cómo se ha generado un servicio a través del módulo web_delivery. Si quisiéramos detener esto deberíamos ejecutar Jobs –K.


La herramienta Ranger debe ser ejecutada de la siguiente forma: ranger –u [user] –p [password o hash] –d [domain] –t [target] –downloader. El parámetro downloader hace que Ranger se autentique en la máquina remota, ejecute un script encodeado en Powershell, tal y como se puede ver en la imagen. Este script lo que realizará es  una llamada a nuestra máquina para encontrar el payload a ejecutar.


Si echamos un ojo a lo que se descarga la máquina remota gracias a la interacción con Ranger y el uso de Powershell, podemos ver que es código python. Este código ejecutará el payload que hayamos configurado en el módulo web_delivery de Metasploit.


Como veis, Ranger aporta múltiples opciones, métodos y ataques que pueden ser necesarios en un pentest. Además, Ranger incorpora otros ataques interesantes, como por ejemplo la posibilidad de ejecutar un Mimikatz a través de un script de Powershell y obtener las credenciales logadas en la máquina en plano. Sin duda, una herramienta a tener en cuenta y guardarla en nuestra mochila para llevar a cabo un test de intrusión.