Intelligence

Intelligence es una máquina Windows de dificultad media que muestra una serie de ataques comunes en un entorno Active Directory. Tras recuperar documentos PDF internos almacenados en el servidor web (forzando un esquema de nomenclatura común) e inspeccionar su contenido y metadatos, que revelan una contraseña predeterminada y una lista de posibles usuarios de Active Directory, el rociado de contraseñas conduce al descubrimiento de una cuenta de usuario válida, lo que permite la entrada inicial en el sistema. Se descubre un script PowerShell programado que envía peticiones autenticadas a servidores web basándose en su nombre de host; añadiendo un registro DNS personalizado, es posible forzar una petición que puede ser interceptada para capturar el hash de un segundo usuario, que es fácilmente crackeable. A este usuario se le permite leer la contraseña de una cuenta de servicio administrada por un grupo, que a su vez tiene acceso restringido por delegación al controlador de dominio, lo que da lugar a un shell con privilegios administrativos.

20240328005847.png

Enumeración

Iniciamos enumerando los puertos que se encuentra abiertos en la maquina victima, esto con la herramienta de nmap

  • -p-: especifica que se escaneen todos los puertos (desde el puerto 1 hasta el puerto 65535).

  • --open: muestra solo los puertos que están abiertos.

  • --min-rate 5000: establece la tasa mínima de paquetes por segundo a 5000 para acelerar el escaneo.

  • -vvv: establece un nivel de verbosidad muy alto, mostrando una salida muy detallada del escaneo.

  • -Pn: ignora la detección de hosts y asume que el objetivo está activo.

  • -n: evita la resolución DNS inversa para las direcciones IP.

  • 10.10.11.248: es la dirección IP del host que se va a escanear.

  • -oG allportsScan: genera un archivo de salida en formato greppable con el nombre "allportsScan".

Luego de obtener los puertos abiertos lo que haremos será enumerar los servicios y las versiones de estas en cada uno de los puertos.

  • -p: especifica los puertos a escanear. En este caso, se están escaneando los puertos 53, 80, 88, 135, 139, 389, 445, 464, 593, 636, 3268, 3269, 5985, 9389, 49667, 49683, 49684, 49694, 49742 y 56871.

  • -sC: activa la opción de enumeración de scripts predeterminados de Nmap. Esto permite ejecutar una serie de scripts diseñados para detectar vulnerabilidades o características específicas de los servicios.

  • -sV: realiza una detección de la versión de los servicios que se encuentran en los puertos especificados.

  • -vv: establece un nivel de verbosidad muy alto, mostrando una salida muy detallada del escaneo.

  • -n: evita la resolución DNS inversa para las direcciones IP.

  • 10.10.10.248: es la dirección IP del host que se va a escanear.

  • -oN ServicesScan: genera un archivo de salida en formato normal con el nombre "ServicesScan".

Puerto 80

Revisando el sitio web encontraremos el siguiente contenido:

20240328012947.png

Vemos que tiene enlaces de algunos documentos

20240328013014.png

Revisando el nombre de los documentos vemos que tienen un patrón

20240328013042.png

Además, en los metadatos podemos ver que contiene el nombre del creador del documento.

20240328110656.png

Explotación

Haciendo uso del script Fuzz_DownloadPDF.pyarrow-up-right que realizamos nos permitirá hacer ffuzzing y luego descargar los PDFs existentes

20240328170049.png

Enumeración de usuarios de los archivos PDF

Haciendo uso de exiftool para obtener información de los creadores de los documentos PDFs

20240328170149.png

Ahora filtraremos por los usuarios que se encuentran en los metadatos.

20240328170241.png

Validación de Usuarios

Haciendo uso de Kerbrute podremos validar los usuarios que encontramos en los metadatos de cada uno de los documentos PDFs.

20240328170717.png

Vemos que todos los usuarios son validos

Obtención de credenciales dentro de PDFs

Revisando el contenido de cada uno de los PDFs encotraremos unas credenciales

20240328174432.png

