
Framework C2 multioperador con agentes nativos en C y Python, canales HTTP(S), tareas asíncronas y una interfaz web reactiva para operaciones de equipo rojo.
Striker es un sencillo programa de Comando y Control (C2).


Este proyecto está en desarrollo activo. La mayoría de las funcionalidades son experimentales, y habrá más por venir. Espere cambios importantes.
A) Agentes
B) Backend / Teamserver
C) Interfaz de usuario
Clone el repositorio:
$ git clone https://github.com/4g3nt47/Striker.git
$ cd Striker
El código está dividido en 4 secciones independientes:
Maneja toda la lógica del lado del servidor tanto para operadores como para agentes. Es una aplicación NodeJS hecha con:
express - Para la API REST.socket.io - Para la comunicación por Web Socket.mongoose - Para conectar con MongoDB.multer - Para manejar la subida de archivos.bcrypt - Para cifrar las contraseñas de los usuarios.El código fuente está en el directorio backend/. Para configurar el servidor:
Striker usa MongoDB como base de datos backend para almacenar todos los datos importantes. Puede instalarlo localmente en su máquina usando esta guía para distribuciones basadas en Debian, o crear una gratuita con MongoDB Atlas (una plataforma de base de datos como servicio).
$ cd backend
$ npm install
$ mkdir static
Puede usar esta carpeta para alojar archivos estáticos en el servidor. También debería ser donde se establezca UPLOAD_LOCATION en el archivo .env (más sobre esto después), pero no es necesario. Los archivos en este directorio serán accesibles públicamente bajo la ruta /static/.
.env;NOTA: Los valores entre < y > son marcadores de posición. Reemplácelos con valores apropiados (incluyendo los <>).
Para campos que requieran cadenas aleatorias, puede generarlas fácilmente usando;
$ head -c 100 /dev/urandom | sha256sum
DB_URL=<su URL de conexión a MongoDB>
HOST=<host donde escuchar (predeterminado: 127.0.0.1)>
PORT=<puerto donde escuchar (predeterminado: 3000)>
SECRET=<cadena aleatoria para firmar cookies de sesión y cifrar datos de sesión>
ORIGIN_URL=<URL completa del servidor donde alojará el frontend. Se usa para configurar CORS>
REGISTRATION_KEY=<cadena aleatoria para autenticación durante el registro>
MAX_UPLOAD_SIZE=<tamaño máximo de subida, en bytes>
UPLOAD_LOCATION=<directorio para almacenar archivos subidos (predeterminado: static)>
SSL_KEY=<su archivo de clave SSL (opcional)>
SSL_CERT=<su archivo de certificado SSL (opcional)>
Tenga en cuenta que SSL_KEY y SSL_CERT son opcionales. Si alguno no está definido, se creará un servidor HTTP plano. Esto ayuda a evitar sobrecarga innecesaria cuando se ejecuta el servidor detrás de un proxy inverso con SSL en el mismo host.
$ node index.js
[12:45:30 PM] Conectando a la base de datos backend...
[12:45:31 PM] Iniciando servidor HTTP...
[12:45:31 PM] Servidor iniciado en el puerto: 3000
Esta es la interfaz web utilizada por los operadores. Es una aplicación web de una sola página escrita en Svelte, y el código fuente está en el directorio frontend/.
Para configurar el frontend:
$ cd frontend
$ npm install
.env con la variable VITE_STRIKER_API configurada con la URL completa del servidor C2 configurado anteriormente;VITE_STRIKER_API=https://c2.striker.local
$ npm run build
Lo anterior compilará todo en una aplicación web estática en el directorio dist/. Puede mover todos los archivos dentro de la raíz web de su servidor web, o incluso alojarlo con un servidor HTTP básico como el de Python;
$ cd dist
$ python3 -m http.server 8000
Register.REGISTRATION_KEY en backend/.env).Esto creará una cuenta de usuario estándar. Necesitará una cuenta de administrador para acceder a algunas funciones.
Su primera cuenta de administrador debe crearse manualmente; luego puede ascender y degradar otras cuentas en la pestaña Users de la interfaz web.
Para crear su primera cuenta de administrador:
users y establezca el campo admin del usuario objetivo en true;Hay diferentes maneras de hacer esto. Si tiene mongo disponible en su línea de comandos, puede hacerlo usando;
$ mongo <su URL de conexión a MongoDB>
> db.users.updateOne({username: "<su nombre de usuario>"}, {$set: {admin: true}})
Debería obtener la siguiente respuesta si funciona;
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
¡Ahora puede iniciar sesión :)
A) Redireccionamiento por Tubería Simple (Dumb Pipe)
Hay un redireccionador por tubería simple escrito para Striker disponible en redirector/redirector.py. Obviamente, esto solo funcionará para tráfico HTTP plano, o para HTTPS cuando la verificación SSL esté desactivada (puede hacerlo habilitando la macro INSECURE_SSL en el agente C).
El siguiente ejemplo escucha en el puerto 443 en todas las interfaces y reenvía a c2.example.org en el puerto 443;
$ cd redirector
$ ./redirector.py 0.0.0.0:443 c2.example.org:443
[*] Iniciando redireccionador en 0.0.0.0:443...
[+] Escuchando conexiones...
B) Proxy Inverso Nginx como Redireccionador
$ sudo apt install nginx
/etc/nginx/sites-available/striker);Marcadores de posición;
<domain-name> - Es el FQDN de su servidor, y debe coincidir con el de su certificado SSL.<ssl-cert> - El archivo de certificado SSL a usar.<ssl-key> - El archivo de clave SSL a usar.<c2-server> - La URL completa del servidor C2 al que reenviar las solicitudes.ADVERTENCIA: client_max_body_size debe ser tan grande como el tamaño definido por MAX_UPLOAD_SIZE en su archivo backend/.env, de lo contrario las subidas de archivos grandes fallarán.
server {
listen 443 ssl;
server_name <domain-name>;
ssl_certificate <ssl-cert>;
ssl_certificate_key <ssl-key>;
client_max_body_size 100M;
access_log /var/log/nginx/striker.log;