Ir al contenido
  1. Posts/

Kraken Fundamentals - I

·1175 palabras·6 mins
secu
Persistence Defense Evasion kraken webshell redteam
Kraken Fundamentals - Este artículo es parte de una serie.
Parte : Este artículo

Portada

Comenzamos un nuevo año y con ello se presentan nuevas oportunidades y nuevos retos!

Quiero comenzar este 2023 presentando un proyecto en el que llevo trabajando más de un año. Y el cuál será presentado en la próxima Hackplayers Conference (Hc0n) que se celebrará los días 24 y 25 de Febrero en La Nave (Madrid).

H-c0n 2023

Para comenzar con la explicación, primero necesito “hacer un seek al inicio”, dónde comenzó todo y empezar a contar desde ahí.

Este será el primero de una serie de posts dónde hablaré acerca de Kraken, de cómo funciona internamente y cómo puede utilizarse.

Así que, pilla algo para picar y… ¡comencémos!

Introducción #

Durante uno de mis ejercicios de Red Team, conseguí comprometer varias plataformas web del perímetro del cliente. La vulnerabilidad que exploté me permitió desplegar una Webshell1 en cada uno de los servidores comprometidos.

Definición de Webshell por Imperva

La razón de desplegar una webshell en lugar de utilizar otro vector, es que se aporta tanto un vector de ejecución ( TA0002) como una forma de mantener el acceso al equipo comprometido ( TA0003).

Llegados a este punto, iba a comenzar con la fase de reconocimiento, como bien estaba acostumbrado a hacer. No obstante, tras comentar los hallazgos con mis compañeros, se me advirtió de la posible existencia de EDR’s2 en los equipos comprometidos.

Ya que, al tratarse de máquinas expuestas a Internet (Endpoint3), debían tener una política de Hardening4 más robusta que otros equipos de la organización.

Fue en este momento cuando se me planteó el primer problema:

¿Cómo verificar esta premisa sin llamar demasiado la atención?
(pues la ejecución de comandos del sistema, muy probablemente este monitorizada)

Para dar solución a este problema, implementé rápidamente una prueba de concepto de “webshell” que me permitiera realizar operaciones básicas sobre el sistema para poder hacer la comprobación.

Tras utilizarla en uno de los equipos comprometidos, pude confirmar que, efectivamente, había en funcionamiento un agente Linux de un EDR muy conocido.

Con esto, la situación se complicaba, pues se sabía de antemano que dicho producto detectaría cualquier intento de enumeración tradicional desde la webshell.

Y aquí se planteaba la siguiente pregunta:

¿Cómo proceder a realizar un reconocimiento completo sin ser detectados?

Y de la respuesta a esta pregunta, nació una versión muy minimalista de lo que es hoy Kraken.

¿Qué es Kraken? #

Kraken es una herramienta que te permite controlar webshells en múltiples lenguajes de programación. Se podría decir que es algo así como un “orquestador de webshells”.

Ahora bien, el objetivo que Kraken persigue es: dar la capacidad de operar de la forma más silenciosa posible. Utilizando, para ello, todos los recursos que el lenguaje y el sistema en uso te proporcionan.

¿Cómo funciona Kraken? #

El flujo de ejecución de Kraken se podría simplificar en el siguiente diagrama:

Diagrama de Flujo de Kraken

Por un lado tenemos la parte del Cliente: que se trata de un script en Python que se puede utilizar para generar webshells y conectarse con las mismas una vez estan desplegadas.

Y por otro lado, se encuentra el Agente con el que conseguimos ejecutar los módulos que nos permitirán obtener la información que buscamos durante el proceso de reconocimiento.

Más adelante profundizaremos en todos estos componentes que intervienen en el funcionamiento de la herramienta y el motivo por el que estan ahí.

¿Qué lenguajes soporta Kraken? #

Actualmente, Kraken soporta:

  • PHP (para servicios web en PHP)
  • Java (para JSP)
  • .NET (para ASPX)

