¡Lo rompí! Aspectos destacados de KringleCon 5: Anillos de oro

¡Lo rompí! Aspectos destacados de KringleCon 5: Anillos de oro

El aprendizaje se encuentra con la diversión en el SANS Holiday Hack Challenge de 2022: prepárate para un viaje de crack en el Polo Norte mientras frustro el malvado plan de Grinchum y recupero los cinco anillos de oro.

Este es mi primer año participando en el Desafío SANS Holiday Hack y fue genial. A través de una serie de 16 desafíos que van de fáciles a difíciles, practiqué analizando el tráfico de red sospechoso y los registros de PowerShell, escribiendo reglas de suricata, saliendo de un Contenedor Docker, encontrando claves filtradas para explotar un Canalización de CI/CD de GitLab y una Usuario de AWS, conduciendo Ataques de entidad externa XML, y hackear un contrato inteligente para comprar un token no fungible.

La mejor parte de esta experiencia fue que me presentó nuevas herramientas y tecnologías, ampliando así mis conocimientos de ciberseguridad mucho más. Aquí, comparto algunos aspectos destacados de la resolución de los desafíos.

Orientación

Cada participante recibe un avatar para navegar en un entorno de juego de video en el navegador ambientado en el Polo Norte:

Cracked it! Highlights from KringleCon 5: Golden Rings PlatoBlockchain Data Intelligence. Vertical Search. Ai.

Durante la orientación, recibe una billetera de criptomonedas que el juego usa para otorgar KringleCoins por completar desafíos y que usa en el último desafío para piratear un contrato inteligente. Curiosamente, el juego realiza un seguimiento de todas las transacciones de KringleCoin en una cadena de bloques de Ethereum, lo que significa que también se almacena un registro completo de su progreso en esta cadena de bloques.

En el primer anillo del juego.

1. Anillo de Tolkien

Cracked it! Highlights from KringleCon 5: Golden Rings PlatoBlockchain Data Intelligence. Vertical Search. Ai.

Encontrar el Tolkien Ring requirió que ejercitara mis músculos de análisis de registros.

Suplantación de identidad de Wireshark

Primero, usé Wireshark para analizar los datos proporcionados .pcap archivo que reveló un servidor en adv.epostoday[.]uk descargando el archivo Ref_24Septiembre-2020.zip a una computadora:

Cracked it! Highlights from KringleCon 5: Golden Rings PlatoBlockchain Data Intelligence. Vertical Search. Ai.

Mirando dentro del archivo ZIP, encontré un ejecutable llamado Ref_24-septiembre-2020.scr que activó dos detecciones en ESET Endpoint Security: BAT/Runner.ES y Genérico.TAGTBG. Este malware eventualmente conduce a un ejecutable malicioso que se ejecuta en la memoria llamado config.dll y detectado por ESET Escáner de memoria avanzado as Win32/Dridex.DD.

Registros de eventos de Windows

A continuación, analicé los datos proporcionados .evtx archivo que contiene registros de PowerShell con el Visor de eventos. Si bien existen otras herramientas para analizar los registros de PowerShell, si los atacantes saben cómo usar los archivos binarios de living-off-the-land para pasar desapercibidos, los defensores también deben conocer bien las herramientas nativas que proporciona un sistema operativo.

Dado que los registros contenían 10,434 XNUMX eventos, agrupé los eventos por fecha y luego ejecuté la acción Buscar para buscar cualquier evento que contuviera el $ personaje. En PowerShell, $ se utiliza para crear y hacer referencia las variables. Encontré un ataque que ocurrió el 24 de diciembre de 2022, cuando el atacante ejecutó el siguiente script:

Cracked it! Highlights from KringleCon 5: Golden Rings PlatoBlockchain Data Intelligence. Vertical Search. Ai.

Parece que el atacante encontró una receta secreta, cambió el ingrediente secreto de miel de abeja para de aceite de pescadoy luego creó un nuevo archivo de recetas. Esto desencadenó un evento con un ID de 4104, que representa la ejecución de comandos remotos de PowerShell. Entonces, filtré los eventos por esta ID, lo que me ayudó a encontrar eventos maliciosos adicionales más rápidamente.

Regata Suricata

El último ejercicio para Tolkien Ring fue escribir cuatro reglas de Suricata para monitorear el tráfico de red en busca de una infestación de Dridex:

alerta dns $HOME_NET cualquiera -> cualquiera cualquiera (msg:”Búsqueda de DNS incorrecta conocida, posible infección Dridex”; dns.query; content:”adv.epostoday.uk”; nocase; sid:1; rev:1;)

