
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;
location / {
proxy_pass <c2-server>;
proxy_redirect off;
proxy_ssl_verify off;
proxy_read_timeout 90;
proxy_http_version 1.0;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
$ sudo ln -s /etc/nginx/sites-available/striker /etc/nginx/sites-enabled/striker
$ sudo service nginx restart
Su redireccionador ya debería estar funcionando en el puerto 443, y puede probarse usando (asumiendo que su FQDN es striker.local);
$ curl https://striker.local
Si funciona, debería obtener la respuesta 404 utilizada por el backend, como;
{"error":"¡Ruta inválida!"}
A) El Agente C
Estos son los implantes utilizados por Striker. El agente principal está escrito en C, y se encuentra en agent/C/. Es compatible con sistemas Linux y Windows. El agente Linux depende externamente de libcurl, que suele estar instalado en la mayoría de los sistemas.
El agente Windows no tiene dependencias externas. Usa wininet para las comunicaciones, que creo que está disponible en todos los sistemas Windows.
Asumiendo que está en un host de 64 bits, lo siguiente compilará para 64 bits;
$ cd agent/C
$ mkdir bin
$ make
Para compilar para 32 bits en 64 bits;
$ sudo apt install gcc-multilib
$ make arch=32
Lo anterior compila todo en el directorio bin/. Solo necesitará dos archivos para generar implantes funcionales;
bin/stub - Este es el stub del agente que se usará como plantilla para generar implantes funcionales.bin/builder - Es lo que usará para modificar el stub del agente y generar implantes funcionales.El builder acepta los siguientes argumentos;
$ ./bin/builder
[-] Uso: ./bin/builder <url> <auth_key> <delay> <stub> <outfile>
Donde;
<url> - El servidor al que reportarse. Idealmente debería ser un redireccionador, pero una URL directa al servidor también funcionará.<auth_key> - La clave de autenticación a usar al conectarse al C2. Puede crear esto en la pestaña auth keys de la interfaz web.<delay> - Retardo entre cada callback, en segundos. Debería ser al menos 2, dependiendo de lo ruidoso que quiera que sea.<stub> - El archivo stub a leer, bin/stub en este caso.<outfile> - El nombre del archivo de salida del nuevo implante.Ejemplo;
$ ./bin/builder https://localhost:3000 979a9d5ace15653f8ffa9704611612fc 5 bin/stub bin/striker
[*] Ofuscando cadenas...
[+] 69 cadenas ofuscadas :)
[*] Buscando offsets de nuestros marcadores...
[+] Offsets:
URL: 0x0000a2e0
OBFS Key: 0x0000a280
Auth Key: 0x0000a2a0
Delay: 0x0000a260
[*] Parcheando...
[+] ¡Operación completada!
Necesitará MinGW para esto. Lo siguiente instalará el entorno de desarrollo de Windows de 32 y 64 bits;
$ sudo apt install mingw-w64
Compile para 64 bits;
$ cd agent/C
$ mdkir bin
$ make target=win
Para compilar para 32 bits;
$ make target=win arch=32
Esto compilará todo en el directorio bin/, y tendrá el builder y el stub como bin\stub.exe y bin\builder.exe, respectivamente.
B) El Agente Python
Striker también incluye un agente Python autocontenido (probado en Python 2.7.16 y 3.7.3). Se encuentra en agent/python/. Solo las funcionalidades más básicas están implementadas en este agente. Útil para hosts que no pueden ejecutar el agente C pero tienen Python instalado.
Hay 2 archivos en este directorio;
stub.py - Este es el stub del payload para pasar al builder.builder.py - Esto es lo que usará para generar un implante.Ejemplo de uso:
$ ./builder.py
[-] Uso: builder.py <url> <auth_key> <delay> <stub> <outfile>
# Lo siguiente generará un payload funcional como `output.py`
$ ./builder.py http://localhost:3000 979a9d5ace15653f8ffa9704611612fc 2 stub.py output.py
[*] Cargando stub del agente...
[*] Escribiendo configuraciones...
[+] Agente construido exitosamente: output.py
# Ejecútelo
$ python3 output.py
Después de seguir las instrucciones anteriores, Striker debería estar listo para usar. Por favor, revise la guía de uso. ¡Diviértase y feliz hacking!
Si le gusta el proyecto, considere ayudarme a convertir café en código!