Los web sockets son una característica muy interesante en el mundo web ya que permiten las comunicaciones asíncronas completas (full-duplex) sobre una conexión TCP. Esto significa que tanto cliente como servidor pueden enviar mensajes al otro extremo en cualquier momento. Esto es precisamente lo opuesto a lo que se hace en el mundo de las aplicaciones web tradicionales en donde es el cliente el que siempre debe iniciar la comunicación con el servidor (modelo cliente/servidor). Con las comunicaciones asíncronas se consigue un ahorro en tiempo y recursos, ya que el servidor puede hacer cosas como por ejemplo enviar "actualizaciones" de contenido al cliente o notificaciones. Las posibilidades con un modelo de este tipo son bastante amplias y por supuesto, implica también un análisis adicional del tráfico HTTP que ya no es como el tradicional basado en "petición/respuesta", lo que dificulta la detección de tráfico sospechoso o malicioso por parte de sistemas de seguridad perimetral.
Existe una prueba de concepto llamadaWSC2 que se ha publicado hace algunos años que explota precisamente este escenario, aprovechándose de las características que ofrecen los web sockets para establecer conexiones a un C2. Dado que ya lleva unos años publicado se encuentra desarrollado en Python y a la fecha de redactar este post no soporta la versión Python 3. El programa no es complejo y merece la pena echarle un vistazo para entender su funcionamiento, desde el punto de vista académico es interesante ya que utiliza la librería Tornado para el establecimiento de las conexiones con web sockets. Una vez se clona el repositorio lo primero que hay que hacer para comenzar a utilizarlo es editar el fichero config.py en donde se deben definir los detalles de configuración básicos del servidor para que funcione correctamente.
A continuación se puede ejecutar el fichero wsc2.py y generar un stager, que no es más que la muestra que se debe ejecutar en el cliente. Es un concepto muy similar a lo que se ha visto en otros posts cuando se ha hablado de Pupy, Empire, Shad0w, Kaodic, Sliver, Merlin, etc. Una vez dentro del interprete de WSC2, se puede ejecutar el comando "genStager" con alguno de los "stagers" disponibles en la herramienta.
El stager más sencillo probablemente es el one liner de Powershell, el cual cuando se ejecuta establecer una conexión entre la máquina comprometida y el servidor. Ahora bien, tal como se indica en el repositorio de la herramienta, hay algunos stagers disponibles que funcionan bien aunque no dejan de ser pruebas de concepto. Concretamente los stagers "JScript2", "JScript3" y "psoneliner" están basados en assemblies de .NET y su código se encuentra disponible públicamente, de hecho, el autor indica que se pueden modificar y adaptar sin ningún problema con un IDE como el Visual Studio .NET.
En cuanto se ejecuta el stager en la máquina víctima se recibe una conexión en el servidor y ahora se puede interactuar fácilmente con el agente, sabiendo que dichas comunicaciones utilizan web sockets.
Como se puede apreciar en la imagen anterior, se puede seleccionar un agente desde el C2 de WSC2 y con el comando "cli" ejecutar instrucciones de forma directa contra dicho sistema. Las operaciones que admite el agente son muy pocas y evidentemente no es tan potente como el payload de meterpreter u otras soluciones mencionadas anteriormente pero es simple y funciona.
Esta herramienta como tal no es "tan interesante" como muchas otras que se han explicado en este blog, sin embargo el código fuente está disponible y dado que es sencillo puede ser un buen punto de inicio para entender cómo funcionan otras utilidades más complejas. Hay que tener en cuenta que a lo mejor esta herramienta no es una alternativa adecuada para una campaña de Red Team dado que no solamente no cuenta con un payload/agente robusto sino que además, lleva años sin actualizarse y tal como se indica en el repositorio no cuenta con una capa de cifrado punto a punto para las comunicaciones entre el C2 y los agentes, pero como se ha comentado antes desde el punto de vista académico puede resultar interesante.
Un saludo y Happy Hack!
Adastra.