alerta http 192.185.57.242 cualquiera <> cualquiera cualquiera (mensaje: "Investigar conexiones sospechosas, posible infección Dridex"; sid: 2; rev: 1;)

alert tls any any -> any any (msg:”Investigar certificados incorrectos, posible infección Dridex”; tls.cert_subject; content:”CN=heardbellith.Icanwepeh.nagoya”; sid:3; rev:1;)

alert http any any -> any any (msg:”Función de JavaScript sospechosa, posible infección de Dridex”; file_data; content:”let byteCharacters = atob”; sid:4; rev:1;)

En orden, estas reglas detectan búsquedas de DNS para adv.epostoday[.]uk, conexiones a la dirección IP 192.185.57[.]242, el uso del servidor malicioso oídobellith.Icanwepeh[.]nagoya identificado a través del nombre común (CN) en un certificado TLS y el uso de JavaScript de la A, a la B() función para decodificar una cadena binaria que contiene datos codificados en base64 en el cliente.

Completar estos tres desafíos me valió el Tolkien Ring:

Cracked it! Highlights from KringleCon 5: Golden Rings PlatoBlockchain Data Intelligence. Vertical Search. Ai.

En el segundo anillo.

2. Anillo élfico

Cracked it! Highlights from KringleCon 5: Golden Rings PlatoBlockchain Data Intelligence. Vertical Search. Ai.

Los desafíos más destacados para Elfen Ring fueron Prison Escape y Jolly CI/CD.

Prison Escape

Prison Escape fue un severo recordatorio de que otorgar privilegios de root a un usuario en un contenedor Docker es tan bueno como otorgar privilegios de root en el sistema host. El desafío era salir del contenedor. Bueno, fácil de hacer cuando eres root:

Cracked it! Highlights from KringleCon 5: Golden Rings PlatoBlockchain Data Intelligence. Vertical Search. Ai.

Como usuario raíz, enumeré las tablas de partición para el dispositivo y luego monté el sistema de archivos del host, lo que me otorgó acceso completo al host. Ahora podría buscar la clave, que debería estar ubicada en el directorio de inicio como lo revelan las sugerencias del juego:

Cracked it! Highlights from KringleCon 5: Golden Rings PlatoBlockchain Data Intelligence. Vertical Search. Ai.

alegre CI/CD

Si bien eso fue rápido, Jolly CI/CD me tomó más tiempo de todos los desafíos para resolverlo. Primero, nos dieron un repositorio de Git para clonar a través de HTTP:

Cracked it! Highlights from KringleCon 5: Golden Rings PlatoBlockchain Data Intelligence. Vertical Search. Ai.

Desde la URL, pude ver que el nombre del repositorio era wordpress.flag.net.interno, así que me mudé al repositorio y encontré un sitio web de WordPress. Revisé si el sitio web estaba activo:

Cracked it! Highlights from KringleCon 5: Golden Rings PlatoBlockchain Data Intelligence. Vertical Search. Ai.

Sí, el sitio web era funcional. Tenía curiosidad por saber si había alguna clave filtrada en el historial del código fuente. En caso afirmativo, debería poder enviar ediciones al código fuente. así que corrí git log:

Cracked it! Highlights from KringleCon 5: Golden Rings PlatoBlockchain Data Intelligence. Vertical Search. Ai.

A partir de los mensajes de confirmación, parece un hacer se hizo después de agregar activos para arreglar un grito. Es hora de revisar el compromiso previo a los gritos:

Cracked it! Highlights from KringleCon 5: Golden Rings PlatoBlockchain Data Intelligence. Vertical Search. Ai.

Excelente, encontré un .ssh directorio con claves. Copiemos esas claves y configuremos un agente SSH y un usuario de Git para ver si puedo suplantar al propietario de esas claves:

Cracked it! Highlights from KringleCon 5: Golden Rings PlatoBlockchain Data Intelligence. Vertical Search. Ai.

Ahora volvamos a la rama principal y probemos si podemos hacer un cambio trivial en el código fuente (usando nano, simplemente agregué un espacio a uno de los archivos):

Cracked it! Highlights from KringleCon 5: Golden Rings PlatoBlockchain Data Intelligence. Vertical Search. Ai.

Entonces, logré la primera parte del desafío haciéndome pasar por uno de los desarrolladores de WordPress, pero ¿el sitio web siguió funcionando después de mi impulso?

Cracked it! Highlights from KringleCon 5: Golden Rings PlatoBlockchain Data Intelligence. Vertical Search. Ai.

