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...
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...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
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.
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.
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.
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.
RustHound-CE
: pensado para BloodHound Community Edition, con un enfoque más modular y eficiente.
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.
¡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
con la información actualizada del entorno.
Use
# Autenticación usuario y contraseña
# Autenticación a través de Pass-the-Hash (PtH)
# Autenticación mediante Kerberos (.ccache)
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 mediante Kerberos (.ccache)
# 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
Pasaremos el binario al equipo víctima y lo ejecutaremos para recolectar la información.
# 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)
# 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)
# 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)
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.
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.
Ya dispondremos de nuestro BloodHound CE
instalado correctamente en nuestro equipo a través de Docker.
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.
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.
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
Ingresar al apartado de "Administration"
Acceder a la pestaña de "File Ingest"
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.
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.
Accederemos al apartado "Administration"
Ingresaremos al apartado de "Database Management"
Marcaremos todas las casillas, para la "limpieza profunda"
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".
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)
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.
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:
Accedemos al apartado Group Management desde el ícono de personas (barra lateral izquierda).
Seleccionamos el grupo que queremos revisar Owned/High Value
.
Elegimos el entorno, normalmente All Active Directory Domains
.
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.
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
Principales con privilegios peligrosos (DCSync, GenericAll, etc.)
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.
Actualizaremos los repositorios e instalaremos BloodHound y Neo4j para que funcione correctamente BH.
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.
Para iniciar BloodHound una vez ya realizada la instalación es ejecutar los siguientes comandos.
Abriremos BloodHound en segundo plano, si tenemos las credenciales almacenadas con el check, iniciará sesión automáticamente.
Se recomienda antes sincronizar la hora con el DC para evitar problemas de .
Accederemos a y asignaremos las siguientes credenciales:
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.
Abriremos en una terminal aparte Neo4j, se nos iniciará la interfaz web en
Accederemos a e ingresaremos las siguientes credenciales por defecto.
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
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í! 😊
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.
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.
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:
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.
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.
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.
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.
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.
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.
P7B (PKCS#7): Almacena certificados de cadena, pero no claves privadas.
Subject: Entidad a la que se emite el certificado.
Issuer: Normalmente la CA.
SAN: Nombre alternativo del sujeto.
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.
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
El cliente envía una solicitud de certificado (CSR).
La CA verifica los permisos del cliente para emitir el certificado solicitado.
Si los permisos coinciden, la CA genera y firma el certificado con su clave privada.
El certificado firmado es devuelto al cliente.
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.
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.
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.
Solicitud del certificado con SAN alternativo.
Autenticación con certificado.
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
.
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.
Solicitud del certificado con SAN alternativo.
Autenticación con certificado.
Verificación.
Solicitar un certificado.
Solicitar un certificando suplantando al Administrator.
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.
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.
Solicitud de certificado con UPN alternativo, en este caso, el usuario Administrator.
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.
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
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".
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.
Configuramos el relay
Autenticación Coerce con PetitPotam
Certipy recibe autenticación del DC de AD
A continuación, se deberá realizarlos pasos del ESC8
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.
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.
Clonar repositorio de GitHub.
Guía detallada a través del siguiente blog.
MUY IMPORTANTE TENER LA HORA DE NUESTRO EQUIPO CON LA DEL DOMAIN CONTROLLER
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.
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.
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.
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.
# 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'
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 .
Abusing Active Dierctory Certificate Services Explication -->
Abusing ADCS Attacks (ADMinions) -->
Abusing ACS Attacks (The Hacker Recipes) -->
Abusing ESC8 & ESC10 on ADCS -->
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.
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
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.
Autenticación básica NTLM
Autenticación mediante Kerberos
Web Browser
# 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.
DnsAdmins to Domain Admin -
HTB Resolute -
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
Agregarnos a nosotros mismos a un grupo o a otro usuario del dominio.
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
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.
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.
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.
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.
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.
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.
En Windows haremos una copia de los archivos en "temp"
Desde Kali Linux exportaremos los hashes de la SAM
De manera remota podemos hacer el dump del SAM del equipo.
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.
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:
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.
(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:
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.
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.
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.
En Windows a través de la herramienta de mimikatz haremos el dump del LSASS.
Con acceso a una sesión gráfica interactiva con el objetivo, podemos utilizar el administrador de tareas para crear un volcado de memoria.
En caso de disponer de un lsass.DMP en nuestra Kali, comprobar que tipo de dump es y hacer un dump del LSASS.
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.
De manera remota podemos hacer un dump del LSASS a través de netexec
.
Enlaces utilizados:
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.
Repositorio de GitHub de la herramienta
# 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
Export copy SAM and SYSTEM files -
DCSync Attack (Hacktricks) -->
Dumping Active Directory Hashes -->
Diskshadow --<
Máquina HTB 'Forest' de referencia (DCSync) -->
Máquina HTB 'Blackfield' de referencia (NTDS.dit) -->
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
Export LSASS ->
La transferencia web es la forma más común en la que la mayoría de la gente transfiere archivos, ya que HTTP/HTTPS son los protocolos que normalmente están permitidos a través de los firewalls. Además, en muchos casos, el archivo viaja cifrado, lo cual es una gran ventaja. No hay nada peor que estar en un pentest y que el IDS del cliente detecte que hemos enviado un archivo sensible en texto plano, y que luego pregunten por qué mandamos una contraseña a nuestro servidor sin cifrado.
Ya vimos cómo usar el módulo uploadserver
de Python3 para montar un servidor web con capacidad de subida de archivos, pero también podemos usar Apache o Nginx. En esta parte, vamos a ver cómo montar un servidor web seguro para operaciones de subida de archivos.
Una buena alternativa a Apache para transferir archivos es Nginx, ya que su configuración es más sencilla y su sistema de módulos no genera tantos problemas de seguridad como puede ocurrir con Apache.
Cuando permitimos subidas por HTTP, es fundamental asegurarnos al 100% de que los usuarios no puedan subir shells web y ejecutarlos. Apache, por ejemplo, puede ser peligroso en este sentido, ya que su módulo de PHP tiende a ejecutar cualquier archivo que termine en .php
. En cambio, configurar PHP en Nginx no es tan directo, lo que en este contexto es una ventaja porque reduce el riesgo de ejecución automática.
Cree el archivo de configuración de Nginx creando el archivo /etc/nginx/sites-available/upload.conf
con el contenido:
Remove NginxDefault Configuration
Ahora podemos probar la carga usando cURL para enviar una solicitud PUT. En el siguiente ejemplo, subiremos el archivo /etc/passwd al servidor y lo llamaremos users.txt.
Una vez que esto funcione, una buena prueba es asegurarnos de que el listado de directorios no esté habilitado navegando a http://localhost/SecretUploadDirectory. Por defecto, con Apache, si encontramos un directorio sin un archivo de índice (index.html), listará todos los archivos. Esto es perjudicial para nuestro caso de exfilling de archivos, ya que la mayoría son sensibles por naturaleza y queremos hacer todo lo posible por ocultarlos. Gracias a que Nginx es minimalista, estas funciones no están habilitadas por defecto.
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 inlanefreight.htb
:
A continuación, veremos cómo realizar ataques Pass the Hash desde sistemas Windows y Linux.
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).
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
– El dominio al que pertenece el usuario. Si es una cuenta local, se puede usar el nombre del equipo, localhost
, o simplemente un punto (.
).
/run
– El programa que queremos ejecutar con el contexto del usuario (si no se especifica, se lanzará por defecto una cmd.exe
).
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.
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.
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, usuario@dominio
).
Hash
: Hash NTLM de la contraseña. Se acepta el formato LM:NTLM
o solo NTLM
.
Command
: Comando a ejecutar en el sistema objetivo. Si no se especifica ningún comando, la función verificará si las credenciales tienen acceso a WMI en la máquina remota.
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:
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.
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
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
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.
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)
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.
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.
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.
Las nuevas versiones de Windows bloquean el acceso de invitados no autenticados, como podemos ver en el siguiente comando:
You can't access this shared folder because your organization's security policies block unauthenticated guest access. These policies help protect your PC from unsafe or malicious devices on the network.
Para transferir archivos en este escenario, podemos establecer un nombre de usuario y una contraseña usando nuestro servidor SMB Impacket y montar el servidor SMB en nuestra máquina de destino de Windows:
Disponemos de diversas maneras de realizar una transferencias de archivos hacía la máquina objetivo a través de PowerShell.
El servicio Background Intelligent Transfer Service (BITS) puede usarse para descargar archivos desde sitios HTTP o recursos compartidos SMB. Este servicio tiene la ventaja de que descarga los archivos de forma "inteligente", tomando en cuenta la carga de la red y del sistema para minimizar el impacto en el trabajo del usuario.
Otra forma de transferir archivos es mediante FTP (File Transfer Protocol), que utiliza los puertos TCP/21 y TCP/20. Podemos utilizar el cliente FTP o PowerShell Net.WebClient para descargar archivos desde un servidor FTP.
Podemos configurar un servidor FTP en nuestro host de ataque utilizando el módulo pyftpdlib de Python3. Se puede instalar con el siguiente comando:
Una vez configurado el servidor FTP, podemos realizar transferencias de archivos utilizando el cliente FTP preinstalado desde Windows o PowerShell Net.WebClient.
Create a Command File for the FTP Client and Download the Target File
JavaScript es un lenguaje de programación que permite implementar funciones complejas en páginas web. Al igual que con otros lenguajes de programación, podemos usarlo para muchas cosas diferentes.
Podemos usar el siguiente comando desde un símbolo del sistema de Windows o una terminal de PowerShell para ejecutar nuestro código JavaScript y descargar un archivo.
Podemos usar el siguiente comando desde un símbolo del sistema de Windows o una terminal de PowerShell para ejecutar nuestro código VBScript y descargar un archivo.
Disponemos de diversas maneras de realizar una transferencias de archivos de la máquina objetivo hacía la nuestra a través de PowerShell.
SMB Server
Las nuevas versiones de Windows bloquean el acceso de invitados no autenticados, como podemos ver en el siguiente comando:
You can't access this shared folder because your organization's security policies block unauthenticated guest access. These policies help protect your PC from unsafe or malicious devices on the network.
Para transferir archivos en este escenario, podemos establecer un nombre de usuario y una contraseña usando nuestro servidor SMB Impacket y montar el servidor SMB en nuestra máquina de destino de Windows:
WebDAV
Anteriormente discutimos que las empresas suelen permitir el tráfico saliente a través de los protocolos HTTP (TCP/80) y HTTPS (TCP/443). Normalmente, las empresas no permiten el protocolo SMB (TCP/445) fuera de su red interna, ya que esto podría exponerlas a posibles ataques. Para más información sobre esto, podemos leer la publicación de Microsoft Preventing SMB traffic from lateral connections and entering or leaving the network.
Una alternativa es ejecutar SMB sobre HTTP con WebDAV. WebDAV (RFC 4918) es una extensión de HTTP, el protocolo de Internet que utilizan los navegadores y servidores web para comunicarse entre sí. El protocolo WebDAV permite que un servidor web funcione como un servidor de archivos, admitiendo la creación colaborativa de contenido. WebDAV también puede usar HTTPS.
Cuando se usa SMB, primero intentará conectarse mediante el protocolo SMB y, si no encuentra un recurso compartido SMB disponible, intentará conectarse a través de HTTP. En la siguiente captura de Wireshark, intentamos conectarnos al recurso compartido testing3 y, como no encontró nada con SMB, utilizó HTTP.
1 - Configuring WebDav Server
2 - Installing WebDav Python modules
3 - Using the WebDav Python module
4 - Connecting to the Webdav Share
Ahora podemos intentar conectarnos al recurso compartido utilizando el directorio DavWWWRoot. Desde CMD.
Otro método desde PowerShell
.
Comprobar que podemos listar la unidad que se nos ha asignado.
5 - Uploading Files using SMB
Subir archivos usando FTP es muy similar a descargar archivos. Podemos usar PowerShell o el cliente FTP para realizar la operación. Antes de iniciar nuestro servidor FTP utilizando el módulo de Python pyftpdlib, necesitamos especificar la opción --write para permitir que los clientes suban archivos a nuestro host de ataque.
Ahora usemos la función de carga de PowerShell para subir un archivo a nuestro servidor FTP.
PowerShell Upload File
Create a Command File for the FTP Client to Upload a File
Para crear una sesión de PowerShell Remoting en una computadora remota, necesitaremos acceso administrativo, ser miembro del grupo Remote Management Users
o tener permisos explícitos para PowerShell Remoting en la configuración de la sesión. Creemos un ejemplo y transfiramos un archivo de DC01
a DATABASE01
y viceversa.
Tenemos una sesión como Administrador en DC01
, el usuario tiene derechos administrativos en DATABASE01
y PowerShell Remoting
está habilitado. Usemos Test-NetConnection
para confirmar que podemos conectarnos a WinRM
.
Como esta sesión ya tiene privilegios sobre DATABASE01, no necesitamos especificar credenciales. En el ejemplo siguiente, se crea una sesión en la computadora remota denominada DATABASE01 y se almacenan los resultados en la variable denominada $Session.
Create a PowerShell Remoting Session to DATABASE01
Podemos usar el cmdlet Copy-Item para copiar un archivo de nuestra máquina local DC01 a la sesión DATABASE01 que tenemos $Session o viceversa.
DownloadFile --> Descarga datos de un recurso a un archivo local.
DownloadFileAsync --> Descarga datos de un recurso a un archivo local sin bloquear el hilo que lo llama.
Ejecutar directamente en memoria el script a través de IEX
.
Puede haber casos en los que la configuración inicial de Internet Explorer no se haya completado, lo que impide la descarga.
Esto se puede evitar utilizando el parámetro -UseBasicParsing
.
Otro error en las descargas de PowerShell está relacionado con el canal seguro SSL/TLS si el certificado no es de confianza. Podemos evitar ese error con el siguiente comando:
PowerShell no tiene una función integrada para operaciones de carga de archivos, pero podemos usar Invoke-WebRequest
o Invoke-RestMethod
para construir nuestra propia función de carga. También necesitaremos un servidor web que acepte cargas de archivos, ya que esta no es una opción predeterminada en la mayoría de los servidores web comunes.
Para nuestro servidor web, podemos usar uploadserver, un módulo extendido de Python HTTP.server, que incluye una página para la carga de archivos. Vamos a instalarlo y a iniciar el servidor web.
Installing a Configured WebServer with Upload
Ahora podemos usar un script de PowerShell llamado PSUpload.ps1
, que utiliza Invoke-RestMethod
para realizar las operaciones de carga. El script acepta dos parámetros:
-File
, que usamos para especificar la ruta del archivo.
-Uri
, que es la URL del servidor donde subiremos nuestro archivo.
Vamos a intentar subir el archivo hosts
desde nuestro sistema Windows.
Otra forma de usar PowerShell y archivos codificados en Base64 para cargas es combinando Invoke-WebRequest
o Invoke-RestMethod
con Netcat.
Usamos Netcat para escuchar en un puerto específico y recibir la solicitud POST con el archivo.
Luego, copiamos la salida y utilizamos la función de decodificación Base64 para convertir la cadena en un archivo.
Capturamos los datos en Base64 con Netcat y luego usamos la aplicación base64 con la opción de decodificación para convertir la cadena en un archivo.
RDP (Remote Desktop Protocol) se utiliza habitualmente en redes Windows para el acceso remoto. Podemos transferir archivos mediante RDP copiando y pegando. Podemos hacer clic derecho y copiar un archivo desde la máquina Windows a la que nos conectamos y pegarlo en la sesión RDP.
Si estamos conectados desde Linux, podemos utilizar xfreerdp
o rdesktop
. En el momento de redactar este artículo, xfreerdp
y rdesktop
permiten copiar desde nuestra máquina de destino a la sesión RDP, pero puede haber situaciones en las que esto no funcione como se espera.
Como alternativa a copiar y pegar, podemos montar un recurso local en el servidor RDP de destino. rdesktop
o xfreerdp
se pueden utilizar para exponer una carpeta local en la sesión RDP remota.
Para acceder al directorio, podemos conectarnos a \\tsclient
, lo que nos permitirá transferir archivos hacia y desde la sesión RDP.
Alternativamente, desde Windows, se puede utilizar el cliente de escritorio remoto nativo mstsc.exe
.
Después de seleccionar la unidad, podremos interactuar con ella en la sesión remota que sigue.
Nota: Esta unidad no es accesible para ningún otro usuario que haya iniciado sesión en la computadora de destino, incluso si logra secuestrar la sesión RDP.
Durante una auditoría, muchas veces tenemos acceso a información sensible como listas de usuarios, credenciales (por ejemplo, al descargar el archivo NTDS.dit para crackeo offline), datos de enumeración que revelan detalles clave de la infraestructura de red o del entorno de Active Directory, entre otros. Por eso, es fundamental cifrar esa información o usar conexiones seguras como SSH, SFTP o HTTPS siempre que sea posible.
Sin embargo, a veces no tenemos acceso a esos canales cifrados y toca buscar otra forma de proteger los datos. En esos casos, cifrar los archivos antes de transferirlos es una buena práctica para evitar que puedan ser leídos si son interceptados.
Se pueden usar muchos métodos diferentes para cifrar archivos e información en sistemas Windows. Uno de los más sencillos es el script de PowerShell Invoke-AESEncryption.ps1. Este script es pequeño y permite cifrar archivos y cadenas.
Se pueden usar muchos métodos diferentes para cifrar archivos e información en sistemas Windows. Uno de los más sencillos es el script de PowerShell Invoke-AESEncryption.ps1. Este script es pequeño y permite cifrar archivos y cadenas.
Podemos usar cualquiera de los métodos de transferencia de archivos mostrados anteriormente para transferir este archivo al host de destino. Una vez transferido el script, solo es necesario importarlo como módulo, como se muestra a continuación.
Tras importar el script, este puede cifrar cadenas o archivos, como se muestra en los siguientes ejemplos. Este comando crea un archivo cifrado con el mismo nombre que el archivo cifrado, pero con la extensión ".aes".
Es fundamental utilizar contraseñas de cifrado muy seguras y únicas para cada empresa donde se realice una prueba de penetración. Esto evita que archivos e información confidenciales se descifren con una sola contraseña que podría haber sido filtrada y descifrada por un tercero.
Desde nuestro equipo atacante, deberemos de disponer del binario nc.exe. Lo compartiremos al equipo víctima a través de un servidor web o SMB. Una vez subido el binario en una ruta, nos otorgaremos una Reverse Shell con nc.exe.
También podemos disponer del binario de nc.exe en nuestro servidor SMB y ejecutar el binario para otorgarnos una Reverse Shell accediendo al mismo recuso compartido desde el equipo víctima.
Invoke-PowerShellTcp.ps1
Desde la siguiente página, podemos generar diferentes tipos de Reverse Shell. El más recomendado en el caso de Windows, es el de PowerShell Base64.
Estableceremos nuestra dirección IP y el puerto donde estaremos en escucha. Del resultado generado, es el comando que deberá ejecutar la víctima.
Proceso para ejecutar la Reverse Shell de revshells.
For example:
Will generate the payload:
This option will create a payload file, by default named revshell.ps1
(which is the obfuscated payload from revshell
command written into a file), and expose it into a temporal HTTP server (by default on port 8000
, which can be changed as well). The script will then generate an encoded payload that will request the file to the temporal server, executes it and triggers the reverse shell.
For example:
Will generate the payload:
Executing it on the victim machine will make a request to the HTTP server exposed and the payload file.
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.
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
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.
La detección de comandos en línea basada en listas negras es fácil de evadir, incluso usando una simple ofuscación con mayúsculas y minúsculas. Sin embargo, aunque crear una lista blanca de todos los comandos permitidos en un entorno puede llevar tiempo al principio, es una solución muy robusta que permite detectar y alertar rápidamente sobre comandos inusuales.
La mayoría de los protocolos cliente-servidor requieren que el cliente y el servidor negocien cómo se entregará el contenido antes de intercambiar información. Esto es común en el protocolo HTTP
. Existe la necesidad de interoperabilidad entre diferentes servidores web y navegadores para asegurar que los usuarios tengan la misma experiencia sin importar el navegador que usen. Los clientes HTTP
suelen identificarse por su cadena User-Agent, que el servidor usa para saber qué cliente se está conectando, por ejemplo, Firefox, Chrome, etc.
Los User-Agent no solo se usan para identificar navegadores web, sino que cualquier cosa que actúe como cliente HTTP
y se conecte a un servidor puede tener su propia cadena User-Agent (por ejemplo, cURL
, un script en Python
, o herramientas como sqlmap
o Nmap
).
Las transferencias de archivos maliciosas también pueden detectarse a través de su User-Agent. A continuación, se muestran los User-Agent y cabeceras observadas en técnicas comunes de transferencia HTTP
(probado en Windows 10, versión 10.0.14393, con PowerShell 5).
Invoke-WebRequest - Client
Invoke-WebRequest - Server
WinHttpRequest - Client
WinHttpRequest - Server
Msxml2 - Client
Msxml2 - Server
Certutil - Client
Certutil - Server
BITS - Client
BITS - Server
Esta sección apenas comienza con la detección de transferencias de archivos maliciosas. Sería un excelente punto de partida para cualquier organización crear una lista blanca de binarios permitidos o una lista negra de binarios que se sabe que se utilizan con fines maliciosos. Además, la búsqueda de cadenas de agente de usuario anómalas puede ser una excelente manera de detectar un ataque en curso. Abordaremos las técnicas de búsqueda y detección de amenazas en profundidad en módulos posteriores.
Si los administradores o defensores han bloqueado alguno de estos User-Agent, el comando Invoke-WebRequest
tiene un parámetro llamado -UserAgent
que permite cambiar el valor por defecto. Podemos poner uno que imite a Internet Explorer, Firefox, Chrome, Opera o Safari.
Por ejemplo, si en la red del cliente todo el tráfico web pasa por Chrome, usar ese User-Agent puede hacer que la petición parezca legítima y así pasar más desapercibidos.
Listing out User Agents
Invocar Invoke-WebRequest para descargar nc.exe mediante un agente de usuario de Chrome:
Request with Chrome User Agent
El uso de whitelisting de aplicaciones puede impedirnos ejecutar herramientas como PowerShell o Netcat, y además, el registro de comandos puede alertar a los defensores de nuestra actividad. En estos casos, una opción útil es recurrir a un LOLBIN (Living Off The Land Binary), también conocidos como binarios de confianza mal ubicada.
Un ejemplo de LOLBIN es el GfxDownloadWrapper.exe, que forma parte de los drivers de gráficos de Intel en Windows 10. Este binario ya viene instalado en algunos sistemas y tiene la capacidad de descargar archivos de configuración de forma periódica. Podemos aprovechar esa funcionalidad para descargar archivos de forma encubierta con un simple comando como:
Transferring File with GfxDownloadWrapper.exe
Ese tipo de binario (como GfxDownloadWrapper.exe
) puede estar permitido por las políticas de whitelisting y además no generar alertas, ya que es legítimo y forma parte del sistema.
Sudoers Privileges
SUID
Variables de entorno
Puertos internos
Grupos
Versión del Kernel
Capabilities
El siguiente repositorio nos proporciona el siguiente script para crear una configuración en Nginx
maliciosa. El siguiente script realizará una configuración de Nginx
que habilite una página web por el puerto 1338
. Se indicará que el servidor tenga capacidad para realizar un listado de directorios (directory listing
) en el directorio raíz (/
), dado que el usuario que ejecuta Nginx es root
. Esto nos permitirá listar los archivos del sistema sin restricciones.
Además, se habilitará el método PUT
para que se puedan subir contenidos a través de la página web vulnerable que estamos montando. Una vez configurado, cargaremos la configuración del sitio web vulnerable.
Le daremos permisos de ejecución al script realizado y a ejecutarlo para levantar el sitio web vulnerable.
Accederemos al sitio web vulnerable http://<VICTIM_IP>:1338 y verificaremos que disponemos del acceso a listar los directorios del equipo desde la raíz /
.
Al verificar esto, si el servicio de SSH
se encuentra expuesto, el objetivo será crear en nuestra máquina atacante una clave pública que subiremos a través del método PUT
al servidor web vulnerable en la ruta /root/.ssh/authorized_keys
.
Mostraremos el contenido de la clave pública id_rsa.pub
que hemos generado en nuestra máquina y a través de la herramienta cURL
subiremos este contenido dentro del archivo authorized_keys
, esto con el objetivo de que nuestra clave pública se encuentre permitida en la máquina pública y nos podamos conectar como usuario root
sin proporcionar credenciales.
Procederemos a conectarnos mediante SSH
con el usuario root
en la máquina víctima. En este ejemplo, la IP de la máquina víctima es 10.10.10.10.
Al revisar si el usuario que disponemos tiene algún privilegio de sudoers
, nos encontramos que puede ejecutar como usuarioroot
el binario /usr/bin/mosh-server
.
Al ejecutar el servidor Mosh como root
, ahora el usuario hacker
tiene una shell con permisos de root
. Esto permite al atacante acceder a todos los recursos del sistema con permisos completos, incluyendo la capacidad de modificar archivos, instalar software, y ejecutar comandos con total libertad.
Básicamente, lo que realizamos es montar un servidor Mosh
con privilegios de root
en el localhost
, para así lograr obtener acceso como usuario root
.
En este ejemplo, el usuario llamado hacker
dispone del privilegio sudoers sobre el binario de PrusaSlicer
que en este caso se encuentra instalado en /opt/PrusaSlicer/prusaslicer
.
Nos descargaremos el siguiente proyecto de GitHub en nuestro equipo atacante.
Editaremos el archivo exploit.sh
para establecer nuestra dirección IP de atacante y el puerto desde donde estaremos en escucha. Levantaremos un servidor web para transferir estos archivos al equipo víctima.
Desde el equipo víctima, nos descargaremos los archivos exploit.sh
y evil.3mf
. En nuestro caso la dirección IP de atacante es la 10.10.16.5.
Desde una terminal de nuestro equipo, nos pondremos en escucha por el puerto especificado en el payload para recibir la Reverse Shell.
Realizaremos la explotación para abusar de este permiso de sudoers del binario.
Revisamos que hemos logrado obtener acceso al equipo como usuario root
, ya que es quien lo ha ejecutado al disponer de permisos de sudo
sobre el binario indicado que ha sido aprovechado para ejecutar la Reverse Shell.
En el siguiente blog, se especifica como podemos abusar de este privilegio de sudoers. Además de un PoC sencillo.
Opción 1 --> sobreescribir /etc/passwd
para añadir nuevo usuario root
En el PoC del blog mencionado, se nos informa que disponiendo de ambos permisos de sudoers
, podemos intentar sobreescribir el archivo /etc/passwd
para añadir una nueva entrada de un nuevo usuario root
con una contraseña asignada por nosotros mismos.
En este caso, lo que realizaremos es copiar la entrada de nuestro /etc/passwd
para tener la estructura de lo que deberemos añadir en el archivo de la máquina víctima.
Una vez tengamos la entrada de plantilla, lo que deberemos realizar es crear una contraseña en el formato de OpenSSL
. Deberemos de reemplazar el valor x
por el de la contraseña generada, para lograr obtener el siguiente resultado --> root:$1$Gow86CXS$sHAPSqpiT4xePLCPO147m1:0:0:root:/root:/bin/bash
Inyectaremos la entrada root
falsificada en un nuevo comentario de regla de e, verificaremos que se encuentra añadida esta línea en las reglas de iptables
y sobreescribiremos el archivo /etc/passwd
para añadir esta nueva entrada del usuario root
. Verificaremos si podemos acceder con este nuevo usuario root
y la contraseña asignada.
Opción 2 --> sobreescribir /root/.ssh/authorized_keys
para añadir nuestra clave pública SSH
Buscando otras maneras de aprovecharnos de estos privilegios de sudoers
, pensamos en subir nuestra clave pública SSH al archivo authorized_keys
del usuario root.
En un principio no deberíamos tener problemas al ejecutar el iptables && iptables-save
con permisos de sudo
.
Generaremos una nueva clave pública SSH en nuestro equipo atacante.
Copiaremos nuestra clave SSH pública .
Volveremos a realizar el PrivEsc aprovechándonos de estos permisos de sudoers
. En este caso, crearemos un nuevo comentario que contenga nuestra clave SSH pública. Revisaremos que nos aparece el comentario en las reglas de iptables
, y sobreescribiremos el archivo mencionado.
Al intentar acceder mediante SSH con el usuario root
, comprobamos que no se solicita credenciales. Al subir nuestra clave pública SSH al archivo /root/.ssh/authorized_keys
, logramos conectarnos sin necesidad de proporcionar una contraseña, ya que la clave pública almacenada en ese archivo se comunica directamente con nuestra clave privada.
Leer archivos privilegiados del sistema (LFI)
Obtener ejecución de comandos (RCE)
Manual
Durante una auditoría, muchas veces tenemos acceso a información sensible como listas de usuarios, credenciales (por ejemplo, al descargar el archivo NTDS.dit para crackeo offline), datos de enumeración que revelan detalles clave de la infraestructura de red o del entorno de Active Directory, entre otros. Por eso, es fundamental cifrar esa información o usar conexiones seguras como SSH, SFTP o HTTPS siempre que sea posible.
Sin embargo, a veces no tenemos acceso a esos canales cifrados y toca buscar otra forma de proteger los datos. En esos casos, cifrar los archivos antes de transferirlos es una buena práctica para evitar que puedan ser leídos si son interceptados.
OpenSSL se incluye frecuentemente en distribuciones de Linux, y los administradores de sistemas lo utilizan para generar certificados de seguridad, entre otras tareas. OpenSSL permite enviar archivos al estilo "nc" para cifrarlos.
Para cifrar un archivo con openssl, podemos seleccionar diferentes cifrados; consulte la página del manual de OpenSSL. Usemos -aes256 como ejemplo. También podemos anular el número de iteraciones predeterminado con la opción -iter 100000 y añadir la opción -pbkdf2 para usar el algoritmo de la Función de Password-Based Key Derivation Function 2. Al pulsar Intro, necesitaremos proporcionar una contraseña.
Recuerde usar una contraseña segura y única para evitar ataques de fuerza bruta si alguien no autorizado obtiene el archivo. Para descifrarlo, podemos usar el siguiente comando:
Podemos usar cualquiera de los métodos anteriores para transferir este archivo, pero se recomienda usar un método de transporte seguro como HTTPS, SFTP o SSH.
Durante una auditoría, muchas veces tenemos acceso a información sensible como listas de usuarios, credenciales (por ejemplo, al descargar el archivo NTDS.dit para crackeo offline), datos de enumeración que revelan detalles clave de la infraestructura de red o del entorno de Active Directory, entre otros. Por eso, es fundamental cifrar esa información o usar conexiones seguras como SSH, SFTP o HTTPS siempre que sea posible.
Sin embargo, a veces no tenemos acceso a esos canales cifrados y toca buscar otra forma de proteger los datos. En esos casos, cifrar los archivos antes de transferirlos es una buena práctica para evitar que puedan ser leídos si son interceptados.
Debido a la forma en que funciona Linux y cómo operan las tuberías (pipes), la mayoría de las herramientas que usamos en Linux pueden ser utilizadas para replicar operaciones sin archivos, lo que significa que no necesitamos descargar un archivo para ejecutarlo.
Nota: Algunos payloads, como mkfifo
, escriben archivos en el disco. Ten en cuenta que, aunque la ejecución del payload pueda ser sin archivos cuando usas una tubería, dependiendo del payload elegido, puede crear archivos temporales en el sistema operativo.
Tomemos el comando cURL
que usamos, y en lugar de descargar LinEnum.sh
, lo ejecutaremos directamente utilizando una tubería.
Fileless Download with cURL
Fileless Download with wget
También puede haber situaciones en las que ninguna de las herramientas de transferencia de archivos más conocidas esté disponible. Siempre y cuando se tenga instalada una versión de Bash 2.04 o superior (compilada con --enable-net-redirections
), se puede utilizar el archivo de dispositivo incorporado /dev/TCP
para realizar descargas simples de archivos.
Connect to the Target Webserver
HTTP GET Request
Print the Response
SSH
(o Secure Shell) es un protocolo que permite el acceso seguro a computadoras remotas. La implementación de SSH incluye una utilidad SCP para la transferencia remota de archivos que, por defecto, utiliza el protocolo SSH.
SCP
(secure copy) es una utilidad de línea de comandos que permite copiar archivos y directorios entre dos hosts de manera segura. Podemos copiar nuestros archivos desde la máquina local a servidores remotos y desde servidores remotos a nuestra máquina local.
SCP
es muy similar al comando cp
o copy
, pero en lugar de proporcionar una ruta local, necesitamos especificar un nombre de usuario, la dirección IP remota o el nombre DNS, y las credenciales del usuario.
Enabling and Starting the SSH Server
Checking for SSH Listening Port
Ahora podemos comenzar a transferir archivos.
Linux - Downloading Files Using SCP
Nota: Puedes crear una cuenta de usuario temporal para transferencias de archivos y evitar usar tus credenciales principales o claves en un ordenador remoto.
Python es un lenguaje de programación muy popular. Actualmente, se admite la versión 3, pero es posible que encontremos servidores en los que aún exista la versión 2.7 de Python. Python puede ejecutar comandos de una sola línea desde una línea de comandos del sistema operativo utilizando la opción -c. Veamos algunos ejemplos:
En el siguiente ejemplo, utilizaremos el módulo PHP file_get_contents()
para descargar contenido de un sitio web combinado con el módulo file_put_contents()
para guardar el archivo en un directorio. PHP se puede utilizar para ejecutar comandos de una sola línea desde una línea de comandos del sistema operativo utilizando la opción -r.
Una alternativa a file_get_contents()
y file_put_contents()
es el módulo fopen()
. Podemos utilizar este módulo para abrir una URL, leer su contenido y guardarlo en un archivo.
También podemos enviar el contenido descargado a una tubería, similar al ejemplo sin archivos que ejecutamos en la sección anterior usando cURL y wget.
Lo primero que necesitamos hacer es instalar el módulo uploadserver
.
Start Web Server
Ahora necesitamos crear un certificado. En este ejemplo, estamos utilizando un certificado autofirmado.
Create a Self-Signed Certificate
Start Web Server
Linux - Upload Multiple Files
Utilizamos la opción --insecure porque usamos un certificado autofirmado en el que confiamos.
Web Upload without certificate
Dado que las distribuciones de Linux suelen tener Python o PHP instalados, iniciar un servidor web para transferir archivos es muy sencillo. Además, si el servidor que hemos comprometido es un servidor web, podemos mover los archivos que queremos transferir al directorio del servidor web y acceder a ellos desde la página web.
Es posible configurar un servidor web usando varios lenguajes. Una máquina Linux comprometida puede no tener un servidor web instalado. En tales casos, podemos usar un servidor web miniatura. Lo que quizás les falte en seguridad, lo compensan con flexibilidad, ya que la ubicación del webroot y los puertos de escucha se pueden cambiar rápidamente.
Linux - Creating a Web Server with Python3
Linux - Creating a Web Server with Python2.7
Linux - Creating a Web Server with PHP
Linux - Creating a Web Server with Ruby
Download the File from the Target Machine
Nota: Cuando iniciamos un nuevo servidor web usando Python o PHP, es importante tener en cuenta que el tráfico entrante puede estar bloqueado. Estamos transfiriendo un archivo desde nuestro objetivo a nuestro host de ataque, pero no estamos subiendo el archivo.
Es posible que encontremos algunas empresas que permitan el protocolo SSH (TCP/22) para conexiones salientes, y si ese es el caso, podemos usar un servidor SSH con la utilidad scp
para subir archivos. Intentemos subir un archivo a la máquina objetivo utilizando el protocolo SSH.
File Upload using SCP
Nota: Recuerda que la sintaxis de scp
es similar a la de cp
o copy
.
Si queremos subir un archivo, necesitamos entender las funciones de un lenguaje de programación en particular para realizar la operación de subida. El módulo de solicitudes de Python3 permite enviar solicitudes HTTP (GET, POST, PUT, etc.) mediante Python. Podemos utilizar el siguiente código si queremos subir un archivo a nuestro servidor de subida de Python3.
Dividamos esta línea en varias líneas para comprender mejor cada parte.
Dividamos esta línea en varias líneas para comprender mejor cada parte.
ES POSIBLE QUE SE NECESITE INSTALAR EN EL EQUIPO VÍCTIMA LA SIGUIENTE GEMA QUE NO VIENE POR DEFECTO INSTALADA EN EL SISTEMA.
gem install multipart-post
Dividamos esta línea en varias líneas para comprender mejor cada parte.
Dividamos esta línea en varias líneas para comprender mejor cada parte.
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.
Un Ticket Granting Ticket (TGT), que se utiliza para solicitar tickets de servicio y así acceder a cualquier recurso para el cual el usuario tenga privilegios.
Antes de realizar un ataque Pass the Ticket (PtT), vamos a ver algunos métodos para obtener un ticket utilizando Mimikatz y Rubeus.
Imaginemos que estamos en un pentest y logramos hacer phishing a un usuario, obteniendo acceso a su equipo. Además, encontramos una forma de escalar privilegios y ahora contamos con permisos de administrador local en esa máquina. Con este nivel de acceso, podemos explorar varias formas de obtener tickets Kerberos existentes y también crear nuevos tickets. Veamos algunas de las opciones:
Los tickets que terminan con $ corresponden a cuentas de equipo, ya que estas también necesitan un ticket para interactuar con Active Directory. Los tickets de usuario llevan el nombre del usuario, seguido de una @ que separa el nombre del servicio y el dominio. Por ejemplo:
[randomvalue]-username@service-domain.local.kirbi
.
Nota: Al momento de escribir esto, usando Mimikatz versión 2.2.0 20220919, si ejecutamos sekurlsa::ekeys
, se muestran todos los hashes como des_cbc_md4 en algunas versiones de Windows 10. Los tickets exportados con sekurlsa::tickets /export
pueden no funcionar correctamente debido al cifrado incorrecto. Aun así, es posible usar esos hashes para generar nuevos tickets o utilizar Rubeus para exportar los tickets en formato base64.
También podemos exportar tickets usando Rubeus con la opción dump
. Esta opción permite volcar todos los tickets (si tenemos privilegios de administrador local). A diferencia de Mimikatz, Rubeus dump
no genera archivos, sino que imprime el ticket directamente en formato base64. Podemos añadir la opción /nowrap
para facilitar el copiado y pegado.
Nota: Para recolectar todos los tickets, necesitamos ejecutar Mimikatz o Rubeus con privilegios de administrador.
Este es un método común para recuperar tickets desde una máquina. Una de las ventajas de abusar de los tickets Kerberos es que también podemos forjar nuestros propios tickets.
Veamos cómo podemos hacerlo utilizando la técnica OverPass the Hash o también conocida como Pass the Key.
La técnica tradicional de Pass the Hash (PtH) consiste en reutilizar un hash de contraseña NTLM y no interactúa con Kerberos. En cambio, la técnica Pass the Key o OverPass the Hash convierte un hash o clave (como rc4_hmac
, aes256_cts_hmac_sha1
, etc.) de un usuario unido al dominio en un Ticket-Granting-Ticket (TGT) completo.
Esta técnica fue desarrollada por Benjamin Delpy y Skip Duckwall en su presentación Abusing Microsoft Kerberos - Sorry you guys don't get it. Más adelante, Will Schroeder adaptó ese trabajo y creó la herramienta Rubeus.
Para forjar nuestros propios tickets, necesitamos tener el hash del usuario. Podemos usar Mimikatz para volcar todas las claves de cifrado Kerberos de los usuarios con el módulo:
Este módulo enumerará todos los tipos de claves disponibles para el paquete Kerberos.
Ahora que ya tenemos acceso a las claves AES256_HMAC y RC4_HMAC, podemos llevar a cabo el ataque OverPass the Hash o Pass the Key utilizando Mimikatz o Rubeus.
Esto generará una nueva ventana de cmd.exe que podremos usar para solicitar acceso a cualquier servicio que queramos, ya en el contexto del usuario objetivo.
Para forjar un ticket usando Rubeus, podemos utilizar el módulo asktgt
junto con el nombre de usuario, el dominio y el hash correspondiente, que puede ser /rc4
, /aes128
, /aes256
o /des
.
En el siguiente ejemplo usamos el hash aes256 obtenido previamente con Mimikatz usando sekurlsa::ekeys
:
Ahora que ya tenemos algunos tickets Kerberos, podemos usarlos para movernos lateralmente dentro del entorno.
Con Rubeus, realizamos un ataque OverPass the Hash y recuperamos el ticket en formato base64. Sin embargo, en lugar de simplemente mostrar el ticket, también podemos usar la opción /ptt
para inyectarlo directamente (ya sea un TGT o un TGS) en la sesión de inicio actual.
Esto nos permite actuar como el usuario comprometido y acceder a recursos dentro del dominio sin necesidad de autenticarnos con su contraseña.
Hay que notar que ahora aparece el mensaje Ticket successfully imported!, lo que indica que el ticket se ha inyectado correctamente en la sesión actual.
Otra forma de hacerlo es importar el ticket manualmente desde el disco, usando un archivo .kirbi
previamente exportado.
También podemos usar la salida en base64 generada por Rubeus, o convertir un archivo .kirbi
a base64, para llevar a cabo un ataque Pass the Ticket.
Nota: Cambiar [0;6c680]-2-0-40e10000-plaintext@krbtgt-inlanefreight.htb.kirbi
por el ticket correspondiente.
Con Rubeus, también podemos realizar un ataque Pass the Ticket proporcionando directamente la cadena en base64 en lugar del nombre del archivo .kirbi
.
Finalmente, también podemos realizar el ataque Pass the Ticket utilizando el módulo kerberos::ptt
de Mimikatz, importando directamente el archivo .kirbi
que contiene el ticket que queremos inyectar.
PowerShell Remoting nos permite ejecutar scripts o comandos en un equipo remoto. Los administradores suelen usarlo para gestionar equipos en la red.
Al habilitar PowerShell Remoting, se crean listeners tanto HTTP como HTTPS. El listener se ejecuta en el puerto estándar TCP/5985 para HTTP y TCP/5986 para HTTPS.
Para crear una sesión remota de PowerShell en otro equipo, debemos tener permisos de administrador, ser miembros del grupo Remote Management Users, o tener permisos explícitos de PowerShell Remoting en la configuración de la sesión.
Supongamos que encontramos una cuenta de usuario que no tiene privilegios de administrador en el equipo remoto, pero sí es miembro del grupo Remote Management Users. En ese caso, podemos usar PowerShell Remoting para conectarnos a ese equipo y ejecutar comandos.
Para usar PowerShell Remoting junto con Pass the Ticket, podemos usar Mimikatz para importar nuestro ticket Kerberos y luego abrir una consola de PowerShell para conectarnos a la máquina objetivo.
Primero, abrimos una nueva ventana de cmd.exe
y ejecutamos mimikatz.exe
. Luego importamos el ticket que recolectamos usando:
Una vez que el ticket esté importado en la sesión de cmd.exe
, lanzamos una consola de PowerShell desde esa misma ventana con powershell
.
Finalmente, usamos el comando:
Esto nos permite conectarnos a la máquina remota aprovechando el ticket Kerberos inyectado, sin necesidad de ingresar credenciales.
Mimikatz - Pass the Ticket for Lateral Movement
Rubeus tiene la opción createnetonly
, que crea un proceso o sesión de inicio de sesión "sacrificial" (tipo de logon 9). Este proceso está oculto por defecto, pero podemos usar el flag /show
para mostrarlo. El resultado es equivalente a ejecutar runas /netonly
.
Esto evita que se sobrescriban o eliminen los TGTs existentes de la sesión de inicio actual.
Create a Sacrificial Process with Rubeus
El comando anterior abrirá una nueva ventana de cmd
. Desde esa ventana, podemos ejecutar Rubeus para solicitar un nuevo TGT usando la opción /ptt
, lo que inyectará el ticket en la sesión actual.
Una vez hecho esto, ya podremos conectarnos al Domain Controller usando PowerShell Remoting dentro de esa misma sesión.
Rubeus - Pass the Ticket for Lateral Movement
Desde nuestra máquina configuramos un listener para recibir la conexión inversa. Usando el comando:
Abrimos el puerto 443, que se asocia normalmente al tráfico HTTPS. De este modo, el firewall podría interpretar la conexión como una solicitud legítima a una página web, lo que ayuda a disimular la actividad. Cuando la máquina víctima se conecta, obtenemos una shell interactiva para ejecutar comandos remotamente.
Una vez que tenemos una reverse shell, es vital configurar una TTY interactiva para trabajar de forma cómoda y segura. De esta manera, evitamos cerrar la conexión accidentalmente y ganamos la facilidad de desplazarnos con las flechas o utilizar el tab para autocompletar rutas. El proceso es muy sencillo: solo hay que ajustar la tty siguiendo estos pasos para obtener una sesión más fluida y robusta.
Desde la reverse shell obtenida, script /dev/null -c bash
transforma la sesión en una TTY interactiva.
A continuación, hacemos Ctrl+Z
para suspender la Reverse Shell.
Desde la reverse shell, con stty raw -echo; fg
recuperamos la sesión en primer plano y reset xterm
restablece la terminal para una experiencia interactiva óptima.
Exportamos las variables para que la terminal y la shell funcionen correctamente:
export TERM=xterm
corrige el valor por defecto de TERM (a veces aparece como "dump") y permite usar atajos de teclado.
export SHELL=bash
fuerza a que la shell sea bash.
Desde nuestra máquina revisaremos las dimensiones de nuestra terminal para ajustarlas en la máquina víctima.
Desde la máquina configuraremos la terminal con los valores de nuestra terminal. En el caso anterior, como ejemplo nos devolvió 40 filas y 230 columnas, el comando sería el siguiente.
El comando anterior debe ejecutarse desde un script.
El comando anterior debe ejecutarse desde un script.
El comando anterior debe ejecutarse desde un script.
La búsqueda de credenciales es uno de los primeros pasos una vez que tenemos acceso al sistema. Estos frutos maduros pueden darnos privilegios elevados en cuestión de segundos o minutos. Entre otras cosas, esto es parte del proceso de escalada de privilegios local que cubriremos aquí. Sin embargo, es importante señalar aquí que estamos lejos de cubrir todas las situaciones posibles y por lo tanto nos centramos en los diferentes enfoques.
Podemos imaginar que hemos conseguido acceder a un sistema a través de una aplicación web vulnerable y, por lo tanto, hemos obtenido una shell inversa, por ejemplo. Por lo tanto, para escalar nuestros privilegios de la forma más eficiente, podemos buscar contraseñas o incluso credenciales completas que podamos utilizar para iniciar sesión en nuestro objetivo. Hay varias fuentes que pueden proporcionarnos credenciales que clasificamos en cuatro categorías.
Estas incluyen, pero no se limitan a:
Enumerar todas estas categorías nos permitirá aumentar la probabilidad de averiguar con cierta facilidad las credenciales de los usuarios existentes en el sistema. Existen innumerables situaciones diferentes en las que siempre veremos resultados distintos. Por lo tanto, debemos adaptar nuestro enfoque a las circunstancias del entorno y tener en cuenta el panorama general. Sobre todo, es crucial tener en cuenta cómo funciona el sistema, su enfoque, para qué existe y qué papel desempeña en la lógica empresarial y en la red global.
Por ejemplo, supongamos que se trata de un servidor de base de datos aislado. En ese caso, no necesariamente encontraremos allí usuarios normales, ya que se trata de una interfaz sensible en la gestión de datos a la que sólo unas pocas personas tienen acceso.
Un principio básico de Linux es que todo es un archivo. Por lo tanto, es crucial tener este concepto en mente y buscar, encontrar y filtrar los archivos apropiados según nuestros requisitos. Debemos buscar, encontrar e inspeccionar varias categorías de archivos uno por uno. Estas categorías son las siguientes:
Los archivos de configuración son el núcleo de la funcionalidad de los servicios en las distribuciones Linux. A menudo contienen incluso credenciales que podremos leer. Su conocimiento también nos permite entender cómo funciona el servicio y sus requisitos con precisión. Normalmente, los archivos de configuración están marcados con las siguientes tres extensiones de archivo (.config, .conf, .cnf). Sin embargo, estos archivos de configuración o los archivos de extensión asociados pueden renombrarse, lo que significa que estas extensiones de archivo no son necesariamente necesarias. Además, incluso al recompilar un servicio, se puede cambiar el nombre de archivo requerido para la configuración básica, lo que tendría el mismo efecto. Sin embargo, este es un caso raro con el que no nos encontraremos a menudo, pero esta posibilidad no debe quedar fuera de nuestra búsqueda.
La parte más crucial de cualquier enumeración de un sistema es obtener una visión general del mismo. Por lo tanto, el primer paso debe ser encontrar todos los posibles archivos de configuración del sistema, que luego podremos examinar y analizar individualmente con más detalle. Hay muchos métodos para encontrar estos archivos de configuración, y con el siguiente método, veremos que hemos reducido nuestra búsqueda a estas tres extensiones de archivo.
Opcionalmente, podemos guardar el resultado en un archivo de texto y utilizarlo para examinar los archivos individuales uno tras otro. Otra opción es ejecutar el análisis directamente para cada archivo encontrado con la extensión especificada y mostrar el contenido. En este ejemplo, buscamos tres palabras (user, password, pass) en cada fichero con extensión .cnf.
También podemos aplicar esta sencilla búsqueda a otras extensiones de archivo. Además, podemos aplicar este tipo de búsqueda a bases de datos almacenadas en archivos con diferentes extensiones de archivo, y luego podemos leerlas.
Dependiendo del entorno en el que nos encontremos y del propósito del host en el que estemos, a menudo podemos encontrar notas sobre procesos específicos del sistema. Éstas a menudo incluyen listas de diferentes puntos de acceso o incluso sus credenciales.
Sin embargo, a menudo es difícil encontrar notas de inmediato si están almacenadas en algún lugar del sistema y no en el escritorio o en sus subcarpetas. Esto se debe a que pueden llamarse como se quiera y no tienen por qué tener una extensión de archivo específica, como .txt. Por lo tanto, en este caso, tenemos que buscar archivos que incluyan la extensión de archivo .txt y archivos que no tengan ninguna extensión de archivo.
Los scripts son archivos que a menudo contienen información y procesos altamente sensibles. Entre otras cosas, también contienen las credenciales necesarias para poder llamar y ejecutar los procesos automáticamente. De lo contrario, el administrador o desarrollador tendría que introducir la contraseña correspondiente cada vez que se llamara al script o al programa compilado.
Cronjobs son ejecuciones independientes de comandos, programas, scripts. Se dividen en el área de todo el sistema (/etc/crontab) y ejecuciones dependientes del usuario. Algunas aplicaciones y scripts requieren credenciales para ejecutarse y, por lo tanto, se introducen incorrectamente en los cronjobs. Además, existen las áreas que se dividen en diferentes intervalos de tiempo (/etc/cron.daily, /etc/cron.hourly, /etc/cron.monthly, /etc/cron.weekly). Los scripts y archivos utilizados por cron también pueden encontrarse en /etc/cron.d/ para las distribuciones basadas en Debian.
Las claves SSH pueden considerarse «tarjetas de acceso» al protocolo SSH utilizado para el mecanismo de autenticación de clave pública. Se genera un archivo para el cliente (clave privada) y otro correspondiente para el servidor (clave pública). Sin embargo, éstas no son iguales, por lo que conocer la clave pública es insuficiente para encontrar una clave privada. La clave pública puede verificar las firmas generadas por la clave privada SSH y permitir así el inicio de sesión automático en el servidor. Aunque personas no autorizadas se hagan con la clave pública, es casi imposible calcular la privada coincidente a partir de ella. Al conectarse al servidor utilizando la clave privada SSH, el servidor comprueba si la clave privada es válida y permite al cliente iniciar la sesión en consecuencia. Así, ya no se necesitan contraseñas para conectarse a través de SSH.
Como las claves SSH pueden tener nombres arbitrarios, no podemos buscar en ellas nombres concretos. Sin embargo, su formato nos permite identificarlas unívocamente porque, ya sean de clave pública o de clave privada, ambas tienen primeras líneas únicas para distinguirlas.
Todos los archivos de historial proporcionan información crucial sobre el curso actual y pasado/histórico de los procesos. Nos interesan los archivos que almacenan el historial de comandos de los usuarios y los registros que almacenan información sobre los procesos del sistema.
En el historial de los comandos introducidos en las distribuciones de Linux que utilizan Bash como shell estándar, encontramos los archivos asociados en .bash_history. Sin embargo, otros archivos como .bashrc o .bash_profile pueden contener información importante.
Un concepto esencial de los sistemas Linux son los archivos de registro que se almacenan en archivos de texto. Muchos programas, especialmente todos los servicios y el propio sistema, escriben este tipo de archivos. En ellos encontramos errores del sistema, detectamos problemas relacionados con los servicios o seguimos lo que el sistema está haciendo en segundo plano. La totalidad de los archivos de registro se puede dividir en cuatro categorías:
Existen muchos registros diferentes en el sistema. Éstos pueden variar en función de las aplicaciones instaladas, pero he aquí algunos de los más importantes:
Cubrir el análisis de estos archivos de registro en detalle sería ineficaz en este caso. Así que en este punto, debemos familiarizarnos con los registros individuales, primero examinándolos manualmente y entendiendo sus formatos. Sin embargo, aquí hay algunas cadenas que podemos usar para encontrar contenido interesante en los registros:
Una herramienta aún más potente que podemos utilizar y que se mencionó anteriormente en la sección Caza de credenciales en Windows es LaZagne. Esta herramienta nos permite acceder a muchos más recursos y extraer las credenciales. Las contraseñas y hashes que podemos obtener provienen de las siguientes fuentes pero no se limitan a:
Por ejemplo, los Keyrings
se utilizan para almacenar y gestionar de forma segura las contraseñas en las distribuciones Linux. Las contraseñas se almacenan encriptadas y protegidas con una contraseña maestra. Se trata de un gestor de contraseñas basado en el sistema operativo, del que hablaremos más adelante en otra sección. De esta forma, no necesitamos recordar todas y cada una de las contraseñas y podemos guardar entradas de contraseñas repetidas.
Los navegadores almacenan las contraseñas guardadas por el usuario de forma cifrada localmente en el sistema para su reutilización. Por ejemplo, Mozilla Firefox almacena las credenciales cifradas en una carpeta oculta para el usuario correspondiente. Estas suelen incluir los nombres de campo, las URL y otra información valiosa.
Por ejemplo, al almacenar las credenciales de una página web en Firefox, estas se cifran y se almacenan en logins.json en el sistema. Sin embargo, esto no significa que estén seguras allí. Muchos empleados almacenan estos datos de inicio de sesión en su navegador sin sospechar que pueden descifrarse fácilmente y utilizarse en contra de la empresa.
La herramienta Firefox Decrypt
es excelente para descifrar estas credenciales y se actualiza periódicamente. Requiere Python 3.9 para ejecutar la última versión. De lo contrario, se debe usar Firefox Decrypt 0.7.0 con Python 2.
Decrypting Firefox Credentials
Normalmente es neceario disponer de los siguientes archivos:
Browsers - LaZagne
Alternativamente, LaZagne también puede devolver resultados si el usuario ha utilizado el navegador compatible.
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.
El siguiente código JavaScript se basa en esta y podemos descargar un archivo que lo utilice. Crearemos un archivo llamado wget.js
y guardaremos el siguiente contenido:
("Microsoft Visual Basic Scripting Edition") es un lenguaje Active Scripting desarrollado por Microsoft que sigue el modelo de Visual Basic. VBScript se ha instalado de forma predeterminada en todas las versiones de escritorio de Microsoft Windows desde Windows 98.
El siguiente ejemplo de VBScript se puede utilizar en base a . Crearemos un archivo llamado wget.vbs
y guardaremos el siguiente contenido:
Para configurar nuestro servidor WebDav, necesitamos instalar dos módulos de Python: wsgidav y cheroot (puedes leer más sobre esta implementación aquí: ). Después de instalarlos, ejecutamos la aplicación wsgidav en el directorio objetivo.
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.
Para buscar funciones de Download y Upload en podemos utilizar /download
o /upload
.
Generates an obfuscated PowerShell
reverse shell payload based on original .
Las organizaciones pueden tomar algunas medidas para identificar posibles cadenas de User-Agent sospechosas, comenzando por crear una lista de User-Agent legítimos conocidos, los que usan por defecto los procesos del sistema operativo, los que usan los servicios de actualización como Windows Update, actualizaciones de antivirus, etc. Estas listas pueden incorporarse a herramientas SIEM para hacer threat hunting, filtrar el tráfico legítimo y centrarse en las anomalías que podrían indicar actividad sospechosa. Cualquier User-Agent sospechoso puede ser investigado más a fondo para ver si se usó para llevar a cabo acciones maliciosas. Esta sirve para identificar cadenas de User-Agent comunes. se puede consultar una lista de User-Agent.
Existen otros binarios aún más comunes que se pueden aprovechar, y por eso vale la pena revisar el proyecto , donde se recopilan binarios legítimos de Windows que pueden ser usados para descargar archivos, ejecutar comandos, etc.
En Linux, el equivalente es el proyecto , que también merece la pena revisar. A día de hoy, GTFOBins documenta casi 40 binarios comunes que pueden usarse para transferencias de archivos y otras acciones útiles en post-explotación o evasión.
LinPeas:
LinEnum:
LES (Linux Exploit Suggester):
Linux Smart Enumeration:
Linux Priv Checker:
Como se mencionó en la sección de , podemos usar uploadserver
, un módulo extendido del módulo Python HTTP.Server
, que incluye una página de carga de archivos. Para este ejemplo en Linux, veamos cómo podemos configurar el módulo uploadserver
para usar HTTPS y así asegurar la comunicación.
Si queremos profundizar en la diferencia entre sekurlsa::pth
de Mimikatz y asktgt
de Rubeus, podemos consultar la documentación oficial de Rubeus en el apartado .
Muchas aplicaciones y procesos trabajan con credenciales necesarias para la autenticación y las almacenan en memoria o en archivos para poder reutilizarlas. Por ejemplo, pueden ser las credenciales requeridas por el sistema para los usuarios que inician sesión. Otro ejemplo son las credenciales almacenadas en los navegadores, que también pueden ser leídas. Para recuperar este tipo de información de las distribuciones Linux, existe una herramienta llamada que facilita todo el proceso. Sin embargo, esta herramienta requiere permisos de administrador/root.
Configs
Logs
Cache
Browser stored credentials
Databases
Command-line History
In-memory Processing
Notes
Scripts
Source codes
Cronjobs
SSH Keys
Scripts
Cronjobs
SSH keys
Application Logs
Event Logs
Service Logs
System Logs
Log File
Description
/var/log/messages
Generic system activity logs.
/var/log/syslog
Generic system activity logs.
/var/log/auth.log
(Debian) All authentication related logs.
/var/log/secure
(RedHat/CentOS) All authentication related logs.
/var/log/boot.log
Booting information.
/var/log/dmesg
Hardware and drivers related information and logs.
/var/log/kern.log
Kernel related warnings, errors and logs.
/var/log/faillog
Failed login attempts.
/var/log/cron
Information related to cron jobs.
/var/log/mail.log
All mail server related logs.
/var/log/httpd
All Apache related logs.
/var/log/mysqld.log
All MySQL server related logs.
Chromium-based
CLI
Mozilla
Thunderbird
Git
Env_variable
Grub
Fstab
AWS
Filezilla
Gftp
SSH
Apache
Shadow
Docker
KeePass
Mimipy
Sessions
Keyrings
SSH (Secure Shell o Secure Socket Shell) es un protocolo de red que permite una conexión segura a una computadora a través de una red no segura. Es esencial para mantener la confidencialidad e integridad de los datos al acceder a sistemas remotos.
Puerto por defecto
Autenticación con credenciales
Autenticación con clave privada
Puerto 139 es el canal que se utiliza en redes LAN para gestionar las sesiones de NetBIOS. Esto significa que, cuando una aplicación (como cliente) necesita comunicarse con otra (que actúa como servidor), lo hace a través de este puerto utilizando TCP. NetBIOS se encarga de que los dispositivos y aplicaciones se encuentren y se identifiquen en la red mediante nombres de hasta 16 caracteres, que pueden no coincidir con el nombre real del equipo.
En otras palabras, el puerto 139 es el punto de entrada para que las aplicaciones establezcan conexiones y compartan datos dentro de la red. Gracias a este protocolo, se facilita la transmisión de información y la localización de recursos, lo que resulta esencial en entornos donde la comunicación entre varios dispositivos es clave. Aunque en algunas configuraciones modernas se opta por otros métodos y puertos por temas de seguridad, el puerto 139 sigue siendo una parte importante en redes tradicionales y en ciertas aplicaciones que aún dependen de NetBIOS para funcionar correctamente.
El Puerto 445 se utiliza para implementar SMB (Server Message Blocks), también conocido en la actualidad como CIFS, sobre TCP/IP. Esto quiere decir que este puerto permite que dispositivos en una red compartan archivos, impresoras y otros recursos de manera directa.
A diferencia del Puerto 139, que opera con NetBIOS sobre IP (es decir, SMB a través de la capa adicional de NetBIOS), el Puerto 445 permite que SMB funcione directamente sobre TCP/IP. En entornos Windows, esto facilita la comunicación al eliminar la necesidad de NetBIOS, haciendo que el intercambio de datos sea más directo y eficiente.
Sin embargo, en otros sistemas o configuraciones que aún dependen de NetBIOS, es posible que se utilice el Puerto 139 para manejar SMB a través de esa capa extra. En resumen, el Puerto 445 ofrece una forma más moderna y optimizada de gestionar el intercambio de recursos en red, mientras que el Puerto 139 puede seguir en uso para mantener compatibilidad con sistemas antiguos o configuraciones específicas.
SMB es un protocolo cliente-servidor que facilita el acceso y compartición de recursos en red, como archivos, carpetas e impresoras. Se usa principalmente en entornos Windows, permitiendo la comunicación entre versiones modernas y antiguas, y gracias a Samba, también se implementa en Linux/Unix. Además, usa ACLs para asignar permisos específicos a usuarios o grupos, independientemente de los controles locales.
El acceso al recurso compartido IPC$ se puede obtener a través de una sesión nula anónima, permitiendo la interacción con servicios expuestos a través de tuberías con nombre. La utilidad enum4linux
es útil para este propósito. Utilizada correctamente, permite la adquisición de:
Información sobre el sistema operativo
Detalles sobre el dominio padre
Una compilación de usuarios y grupos locales
Información sobre los recursos compartidos SMB disponibles
La política de seguridad del sistema efectiva
Esta funcionalidad es crítica para los administradores de red y profesionales de seguridad para evaluar la postura de seguridad de los servicios SMB (Server Message Block) en una red. enum4linux
proporciona una vista completa del entorno SMB del sistema objetivo, lo cual es esencial para identificar vulnerabilidades potenciales y asegurar que los servicios SMB estén debidamente protegidos.
Verificar vulnerabilidades a través de Nmap
.
Dumping SAM
Dumping LSASS
Dumping NTDS.dit
El RID Cycling Attack se aprovecha del acceso a la compartición IPC$ para comunicarse con el servicio SAM mediante RPC. Esto permite iterar sobre los Relative Identifiers (RIDs) y, de ese modo, enumerar usuarios válidos en el sistema.
smbclient
psexec.py
smbexec.py
Impacket
CrackMapExec
Hay diferentes maneras de interactuar con una carpeta compartida en Windows, y exploraremos un par de ellas. En la interfaz gráfica de Windows, podemos presionar [WINKEY] + [R
] para abrir el cuadro de diálogo.
Ejecutar e introducir la ubicación del recurso compartido, por ejemplo: \\192.168.220.129\Finance\
Supongamos que la carpeta compartida permite la autenticación anónima o que nos autenticamos con un usuario con privilegios sobre ella. En ese caso, no recibiremos ninguna solicitud de autenticación y se mostrará el contenido de la carpeta compartida.
Si no tenemos acceso, recibiremos una solicitud de autenticación.
Windows tiene dos consolas de línea de comandos: Command Shell y PowerShell. Cada una es un programa que permite la comunicación directa entre nosotras y el sistema operativo o las aplicaciones, proporcionando un entorno para automatizar tareas administrativas.
Veamos algunos comandos para interactuar con recursos compartidos utilizando Command Shell (CMD) y PowerShell.
El comando dir
muestra una lista de los archivos y subdirectorios de un directorio.
El comando net use
conecta un equipo a un recurso compartido, lo desconecta o muestra información sobre las conexiones existentes. Podemos conectarnos a un recurso compartido y asignar su contenido a la letra de unidad n con el siguiente comando.
También podemos proporcionar un nombre de usuario y una contraseña para autenticarnos en el recurso compartido.
Una vez que la carpeta compartida está montada como la unidad N, podemos ejecutar comandos de Windows como si esta carpeta estuviera en nuestro propio equipo.
Veamos cuántos archivos contiene la carpeta compartida y sus subdirectorios.
Encontramos 29.302 archivos. Analicemos el comando:
dir
Application
n:
Directory or drive to search
/a-d
/a
is the attribute and -d
means not directories
/s
Displays files in a specified directory and all subdirectories
/b
Uses bare format (no heading information or summary)
El siguiente comando | find /c ":\\"
procesa la salida de dir n: /a-d /s /b
para contar cuántos archivos existen en el directorio y sus subdirectorios. Puedes usar dir /?
para ver la ayuda completa del comando.
Buscar entre 29,302 archivos puede llevar mucho tiempo, por eso usar scripts o herramientas de línea de comandos nos ayuda a agilizar el proceso. Con dir
podemos buscar nombres específicos dentro de los archivos, como por ejemplo:
cred
password
users
secrets
key
Y también extensiones comunes de código fuente como: .cs
, .c
, .go
, .java
, .php
, .asp
, .aspx
, .html
.
Si queremos buscar una palabra específica dentro de los archivos de texto, podemos usar el comando findstr
.
PowerShell fue diseñada para ampliar las capacidades de la consola de comandos tradicional, permitiendo ejecutar comandos propios llamados cmdlets. Los cmdlets son similares a los comandos de Windows, pero ofrecen un lenguaje de scripting mucho más potente y extensible.
En PowerShell podemos ejecutar tanto comandos de Windows como cmdlets, mientras que la consola de comandos (CMD) solo puede ejecutar comandos tradicionales y no puede usar cmdlets de PowerShell.
Ahora vamos a replicar los mismos comandos usando PowerShell.
En lugar de net use
, podemos usar New-PSDrive
para montar el recurso compartido:
Para proporcionar un nombre de usuario y contraseña en PowerShell, necesitamos crear un objeto PSCredential
:
Podemos usar Get-ChildItem
(o su alias gci
) para buscar archivos de forma recursiva:
Buscar archivos que contengan “cred” en el nombre:
El cmdlet Select-String
utiliza coincidencias con expresiones regulares para buscar patrones de texto en cadenas de entrada y archivos. Podemos usar Select-String
de forma similar a grep
en UNIX o findstr.exe
en Windows.
La línea de comandos permite automatizar tareas rutinarias como la gestión de cuentas de usuario, copias de seguridad nocturnas o la interacción con muchos archivos. Podemos realizar estas operaciones de forma más eficiente utilizando scripts en lugar de la interfaz gráfica (GUI).
Linux (UNIX) también puede usarse para explorar y montar recursos compartidos SMB. Esto puede hacerse tanto si el servidor de destino es una máquina Windows como si es un servidor Samba. Aunque algunas distribuciones de Linux tienen interfaz gráfica, aquí nos enfocaremos en el uso de herramientas y utilidades de línea de comandos para interactuar con SMB.
Veamos cómo montar recursos compartidos SMB para interactuar localmente con directorios y archivos.
Como alternativa, podemos usar un archivo de credenciales:
El archivo credentialfile
debe tener esta estructura:
Una vez montada la carpeta compartida, podemos usar herramientas comunes de Linux como find
o grep
para interactuar con la estructura de archivos.
Buscar un archivo cuyo nombre contenga la cadena cred
:
Antes de ver cómo ejecutar comandos en un sistema remoto usando SMB, hablemos de Sysinternals. El sitio web de Windows Sysinternals fue creado en 1996 por Mark Russinovich y Bryce Cogswell, ofreciendo herramientas y recursos técnicos para administrar, diagnosticar, solucionar problemas y monitorear entornos Windows. Microsoft adquirió Sysinternals el 18 de julio de 2006.
Sysinternals incluía varias herramientas gratuitas para administrar sistemas Windows, y una de las más conocidas es PsExec.
PsExec nos permite ejecutar procesos en sistemas remotos sin necesidad de instalar software cliente. Funciona porque lleva un servicio de Windows incorporado dentro de su ejecutable. Este servicio se copia en el recurso compartido admin$
de la máquina remota y se inicia utilizando la API del Service Control Manager a través de DCE/RPC sobre SMB. Luego, se crea una named pipe para enviar los comandos al sistema.
Además de la versión oficial de PsExec, existen implementaciones en Linux, como:
Impacket PsExec – Implementación en Python basada en RemComSvc.
Impacket SMBExec – Similar a PsExec, pero sin usar RemComSvc. Usa un servidor SMB local para recibir salida.
Impacket atexec – Ejecuta comandos usando el Task Scheduler.
CrackMapExec – Incluye implementación de smbexec
y atexec
.
Metasploit PsExec – Implementación en Ruby del módulo PsExec.
Para usar impacket-psexec, necesitamos proporcionar el dominio/usuario, la contraseña y la dirección IP de la máquina objetivo. Para obtener información más detallada, podemos usar la ayuda de impacket:
Para conectarnos a una máquina remota usando una cuenta de administrador local con impacket-psexec, podemos utilizar el siguiente comando:
Las mismas opciones se aplican a las herramientas impacket-smbexec e impacket-atexec.
Otra herramienta que podemos usar para ejecutar comandos CMD o PowerShell es CrackMapExec. Una de sus ventajas es que permite ejecutar comandos en múltiples hosts al mismo tiempo.
Para usarla, debemos especificar:
el protocolo, por ejemplo smb
la IP o rango de IPs
la opción -u
para el nombre de usuario
la opción -p
para la contraseña
la opción -x
para ejecutar comandos CMD
la opción -X
(mayúscula) para ejecutar comandos PowerShell
También podemos abusar del protocolo SMB creando un servidor SMB falso para capturar los hashes NetNTLM v1/v2 de los usuarios.
La herramienta más común para esto es Responder. Responder es una herramienta de envenenamiento de LLMNR, NBT-NS y MDNS, con varias funcionalidades, entre ellas la posibilidad de levantar servicios falsos, como SMB, para capturar hashes NetNTLM. En su configuración por defecto, escucha tráfico LLMNR y NBT-NS, responde en nombre de los servidores que la víctima busca, y captura los hashes que se generen.
Imaginemos un ejemplo: creamos un servidor SMB falso con Responder usando su configuración por defecto:
Cuando una máquina necesita resolver un nombre (Name Resolution), sigue un flujo como este:
Verifica el archivo hosts
local (C:\Windows\System32\Drivers\etc\hosts
)
Consulta el caché local DNS
Consulta un servidor DNS configurado
Si todo falla, lanza una consulta multicast (LLMNR/NBT-NS)
Si un usuario comete un error al escribir el nombre de una carpeta compartida (por ejemplo, \\mysharefoder\
en lugar de \\mysharedfolder\
), y ese nombre no existe, se lanza una consulta a toda la red, incluyéndonos a nosotras con el servidor falso. El sistema no valida las respuestas, así que podemos engañarlo fácilmente y capturar credenciales.
Estas credenciales capturadas pueden ser crackeadas con hashcat o retransmitidas a una máquina remota para completar la autenticación e impersonar al usuario.
Todos los hashes capturados se guardan en el directorio de logs de Responder:
/usr/share/responder/logs/
Nota: si ves múltiples hashes para una misma cuenta, es porque NTLMv2 usa un challenge tanto del cliente como del servidor, y ambos son aleatorios en cada interacción. Esto hace que los hashes generados estén salteados con cadenas aleatorias, por lo tanto no coinciden entre sí, aunque representen la misma contraseña.
El hash NTLMv2 fue descifrado. La contraseña es P@ssword. Si no podemos descifrar el hash, podemos potencialmente reenviarlo a otra máquina usando impacket-ntlmrelayx o Responder MultiRelay.py. Veamos un ejemplo usando impacket-ntlmrelayx.
Primero, necesitamos establecer SMB en OFF en nuestro archivo de configuración de responder (/etc/responder/Responder.conf).
Luego ejecutamos impacket-ntlmrelayx con la opción --no-http-server
, -smb2support
, y la máquina objetivo con la opción -t
. Por defecto, impacket-ntlmrelayx volcará la base de datos SAM, pero podemos ejecutar comandos agregando la opción -c
.
Una vez que la víctima se autentica contra nuestro servidor, envenenamos la respuesta y forzamos la ejecución del comando, obteniendo la reverse shell:
dbeaver
MySQL Workbench
Para interactuar con MySQL, podemos usar los binarios de MySQL para Linux (mysql
) o Windows (mysql.exe
). MySQL viene preinstalado en algunas distribuciones de Linux, pero también podemos instalar los binarios manualmente siguiendo una guía específica.
Iniciar una sesión SQL interactiva en Windows:
Para iniciar la aplicación utilice:
Video - Connecting to MySQL DB using dbeaver
MySQL no tiene un procedimiento almacenado como xp_cmdshell
, pero podemos lograr la ejecución de comandos si escribimos en una ubicación del sistema de archivos que pueda ejecutar nuestros comandos. Por ejemplo, supongamos que MySQL se ejecuta en un servidor web basado en PHP u otros lenguajes como ASP.NET. Si tenemos los privilegios adecuados, podemos intentar escribir un archivo usando SELECT INTO OUTFILE
en el directorio del servidor web. Luego, podemos navegar hasta la ubicación del archivo y ejecutar nuestros comandos.
Como mencionamos anteriormente, por defecto una instalación de MySQL no permite la lectura arbitraria de archivos, pero si la configuración es la adecuada y contamos con los privilegios necesarios, podemos leer archivos utilizando los siguientes métodos:
En MySQL, una variable de sistema global llamada secure_file_priv
limita el efecto de las operaciones de importación y exportación de datos, como las realizadas por las sentencias LOAD DATA
y SELECT … INTO OUTFILE
, así como por la función LOAD_FILE()
. Estas operaciones solo están permitidas para los usuarios que tengan el privilegio FILE
.
secure_file_priv
puede configurarse de las siguientes maneras:
Si está vacía, la variable no tiene efecto, lo cual no es una configuración segura.
Si está configurada con el nombre de un directorio, el servidor limita las operaciones de importación y exportación solo a ese directorio. El directorio debe existir; el servidor no lo crea automáticamente.
Si está configurada como NULL
, el servidor desactiva completamente las operaciones de importación y exportación.
En el siguiente ejemplo, podemos ver que la variable secure_file_priv
está vacía, lo que significa que podemos leer y escribir datos usando MySQL:
SE DEBEN VERIFICAR AMBAS AUTENTICACIONES SIEMPRE PARA VERIFICAR ACCESO.
Para interactuar con MSSQL (Microsoft SQL Server) desde Linux podemos usar sqsh, o sqlcmd si estás usando Windows. Sqsh es mucho más que un simple prompt amigable. Está diseñado para ofrecer gran parte de la funcionalidad de un shell de comandos, como variables, alias, redirección, pipes, ejecución en segundo plano, control de trabajos, historial, sustitución de comandos y configuración dinámica. Podemos iniciar una sesión SQL interactiva de la siguiente forma:
La utilidad sqlcmd nos permite ingresar instrucciones Transact-SQL, procedimientos del sistema y archivos de scripts a través de varios modos disponibles:
En la línea de comandos.
En el Editor de Consultas en modo SQLCMD.
En un archivo de script de Windows.
En un paso de trabajo del Agente de SQL Server ejecutado por el sistema operativo (Cmd.exe).
Video - Connecting to MSSQL DB using dbeaver
Se debe verificar al acceder a un MSSQL si podemos habilitar el componente xp_cmdshell para lograr ejecutar comandos arbitrarios en el equipo.
A través de la herramienta de nxc
también podemos ejecutar comandos con xp_cmdshell
.
Si disponemos del componente (xp_dirtree) habilitado, podemos probar lo siguiente para obtener un hash NTLMv2 y posteriormente crackear el hash.
Desde Kali podemos hacer uso de alguno de los métodos.
Desde MSSQL podemos ejecutar los siguientes comandos, si todo funciona bien, en nuestro equipo atacante recibiremos un hash Net-NTLMv2 que podremos crackear posteriormente.
A través de la herramienta de nxc
también podemos abusar del componente xp_dirtree
. Primero, en nuestra Kali levantamos el servidor SMB o el Responder
.
Buscando más información sobre maneras de explotar un MSSQL, nos encontramos con el siguiente blog que nos indica como podemos intentar explotar este servicio para enumerar usuarios del Active Directory (AD) a través de inyecciones SQL para enumerar usuarios a través del Relative ID (RID).
MSSQL - Enable Ole Automation Procedures
MSSQL - Create a File
De forma predeterminada, MSSQL permite la lectura de cualquier archivo del sistema operativo al que la cuenta tenga acceso de lectura. Podemos usar la siguiente consulta SQL:
SQL Server tiene un permiso especial llamado IMPERSONATE
, que permite al usuario que lo ejecuta asumir los permisos de otro usuario o login hasta que se restablezca el contexto o finalice la sesión. Vamos a ver cómo el privilegio IMPERSONATE
puede llevar a una escalada de privilegios en SQL Server.
Identify Users that We Can Impersonate
Primero, necesitamos identificar qué usuarios podemos suplantar. Los usuarios con rol de sysadmin
pueden suplantar a cualquiera por defecto, pero para los usuarios no administradores, los privilegios deben asignarse explícitamente.
Podemos usar la siguiente consulta para identificar los usuarios que podemos suplantar:
Verifying our Current User and Role
Para hacernos una idea de las posibilidades de escalada de privilegios, vamos a verificar si nuestro usuario actual tiene el rol de sysadmin:
Como el valor devuelto es 0
, indica que no tenemos el rol de sysadmin, pero sí podemos suplantar al usuario sa
. Vamos a suplantar a ese usuario y ejecutar los mismos comandos.
Impersonating the SA User
Nota: Se recomienda ejecutar EXECUTE AS LOGIN
dentro de la base de datos master, ya que todos los usuarios, por defecto, tienen acceso a esa base de datos.
Si el usuario que intentas suplantar no tiene acceso a la base de datos a la que estás conectado, se producirá un error.
MSSQL tiene una opción de configuración llamada linked servers. Los linked servers suelen configurarse para permitir que el motor de base de datos ejecute sentencias Transact-SQL que incluyan tablas en otra instancia de SQL Server, o incluso en otro producto de base de datos como Oracle.
Si logramos obtener acceso a un servidor SQL que tiene un linked server configurado, podríamos ser capaces de movernos lateralmente hacia ese otro servidor de base de datos. Los administradores pueden configurar un linked server usando credenciales del servidor remoto, y si esas credenciales tienen privilegios de sysadmin, podríamos ejecutar comandos en la instancia SQL remota.
Veamos cómo podemos identificar y ejecutar consultas en servidores enlazados.
Identify linked Servers in MSSQL
Como podemos ver en la salida de la consulta, tenemos el nombre del servidor y la columna isremote
, donde 1 indica que es un servidor remoto, y 0 que es un linked server. Podemos consultar la Transact-SQL sysservers
para más información.
A continuación, podemos intentar identificar el usuario usado en la conexión y sus privilegios. La instrucción EXECUTE
puede utilizarse para enviar comandos directamente a los linked servers. Colocamos nuestro comando entre paréntesis y especificamos el nombre del linked server entre corchetes [ ]
.
Como hemos visto, ahora podemos ejecutar consultas con privilegios de sysadmin sobre el linked server. Siendo sysadmin, tenemos control total sobre la instancia de SQL Server: podemos leer datos de cualquier base de datos o ejecutar comandos del sistema usando xp_cmdshell
.
El Domain Name System (DNS) traduce nombres de dominio (por ejemplo, hackthebox.com) a direcciones IP numéricas (por ejemplo, 104.17.42.72). DNS utiliza principalmente UDP/53, pero con el tiempo dependerá más de TCP/53.
Desde el inicio, DNS fue diseñado para usar tanto UDP como TCP en el puerto 53, siendo UDP el predeterminado. Si no puede comunicarse por UDP, recurre a TCP, generalmente cuando el tamaño del paquete es demasiado grande para enviarse en un solo paquete UDP.
Como casi todas las aplicaciones de red usan DNS, los ataques contra servidores DNS representan una de las amenazas más comunes y significativas hoy en día.
DNS contiene información interesante sobre una organización. Como se mencionó en la sección de Domain Information del módulo de Footprinting, podemos entender cómo opera una empresa, los servicios que ofrece, así como identificar proveedores externos como los de correo electrónico.
Las opciones -sC
(scripts por defecto) y -sV
(escaneo de versiones) de Nmap pueden utilizarse para realizar una enumeración inicial sobre los servidores DNS objetivo:
Una zona DNS es una porción del espacio de nombres DNS que está gestionada por una organización o administrador específico. Dado que DNS está compuesto por múltiples zonas, los servidores DNS utilizan las transferencias de zona (zone transfers) para copiar parte de su base de datos a otro servidor DNS.
A menos que un servidor DNS esté configurado correctamente (limitando qué IPs pueden realizar una transferencia de zona), cualquiera puede solicitar una copia de la información de la zona, ya que estas transferencias no requieren autenticación. Aunque el servicio DNS usa normalmente el puerto UDP, al realizar transferencias de zona utiliza TCP para asegurar una transmisión fiable.
Un atacante puede aprovechar esta vulnerabilidad para obtener información detallada del espacio de nombres DNS de la organización objetivo, ampliando la superficie de ataque.
Para explotarlo, podemos usar la utilidad dig
con el tipo de consulta AXFR
para intentar volcar todas las entradas DNS desde un servidor vulnerable:
DIG - AXFR Zone Transfer
FIERCE - AXFR Zone Transfer
La toma de dominio (domain takeover) consiste en registrar un nombre de dominio inexistente para tomar control sobre otro dominio. Si un atacante encuentra un dominio expirado, puede reclamarlo para realizar ataques como alojar contenido malicioso en un sitio web o enviar correos de phishing aprovechando ese dominio ya reclamado.
La toma de control también es posible con subdominios, lo que se conoce como subdomain takeover. Un registro CNAME en DNS se usa para apuntar un dominio a otro. Muchas organizaciones utilizan servicios de terceros como AWS, GitHub, Akamai, Fastly y otras CDNs para alojar contenido. En estos casos, se suele crear un subdominio que apunte a dichos servicios. Por ejemplo
El nombre de dominio sub.target.com
utiliza un registro CNAME que apunta a anotherdomain.com
. Si anotherdomain.com
expira y queda libre para ser registrado, cualquier persona puede reclamarlo. Dado que el servidor DNS de target.com
aún tiene ese registro CNAME apuntando allí, quien registre anotherdomain.com
tendrá control total sobre sub.target.com
hasta que el registro DNS sea actualizado.
Una excelente alternativa es una herramienta llamada Subbrute. Esta herramienta nos permite usar resolvers definidos por nosotros mismos y realizar ataques de fuerza bruta DNS puros, ideal para pruebas internas en máquinas sin acceso a Internet.
A veces, las configuraciones físicas internas están mal protegidas, lo que podemos aprovechar para subir nuestras herramientas desde un USB. Otro escenario sería que hayamos llegado a un host interno haciendo pivoting y queramos trabajar desde ahí. Por supuesto, hay otras alternativas, pero no está de más conocer diferentes formas y posibilidades.
La herramienta ha encontrado cuatro subdominios asociados con inlanefreight.com. Usando el comando nslookup
o host
, podemos enumerar los registros CNAME de esos subdominios.
El subdominio support
tiene un registro alias apuntando a un bucket de AWS S3. Sin embargo, al acceder a la URL https://support.inlanefreight.com
, se muestra un error NoSuchBucket, lo que indica que este subdominio podría ser vulnerable a un Subdomain Takeover.
Ahora, podríamos tomar el control del subdominio creando un bucket S3 en AWS con el mismo nombre del subdominio: support.inlanefreight.com
.
Es muy útil para saber, por ejemplo, si un servicio como GitHub Pages, Heroku, AWS S3, entre otros, permite el takeover cuando un recurso ha sido eliminado, pero el subdominio sigue apuntando hacia él.
El DNS spoofing, también conocido como envenenamiento de caché DNS (DNS Cache Poisoning), es un ataque que consiste en alterar registros DNS legítimos con información falsa para redirigir el tráfico hacia sitios fraudulentos. Algunos ejemplos de cómo se puede llevar a cabo este ataque son:
Ataque Man-in-the-Middle (MITM): El atacante intercepta la comunicación entre un usuario y un servidor DNS para redirigir al usuario a un destino fraudulento en lugar del legítimo.
Explotación de vulnerabilidades en el servidor DNS: Si un atacante logra comprometer un servidor DNS, podría modificar sus registros y redirigir el tráfico de múltiples usuarios hacia sitios maliciosos.
Local DNS Cache Poisoning
Desde una red local, un atacante también puede llevar a cabo un DNS Cache Poisoning utilizando herramientas de MITM como Ettercap o Bettercap.
Para explotar esta técnica con Ettercap, primero debemos editar el archivo /etc/ettercap/etter.dns
para mapear el nombre de dominio que se quiere suplantar (por ejemplo, inlanefreight.com
) hacia la dirección IP del atacante (por ejemplo, 192.168.225.110
):
A continuación, iniciamos la herramienta Ettercap y escaneamos los hosts activos en la red navegando a Hosts > Scan for Hosts. Una vez completado el escaneo, añadimos la dirección IP de la máquina víctima (por ejemplo, 192.168.152.129
) como Target1, y la IP de la puerta de enlace (por ejemplo, 192.168.152.2
) como Target2.
Luego activamos el ataque dns_spoof
desde Plugins > Manage Plugins. Esto provocará que la máquina víctima reciba respuestas DNS falsas, haciendo que el dominio inlanefreight.com
se resuelva a la dirección IP 192.168.225.110
:
Después de un spoofing exitoso, si un usuario víctima desde la IP 192.168.152.129
visita inlanefreight.com
en su navegador, será redirigido a una página falsa alojada en 192.168.225.110
.
Además, un simple ping desde la máquina víctima mostrará que inlanefreight.com
ahora se resuelve a la IP maliciosa:
El Protocolo de Transferencia de Archivos (FTP) es un protocolo de red estándar utilizado para transferir archivos entre computadoras. También permite realizar operaciones sobre directorios y archivos, como cambiar el directorio de trabajo, listar archivos, renombrar o eliminar carpetas y archivos. Por defecto, FTP escucha en el puerto TCP/21.
Para atacar un servidor FTP, podemos abusar de una mala configuración, privilegios excesivos, vulnerabilidades conocidas o incluso descubrir nuevas vulnerabilidades. Por eso, una vez que tengamos acceso al servicio FTP, debemos revisar el contenido de los directorios y buscar información sensible o crítica, como ya vimos antes.
El protocolo está diseñado para permitir descargas y subidas mediante comandos, lo que permite la transferencia de archivos entre servidores y clientes. El usuario tiene acceso a un sistema de gestión de archivos proporcionado por el sistema operativo. Los archivos pueden almacenarse en carpetas, las cuales a su vez pueden estar dentro de otras carpetas, generando así una estructura jerárquica de directorios.
Muchas empresas utilizan este servicio como parte de sus procesos de desarrollo de software o sitios web.
Los scripts por defecto de Nmap (-sC
) incluyen el script ftp-anon
, que verifica si un servidor FTP permite inicios de sesión anónimos. La opción de enumeración de versiones -sV
proporciona información interesante sobre los servicios FTP, como el banner del servicio, que a menudo incluye el nombre y la versión del servidor.
Podemos usar el cliente ftp
o nc
(netcat) para interactuar con el servicio FTP. Por defecto, FTP se ejecuta en el puerto TCP 21.
Como ya comentamos, la autenticación anónima puede estar configurada en distintos servicios como FTP. Para acceder con un inicio de sesión anónimo, simplemente se usa el usuario anonymous
y sin necesidad de contraseña. Esto puede ser muy peligroso para la empresa si los permisos de lectura y escritura no están correctamente configurados en el servicio FTP.
Con un acceso anónimo mal configurado, la empresa podría haber dejado información sensible expuesta en carpetas accesibles, permitiendo que cualquier usuario pueda:
descargar archivos confidenciales, o incluso
subir scripts maliciosos
Si combinamos esto con vulnerabilidades como path traversal en una aplicación web, podríamos localizar el archivo subido y ejecutarlo como código, por ejemplo como PHP.
Una vez que obtenemos acceso al servidor FTP con credenciales anónimas, podemos comenzar a buscar información interesante.
Comandos útiles:
ls
y cd
→ para navegar por los directorios, igual que en Linux
get archivo.txt
→ descarga un archivo
mget *
→ descarga múltiples archivos
put archivo.txt
→ sube un archivo
mput *
→ sube varios archivos
Puedes usar el comando help
dentro de la sesión FTP para ver más opciones disponibles.
Si no hay autenticación anónima disponible, también podemos realizar un ataque de fuerza bruta contra el servicio FTP usando listas de nombres de usuario y contraseñas predefinidas.
Brute Forcing with Medusa
Existen muchas herramientas para hacer fuerza bruta, pero vamos a ver una muy común: Medusa.
Con Medusa:
-u
especifica un único usuario
-U
es para un archivo con varios usuarios
-P
indica un archivo con contraseñas
-M
define el módulo o protocolo a atacar (en este caso, ftp
)
-h
es el host o IP del objetivo
Nota: aunque es posible encontrar servicios vulnerables a fuerza bruta, hoy en día la mayoría de aplicaciones implementan mecanismos de protección. Un método más efectivo suele ser el Password Spraying.
Con Hydra:
-l
especifica un único usuario
-L
es para un archivo con varios usuarios
-p
indica una contraseña única
-P
indica un archivo con contraseñas
ftp://10.129.42.197
es el host o IP del objetivo
Un FTP bounce attack es un ataque de red que aprovecha servidores FTP para enviar tráfico saliente hacia otro dispositivo dentro de la red. El atacante utiliza el comando PORT para engañar la conexión FTP y hacer que ejecute comandos o recopile información desde un dispositivo diferente al servidor original.
Imaginemos que estamos atacando un servidor FTP llamado FTP_DMZ que está expuesto a internet. Dentro de la misma red, hay otro dispositivo llamado Internal_DMZ, que no está expuesto públicamente. Podemos usar la conexión al servidor FTP_DMZ para escanear Internal_DMZ mediante un ataque FTP Bounce y descubrir qué puertos tiene abiertos. Luego, podremos usar esa información para preparar futuros ataques contra la infraestructura.
La opción -b
de Nmap permite realizar este tipo de ataque:
Aunque la mayoría de servidores FTP modernos tienen protecciones activas por defecto para evitar este tipo de ataque, si estas características están mal configuradas, el servidor podría quedar vulnerable a un FTP Bounce.
Remote Desktop Protocol (RDP) es un protocolo propietario desarrollado por Microsoft que permite a un usuario tener una interfaz gráfica para conectarse a otro equipo a través de una red. También es una de las herramientas de administración más populares, ya que permite a los administradores de sistemas controlar sus sistemas remotos como si estuvieran físicamente allí. Además, los proveedores de servicios administrados (MSPs) suelen usar esta herramienta para gestionar cientos de redes y sistemas de clientes.
Sin embargo, aunque RDP facilita enormemente la administración remota de sistemas distribuidos, también introduce una puerta de entrada adicional para ataques.
Por defecto, RDP utiliza el puerto TCP/3389. Podemos identificar si el servicio RDP está activo en un host objetivo usando Nmap:
Dado que RDP utiliza credenciales de usuario para la autenticación, uno de los vectores de ataque más comunes contra este protocolo es el password guessing (adivinanza de contraseñas). Aunque no es habitual, podríamos encontrarnos con un servicio RDP sin contraseña si existe una mala configuración.
Un detalle importante al hacer ataques de fuerza bruta contra sistemas Windows es tener en cuenta la política de contraseñas del sistema. En muchos casos, una cuenta de usuario puede bloquearse o deshabilitarse después de varios intentos fallidos. Para evitarlo, podemos aplicar una técnica específica llamada Password Spraying.
Esta técnica consiste en probar una única contraseña contra muchos usuarios antes de intentar con otra contraseña, teniendo cuidado de no disparar bloqueos por intentos fallidos.
Crowbar - RDP Password Spraying
También podemos usar Hydra para realizar un ataque de Password Spraying contra un servicio RDP.
El funcionamiento es similar al de otras herramientas de fuerza bruta: definimos una lista de usuarios, una contraseña específica (ya que en password spraying solo se prueba una por intento), el host objetivo y el módulo rdp
.
No es muy recomendable por el problema que mencionábamos anteriormente, pero se podría realizar fuerza bruta entre un listado de usuarios y contraseñas.
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)
Imaginemos que hemos conseguido acceso a una máquina y tenemos una cuenta con privilegios de administrador local. Si un usuario está conectado por RDP a nuestra máquina comprometida, podemos secuestrar la sesión de escritorio remoto de ese usuario para escalar privilegios e imitar su cuenta.
En un entorno de Active Directory, esto podría permitirnos tomar el control de una cuenta Domain Admin o ampliar aún más nuestro acceso dentro del dominio.
Como se muestra en el ejemplo, estamos conectados como el usuario juurena
(UserID = 2), que tiene privilegios de administrador. Nuestro objetivo es secuestrar la sesión del usuario lewen
(UserID = 4), quien también está conectado vía RDP.
Para suplantar a un usuario sin conocer su contraseña, necesitamos tener privilegios SYSTEM y utilizar el binario de Microsoft tscon.exe
, que permite conectarse a otra sesión de escritorio.
Funciona indicando el SESSION ID al que queremos conectarnos (por ejemplo, el 4 para el usuario lewen
) y el nombre de nuestra sesión actual (por ejemplo, rdp-tcp#13
).
El siguiente comando abrirá una nueva consola con el contexto del SESSION_ID especificado dentro de nuestra sesión RDP actual:
Si ya tenemos privilegios de administrador local, podemos conseguir privilegios SYSTEM usando herramientas como PsExec o Mimikatz.
Un truco sencillo es crear un servicio de Windows, que por defecto se ejecuta como Local System y puede lanzar cualquier binario con esos privilegios.
Para ello, utilizamos el binario sc.exe
de Microsoft. Primero definimos un nombre para el servicio (por ejemplo, sessionhijack
) y el binpath
, que es el comando que queremos ejecutar. Al ejecutar el siguiente comando, se creará un servicio llamado sessionhijack
:
Para ejecutar el comando, simplemente iniciamos el servicio sessionhijack
:
Una vez que el servicio se inicie, se abrirá una nueva terminal con la sesión del usuario lewen
.
Con esta nueva cuenta, podemos intentar descubrir qué tipo de privilegios tiene en la red, y con algo de suerte, podríamos estar ante un usuario que pertenece al grupo Help Desk (con derechos de administrador sobre varios equipos) o incluso a Domain Admin.
Nota: Este método ya no funciona en Windows Server 2019.
RDP (Remote Desktop Protocol) se utiliza habitualmente en redes Windows para el acceso remoto. Podemos transferir archivos mediante RDP copiando y pegando. Podemos hacer clic derecho y copiar un archivo desde la máquina Windows a la que nos conectamos y pegarlo en la sesión RDP.
Si estamos conectados desde Linux, podemos utilizar xfreerdp
o rdesktop
. En el momento de redactar este artículo, xfreerdp
y rdesktop
permiten copiar desde nuestra máquina de destino a la sesión RDP, pero puede haber situaciones en las que esto no funcione como se espera.
Como alternativa a copiar y pegar, podemos montar un recurso local en el servidor RDP de destino. rdesktop
o xfreerdp
se pueden utilizar para exponer una carpeta local en la sesión RDP remota.
Para acceder al directorio, podemos conectarnos a \\tsclient
, lo que nos permitirá transferir archivos hacia y desde la sesión RDP.
Alternativamente, desde Windows, se puede utilizar el cliente de escritorio remoto nativo mstsc.exe
.
Después de seleccionar la unidad, podremos interactuar con ella en la sesión remota que sigue.
Nota: Esta unidad no es accesible para ningún otro usuario que haya iniciado sesión en la computadora de destino, incluso si logra secuestrar la sesión RDP.
Un servidor de correo (también llamado servidor de email) es un servidor que gestiona y entrega correos electrónicos a través de una red, normalmente por Internet. Un servidor de correo puede recibir correos desde un dispositivo cliente y enviarlos a otros servidores de correo, así como también entregar correos a los clientes. Un cliente es normalmente el dispositivo desde el cual leemos nuestros correos (como computadoras, móviles, etc.).
Cuando presionamos el botón de Enviar en nuestra aplicación de correo (cliente de correo), el programa establece una conexión con un servidor SMTP en la red o en Internet. SMTP (Simple Mail Transfer Protocol) es el protocolo utilizado para enviar correos desde los clientes a los servidores y entre servidores.
Cuando descargamos correos en nuestra aplicación, esta se conecta a un servidor POP3 o IMAP4, el cual permite al usuario guardar mensajes en el buzón del servidor y descargarlos periódicamente.
Por defecto, los clientes POP3 eliminan los mensajes descargados del servidor. Este comportamiento dificulta el acceso al correo desde varios dispositivos, ya que los mensajes quedan almacenados localmente. Sin embargo, normalmente podemos configurar el cliente POP3 para que mantenga copias en el servidor.
Por otro lado, los clientes IMAP4 no eliminan los mensajes del servidor por defecto, lo que permite acceder fácilmente a los correos desde múltiples dispositivos.
Veamos cómo podemos atacar servidores de correo.
Los servidores de correo son complejos y normalmente requieren que enumeremos varios servidores, puertos y servicios. Además, hoy en día la mayoría de las empresas tienen sus servicios de correo en la nube, como Microsoft 365 o G-Suite. Por lo tanto, nuestra forma de atacar el servicio de correo dependerá del tipo de servicio que estén utilizando.
Podemos usar el registro DNS MX (Mail eXchanger) para identificar el servidor de correo. Este registro especifica el servidor responsable de aceptar mensajes de correo en nombre de un dominio. Es posible configurar varios registros MX, normalmente apuntando a un conjunto de servidores de correo para balanceo de carga y redundancia.
Podemos utilizar herramientas como host
o dig
, o sitios web como MXToolbox para consultar información sobre los registros MX.
stos registros MX indican que los tres primeros servicios de correo están utilizando servicios en la nube como G-Suite (aspmx.l.google.com
), Microsoft 365 (microsoft-com.mail.protection.outlook.com
) y Zoho (mx.zoho.com
), mientras que el último probablemente sea un servidor de correo personalizado alojado por la empresa.
Esta información es importante porque los métodos de enumeración pueden variar según el servicio. Por ejemplo, la mayoría de los proveedores en la nube utilizan su propia implementación del servidor de correo y adoptan autenticación moderna, lo cual abre vectores de ataque únicos y específicos para cada proveedor. En cambio, si la empresa ha configurado su propio servicio, podríamos encontrar malas prácticas y configuraciones inseguras que permitan ataques comunes a protocolos de servidores de correo.
Si estamos apuntando a un servidor de correo personalizado como inlanefreight.htb
, podemos enumerar los siguientes puertos:
TCP/25
SMTP Unencrypted
TCP/143
IMAP4 Unencrypted
TCP/110
POP3 Unencrypted
TCP/465
SMTP Encrypted
TCP/587
TCP/993
IMAP4 Encrypted
TCP/995
POP3 Encrypted
Podemos usar Nmap con la opción -sC
(scripts por defecto) para enumerar estos puertos en el sistema objetivo:
Los servicios de correo utilizan autenticación para permitir a los usuarios enviar y recibir correos electrónicos. Una mala configuración puede darse cuando el servicio SMTP permite autenticación anónima o soporta comandos que pueden ser usados para enumerar nombres de usuario válidos.
El servidor SMTP dispone de distintos comandos que se pueden aprovechar para enumerar usuarios válidos: VRFY
, EXPN
y RCPT TO
. Si logramos enumerar usuarios válidos, podemos intentar realizar ataques de password spraying, fuerza bruta o incluso adivinar una contraseña válida. Veamos cómo funcionan estos comandos:
VRFY: este comando le indica al servidor SMTP que verifique si existe un nombre de usuario o dirección de correo específica. El servidor responderá indicando si el usuario existe o no. Esta funcionalidad suele estar desactivada por seguridad.
EXPN es similar a VRFY, con la diferencia de que cuando se usa con una lista de distribución, devuelve todos los usuarios incluidos en dicha lista. Esto puede ser más problemático que el comando VRFY, ya que muchas veces existen alias como “all” que agrupan a muchos usuarios.
Como vemos, el comando EXPN devuelve direcciones de usuarios individuales que forman parte de la lista de distribución. Esto amplía nuestra superficie de ataque.
RCPT TO identifica al destinatario de un mensaje de correo. Este comando se puede repetir varias veces para enviar un solo mensaje a múltiples destinatarios.
Como vemos, este comando también nos permite validar si un usuario existe en el sistema en función de la respuesta del servidor. Esto se puede usar para enumerar usuarios válidos antes de lanzar ataques como password spraying o fuerza bruta.
También podemos usar el protocolo POP3 para enumerar usuarios, dependiendo de cómo esté implementado el servicio. Por ejemplo, podemos usar el comando USER
seguido del nombre de usuario, y si el servidor responde con +OK
, eso significa que el usuario existe en el servidor.
Este comportamiento se puede aprovechar para enumerar cuentas válidas antes de intentar ataques de autenticación como fuerza bruta o password spraying.
En el siguiente ejemplo, estamos usando:
-M RCPT
: especifica el modo de enumeración.
-U userlist.txt
: lista de nombres de usuario a probar.
-D inlanefreight.htb
: dominio que se añadirá a cada usuario.
-t 10.129.203.7
: IP del servidor SMTP objetivo.
Como vimos antes, los proveedores de servicios en la nube como Microsoft implementan sus propios sistemas de correo. En el caso de Office 365, podemos abusar de funciones específicas como la enumeración de usuarios.
Podemos usar Hydra para realizar ataques de fuerza bruta o password spraying contra servicios de correo como SMTP, POP3 o IMAP4. Solo necesitamos un listado de usuarios (-L
) y una contraseña o lista de contraseñas (-p
o -P
), además de indicar el servicio.
Si los servicios en la nube permiten el uso de los protocolos SMTP, POP3 o IMAP4, podríamos intentar realizar ataques de password spraying usando herramientas como Hydra, pero normalmente estos intentos son bloqueados por medidas de seguridad del proveedor.
En lugar de eso, es preferible usar herramientas especializadas como:
o365spray
o MailSniper
→ para Microsoft Office 365
CredKing
→ para Gmail u Okta
Un open relay es un servidor SMTP (Simple Mail Transfer Protocol) mal configurado que permite el reenvío de correos sin autenticación. Los servidores de mensajería que están configurados como open relays, ya sea accidental o intencionalmente, permiten que cualquier fuente envíe correos a través del servidor, enmascarando así el origen real de los mensajes y haciendo parecer que provienen del propio servidor.
Desde la perspectiva de un atacante, esto puede ser aprovechado para realizar phishing, enviando correos como si fueran de usuarios inexistentes o suplantando la identidad de otro. Por ejemplo, si detectamos que una empresa tiene un servidor de correo mal configurado como open relay y usa una dirección específica para notificaciones, podemos enviar un correo con esa misma dirección y añadir un enlace malicioso.
Con el script smtp-open-relay
de Nmap, podemos identificar si un puerto SMTP permite este tipo de reenvío:
Después, podemos usar cualquier cliente de correo para conectarnos al servidor y enviar nuestro mensaje:
Se trata de una herramienta con múltiples opciones que permite enumerar los recursos compartidos de un servicio SMB/Samba, ver los contenidos y permisos de unidades compartidas, descargar y subir ficheros e incluso, si las condiciones son las adecuadas, permite la ejecución de comandos.
WinRM es la implementación de Microsoft del protocolo WS-Management, muy habitual en entornos Windows, especialmente en sus versiones Server. Fue diseñado para facilitar la administración remota del sistema. Aunque en las estaciones de trabajo (Windows 7, 8, 8.1 o 10) no viene activado por defecto, en Windows Server suele estar habilitado en el puerto 5985.
Si cuentas con acceso al sistema —ya sea con usuario y contraseña, con el hash NTLM o incluso con un ticket TGT de Kerberos— puedes conectarte a este servicio y obtener una shell en el sistema. Esto es especialmente útil en la etapa de post-explotación, una vez que ya tienes cierto control sobre el entorno.
Aquí es donde entra Evil-WinRM, una de las herramientas más interesantes para explotar y gestionar conexiones a través de WinRM, permitiéndote realizar pruebas de post-explotación de manera eficaz y práctica.
Para instalar evil-winrm
ejecutaremos el siguiente comando:
Para verificar que disponemos de acceso para conectarnos a través de WinRM
al equipo, podemos hacer uso de la herramienta nxc
(NetExec) para validar dicho acceso. En el resultado nos debe aparecer con un +
y con la palabra Pwn3d!
. En caso contrario, solamente nos saldrá como -
.
Ejemplo de acceso para conectarnos al equipo mediante WinRM
.
Ejemplo de que no disponemos de acceso para conectarnos al equipo mediante WinRM
.
A continuación, se detallan como conectarnos mediante evil-winrm
a un equipo que disponga WinRM
expuesto.
La autenticación mediante Kerberos requiere de una serie de pasos previos para que funcione correctamente.
Sincronizar la hora de la máquina local con la del Domain Controller.
Disponer de un TGT (Ticket Granting Ticket)
Exportar el TGT en la variable KRB5CCNAME
Disponer de la instalación de krb5-user
y krb5-config
en el equipo local
Configurar adecuadamente el archivo /etc/krb5.conf
con la configuración necesaria del dominio
Configurar correctamente el archivo /etc/hosts
para la resolución de nombres.
El comando para conectarnos mediante el TGT obtenido es el siguiente:
Para configurar paso a paso esta autenticación al WinRM
mediante Kerberos, realizaremos los siguientes pasos:
Deberemos de sincronizar la hora de nuestro equipo con la del DC (Domain Controller).
Instalaremos el paquete de ntpdate
para ayudarnos a sincronizar la hora de nuestro reloj.
Una vez instalado, sincronizaremos nuestra hora con la del DC.
Deberemos de disponer de un TGT (Ticket Granting Ticket) del usuario con el que queramos conectarnos. Disponemos de varias maneras de haber obtenido ya un TGT, pero en este caso explicaremos solamente a solicitarlo para el usuario que disponemos sus credenciales.
A través de la herramienta de impacket-getTGT
obtendremos un TGT válido para nuestro usuario.
Una vez solicitado el TGT, nos deberá proporcionar un archivo .ccache
.
Una vez obtenido el TGT (.ccache
), deberemos de exportar este tiquet en la variable KRB5CCNAME
para poder utilizarlo correctamente.
Instalaremos el paquete de krb5-user
a través del siguiente comando:
Una vez instalado, validaremos que el tiquet TGT obtenido y declarado en KRB5CCNAME
funcione correctamente. Nos deberá aparecer nuestro TGT.
Instalaremos el paquete necesario para el /etc/krb5.conf
a través del siguiente comando:
Una vez instalado el paquete, deberemos de configurar el archivo /etc/krb5.conf
para que se adapte al dominio correspondiente.
A continuación, dejaremos un archivo /etc/krb5.conf
de ejemplo.
Deberemos de disponer en nuestro archivo /etc/hosts
las entradas correspondientes para que nos resuelva correctamente el hostname, FQDN y nombre del dominio.
Ejemplo:
Dirección IP: 10.10.14.13
Hostname: dc01
Dominio: gzzcoo.htb
FQDN: dc01.gzzcoo.htb
Nuestro archivo /etc/hosts
deberá tener la siguiente entrada correspondiente.
La herramienta de evil-winrm
dispone de un módulo para realizar un Bypass de la AMSI para lograr ejecutar nuestro código malicioso.
A veces, las herramientas de enumeración en post-explotación no logran identificar el nombre del servicio activo en el sistema objetivo. En esos casos, evil-winrm
resulta muy útil, ya que permite ver una lista completa de los servicios en ejecución desde su menú, específicamente a través de la opción de services
. Esto es especialmente valioso para detectar servicios sin comillas, que otras herramientas podrían pasar por alto.
Evil-WinRM cuenta con un módulo que te permite subir archivos desde el directorio actual de tu sesión directamente al sistema comprometido.
Esto facilita la transferencia de herramientas, scripts u otros recursos necesarios para continuar con tus actividades de post-explotación de manera sencilla y directa.
Evil-WinRM también te permite extraer archivos del sistema comprometido hacia tu máquina local. Simplemente, estando en el directorio deseado, utiliza el comando:
Esto resulta muy práctico para recolectar información o respaldar archivos importantes durante la fase de post-explotación.
Evil-winrm
ofrece una funcionalidad que permite cargar scripts directamente desde nuestra máquina local. Usando la opción -s
seguida de la ruta del script, podemos inyectarlo en memoria en el sistema objetivo. Además, cuenta con una capacidad para omitir AMSI, lo que resulta fundamental antes de importar cualquier script.
En el ejemplo que se muestra, primero se desactiva AMSI y luego se carga el script Invoke-Mimikatz.ps1 en la memoria del sistema comprometido, lo que nos permite ejecutar comandos de mimikatz. Con este método, por ejemplo, podemos volcar las credenciales en caché y, posteriormente, utilizar el hash NTLM obtenido para realizar un ataque de Pass-The-Hash (PtH)
.
Esta función te permite guardar registros de tus sesiones remotas en tu máquina local durante la fase de enumeración. En escenarios como CTF o pruebas internas de penetración, es esencial contar con un historial para la elaboración de informes. Evil-winrm incorpora la opción -l, que al incluirla en la sesión, almacena automáticamente todos los logs en el directorio /root/evil-winrm-logs
de tu máquina base, etiquetados con la fecha y la IP del objetivo. Por ejemplo, si ejecutas el comando ipconfig
durante una sesión, la salida se registrará localmente, facilitándote la referencia posterior.
Podemos corroborarlo revisando los registros almacenados; notarás que se capturó una imagen de la terminal en el instante en el que ejecutamos el comando ipconfig.
Una vulnerabilidad XSS (Cross-Site Scripting) es un tipo de vulnerabilidad de seguridad informática que permite a un atacante ejecutar código malicioso en la página web de un usuario sin su conocimiento o consentimiento. Esta vulnerabilidad permite al atacante robar información personal, como nombres de usuario, contraseñas y otros datos confidenciales.
En esencia, un ataque XSS implica la inserción de código malicioso en una página web vulnerable, que luego se ejecuta en el navegador del usuario que accede a dicha página. El código malicioso puede ser cualquier cosa, desde scripts que redirigen al usuario a otra página, hasta secuencias de comandos que registran pulsaciones de teclas o datos de formularios y los envían a un servidor remoto.
Existen varios tipos de vulnerabilidades XSS, incluyendo las siguientes:
Reflejado (Reflected): Este tipo de XSS se produce cuando los datos proporcionados por el usuario se reflejan en la respuesta HTTP sin ser verificados adecuadamente. Esto permite a un atacante inyectar código malicioso en la respuesta, que luego se ejecuta en el navegador del usuario.
Almacenado (Stored): Este tipo de XSS se produce cuando un atacante es capaz de almacenar código malicioso en una base de datos o en el servidor web que aloja una página web vulnerable. Este código se ejecuta cada vez que se carga la página.
DOM-Based: Este tipo de XSS se produce cuando el código malicioso se ejecuta en el navegador del usuario a través del DOM (Modelo de Objetos del Documento). Esto se produce cuando el código JavaScript en una página web modifica el DOM en una forma que es vulnerable a la inyección de código malicioso.
Los ataques XSS pueden tener graves consecuencias para las empresas y los usuarios individuales. Por esta razón, es esencial que los desarrolladores web implementen medidas de seguridad adecuadas para prevenir vulnerabilidades XSS. Estas medidas pueden incluir la validación de datos de entrada, la eliminación de código HTML peligroso, y la limitación de los permisos de JavaScript en el navegador del usuario.
Cookie Hijacking
Data Exfiltration
Keylogger
Las inyecciones LaTeX son un tipo de ataque que se aprovecha de las vulnerabilidades en las aplicaciones web que permiten a los usuarios ingresar texto formateado en LaTeX. LaTeX es un sistema de composición de textos que se utiliza comúnmente en la escritura académica y científica.
Los ataques de inyección LaTeX ocurren cuando un atacante ingresa código LaTeX malicioso en un campo de entrada de texto que luego se procesa en una aplicación web. El código LaTeX puede ser diseñado para aprovechar vulnerabilidades en la aplicación y ejecutar código malicioso en el servidor.
Un ejemplo de una inyección LaTeX podría ser un ataque que aprovecha la capacidad de LaTeX para incluir gráficos y archivos en una aplicación web. Un atacante podría enviar un código LaTeX que incluya un enlace a un archivo malicioso, como un virus o un troyano, que podría infectar el servidor o los sistemas de la red.
Para evitar las inyecciones LaTeX, las aplicaciones web deben validar y limpiar adecuadamente los datos que se reciben antes de procesarlos en LaTeX. Esto incluye la eliminación de caracteres especiales y la limitación de los comandos que pueden ser ejecutados en LaTeX.
También es importante que las aplicaciones web se ejecuten con privilegios mínimos en la red y que se monitoreen regularmente las actividades de la aplicación para detectar posibles inyecciones. Además, se debe fomentar la educación sobre la seguridad en el uso de LaTeX y cómo evitar la introducción de código malicioso.
Leer primera línea de un archivo
Leer múltiples lineas de un archivo
Qué es: Técnica para moverse entre redes a través de un host comprometido.
Objetivo: Acceder a segmentos de red aislados usando una máquina intermedia.
Ejemplo: Un host tiene dos interfaces de red (dual-homed), una hacia la red empresarial y otra hacia una red operacional. Usamos ese host para pivotear entre ambas.
Alias comunes: Jump Host, Foothold, Proxy, Beachhead, etc.
Qué es: Subconjunto del pivoting que consiste en encapsular tráfico en otros protocolos (como HTTP o HTTPS) para evadir detecciones.
Ejemplo: Instrucciones C2 ocultas en peticiones HTTP GET/POST disfrazadas como tráfico legítimo.
Aplicaciones comunes: VPN, proxys SOCKS, HTTPS sobre SSH, etc.
Qué es: Técnica para moverse horizontalmente dentro de la misma red.
Objetivo: Acceder a más máquinas usando credenciales válidas, comúnmente con fines de escalamiento de privilegios.
Ejemplo: Usar credenciales de administrador local para conectarse a otras máquinas dentro de la misma red.
Port Forwarding
El reenvío de puertos (Port Forwarding) es una técnica que nos permite redirigir una solicitud de comunicación de un puerto a otro. El reenvío de puertos utiliza TCP como capa de comunicación principal para proporcionar comunicación interactiva para el puerto reenviado. Sin embargo, se pueden usar diferentes protocolos de capa de aplicación como SSH o incluso SOCKS (no de capa de aplicación) para encapsular el tráfico reenviado. Esto puede ser efectivo para evadir firewalls y utilizar servicios existentes en el host comprometido para pivotar hacia otras redes.
Tomemos como ejemplo la imagen de abajo.
Scanning the Pivot Target
Tenemos nuestro host atacante (10.10.15.x
) y un servidor Ubuntu de destino (10.129.x.x
), que ya hemos comprometido. Escanearemos el servidor Ubuntu con Nmap para buscar puertos abiertos.
El resultado de Nmap muestra que el puerto SSH está abierto. Para acceder al servicio MySQL, podemos hacer SSH al servidor y acceder a MySQL desde dentro, o reenviar el puerto a nuestro localhost
en el puerto 1234
y acceder localmente. Una ventaja de acceder localmente es que si queremos ejecutar un exploit remoto contra MySQL, no podríamos hacerlo sin reenviar el puerto, ya que el servicio solo está expuesto localmente en el puerto 3306
del servidor Ubuntu.
Executing the Local Port Forward
Así que usaremos el siguiente comando para reenviar nuestro puerto local (1234
) vía SSH al servidor Ubuntu:
La opción -L
le indica al cliente SSH que solicite al servidor SSH reenviar todos los datos enviados por el puerto 1234
a localhost:3306
en el servidor Ubuntu. Al hacer esto, deberíamos poder acceder al servicio MySQL localmente desde el puerto 1234
.
Confirming Port Forward with Netstat
Confirming Port Forward with Nmap
Forwarding Multiple Ports
Si queremos reenviar múltiples puertos desde el servidor Ubuntu a nuestro localhost
, podemos hacerlo añadiendo más argumentos -L
al comando SSH:
A diferencia del escenario anterior donde sabíamos qué puerto debíamos acceder, en nuestro escenario actual no sabemos qué servicios están del otro lado de la red. Por eso, podemos escanear rangos pequeños de IPs dentro de la red (172.16.5.1-200) o el subnet completo (172.16.5.0/23). No podemos hacer este escaneo directamente desde nuestro equipo atacante porque no tiene rutas hacia la red 172.16.5.0/23. Para lograrlo, tendremos que realizar un dynamic port forwarding y pivotear nuestro tráfico de red a través del servidor Ubuntu comprometido.
Esto se conoce como SSH tunneling usando un SOCKS proxy. SOCKS significa Socket Secure, un protocolo que permite comunicarse con servidores cuando existen restricciones impuestas por un firewall. A diferencia de la mayoría de los casos donde iniciamos una conexión hacia un servicio, en el caso de SOCKS, el tráfico inicial es generado por un cliente SOCKS, que se conecta al servidor SOCKS (controlado por nosotras) para acceder a servicios desde el lado del cliente. Una vez establecida la conexión, el tráfico de red puede ser redirigido a través del servidor SOCKS en nombre del cliente conectado.
Esta técnica se usa frecuentemente para evadir restricciones impuestas por firewalls, permitiendo que una entidad externa acceda a un servicio que se encuentra dentro de un entorno protegido. Otro beneficio de usar un SOCKS proxy para pivotear y reenviar datos es que permite pivotear incluso desde redes NAT creando rutas hacia servidores externos. Existen dos tipos de proxies SOCKS: SOCKS4 y SOCKS5. SOCKS4 no ofrece autenticación ni soporte para UDP, mientras que SOCKS5 sí los incluye.
Tomemos como ejemplo la imagen de abajo donde tenemos una red enmascarada con NAT (172.16.5.0/23) a la que no podemos acceder directamente.
En la imagen anterior, el attack host inicia el cliente SSH y solicita al servidor SSH que le permita enviar datos TCP a través del ssh socket. El servidor SSH responde con una confirmación, y el cliente SSH comienza a escuchar en localhost:9050
. Cualquier dato que se envíe allí será retransmitido a toda la red (172.16.5.0/23) mediante SSH. Podemos usar el siguiente comando para realizar este dynamic port forwarding:
El argumento -D
solicita al servidor SSH que habilite el dynamic port forwarding. Una vez habilitado, necesitaremos una herramienta que pueda enrutar los paquetes de cualquier herramienta a través del puerto 9050. Podemos hacer esto usando proxychains, que es capaz de redirigir conexiones TCP a través de servidores proxy TOR, SOCKS, y HTTP/HTTPS, y además permite encadenar múltiples proxies.
Usando proxychains, también podemos ocultar la dirección IP del requesting host, ya que el receiving host sólo verá la IP del pivot host. Proxychains se utiliza a menudo para forzar que el tráfico TCP de una aplicación pase a través de proxies como SOCKS4/SOCKS5, TOR, o HTTP/HTTPS.
Checking /etc/proxychains.conf
Para indicarle a proxychains que debe usar el puerto 9050, debemos modificar el archivo de configuración ubicado en /etc/proxychains.conf
. Podemos agregar socks4 127.0.0.1 9050
en la última línea si aún no está presente.
Using Nmap with Proxychains
Ahora, cuando ejecutemos Nmap con proxychains usando el siguiente comando, todos los paquetes de Nmap se enviarán al puerto local 9050, donde nuestro cliente SSH está escuchando. Este a su vez reenviará todo el tráfico por SSH hacia la red 172.16.5.0/23.
Esta parte de empaquetar todos los datos de Nmap usando proxychains y reenviarlos a un servidor remoto se llama SOCKS tunneling. Otro punto importante a tener en cuenta es que solo podemos realizar un escaneo completo de conexión TCP (full TCP connect scan) a través de proxychains. Esto se debe a que proxychains no puede interpretar paquetes parciales. Si enviamos paquetes parciales, como en un escaneo de tipo half-connect, devolverá resultados incorrectos.
También debemos ser conscientes de que las comprobaciones de host activo (host-alive checks) pueden no funcionar contra objetivos Windows, ya que el firewall de Windows Defender bloquea las solicitudes ICMP (pings tradicionales) por defecto.
Un escaneo completo de conexión TCP sin ping sobre un rango de red completo tomará mucho tiempo. Por eso, en este módulo, nos enfocaremos principalmente en escanear hosts individuales o rangos pequeños de hosts que sabemos que están activos, como en este caso: una máquina Windows en 172.16.5.19
.
Enumerating the Windows Target through Proxychains
Realizaremos un escaneo remoto del sistema con el siguiente comando:
Ya hemos visto el reenvío de puertos local, donde SSH puede escuchar en nuestro equipo local y reenviar un servicio del host remoto a nuestro puerto, y el reenvío de puertos dinámico, donde podemos enviar paquetes a una red remota a través de un pivot host. Pero, a veces, también podríamos querer reenviar un servicio local hacia un puerto remoto.
Imaginemos el escenario en el que podemos hacer RDP hacia el host Windows Windows A. Como se puede ver en la imagen de abajo, en nuestro caso anterior pudimos pivotar hacia el host Windows a través del servidor Ubuntu.
Pero ¿qué pasa si intentamos obtener una reverse shell?
La conexión saliente del host Windows está limitada solo a la red 172.16.5.0/23
. Esto se debe a que el host Windows no tiene ninguna conexión directa con la red en la que se encuentra el attack host. Si iniciamos un listener de Metasploit en nuestro attack host e intentamos obtener una reverse shell, no lograremos una conexión directa porque el servidor Windows no sabe cómo enrutar el tráfico que sale de su red (172.16.5.0/23
) hacia la 10.129.x.x
(nuestra red de atacante).
En estos casos, debemos encontrar un pivot host, que sea un punto de conexión común entre nuestro attack host y el servidor Windows. En nuestro caso, el pivot host sería el servidor Ubuntu, ya que puede conectarse tanto a nuestro attack host como al objetivo Windows.
Para obtener una shell Meterpreter en Windows, crearemos un payload Meterpreter HTTPS usando msfvenom
, pero la configuración de la conexión reversa para el payload tendrá como IP destino la del servidor Ubuntu (172.16.5.129
). Usaremos el puerto 8080 en el servidor Ubuntu para reenviar todos los paquetes de la reverse shell hacia el puerto 8000 de nuestro attack host, donde estará escuchando Metasploit.
Creating a Windows Payload with msfvenom
Configuring & Starting the multi/handler
Transferring Payload to Pivot Host
Una vez que hayamos creado nuestro payload y tengamos el listener configurado y ejecutándose, podemos copiar el payload al servidor Ubuntu usando el comando scp
, ya que ya tenemos las credenciales para conectarnos al servidor Ubuntu por SSH.
Starting Python3 Webserver on Pivot Host
Después de copiar el payload, iniciaremos un servidor HTTP con python3
en el servidor Ubuntu, en el mismo directorio donde se encuentra el payload.
Downloading Payload on the Windows Target
Podemos descargar este backupscript.exe
en el host Windows usando un navegador web o el cmdlet de PowerShell Invoke-WebRequest
.
Using SSH -R
Una vez descargado el payload en el host Windows, usaremos reenvío de puertos remoto por SSH para reenviar conexiones desde el puerto 8080 del servidor Ubuntu hacia el servicio listener de nuestra msfconsole
en el puerto 8000. Usaremos el argumento -vN
en el comando SSH para hacerlo más detallado y evitar que se abra una shell interactiva.
El argumento -R
le indica al servidor Ubuntu que escuche en <targetIPaddress>:8080
y reenvíe todas las conexiones entrantes a nuestro listener en 0.0.0.0:8000
del host atacante.
Después de crear el reenvío remoto SSH, podemos ejecutar el payload desde el objetivo Windows. Si el payload se ejecuta correctamente y trata de conectarse de vuelta a nuestro listener, podremos ver los logs de conexión desde el host pivot.
Viewing the Logs from the Pivot
Meterpreter Session Established
Nuestra sesión de Meterpreter debería mostrar que la conexión entrante proviene del propio host local (127.0.0.1
), ya que estamos recibiendo la conexión a través del socket local SSH, el cual creó una conexión saliente hacia el servidor Ubuntu. Ejecutar el comando netstat
puede mostrarnos que la conexión entrante proviene del servicio SSH.
La siguiente representación gráfica ofrece una manera alternativa de entender esta técnica.
Ahora consideremos un escenario en el que ya tenemos acceso a una shell de Meterpreter en el servidor Ubuntu (nuestro host de pivoteo) y queremos realizar escaneos de enumeración a través de él, aprovechando las funcionalidades que ofrece Meterpreter. En estos casos, podemos crear un pivote usando la sesión de Meterpreter sin depender del reenvío de puertos por SSH.
Podemos generar una shell de Meterpreter para el servidor Ubuntu con el siguiente comando, que nos devolverá una shell en nuestro host atacante a través del puerto 8080:
Creating Payload for Ubuntu Pivot Host
Configuring & Starting the multi/handler
Antes de copiar el payload, podemos iniciar el multi/handler en Metasploit, también conocido como Generic Payload Handler.
Executing the Payload on the Pivot Host
Copiamos el binario backupjob
al servidor Ubuntu (host pivote) vía SSH y lo ejecutamos:
Meterpreter Session Establishment
Debemos asegurarnos de que la sesión de Meterpreter se establezca correctamente tras ejecutar el payload.
Ping Sweep
Sabemos que el objetivo (Windows) se encuentra en la red 172.16.5.0/23
. Suponiendo que el firewall del host Windows permita tráfico ICMP, lo siguiente que queremos hacer es un ping sweep desde nuestra sesión de Meterpreter. Para ello, podemos usar el módulo ping_sweep
, el cual generará tráfico ICMP desde el host Ubuntu hacia esa red.
También podemos realizar un ping sweep (barrido de red con ping) utilizando un bucle for
directamente en el host pivot comprometido, que enviará pings a todos los dispositivos dentro del rango de red que especifiquemos. Aquí tienes dos one-liners muy útiles, dependiendo del sistema operativo del host pivot:
Ping Sweep For Loop on Linux Pivot Hosts
Ping Sweep For Loop Using CMD
Ping Sweep Using PowerShell
Nota: Es posible que un ping sweep no devuelva respuestas exitosas en el primer intento, especialmente cuando se comunica entre diferentes redes. Esto puede deberse al tiempo que tarda un host en construir su caché ARP. En estos casos, es recomendable repetir el barrido al menos dos veces para asegurarnos de que la caché ARP se haya construido correctamente.
Configuring MSF's SOCKS Proxy
También pueden existir escenarios en los que el firewall de un host bloquee el ping (ICMP), por lo que no obtendremos respuestas exitosas. En estos casos, podemos realizar un escaneo TCP sobre la red 172.16.5.0/23
utilizando Nmap.
En lugar de usar SSH para el port forwarding, también podemos utilizar el módulo de post-explotación socks_proxy
de Metasploit, el cual nos permite configurar un proxy local tipo SOCKS en nuestra máquina atacante.
Se configurará el proxy SOCKS en su versión 4a, el cual iniciará un listener en el puerto 9050 y redirigirá todo el tráfico recibido a través de nuestra sesión de Meterpreter.
Confirming Proxy Server is Running
Adding a Line to proxychains.conf if Needed
Después de iniciar el servidor SOCKS, configuraremos proxychains para redirigir el tráfico generado por otras herramientas como Nmap a través de nuestro pivote en el host Ubuntu comprometido.
Podemos añadir la siguiente línea al final del archivo proxychains.conf
ubicado en /etc/proxychains.conf
si no está presente.
Nota: Dependiendo de la versión del servidor SOCKS que estemos usando, en ocasiones necesitaremos cambiar socks4
por socks5
en el archivo de configuración.
Creating Routes with AutoRoute
Finalmente, debemos indicar al módulo socks_proxy
que redirija todo el tráfico a través de nuestra sesión de Meterpreter. Para esto, podemos utilizar el módulo post/multi/manage/autoroute
de Metasploit para añadir rutas hacia la subred 172.16.5.0
y enrutar el tráfico de proxychains
correctamente.
También es posible agregar rutas con autoroute directamente desde la sesión de Meterpreter ejecutando el siguiente comando:
Listing Active Routes with AutoRoute
Una vez agregadas las rutas necesarias, podemos usar la opción -p
para listar las rutas activas y confirmar que nuestra configuración se haya aplicado correctamente.
Testing Proxy & Routing Functionality
Como podemos ver en la salida anterior, la ruta hacia la red 172.16.5.0/23
ha sido añadida correctamente. Esto nos permite ahora utilizar proxychains para enrutar nuestro tráfico de Nmap a través de la sesión de Meterpreter.
También podemos lograr el port forwarding utilizando el módulo portfwd
de Meterpreter. Este módulo nos permite redirigir tráfico desde nuestro host atacante hacia una máquina remota a través de una sesión activa de Meterpreter.
Portfwd options
Creating Local TCP Relay
El comando anterior le indica a la sesión de Meterpreter que inicie un listener en el puerto local 3300 de nuestro host atacante (-l 3300
) y reenvíe todos los paquetes a la máquina remota 172.16.5.19 en el puerto 3389 (-r 172.16.5.19 -p 3389
), utilizando la sesión activa de Meterpreter como canal de comunicación.
Connecting to Windows Target through localhost
Una vez establecido el port forwarding, podemos ejecutar el siguiente comando para iniciar una sesión RDP desde nuestra máquina.
Netstat Output
Podemos usar netstat
para ver información sobre la sesión que acabamos de establecer. Desde una perspectiva defensiva, netstat
también es útil si sospechamos que un host ha sido comprometido, ya que nos permite ver todas las sesiones activas que ese host ha establecido.
Al igual que con los local port forwards, Metasploit también puede realizar reverse port forwarding con el siguiente comando. Esto es útil cuando queremos escuchar en un puerto específico del servidor comprometido y redirigir todas las conexiones entrantes desde el servidor Ubuntu hacia nuestro attack host.
En este caso, vamos a iniciar un listener en un nuevo puerto de nuestra máquina para recibir una Windows shell, y solicitaremos al servidor Ubuntu que redirija todas las solicitudes que reciba en el puerto 1234
hacia nuestro listener en el puerto 8081
.
Reverse Port Forwarding Rules
Podemos crear este reverse port forward en la shell que ya teníamos abierta desde el escenario anterior con el siguiente comando:
Configuring & Starting multi/handler
Generating the Windows Payload
Ahora podemos crear un reverse shell payload que, al ejecutarse en el host Windows, envíe una conexión de vuelta a nuestro servidor Ubuntu (172.16.5.129:1234). Una vez que el servidor Ubuntu reciba esta conexión, la redirigirá al attack host en el puerto 8081
, como lo configuramos anteriormente con reverse port forwarding.
Establishing the Meterpreter session
Una vez que ejecutamos el payload en el host Windows, deberíamos recibir una Meterpreter shell a través del Ubuntu pivot host, redirigida hacia nuestro listener en el attack host:
Podemos iniciar el listener de Metasploit en nuestra máquina atacante usando el mismo comando mencionado en la sección anterior, y luego lanzar socat desde el servidor Ubuntu para establecer el canal de redirection.
Starting Socat Listener
Socat escuchará en localhost
en el puerto 8080 y redirigirá todo el tráfico hacia el puerto 80 de nuestra máquina atacante (10.10.14.18
). Una vez que tengamos configurado nuestro redirector, podemos crear un payload que se conecte de vuelta a ese redirector, el cual está corriendo en el servidor Ubuntu.
También iniciaremos un listener en nuestra máquina atacante, porque en cuanto socat reciba una conexión desde el objetivo, redirigirá todo ese tráfico hacia el listener de nuestra máquina atacante, donde recibiremos la shell.
Creating the Windows Payload
Starting MSF Console
Configuring & Starting the multi/handler
Establishing the Meterpreter Session
Podemos probar esto ejecutando nuevamente nuestro payload en el host Windows, y esta vez deberíamos ver que la conexión de red proviene desde el servidor Ubuntu.
Similar a nuestro redirector de Socat con reverse shell, también podemos crear un redirector de bind shell con Socat.
Esto es diferente de las reverse shells que se conectan de vuelta desde el servidor Windows hacia el servidor Ubuntu y que luego se redirigen hacia nuestra máquina atacante. En el caso de las bind shells, el servidor Windows iniciará un listener y se enlazará a un puerto específico.
Podemos crear un payload de bind shell para Windows y ejecutarlo en el host Windows. Al mismo tiempo, podemos crear un redirector Socat en el servidor Ubuntu, el cual escuchará conexiones entrantes desde un handler de Metasploit configurado como bind y las redirigirá al payload de bind shell en el objetivo Windows
La figura de abajo explica mucho mejor el proceso de pivoting en este escenario.
Creating the Windows Payload
Podemos crear una bind shell usando msfvenom
con el siguiente comando:
Starting Socat Bind Shell Listener
Podemos iniciar un listener con Socat que escuche en el puerto 8080 y redirija los paquetes al servidor Windows en el puerto 8443:
Configuring & Starting the Bind multi/handler
Finalmente, podemos iniciar un handler de Metasploit configurado para bind, el cual se conectará al listener de socat en el puerto 8080 (en el servidor Ubuntu).
Establishing Meterpreter Session
Podemos ver que un bind handler se ha conectado a una solicitud de stage que ha sido pivoteada a través del listener de socat tras ejecutar el payload en el objetivo Windows.
Plink, abreviatura de PuTTY Link, es una herramienta SSH por línea de comandos para Windows que viene incluida en el paquete de PuTTY cuando se instala. Al igual que ssh
, Plink también permite crear reenvíos de puertos dinámicos (Dynamic Port Forwarding) y proxies SOCKS.
Antes de finales de 2018, Windows no incluía un cliente SSH de forma nativa, por lo que los usuarios debían instalar uno por su cuenta. La herramienta preferida por muchos administradores era PuTTY, que incluía plink
.
Ese es solo un posible escenario donde Plink resulta útil. También podríamos utilizarlo si estamos usando una máquina Windows como host de ataque principal en lugar de una basada en Linux.
En la imagen de abajo, tenemos un host de ataque basado en Windows.
El host de ataque en Windows inicia un proceso de plink.exe
con los siguientes argumentos en la línea de comandos para establecer un dynamic port forward a través del servidor Ubuntu. Esto inicia una sesión SSH entre el host de ataque en Windows y el servidor Ubuntu, y luego plink comienza a escuchar en el puerto 9050.
Using Plink.exe
Después de configurar el SOCKS server con la IP 127.0.0.1 y el puerto 9050, podemos iniciar directamente mstsc.exe (el cliente de escritorio remoto de Windows) para establecer una sesión RDP con un objetivo Windows que permita conexiones RDP.
Sshuttle es una herramienta escrita en Python que elimina la necesidad de configurar proxychains. Sin embargo, esta herramienta solo funciona para pivotar sobre conexiones SSH, y no ofrece opciones para hacerlo a través de TOR o servidores proxy HTTPS. Aun así, puede ser muy útil ya que automatiza la ejecución de reglas de iptables y el enrutamiento necesario para establecer pivotes a través del host remoto.
Una ventaja interesante de sshuttle es que no necesitamos usar proxychains para conectarnos a los hosts remotos. Basta con establecer la sesión SSH y sshuttle se encargará del resto.
Podemos instalar sshuttle en el host pivot Ubuntu y configurarlo para que enrute el tráfico hacia el host Windows y conectarnos vía RDP:
Installing sshuttle
Running sshuttle
Para usar sshuttle, especificamos la opción -r
para conectarnos a la máquina remota con un nombre de usuario y contraseña. Luego necesitamos incluir la red o IP que queremos enrutar a través del pivot host, que en nuestro caso es la red 172.16.5.0/23
.
Traffic Routing through iptables Routes
Con este comando, sshuttle crea una entrada en nuestras iptables para redirigir todo el tráfico destinado a la red 172.16.5.0/23
a través del pivot host.
Gracias a esto, ya podemos utilizar cualquier herramienta directamente sin necesidad de usar proxychains, como en el ejemplo con Nmap, donde escaneamos el puerto 3389 de la IP 172.16.5.19
de forma totalmente transparente.
Podemos iniciar nuestro servidor SOCKS proxy de rpivot con el siguiente comando para permitir que el cliente se conecte al puerto 9999
y escuchar en el puerto 9050
para conexiones de pivoteo vía proxy.
Cloning rpivot
Installing Python2.7
Alternative Installation of Python2.7
Running server.py from the Attack Host
Luego de instalar Python 2.7, podemos lanzar el servidor de rpivot con server.py
para aceptar conexiones desde el cliente ubicado en el servidor Ubuntu comprometido.
Transfering rpivot to the Target
Antes de ejecutar client.py
, necesitamos transferir el directorio de rpivot al objetivo comprometido. Podemos hacerlo con el siguiente comando SCP:
Running client.py from Pivot Target
Esto establecerá una conexión inversa desde el host comprometido (Ubuntu) hacia nuestra máquina atacante.
Confirming Connection is Established
Luego, configuramos proxychains
para usar el servidor SOCKS que levantamos con rpivot
en 127.0.0.1:9050
.
Browsing to the Target Webserver using Proxychains
Finalmente, podremos acceder al servidor web interno (en la red 172.16.5.0/23
) apuntando al 172.16.5.135:80
, usando proxychains
y navegando con Firefox desde nuestra máquina atacante.
En estos casos, rpivot
permite añadir una opción adicional de autenticación NTLM proporcionando un usuario y contraseña válidos del dominio.
Connecting to a Web Server using HTTP-Proxy & NTLM Auth
Encontrar rutas.
Ver la configuración del firewall.
Añadir proxies.
Crear reglas de reenvío de puertos.
Tomemos como ejemplo el siguiente escenario, donde el host comprometido es una estación de trabajo con Windows 10 perteneciente a un administrador de TI (IPs: 10.129.15.150
, 172.16.5.25
). Hay que tener en cuenta que, durante un pentest, es posible acceder al equipo de un empleado mediante técnicas como ingeniería social o phishing. Esto nos permitiría pivotar más dentro de la red a la que pertenece esa estación de trabajo.
Using Netsh.exe to Port Forward
Podemos usar netsh.exe
para reenviar todo el tráfico recibido en un puerto específico (por ejemplo, el 8080) hacia un host remoto en un puerto remoto. Esto se puede hacer con el siguiente comando:
Verifying Port Forward
Connecting to the Internal Host through the Port Forward
Después de configurar el portproxy en nuestro host pivot basado en Windows, intentaremos conectarnos al puerto 8080 de ese host desde nuestra máquina atacante usando xfreerdp
. Una vez que se envíe una solicitud desde nuestra máquina, el host Windows redirigirá nuestro tráfico según la configuración del proxy definida con netsh.exe
.
Normalmente, en entornos corporativos con dominios Active Directory, existe un servidor DNS que resuelve nombres de host a direcciones IP y redirige las consultas a servidores DNS externos. Sin embargo, con Dnscat2, la resolución de nombres se solicita desde un servidor externo controlado por el atacante. Cuando el DNS interno intenta resolver una dirección, en realidad se está exfiltrando información camuflada como una consulta DNS.
Este método es altamente sigiloso y puede evadir mecanismos de detección tradicionales, como los firewalls que inspeccionan conexiones HTTPS, ya que aprovecha la naturaleza "inocente" del tráfico DNS.
Cloning dnscat2 and Setting Up the Server
Si dnscat2 aún no está configurado en nuestra máquina atacante, podemos instalarlo y dejarlo listo con los siguientes comandos:
Starting the dnscat2 server
Luego de instalar y preparar el entorno, podemos iniciar el servidor de dnscat2 ejecutando el siguiente comando:
Cloning dnscat2-powershell to the Attack Host
Además, el servidor generará una clave secreta (--secret
) para cifrar la comunicación entre el cliente y el servidor. Esta clave debe usarse también en el cliente para establecer el canal C2.
Para el cliente, podemos usar:
El cliente original de dnscat2 (./dnscat
)
Lo recomendable es clonar el repositorio que contiene el cliente en nuestra máquina atacante, y luego transferirlo al host comprometido para ejecutarlo y establecer el túnel DNS.
Importing dnscat2.ps1
Una vez que el archivo dnscat2.ps1
esté en el equipo comprometido, podemos importarlo en PowerShell con el siguiente comando:
Confirming Session Establishment
Después de importarlo, usaremos el módulo para establecer un túnel hacia nuestro servidor atacante que ya está ejecutando dnscat2
. Podemos enviar una sesión de shell tipo cmd
con este comando:
Listing dnscat2 Options
Es importante que el valor de -PreSharedSecret
coincida con el generado por el servidor para que la conexión se establezca de forma correcta y cifrada.
Si todo está configurado correctamente, veremos una nueva sesión activa en el servidor dnscat2
de nuestra máquina atacante.
Interacting with the Established Session
Podemos listar las opciones disponibles en dnscat2
escribiendo ?
en la consola del servidor.
Esto indica que la sesión está cifrada y autenticada correctamente (gracias al pre-shared key). Desde ahí, cualquier comando que escribamos se enviará al cliente Windows comprometido. Por ejemplo:
dnSpy es una herramienta esencial para Red Team cuando se trata de aplicaciones .NET. Permite descompilar, analizar y modificar ejecutables (.exe) o bibliotecas (.dll), lo que puede ser clave durante un pentest para entender cómo funcionan ciertos binarios en el entorno objetivo.
Usos principales en Red Team:
Análisis de aplicaciones internas: Identificar credenciales, claves de API o lógica de autenticación en binarios .NET.
Modificación de payloads: Alterar binarios .NET maliciosos para evadir detección o personalizarlos según el objetivo.
Explotación: Examinar software vulnerable, como aplicaciones que interactúan con bases de datos, para descubrir fallos explotables.
dnSpy permite entender el comportamiento de los binarios en profundidad, apoyando tanto la ingeniería inversa como la explotación directa.
John the Ripper (JTR o john) es una herramienta de pentesting esencial que se utiliza para comprobar la fortaleza de las contraseñas y descifrar contraseñas cifradas (o con hash) mediante ataques de fuerza bruta o de diccionario. . La variante «Jumbo» se recomienda a los profesionales de la seguridad, ya que cuenta con optimizaciones de rendimiento y funciones adicionales como listas de palabras multilingües y compatibilidad con arquitecturas de 64 bits. Esta versión es más eficaz a la hora de descifrar contraseñas con mayor precisión y rapidez.
Con ella, podemos utilizar varias herramientas para convertir distintos tipos de archivos y hashes a un formato utilizable por John. Además, el software se actualiza periódicamente para mantenerse al día con las tendencias y tecnologías de seguridad actuales, garantizando la seguridad del usuario.
En este método se utiliza una lista predefinida de palabras y frases—lo que llamamos "diccionario"—para descifrar contraseñas. Esta lista puede provenir de diccionarios públicos, contraseñas filtradas o incluso comprarse a proveedores especializados. El proceso consiste en generar cadenas a partir del diccionario y compararlas con los hashes de las contraseñas; si se encuentra coincidencia, la contraseña se revela, permitiendo al atacante acceder al sistema y sus datos. Por eso, es crucial emplear contraseñas complejas, cambiarlas con regularidad y aplicar autenticación de dos factores.
Este método consiste en probar todas las combinaciones posibles de caracteres para encontrar la contraseña correcta. Aunque es muy exhaustivo y lento, se recurre a él cuando no hay otras alternativas. Cuanto mayor y más compleja sea la contraseña, más tiempo llevará descifrarla, por lo que se recomienda que tenga al menos 8 caracteres, combinando letras, números y símbolos.
Este enfoque utiliza tablas pre-calculadas que relacionan hashes con sus contraseñas en texto claro, lo que acelera el proceso en comparación con la fuerza bruta. Sin embargo, su efectividad depende del tamaño de la tabla: una tabla más grande abarca más contraseñas, pero solo sirve para descifrar aquellos hashes que ya estén incluidos. Si el hash no figura en la tabla, el método no será útil.
El Single Crack Mode
de John the Ripper es un método popular que utiliza una única lista de contraseñas para realizar un ataque de fuerza bruta. En esencia, el programa recorre cada palabra de la lista de manera secuencial hasta encontrar la que coincida con el hash de la contraseña. Aunque es un método muy directo y fácil de implementar, su eficiencia depende de la complejidad de la contraseña y del contenido de la lista, lo que puede hacer que el proceso se prolongue considerablemente.
La sintaxis básica es:
Por ejemplo, para un archivo llamado hashes_to_crack.txt
con hashes SHA-256, el comando sería:
Al iniciar el proceso, John compara cada hash con las palabras de su lista incorporada o con las adicionales que se especifiquen mediante la opción --wordlist
, y puede usar reglas (--rules
) para generar candidatos adicionales. Aunque este método es sencillo, su éxito depende de que la contraseña se encuentre o se pueda generar a partir de la lista; de lo contrario, el ataque podría no dar resultado.
Los hashes descifrados se muestran en la consola y se guardan en el archivo john.pot
(usualmente en ~/.john/john.pot
), y el proceso continúa en segundo plano, permitiendo verificar el progreso con john --show
. Para aumentar las probabilidades de éxito, es crucial emplear wordlists y reglas lo más completas y actualizadas posible.
El Wordlist Mode
se emplea para descifrar contraseñas utilizando varias listas de palabras. Funciona como un ataque de diccionario, donde se prueban, una tras otra, todas las palabras de las listas hasta hallar la que coincida. Este método resulta ideal para atacar múltiples hashes de contraseñas con una o varias wordlists, siendo más efectivo que el Modo de Crackeo Simple gracias a su mayor cantidad de palabras, aunque sigue siendo una técnica bastante básica.
La sintaxis básica es:
Primero, se indica el archivo (o archivos) que contiene la lista de palabras, en formato de texto plano (una palabra por línea), pudiendo especificarse varias separándolas con comas. Después, se puede aplicar un conjunto de reglas o las transformaciones predefinidas para modificar las palabras de la lista—por ejemplo, agregando números, cambiando mayúsculas o añadiendo caracteres especiales—para generar candidatos adicionales.
El modo incremental en John the Ripper es una opción avanzada que genera sobre la marcha todas las combinaciones posibles a partir de un conjunto de caracteres. Este método, que parte de contraseñas de un solo carácter e incrementa la longitud progresivamente, es muy eficaz pero también puede ser muy exigente en recursos y tiempo, dependiendo de la complejidad de la contraseña, la configuración de la máquina y el tamaño del conjunto de caracteres.
A diferencia del modo wordlist, que utiliza listas predefinidas, el modo incremental crea las conjeturas al instante, lo que lo hace ideal para probar contraseñas débiles o cuando se tiene una idea aproximada de su estructura. Por otro lado, el modo single crack se centra en comparar una única contraseña contra un hash.
La sintaxis para usar este modo es:
Este comando lee los hashes del archivo especificado y empieza a probar todas las combinaciones posibles, comenzando por las de menor longitud. Cabe destacar que, por defecto, el conjunto de caracteres se limita a a-z, A-Z y 0-9, por lo que para contraseñas más complejas que incluyan caracteres especiales, será necesario configurar un conjunto personalizado.
También se puede descifrar archivos protegidos o encriptados utilizando John. Para ello, se emplean herramientas auxiliares que procesan el archivo y extraen los hashes en un formato que John puede utilizar. Estas herramientas detectan automáticamente el formato del archivo y generan el hash correspondiente. Un ejemplo de cómo hacerlo es el siguiente:
NetExec (también conocido como nxc) es una herramienta de explotación de servicios de red que ayuda a automatizar la evaluación de la seguridad de redes de gran tamaño. Se basa en CrackMapExec, lo que hace que la herramienta sea fácil de usar.
En Kali Linux la herramienta se puede instalar simplemente a través del siguiente comando.
En caso de disponer de otra distribución, podemos revisar la página oficial de NetExec.
Verificar credenciales válidas de un usuario autenticándose mediante SMB.
Dumping SAM
Dumping LSASS
Dumping NTDS.dit
A través de nxc podemos efectuar los siguientes ataques en el protocolo de Kerberos.
Para un único usuario.
Para un listado de usuarios.
Si disponemos credenciales, podemos usar nxc para obtener archivos zip o .json para BloodHound.
Enumerar todos los usuarios del AD.
Enumerar solamente los usuarios que se encuentren activo en el AD.
Enumerar los grupos del AD.
Windows Auth
Local Auth
Specify Port
Podemos encontrar más ejemplos de findstr
.
Podemos crear una reverse shell en PowerShell usando , configurando la IP de nuestra máquina, el puerto, y seleccionando la opción Powershell #3 (Base64).
Para instalar dbeaver usando un paquete Debian podemos descargar el paquete release .deb desde y ejecutar el siguiente comando:
Herramientas como también pueden utilizarse para enumerar todos los servidores DNS del dominio raíz y escanear si es posible realizar una transferencia de zona DNS:
Antes de realizar un subdomain takeover, debemos enumerar los subdominios del dominio objetivo utilizando herramientas como . Esta herramienta recopila subdominios desde fuentes abiertas como . También se pueden usar otras herramientas como para realizar fuerza bruta de subdominios utilizando una wordlist predefinida:
El repositorio también es una excelente referencia para identificar vulnerabilidades de subdomain takeover. Este recurso indica si los servicios utilizados por el subdominio objetivo son susceptibles de ser tomados, y proporciona guías para evaluar si realmente existe la vulnerabilidad.
Fuente:
Podemos usar la herramienta para realizar un ataque de password spraying contra el servicio RDP. En el siguiente ejemplo, se prueba la contraseña password123
contra una lista de usuarios (usernames.txt
). El ataque logra encontrar las credenciales válidas:
SMTP Encrypted/
Podemos automatizar el proceso de enumeración de usuarios en servidores SMTP con la herramienta . Esta utilidad permite comprobar si existen direcciones de correo válidas usando comandos como VRFY
, EXPN
o RCPT
.
Una herramienta útil para esto es , que permite validar si un dominio usa Office 365 y luego enumerar usuarios válidos, así como hacer password spraying.
Hay muchas ocasiones durante una auditoría de Pentest en las que tener únicamente una conexión por escritorio remoto no es suficiente. Podemos necesitar subir o bajar archivos (cuando el portapapeles del RDP está deshabilitado), usar exploits o interactuar con APIs de bajo nivel de Windows mediante una sesión de Meterpreter, lo cual no es posible usando solo.
es una herramienta de relay bidireccional que permite crear sockets tipo pipe entre dos canales de red independientes, sin necesidad de usar SSH tunneling. Actúa como un redirector, escuchando en un host:puerto y redirigiendo ese tráfico hacia otra dirección IP y puerto.
Ten en cuenta que debemos transferir este payload al host Windows. Podemos usar algunas de las mismas técnicas vistas en .
Otra herramienta basada en Windows llamada puede usarse para iniciar un túnel SOCKS a través de la sesión SSH que creamos. Proxifier es una herramienta para Windows que crea una red tunelizada para aplicaciones cliente de escritorio, permitiendo que funcionen a través de un proxy SOCKS o HTTPS, y también permite hacer proxy chaining. Es posible crear un perfil donde podamos proporcionar la configuración para nuestro SOCKS server iniciado por Plink en el puerto 9050.
es una herramienta de reverse SOCKS proxy escrita en Python para el SOCKS tunneling. Rpivot vincula una máquina dentro de una red corporativa a un servidor externo y expone el puerto local del cliente en el lado del servidor. Tomaremos el siguiente escenario, donde tenemos un servidor web en nuestra red interna (172.16.5.135) y queremos acceder a él usando el proxy rpivot.
Similar al proxy de pivoting anterior, puede haber escenarios en los que no podamos pivotar directamente hacia un servidor externo (nuestra máquina atacante en la nube). Algunas organizaciones tienen proxies , configurados con el Controlador de Dominio (DC).
es una herramienta de línea de comandos de Windows que puede ayudarnos con la configuración de red de un sistema Windows en particular. Estas son algunas de las tareas relacionadas con red que podemos realizar con Netsh:
es una herramienta de tunelización que utiliza el protocolo DNS para enviar datos entre dos hosts. Usa un canal C2 (Command and Control) cifrado y envía la información dentro de los registros TXT del protocolo DNS.
O bien, , una versión en PowerShell compatible con Windows.
Además, podemos utilizar diferentes modos para ello con nuestras listas de palabras y reglas personales. Hemos creado una lista que incluye muchas, pero no todas, las herramientas que se pueden utilizar para John.
afs
john --format=afs hashes_to_crack.txt
AFS (Andrew File System) password hashes
bfegg
john --format=bfegg hashes_to_crack.txt
bfegg hashes used in Eggdrop IRC bots
bf
john --format=bf hashes_to_crack.txt
Blowfish-based crypt(3) hashes
bsdi
john --format=bsdi hashes_to_crack.txt
BSDi crypt(3) hashes
crypt(3)
john --format=crypt hashes_to_crack.txt
Traditional Unix crypt(3) hashes
des
john --format=des hashes_to_crack.txt
Traditional DES-based crypt(3) hashes
dmd5
john --format=dmd5 hashes_to_crack.txt
DMD5 (Dragonfly BSD MD5) password hashes
dominosec
john --format=dominosec hashes_to_crack.txt
IBM Lotus Domino 6/7 password hashes
EPiServer SID hashes
john --format=episerver hashes_to_crack.txt
EPiServer SID (Security Identifier) password hashes
hdaa
john --format=hdaa hashes_to_crack.txt
hdaa password hashes used in Openwall GNU/Linux
hmac-md5
john --format=hmac-md5 hashes_to_crack.txt
hmac-md5 password hashes
hmailserver
john --format=hmailserver hashes_to_crack.txt
hmailserver password hashes
ipb2
john --format=ipb2 hashes_to_crack.txt
Invision Power Board 2 password hashes
krb4
john --format=krb4 hashes_to_crack.txt
Kerberos 4 password hashes
krb5
john --format=krb5 hashes_to_crack.txt
Kerberos 5 password hashes
LM
john --format=LM hashes_to_crack.txt
LM (Lan Manager) password hashes
lotus5
john --format=lotus5 hashes_to_crack.txt
Lotus Notes/Domino 5 password hashes
mscash
john --format=mscash hashes_to_crack.txt
MS Cache password hashes
mscash2
john --format=mscash2 hashes_to_crack.txt
MS Cache v2 password hashes
mschapv2
john --format=mschapv2 hashes_to_crack.txt
MS CHAP v2 password hashes
mskrb5
john --format=mskrb5 hashes_to_crack.txt
MS Kerberos 5 password hashes
mssql05
john --format=mssql05 hashes_to_crack.txt
MS SQL 2005 password hashes
mssql
john --format=mssql hashes_to_crack.txt
MS SQL password hashes
mysql-fast
john --format=mysql-fast hashes_to_crack.txt
MySQL fast password hashes
mysql
john --format=mysql hashes_to_crack.txt
MySQL password hashes
mysql-sha1
john --format=mysql-sha1 hashes_to_crack.txt
MySQL SHA1 password hashes
NETLM
john --format=netlm hashes_to_crack.txt
NETLM (NT LAN Manager) password hashes
NETLMv2
john --format=netlmv2 hashes_to_crack.txt
NETLMv2 (NT LAN Manager version 2) password hashes
NETNTLM
john --format=netntlm hashes_to_crack.txt
NETNTLM (NT LAN Manager) password hashes
NETNTLMv2
john --format=netntlmv2 hashes_to_crack.txt
NETNTLMv2 (NT LAN Manager version 2) password hashes
NEThalfLM
john --format=nethalflm hashes_to_crack.txt
NEThalfLM (NT LAN Manager) password hashes
md5ns
john --format=md5ns hashes_to_crack.txt
md5ns (MD5 namespace) password hashes
nsldap
john --format=nsldap hashes_to_crack.txt
nsldap (OpenLDAP SHA) password hashes
ssha
john --format=ssha hashes_to_crack.txt
ssha (Salted SHA) password hashes
NT
john --format=nt hashes_to_crack.txt
NT (Windows NT) password hashes
openssha
john --format=openssha hashes_to_crack.txt
OPENSSH private key password hashes
oracle11
john --format=oracle11 hashes_to_crack.txt
Oracle 11 password hashes
oracle
john --format=oracle hashes_to_crack.txt
Oracle password hashes
john --format=pdf hashes_to_crack.txt
PDF (Portable Document Format) password hashes
phpass-md5
john --format=phpass-md5 hashes_to_crack.txt
PHPass-MD5 (Portable PHP password hashing framework) password hashes
phps
john --format=phps hashes_to_crack.txt
PHPS password hashes
pix-md5
john --format=pix-md5 hashes_to_crack.txt
Cisco PIX MD5 password hashes
po
john --format=po hashes_to_crack.txt
Po (Sybase SQL Anywhere) password hashes
rar
john --format=rar hashes_to_crack.txt
RAR (WinRAR) password hashes
raw-md4
john --format=raw-md4 hashes_to_crack.txt
Raw MD4 password hashes
raw-md5
john --format=raw-md5 hashes_to_crack.txt
Raw MD5 password hashes
raw-md5-unicode
john --format=raw-md5-unicode hashes_to_crack.txt
Raw MD5 Unicode password hashes
raw-sha1
john --format=raw-sha1 hashes_to_crack.txt
Raw SHA1 password hashes
raw-sha224
john --format=raw-sha224 hashes_to_crack.txt
Raw SHA224 password hashes
raw-sha256
john --format=raw-sha256 hashes_to_crack.txt
Raw SHA256 password hashes
raw-sha384
john --format=raw-sha384 hashes_to_crack.txt
Raw SHA384 password hashes
raw-sha512
john --format=raw-sha512 hashes_to_crack.txt
Raw SHA512 password hashes
salted-sha
john --format=salted-sha hashes_to_crack.txt
Salted SHA password hashes
sapb
john --format=sapb hashes_to_crack.txt
SAP CODVN B (BCODE) password hashes
sapg
john --format=sapg hashes_to_crack.txt
SAP CODVN G (PASSCODE) password hashes
sha1-gen
john --format=sha1-gen hashes_to_crack.txt
Generic SHA1 password hashes
skey
john --format=skey hashes_to_crack.txt
S/Key (One-time password) hashes
ssh
john --format=ssh hashes_to_crack.txt
SSH (Secure Shell) password hashes
sybasease
john --format=sybasease hashes_to_crack.txt
Sybase ASE password hashes
xsha
john --format=xsha hashes_to_crack.txt
xsha (Extended SHA) password hashes
zip
john --format=zip hashes_to_crack.txt
ZIP (WinZip) password hashes
pdf2john
Converts PDF documents for John
ssh2john
Converts SSH private keys for John
mscash2john
Converts MS Cash hashes for John
keychain2john
Converts OS X keychain files for John
rar2john
Converts RAR archives for John
pfx2john
Converts PKCS#12 files for John
truecrypt_volume2john
Converts TrueCrypt volumes for John
keepass2john
Converts KeePass databases for John
vncpcap2john
Converts VNC PCAP files for John
putty2john
Converts PuTTY private keys for John
zip2john
Converts ZIP archives for John
hccap2john
Converts WPA/WPA2 handshake captures for John
office2john
Converts MS Office documents for John
wpa2john
Converts WPA/WPA2 handshakes for John
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:
Username
User account
Creds
Users
Passkeys
Passphrases
configuration
dbcredential
dbpassword
pwd
Login
Credentials
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.
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.
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:
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,
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.
Un sistema Linux puede estar configurado de diferentes maneras para almacenar tickets Kerberos, y en esta sección vamos a ver algunas de esas opciones.
Windows y Linux utilizan el mismo proceso para solicitar un Ticket Granting Ticket (TGT) y un Service Ticket (TGS). Sin embargo, la forma en que se almacenan los tickets puede variar según la distribución de Linux y la implementación utilizada.
En la mayoría de los casos, las máquinas Linux almacenan los tickets Kerberos como archivos ccache en el directorio /tmp
. Por defecto, la ubicación del ticket Kerberos se define en la variable de entorno KRB5CCNAME
. Esta variable nos puede indicar si se están utilizando tickets Kerberos o si se ha cambiado la ruta por defecto donde se almacenan. Estos archivos .ccache
están protegidos por permisos de lectura y escritura, pero un usuario con privilegios elevados o root puede acceder fácilmente a ellos.
Otro uso muy común de Kerberos en Linux es a través de los archivos keytab. Un keytab es un archivo que contiene pares de principales Kerberos y claves cifradas (derivadas de la contraseña de Kerberos). Estos archivos permiten autenticarse en sistemas remotos usando Kerberos sin necesidad de introducir una contraseña. Eso sí, si el usuario cambia su contraseña, es necesario recrear los archivos keytab.
Los archivos keytab suelen usarse para que scripts puedan autenticarse automáticamente usando Kerberos, sin intervención humana ni necesidad de guardar la contraseña en texto plano. Por ejemplo, un script podría usar un keytab para acceder a archivos compartidos en un recurso de red de Windows.
Para practicar y entender cómo podemos abusar de Kerberos desde un sistema Linux, contamos con una máquina llamada LINUX01 conectada al Domain Controller. Esta máquina solo es accesible a través de MS01.
Para acceder a LINUX01 por SSH, tenemos dos opciones:
Conectarnos primero a MS01 mediante RDP y, desde ahí, usar el comando SSH en la línea de comandos de Windows para conectar con la máquina Linux.
Usar una técnica de port forwarding para redirigir el tráfico SSH hacia LINUX01.
Linux Auth from MS01 Image
Linux Auth via Port Forward
Como alternativa, creamos un port forwarding
para simplificar la interacción con LINUX01
. Al conectarnos al puerto TCP/2222 en MS01
, obtendremos acceso al puerto TCP/22 en LINUX01
.
Supongamos que estamos en una nueva evaluación, y la empresa nos da acceso a LINUX01
y al usuario david@inlanefreight.htb
y contraseña Password2
.
realm - Check If Linux Machine is Domain Joined
La salida del comando indica que la máquina está configurada como miembro de Kerberos. También nos da información sobre el nombre de dominio (inlanefreight.htb) y qué usuarios y grupos tienen permiso para iniciar sesión, que en este caso son los usuarios David y Julio y el grupo Linux Admins.
PS - Check if Linux Machine is Domain Joined
Como atacante, siempre estamos buscando credenciales. En máquinas Linux unidas a un dominio, queremos encontrar tickets Kerberos para obtener más acceso. Los tickets Kerberos se pueden encontrar en diferentes lugares dependiendo de la implementación de Linux o de que el administrador cambie la configuración por defecto. Exploremos algunas formas comunes de encontrar tickets Kerberos.
Un método sencillo es utilizar find
para buscar archivos cuyo nombre contenga la palabra keytab
. Cuando un administrador comúnmente crea un ticket Kerberos para ser usado con un script, establece la extensión a .keytab
. Aunque no es obligatorio, es una forma en la que los administradores suelen referirse a un archivo keytab.
Otra forma de encontrar archivos keytab
es en scripts automatizados configurados mediante un cronjob o cualquier otro servicio Linux. Si un administrador necesita ejecutar un script para interactuar con un servicio de Windows que utiliza Kerberos, y si el fichero keytab no tiene la extensión .keytab
, podemos encontrar el nombre de fichero apropiado dentro del script. Veamos este ejemplo:
En este ejemplo, encontramos un script que importa un ticket Kerberos (svc_workstations.kt
) para el usuario svc_workstations@INLANEFREIGHT.HTB
antes de intentar conectarse a una carpeta compartida. Más adelante veremos cómo utilizar esos tickets y suplantar usuarios.
Busquemos las variables de entorno e identifiquemos la ubicación de nuestra caché de credenciales Kerberos:
Como se mencionó anteriormente, los archivos ccache
se encuentran, por defecto, en /tmp
. Podemos buscar usuarios que hayan iniciado sesión en el ordenador, y si conseguimos acceso como root o un usuario con privilegios, seríamos capaces de suplantar a un usuario utilizando su archivo ccache
mientras aún sea válido.
Como atacantes, podemos darle varios usos a un archivo keytab. Lo primero que podemos hacer es suplantar a un usuario utilizando kinit
. Para utilizar un archivo keytab
, necesitamos saber para qué usuario fue creado.
klist
es otra aplicación utilizada para interactuar con Kerberos en Linux. Esta aplicación lee información de un fichero keytab. Veámoslo con el siguiente comando:
El ticket corresponde al usuario Carlos. Ya podemos suplantar al usuario con kinit
.
Confirmemos qué ticket estamos usando con klist
y luego importemos el ticket de Carlos a nuestra sesión con kinit
.
Connecting to SMB Share as Carlos
Podemos intentar acceder a la carpeta compartida \\dc01\\carlos
para confirmar nuestro acceso.
El segundo método que utilizaremos para abusar de Kerberos en Linux es extraer los secretos de un archivo keytab. Pudimos hacernos pasar por Carlos usando los tickets de la cuenta para leer una carpeta compartida en el dominio, pero si queremos acceder a su cuenta en la máquina Linux, necesitaremos su contraseña.
Con el hash NTLM, podemos realizar un ataque Pass the Hash. Con el hash AES256 o AES128, podemos falsificar nuestros tickets usando Rubeus o intentar crackear los hashes para obtener la contraseña en texto plano.
Como podemos ver en la imagen, la contraseña para el usuario Carlos es Password5. Ahora podemos iniciar sesión como Carlos.
Carlos tiene un cronjob que utiliza un archivo keytab llamado svc_workstations.kt
. Podemos repetir el proceso, descifrar la contraseña e iniciar sesión como svc_workstations
.
Para abusar de un archivo ccache, todo lo que necesitamos son privilegios de lectura sobre el archivo. Estos archivos, ubicados en /tmp
, sólo pueden ser leídos por el usuario que los creó, pero si obtenemos acceso de root, podríamos utilizarlos.
Una vez que nos logueamos con las credenciales del usuario svc_workstations, podemos usar sudo -l y confirmar que el usuario puede ejecutar cualquier comando como root. Podemos usar el comando sudo su para cambiar el usuario a root.
Como root, necesitamos identificar qué tickets están presentes en la máquina, a quién pertenecen y su tiempo de caducidad.
Julio es miembro del grupo Domain Admins
. Podemos intentar suplantar al usuario y obtener acceso al host Controlador de dominio DC01
.
Para utilizar un archivo ccache, podemos copiar el archivo ccache y asignar la ruta del archivo a la variable KRB5CCNAME
.
La mayoría de las herramientas de ataque en Linux que interactúan con entornos Windows y Active Directory soportan autenticación Kerberos. Si las usamos desde una máquina unida al dominio, debemos asegurarnos de que la variable de entorno KRB5CCNAME esté apuntando al archivo ccache que queremos usar.
En caso de que estemos atacando desde una máquina que no es miembro del dominio, como nuestro equipo de ataque, debemos asegurarnos de que dicha máquina pueda contactar con el KDC o Domain Controller, y que la resolución de nombres del dominio funcione correctamente.
En este escenario, nuestra máquina atacante no tiene conexión directa con el KDC/Domain Controller, y no puede usarlo para resolver nombres. Para poder usar Kerberos, necesitamos redirigir el tráfico a través de MS01 usando herramientas como Chisel y Proxychains, y además editar el archivo /etc/hosts para establecer manualmente las direcciones IP del dominio y de las máquinas que queremos atacar.
Host File Modified
Proxychains Configuration File
Tenemos que modificar nuestro archivo de configuración proxychains para utilizar socks5 y el puerto 1080.
Download Chisel to our Attack Host
Connect to MS01 with xfreerdp
Execute chisel from MS01
Setting the KRB5CCNAME Environment Variable
Finalmente, necesitamos transferir el archivo ccache de Julio desde LINUX01 y crear la variable de entorno KRB5CCNAME
con el valor correspondiente a la ruta del archivo ccache.
Esto permitirá que las herramientas que utilicen autenticación Kerberos en nuestra máquina atacante usen el ticket de Julio para autenticarse como él dentro del dominio.
Para usar el ticket Kerberos, debemos especificar el nombre de la máquina objetivo (no su dirección IP) y usar la opción -k
.
Si al conectarnos se nos solicita una contraseña, también podemos añadir la opción -no-pass
para evitar que la herramienta intente pedir credenciales.
Esto forzará el uso del ticket Kerberos almacenado, sin requerir interacción adicional.
Using Impacket with proxychains and Kerberos Authentication
La autenticación mediante Kerberos requiere de una serie de pasos previos para que funcione correctamente.
Sincronizar la hora de la máquina local con la del Domain Controller.
Disponer de un TGT (Ticket Granting Ticket)
Exportar el TGT en la variable KRB5CCNAME
Disponer de la instalación de krb5-user
y krb5-config
en el equipo local
Configurar adecuadamente el archivo /etc/krb5.conf
con la configuración necesaria del dominio
El comando para conectarnos mediante el TGT obtenido es el siguiente:
Para configurar paso a paso esta autenticación al WinRM
mediante Kerberos, realizaremos los siguientes pasos:
Deberemos de sincronizar la hora de nuestro equipo con la del DC (Domain Controller).
Instalaremos el paquete de ntpdate
para ayudarnos a sincronizar la hora de nuestro reloj.
Una vez instalado, sincronizaremos nuestra hora con la del DC.
Deberemos de disponer de un TGT (Ticket Granting Ticket) del usuario con el que queramos conectarnos. Disponemos de varias maneras de haber obtenido ya un TGT, pero en este caso explicaremos solamente a solicitarlo para el usuario que disponemos sus credenciales.
A través de la herramienta de impacket-getTGT
obtendremos un TGT válido para nuestro usuario.
Una vez solicitado el TGT, nos deberá proporcionar un archivo .ccache
.
Una vez obtenido el TGT (.ccache
), deberemos de exportar este tiquet en la variable KRB5CCNAME
para poder utilizarlo correctamente.
Instalaremos el paquete de krb5-user
a través del siguiente comando:
Una vez instalado, validaremos que el tiquet TGT obtenido y declarado en KRB5CCNAME
funcione correctamente. Nos deberá aparecer nuestro TGT.
Instalaremos el paquete necesario para el /etc/krb5.conf
a través del siguiente comando:
Una vez instalado el paquete, deberemos de configurar el archivo /etc/krb5.conf
para que se adapte al dominio correspondiente.
A continuación, dejaremos un archivo /etc/krb5.conf
de ejemplo.
Si queremos usar un archivo ccache en Windows o un archivo .kirbi en una máquina Linux, podemos usar la herramienta impacket-ticketConverter
para convertirlos.
Para utilizarla, simplemente indicamos el archivo que queremos convertir y el nombre del archivo de salida. Por ejemplo, para convertir el archivo ccache de Julio a formato .kirbi
:
También podemos hacer la operación inversa, convirtiendo un archivo .kirbi
a .ccache
para usarlo en Linux.
Linikatz es una herramienta creada por el equipo de seguridad de Cisco para la extracción de credenciales en máquinas Linux integradas en Active Directory. En otras palabras, lleva el mismo concepto de Mimikatz al entorno UNIX.
Al igual que Mimikatz, para aprovechar Linikatz necesitamos tener acceso root en la máquina. Esta herramienta extrae todas las credenciales, incluidos tickets Kerberos, desde distintas implementaciones como FreeIPA, SSSD, Samba, Vintella, entre otras. Una vez extraídas, las guarda en una carpeta cuyo nombre comienza con linikatz.
Dentro de esa carpeta encontraremos las credenciales en varios formatos útiles como .ccache
y .keytab
, que luego podemos reutilizar según sea necesario (como se explicó anteriormente).
Al ejecutarlo, Linikatz detecta las configuraciones de distintos servicios relacionados con AD (como FreeIPA, SSSD, Samba, Kerberos, etc.) y extrae los archivos relevantes: bases de datos de caché, archivos .ccache
, .keytab
, configuraciones y más.
En el ejemplo mostrado:
Se detectan múltiples tickets Kerberos en /tmp
, incluyendo de usuarios como julio@inlanefreight.htb
y svc_workstations@inlanefreight.htb
.
También se identifican archivos de configuración como /etc/krb5.conf
y /etc/sssd/sssd.conf
.
El sistema está utilizando SSSD
y se observan archivos .ldb
y .ccache
dentro de /var/lib/sss/db/
.
Podemos identificar si la máquina Linux está unida a un dominio utilizando , una herramienta utilizada para gestionar la inscripción del sistema en un dominio y establecer qué usuarios o grupos del dominio tienen permiso para acceder a los recursos del sistema local.
En caso de que no esté disponible, también podemos buscar otras herramientas utilizadas para integrar Linux con Active Directory como sssd o winbind. Buscar esos servicios ejecutándose en la máquina es otra forma de identificar si está unida a un dominio. Podemos leer esta entrada de para más detalles. Vamos a buscar esos servicios para confirmar si la máquina está unida a un dominio.
En el script anterior, notamos el uso de , lo que significa que Kerberos está en uso. permite la interacción con Kerberos, y su función es solicitar el TGT del usuario y almacenar este ticket en la caché (archivo ccache). Podemos utilizar kinit
para importar un keytab
a nuestra sesión y actuar como el usuario.
Un archivo de caché de credenciales o almacena las credenciales Kerberos mientras siguen siendo válidas y, por lo general, mientras dura la sesión del usuario. Una vez que un usuario se autentica en el dominio, se crea un archivo ccache que almacena la información del ticket. La ruta a este archivo se coloca en la variable de entorno KRB5CCNAME
. Esta variable es utilizada por las herramientas que soportan la autenticación Kerberos para encontrar los datos Kerberos.
Podemos intentar descifrar la contraseña de la cuenta extrayendo los hashes del archivo keytab. Usemos , una herramienta para extraer información valiosa de archivos .keytab de tipo 502, que pueden ser usados para autenticar cajas Linux a Kerberos. El script extraerá información como el dominio, el principal del servicio, el tipo de cifrado y los hash.
El hash más sencillo de descifrar es el hash NTLM. Podemos utilizar herramientas como o the Ripper para descifrarlo. Sin embargo, una forma rápida de descifrar contraseñas es con repositorios online como , que contiene miles de millones de contraseñas.
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.
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.
La transferencia web es la forma más común en la que la mayoría de la gente transfiere archivos, ya que HTTP/HTTPS son los protocolos que normalmente están permitidos a través de los firewalls. Además, en muchos casos, el archivo viaja cifrado, lo cual es una gran ventaja. No hay nada peor que estar en un pentest y que el IDS del cliente detecte que hemos enviado un archivo sensible en texto plano, y que luego pregunten por qué mandamos una contraseña a nuestro servidor sin cifrado.
Ya vimos cómo usar el módulo uploadserver
de Python3 para montar un servidor web con capacidad de subida de archivos, pero también podemos usar Apache o Nginx. En esta parte, vamos a ver cómo montar un servidor web seguro para operaciones de subida de archivos.
Una buena alternativa a Apache para transferir archivos es Nginx, ya que su configuración es más sencilla y su sistema de módulos no genera tantos problemas de seguridad como puede ocurrir con Apache.
Cuando permitimos subidas por HTTP, es fundamental asegurarnos al 100% de que los usuarios no puedan subir shells web y ejecutarlos. Apache, por ejemplo, puede ser peligroso en este sentido, ya que su módulo de PHP tiende a ejecutar cualquier archivo que termine en .php
. En cambio, configurar PHP en Nginx no es tan directo, lo que en este contexto es una ventaja porque reduce el riesgo de ejecución automática.
Cree el archivo de configuración de Nginx creando el archivo /etc/nginx/sites-available/upload.conf
con el contenido:
Remove NginxDefault Configuration
Ahora podemos probar la carga usando cURL para enviar una solicitud PUT. En el siguiente ejemplo, subiremos el archivo /etc/passwd al servidor y lo llamaremos users.txt.
Una vez que esto funcione, una buena prueba es asegurarnos de que el listado de directorios no esté habilitado navegando a http://localhost/SecretUploadDirectory. Por defecto, con Apache, si encontramos un directorio sin un archivo de índice (index.html), listará todos los archivos. Esto es perjudicial para nuestro caso de exfilling de archivos, ya que la mayoría son sensibles por naturaleza y queremos hacer todo lo posible por ocultarlos. Gracias a que Nginx es minimalista, estas funciones no están habilitadas por defecto.
Los binarios de Living off the Land pueden usarse para realizar funciones como:
Download
Upload
Command Execution
File Read
File Write
Bypoasses
Para buscar la función de descarga y carga en GTFOBins para binarios de Linux, podemos usar +file download o +file upload.
La vulnerabilidad Local File Inclusion (LFI) es una vulnerabilidad de seguridad informática que se produce cuando una aplicación web no valida adecuadamente las entradas de usuario, permitiendo a un atacante acceder a archivos locales en el servidor web.
En muchos casos, los atacantes aprovechan la vulnerabilidad de LFI al abusar de parámetros de entrada en la aplicación web. Los parámetros de entrada son datos que los usuarios ingresan en la aplicación web, como las URL o los campos de formulario. Los atacantes pueden manipular los parámetros de entrada para incluir rutas de archivo local en la solicitud, lo que puede permitirles acceder a archivos en el servidor web. Esta técnica se conoce como “Path Traversal” y se utiliza comúnmente en ataques de LFI.
En el ataque de Path Traversal, el atacante utiliza caracteres especiales y caracteres de escape en los parámetros de entrada para navegar a través de los directorios del servidor web y acceder a archivos en ubicaciones sensibles del sistema.
Por ejemplo, el atacante podría incluir “../” en el parámetro de entrada para navegar hacia arriba en la estructura del directorio y acceder a archivos en ubicaciones sensibles del sistema.
Para prevenir los ataques LFI, es importante que los desarrolladores de aplicaciones web validen y filtren adecuadamente la entrada del usuario, limitando el acceso a los recursos del sistema y asegurándose de que los archivos sólo se puedan incluir desde ubicaciones permitidas. Además, las empresas deben implementar medidas de seguridad adecuadas, como el cifrado de archivos y la limitación del acceso de usuarios no autorizados a los recursos del sistema.
A continuación, se os proporciona el enlace directo a la herramienta que utilizamos al final de esta clase para abusar de los ‘Filter Chains‘ y conseguir así ejecución remota de comandos:
Apktool es una herramienta de línea de comandos utilizada para descompilar y recompilar aplicaciones Android en formato APK. Permite analizar, modificar y personalizar aplicaciones al desensamblar su código y recursos (como XML y archivos de imagen).
Se utiliza principalmente en tareas como:
Ingeniería inversa para entender el funcionamiento de una app.
Modificación de aplicaciones para cambiar funcionalidades o aspectos visuales.
Análisis de seguridad para buscar vulnerabilidades o comportamientos maliciosos.
JADX-GUI es una herramienta clave en pentests de Red Team dirigidos a aplicaciones Android, ya que permite descompilar archivos APK y analizar su código fuente de forma gráfica. Es especialmente útil para identificar vulnerabilidades y preparar ataques dirigidos.
Usos principales en Red Team:
Reconocimiento avanzado: Extrae información crítica como permisos, endpoints, claves de API y rutas de comunicación con servidores backend.
Análisis de lógica interna: Revisa el código fuente descompilado para encontrar validaciones débiles, cifrados inseguros o credenciales embebidas.
Soporte para ataques posteriores: Identifica puntos de entrada para ataques como modificación de la app, hookeo con Frida o generación de payloads personalizados.
Preparación de exploits: Ayuda a entender cómo interactúa la app con otros sistemas, permitiendo diseñar exploits específicos para APIs o bases de datos.
JADX-GUI es una herramienta poderosa para descompilar y analizar aplicaciones Android, siendo un paso crucial en ataques contra apps móviles en entornos reales.
En las distros Linux se pueden usar varios mecanismos de autenticación, pero uno de los más comunes y estándar es PAM (Pluggable Authentication Modules).
Los módulos principales se llaman pam_unix.so
o pam_unix2.so
, y en sistemas basados en Debian se encuentran en:
Estos módulos se encargan de manejar todo lo relacionado con los usuarios: autenticación, sesiones, contraseñas actuales y antiguas.
Por ejemplo, cuando usamos el comando passwd
para cambiar la contraseña, PAM se activa, toma medidas de seguridad y gestiona todo el proceso como debe ser.
El módulo pam_unix.so
usa llamadas estándar a las librerías del sistema para actualizar la info de la cuenta. Los archivos que maneja directamente son:
/etc/passwd
/etc/shadow
Además, PAM puede usar otros módulos según lo necesitemos, como para autenticación con LDAP, Kerberos, o incluso para montar recursos.
El archivo /etc/passwd
guarda información sobre todos los usuarios del sistema y puede ser leído por cualquier usuario o servicio.
Cada línea del archivo representa un usuario y está formada por siete campos, separados por dos puntos (:
), que actúan como una especie de base de datos simple.
Un ejemplo de cómo se ve una entrada típica sería algo así:
Nombre de usuario → gzzcoo
Contraseña (x) → Un x
significa que la contraseña está en /etc/shadow
UID → Identificador del usuario, por ejemplo 1001
GID → ID del grupo principal del usuario
Comentario o nombre completo → Gzzcoo
Directorio home → /home/gzzcoo
Shell por defecto → /bin/bash
El campo más interesante para nosotros en el archivo /etc/passwd
es el de la contraseña, porque puede tener diferentes valores.
En sistemas muy antiguos, es raro pero posible encontrar ahí directamente el hash de la contraseña. Si eso pasa, como el archivo es legible por todo el sistema, un atacante podría copiar ese hash y crackearlo fácilmente.
En sistemas modernos, lo normal es que ese campo tenga una x
, lo que significa que el hash real está en /etc/shadow
, un archivo mucho más protegido.
Ahora bien, si por error el archivo /etc/passwd
es escribible, podríamos vaciar el campo de contraseña del usuario root
, dejándolo así:
Aunque estos casos no sean tan comunes, igual hay que estar atentos porque pueden aparecer fallos de seguridad por permisos mal puestos. Hay aplicaciones que piden permisos específicos sobre carpetas enteras, y si el admin no tiene mucha experiencia con Linux o con la app, puede terminar dando permiso de escritura al directorio /etc
, y olvidarse de corregirlo después.
Eso abre la puerta a que un atacante modifique archivos críticos como /etc/passwd
, /etc/shadow
o incluso servicios.
Como leer los hashes de contraseñas puede comprometer todo el sistema, se creó el archivo /etc/shadow
, que tiene un formato similar al /etc/passwd
, pero solo guarda la info de contraseñas y su gestión.
Este archivo contiene los hashes de todas las contraseñas de los usuarios. Si un usuario aparece en /etc/passwd
pero no tiene entrada en /etc/shadow
, se considera inválido.
Además, solo puede ser leído por usuarios con permisos de administrador.
Nombre de usuario → cry0l1t3
Contraseña cifrada (hash) → empieza con $6$
(sha512)
Fecha del último cambio de contraseña (en días desde 1970)
Edad mínima de la contraseña (días para poder cambiarla)
Edad máxima de la contraseña (días antes de caducar)
Periodo de aviso (días antes de caducar que se avisa al user)
Periodo de inactividad (días después de caducar sin login)
Fecha de expiración de la cuenta
Campo no usado (vacío)
En el campo de contraseña del archivo /etc/shadow
, si vemos un carácter como !
o *
, significa que el usuario no puede iniciar sesión con contraseña Unix. Pero sí puede autenticarse con otros métodos como Kerberos o claves SSH.
Si el campo está vacío, no se pedirá contraseña para hacer login, aunque eso puede hacer que ciertos programas le bloqueen funciones.
Los hashes tienen esta estructura:
Con esto, podemos identificar el algoritmo usado:
$1$
MD5
$2a$
Blowfish
$2y$
Eksblowfish
$5$
SHA-256
$6$
SHA-512
En las distros modernas de Linux se usa por defecto SHA-512 ($6$
).
En sistemas antiguos aún podemos encontrarnos con MD5, Blowfish, o SHA-256, y ahí es donde es más fácil poder crackear.
El módulo pam_unix.so
de la biblioteca PAM permite restringir la reutilización de contraseñas anteriores. Para ello, almacena los hashes de contraseñas previamente utilizadas en el archivo:
Este archivo es accesible únicamente por el usuario root, a menos que se hayan modificado sus permisos manualmente.
Reading /etc/security/opasswd
Al observar el contenido de este archivo, podemos ver que contiene varias entradas para el usuario cry0l1t3
, separadas por comas (,). Otro aspecto crítico a tener en cuenta es el tipo de algoritmo de hash utilizado. En este caso, el algoritmo MD5 ($1$
) es considerablemente más fácil de romper que SHA-512.
Esto es especialmente relevante para identificar contraseñas antiguas e incluso posibles patrones, ya que es común que las contraseñas se reutilicen en distintos servicios o aplicaciones. Detectar estos patrones aumenta significativamente la probabilidad de adivinar la contraseña actual.
Una vez que hayamos recopilado algunos hashes, podemos intentar descifrarlos de diferentes maneras para obtener las contraseñas en texto sin cifrar.