La credencial que encontramos es:

Ahora, con los usuarios que enumeramos en los documentos y haciendo uso de netexec podremos validar cada uno de los usuarios con la credencial

Encontramos un usuario Tiffany.Molina que es valido a través del servicio smb

Escalada de privilegios

Usuario : Tiffany.Molina

Teniendo las credenciales: Tiffany.Molina : NewIntelligenceCorpUser9876 podremos ver los recursos compartidos, antes intentamos ingresar con evil-winrm y no se pudo.

20240328180050.png

Revisando el contenido del directorio IT encontraremos un archivo de PowerShell que es downdetector.ps1.

  1. Import-Module ActiveDirectory: Esta línea importa el módulo ActiveDirectory de PowerShell, lo que permite al script interactuar con el entorno de Active Directory.

  2. foreach($record in Get-ChildItem ...): Este bucle foreach recorre todos los elementos hijos en la ubicación de Active Directory especificada que cumplen con el filtro proporcionado por Where-Object. En este caso, filtra los elementos cuyo nombre comienza con "web".

  3. Invoke-WebRequest: Este cmdlet se utiliza para realizar solicitudes HTTP a los hosts obtenidos del Active Directory. Utiliza las credenciales predeterminadas del usuario que ejecuta el script (-UseDefaultCredentials).

  4. if (.StatusCode -ne 200): Esta línea verifica si el código de estado de la respuesta HTTP no es 200 (OK). Si la respuesta no es 200, el script envía un correo electrónico informando que el host está fuera de línea.

  5. Send-MailMessage: Este cmdlet se utiliza para enviar correos electrónicos utilizando PowerShell. Toma varios parámetros, como el remitente, el destinatario, el asunto y el cuerpo del correo electrónico.

Ahora que entendemos mejor que es lo que hace el script en powershell, lo que arremos sera agregar un registro dns que sera webSeven. Haciendo uso de dnstool.py podremos agregar, esta herramienta la encontraremos en krbrealyxarrow-up-right

20240328210227.png

Luego iniciaremos el responder para interceptar credenciales que viajan a nivel de red

20240328211047.png

Luego de 5min podremos obtener un hash NTLMv2 que es craceable.

Haciendo uso de John th Ripper podremos lograr crackearlo

Usuario : Mr.Teddy

Luego de crackear tendremos las credenciales, con las que podremos enumerar en directorio activo y haciendo uso de bloodhound-python podremos enumerar y obtener los archivos para luego cargarlos al bloodHound

20240328213626.png

Podemos observar que el usuario Mr.Teddy pertenece al grupo ITSUPPORT, este tiene permisos de READGMSPassword sobre el usuario SVC_INT. El usuario svc_int tiene permisos de AllowedToDelegate contra el dominio

ReadGMSAPassword

Obtenemos el hash del servicies account del usuario svc_int

AllowedToDelegate

Para realizar el siguiente ataque podremos revisar el siguiente post Abusing Kerberos from linuxarrow-up-right.

Para ejecutar impacket-getST debemos obtener el SPN de la maquina victima y para ello usaremos Pywerviewarrow-up-right

20240328222515.png

Luego de obtener el SPN, podremos solicitar un Ticket (Silver Ticket) para así autenticarnos sin proporcionar contraseña

20240328222638.png

Vemos que tenemos un error, esto es debido a que la hora de nuestra maquina atacante debe estar sincronizada con la maquina victima.

Desincronizaremos nuestra maquina atacante virtualizada con nuestra maquina host con los siguientes comandos:

Luego sincronizaremos la maquina atacante con la victima.

Ahora volveremos a ejecutar y solicitar el Ticket

20240328224916.png

Luego veremos que obtuvimos un Ticket que se nos guardara como administrator.ccache. Ahora haremos uso de este para asignar a una variable KRB5CCNAME

Usuario : Administrator

Luego de asignar la variable KRB5CCNAME podremos autenticarnos con impacket-wmiexec

20240328224830.png

Last updated