Mi impulso cambió algo porque ahora el sitio web redirigió al puerto 8080.

Hasta ahora, había ignorado la parte de CI/CD del desafío, que debería ser la clave para completarlo. El depósito contiene un .gitlab-ci.yml que proporciona la configuración para una canalización de CI/CD de GitLab. Cada vez que ingresa al repositorio, el sistema CI/CD se activa y Corredor de GitLab ejecuta los scripts en este archivo YML. Eso es tan bueno como lograr la ejecución remota de código en el servidor donde está instalado GitLab Runner, pensé.

Mirando más de cerca, vi un rsync secuencia de comandos que copia todos los archivos del repositorio de Git al directorio del servidor web desde el que se sirve el sitio web. Al principio, traté de usar rsync para revertir el flujo de datos copiando todos los archivos del servidor web al repositorio de Git, pero sin éxito.

Después de muchas pruebas de hipótesis, finalmente obtuve una idea innovadora: en lugar de intentar "arreglar" el sitio web de WordPress o ejecutar scripts maliciosos a través del sistema de compilación, sirva un sitio web que filtre información del servidor web. En el interior index.php (ubicado en el nivel superior del repositorio), puedo comentar el código que carga el sitio web de WordPress y ejecutar comandos PHP que prueban el servidor web.

De hecho, incluso puedo ejecutar comandos de shell con PHP. encontre eso pasar a través de() funcionó fácilmente.

In index.php, Solía // para comentar dos líneas y agregué passthru('ls -la /'); en la última línea. Esto crea un sitio web que enumera todos los archivos en el directorio raíz del servidor web:

Cracked it! Highlights from KringleCon 5: Golden Rings PlatoBlockchain Data Intelligence. Vertical Search. Ai.

Luego impulsé este cambio al repositorio de Git y el sistema GitLab CI/CD se encargó de actualizar el sitio web por mí:

Cracked it! Highlights from KringleCon 5: Golden Rings PlatoBlockchain Data Intelligence. Vertical Search. Ai.

Ah, el Elfen Ring debe estar en bandera.txt! Repetí los pasos anteriores, pero esta vez usando passthru('gato /bandera.txt'); revelando el Elfen Ring la próxima vez que solicité el sitio web:

Cracked it! Highlights from KringleCon 5: Golden Rings PlatoBlockchain Data Intelligence. Vertical Search. Ai.

En el tercer anillo.

3. Anillo de red

Cracked it! Highlights from KringleCon 5: Golden Rings PlatoBlockchain Data Intelligence. Vertical Search. Ai.

El desafío más divertido para mí fue Abrir la puerta de la mina Boria, aunque la Fuente de Glamtariel fue interesante y también presentó acertijos.

Abre la puerta de la mina Boria

En Open Boria Mine Door, se nos presentaron seis pines o mini-desafíos para eludir la validación de entrada o un Política de seguridad de contenido para conectar los tubos de entrada y salida entre los pines, incluso haciendo coincidir los colores de los tubos. Para la mayoría de los pines, usé HTML para escribir una lista de letras 'o' de conexión. Aquí está mi solución final:

Cracked it! Highlights from KringleCon 5: Golden Rings PlatoBlockchain Data Intelligence. Vertical Search. Ai.

Pasador 1

No hubo validación para el Pin 1, por lo que fue una simple cuestión de HTML y CSS en línea:

Pasador 2

El pin 2 tenía una Política de seguridad de contenido que no permitía JavaScript pero permitía CSS en línea, por lo que no fue un problema para mi método:

Pasador 3

El Pin 3 tenía una Política de seguridad de contenido que no permitía CSS pero permitía JavaScript en línea, así que usé JavaScript para cambiar los estilos en su lugar:

Pasador 4

El pin 4 no tenía una política de seguridad de contenido, pero tenía una función sanitizeInput en el lado del cliente que eliminaría las comillas dobles, las comillas simples, los corchetes angulares izquierdos y los corchetes angulares derechos. El truco aquí fue darse cuenta de que esta función no se activó al enviar el formulario, sino al en la falta de definición evento. En otras palabras, alejar el mouse del campo de entrada activó el en la falta de definición evento, higienizando cualquier entrada. La solución fue enviar el formulario presionando el botón Participar mientras tiene cuidado de no mover el cursor del mouse fuera de los límites del campo de entrada:

Pasador 5

El pin 5 tenía lo mismo desinfectar entrada función y eludir junto con una Política de seguridad de contenido que prohíbe CSS en línea, pero permite JavaScript en línea:

Pasador 6