Obviamente esto es sólo una parte de todas las tecnologías web disponibles actualmente, no obstante, se ha optado por cubrir estas tres, ya que son las más habituales y me permite abordar mejor los problemas que van surgiendo durante el desarrollo.

Pues… el que mucho abarca, poco aprieta.
Refranero popular

Por otro lado, los agentes o webshells de Kraken, se han probado en los sistemas operativos:

  • Windows (en diferentes versiones)
  • Linux (en diferentes distribuciones)

Entonces, una pregunta que surge (o lleva desde el inicio presente) es la siguiente:

¿Qué lo hace diferente de otras webshells conocidas? #

Kraken reune un conjunto de características que han sido pensadas para mejorar el uso de la herramienta y aportar una visión diferente del uso de las webshells. Algunas de las características que la hacen diferente a otras herramientas son:

  1. Se evita la ejecución de comandos del sistema (su característica principal y el propósito por el que se desarrolló). Esta propiedad la hace muy útil en sistemas donde hay una monitorización activa o existen soluciones de seguridad que pueden detectar nuestra presencia.

Detección de Webshell por EDR

  1. Su diseño modular presenta algunas ventajas y fortalezas frente a otras herramientas:

    1. Permite manter un sistema de multi-versión con el cual, se determina en tiempo de ejecución, aquellos módulos que pueden cargarse en función de la información que reporta el agente con el que se comunica.
    2. La jerarquía elegida para el sistema de módulos permite la edicción en caliente de los módulos en uso. De igual forma, es posible registrar módulos sin detener la ejecución del programa.
    3. El desarrollo de cada módulo busca conseguir explotar al máximo las características del lenguaje para conseguir la mejor recreación de los comandos a los que se calca. Esto tiende a generar módulos más grandes pero con mejores resultados.
    4. Las plantillas que se proporcionan para cada lenguaje, hacen que resulte sencillo extender la funcionalidad de Kraken y crear nuevos módulos.
    5. Al tratarse los módulos como archivos, se evita la “duplicidad” de los mismos a partir del uso de enlaces simbólicos (para casos en los que la implementación no varía dependiendo de la versión).

    Jerarquía de los módulos de Kraken

  2. Kraken proporciona un sistema de Cross-Compiling sin dependencias añadidas que permite que, para los casos en los que sea necesario, se puedan compilar los módulos sin necesidad de preocuparse de disponer de los requerimientos instalados en la máquina. Esto se ha conseguido gracias a la integración con Docker5.

Compilación de Módulos Java en Kraken

  1. Actualmente, existen dos modos de utilizar Kraken:

    1. El Modo “Standard” (ST): que es el modo tradicional del que funcionan las webshells (estilo petición-invocación-respuesta).
    2. El Modo “Command-and-Control” (C2): cuyo funcionamiento es similar al de un C2 utilizando el método de carga-invocación-descarga de módulos utilizando variables de sesión (se entrará en detalle en futuros posts).
  2. Flexibilidad en la comunicación mediante el uso de perfiles de conexión. Es posible detallar toda la información acerca de cómo va a ser la comunicación entre cliente y agente a partir de un archivo JSON que sigue un esquema concreto.

Ejemplo de Perfil de Conexión en Kraken

Adiccionalmente, Kraken también proporciona utilidades como:

  • Una pseudo-terminal con las capacidades básicas de una consola.
  • Control de errores en Agentes, Módulos y Cliente.
  • Sistema de Logging e Histórico integrados.
  • Y otras utilidades relacionadas con la herramienta.

Conclusiones #

Con esto llegamos al final de la primera parte. En los siguientes post profundizaré acerca de la estructura interna de Kraken, los elementos que infieren en su funcionamiento así como ejemplos prácticos de uso. Así que ¡no te pierdas lo que esta por venir!

Espero que te haya gustado y ¡nos vemos pronto!

Kraken Fundamentals - Este artículo es parte de una serie.
Parte : Este artículo