Finalmente, Pin 6 no desinfectó la entrada, pero usó una Política de seguridad de contenido más estricta que prohibía tanto CSS en línea como JavaScript. Mi solución fue usar HTML en desuso para obtener los estilos que necesitaba y usar una tabla en lugar de una lista:

Fuente de Glamtariel

Fuente de Glamtariel fue una oportunidad para practicar Ataques de entidad externa XML (XXE). Averiguar cómo definir una entidad XML personalizada, definir una entidad que solicita un archivo del servidor y agregar esa entidad como carga útil a una solicitud HTTP no fue difícil. La parte más difícil fue descifrar los acertijos del juego para adivinar la ruta a los archivos que filtraría el servidor. Aquí está la solicitud de avance que revela la ubicación del anillo de oro:

Cracked it! Highlights from KringleCon 5: Golden Rings PlatoBlockchain Data Intelligence. Vertical Search. Ai.

Cracked it! Highlights from KringleCon 5: Golden Rings PlatoBlockchain Data Intelligence. Vertical Search. Ai.

Cracked it! Highlights from KringleCon 5: Golden Rings PlatoBlockchain Data Intelligence. Vertical Search. Ai.

Ofrecería dos lecciones aprendidas de este desafío. Primero, usa el Convertidor de tipo de contenido extensión en Eructo para convertir cargas útiles JSON a XML. En segundo lugar, intente colocar la carga útil XXE en diferentes etiquetas; me tomó mucho tiempo darme cuenta de que todo lo que tenía que hacer era colocar la &xxe; carga útil en el reqTipo etiqueta en lugar de la imgDrop etiqueta.

En el cuarto anillo.

4. Anillo de nubes

Cracked it! Highlights from KringleCon 5: Golden Rings PlatoBlockchain Data Intelligence. Vertical Search. Ai.

Jugar para Cloud Ring fue una incursión para principiantes en la interfaz de línea de comandos (CLI) de Amazon Web Services (AWS).

Lo más destacado de este conjunto de desafíos fue usar trufa para encontrar las credenciales de AWS en un repositorio de Git y luego explotarlas para autenticarse como usuario de AWS. Un atacante que llega a esta posición puede usar aws soy Comandos para consultar las políticas que se aplican al usuario y, por lo tanto, a qué activos de la nube se puede acceder y abusar.

En el quinto anillo.

5. Anillo de fuego ardiente

Cracked it! Highlights from KringleCon 5: Golden Rings PlatoBlockchain Data Intelligence. Vertical Search. Ai.

La parte más instructiva de este conjunto de desafíos fue aprender sobre Árboles Merkle para explotar un contrato inteligente y inscríbase en la lista de preventa para comprar un token no fungible (NFT). Aquí el desafío fue descubrir los valores de prueba que, junto con la dirección de mi billetera y el valor raíz de un Merkle Tree, probaron mi inclusión en la lista de preventa.

Después de algunos intentos fallidos de proporcionar valores de prueba, me di cuenta de que nunca podría averiguar los valores de prueba para el valor raíz proporcionado porque no había forma de saber todos los valores de hoja utilizados para calcularlo. Necesitaba cambiar el valor raíz para poder proporcionar un Merkle Tree válido.

Usar Herramienta del profesor QPetabyte, creé un Merkle Tree a partir de dos hojas que consisten en la dirección de mi billetera y la dirección del BSRS_nft contrato inteligente, que encontré usando el Blockchain Explorer en el juego en el bloque dos de la cadena de bloques Ethereum del juego. La herramienta generó el valor raíz de este árbol y el valor de prueba para la dirección de mi billetera. Luego usé Burp para interceptar la solicitud al servidor y cambié el valor raíz predeterminado para poder enviar un Merkle Tree válido. Aquí está mi Deporte NFT comprado a un precio fijo de 100 KringleCoins:

Cracked it! Highlights from KringleCon 5: Golden Rings PlatoBlockchain Data Intelligence. Vertical Search. Ai.

Un espécimen feo de hecho.

Finale

Cracked it! Highlights from KringleCon 5: Golden Rings PlatoBlockchain Data Intelligence. Vertical Search. Ai.

Muchas gracias a los organizadores del SANS Holiday Hack Challenge por ampliar mi mente de nuevas maneras y ayudarme a profundizar mis conocimientos sobre ciberseguridad. No solo espero con ansias el desafío del próximo año, sino que incluso probaré las ediciones 2020 y 2021 de este desafío. Y si no has participado en este desafío antes, espero que estos momentos destacados hayan despertado tu interés.

Sello de tiempo:

Mas de Vivimos la seguridad