
Ce projet est un « pont » entre le sommeil et le langage python. Il permet de contrôler un teamserver Cobalt Strike via python sans avoir besoin du client GUI standard. NOTE : Ce projet est très largement en version BÊTA. L'objectif est de fournir un terrain de jeu pour les tests et ne constitue en aucun cas une fonctionnalité officiellement prise en charge. Peut-être que cela pourrait être ajouté à l'avenir au produit principal.
Ce projet est un « pont » entre les langages Sleep et Python. Il permet de contrôler un teamserver Cobalt Strike via Python sans avoir besoin du client graphique standard.
NOTE : Ce projet est encore très expérimental (BETA). L'objectif est de fournir un terrain d'essai pour les tests et ne constitue en aucun cas une fonctionnalité officiellement prise en charge. Peut-être que cela pourrait être ajouté à l'avenir au produit de base.
Le projet a été inspiré par le travail de @BinaryFaultline et @Mcgigglez16 dans le projet https://github.com/emcghee/PayloadAutomation. Je tiens à vous remercier tous les deux !!
Le cœur de ce pont est une implémentation Python d'un client Cobalt Strike sans interface graphique. Cela est réalisé en utilisant la console de scripts Aggressor fournie par agscript comme moteur. Agscript permet une interaction sans interface graphique avec Cobalt Strike (https://www.cobaltstrike.com/aggressor-script/index.html). Le « pont » fonctionne en utilisant des fonctions d'aide Python dans sleepy.py pour générer les commandes Sleep attendues par la console agscript. Au lieu d'écrire les fonctions Sleep, striker.py fournit des fonctions d'aide qui abstraient Sleep et permettent l'utilisation de Python.
Comme le projet PayloadAutomation a inspiré celui-ci, il a commencé avec une grande partie du même code, mais j'ai voulu le réduire pour n'utiliser que les composants nécessaires afin d'agir comme un wrapper agscript.
| Élément | Description |
|---|---|
| sleep_python_bridge | La bibliothèque qui permet à Python d'interfacer avec Cobalt Strike |
| output/html | chemin pour les visualiseurs de données HTML |
| output/html/data | chemin pour les données JSON utilisées par le visualiseur de données |
| output/payloads | chemin pour les payloads enregistrés (utilisé par le générateur de payloads) |
| payload_scripts | chemin pour les scripts externes à charger par payloadgenerator.py |
| beaconlogtracker.py | Implémentation d'un suivi des journaux de beacon qui utilise une grille de données HTML pour afficher les journaux de beacon |
| payloadgenerator.py | Implémentation d'un générateur de payloads de beacon qui crée des payloads pour chaque listener |
| beacongrapher.py | Implémentation d'un traceur de graphe de beacon qui utilise un graphe orienté JavaScript HTML pour les beacons |
Les exemples de ce projet sont peut-être le moyen le plus simple de comprendre, mais voici le script example.py
#!/usr/local/bin/python3
## Import the bridge
from sleep_python_bridge.striker import CSConnector
from argparse import ArgumentParser
from pprint import pp, pprint
###################
## Argparse
def parseArguments():
parser = ArgumentParser()
parser.add_argument('host', help='The teamserver host.')
parser.add_argument('port', help='The teamserver port.')
parser.add_argument('username', help='The desired username.')
parser.add_argument('password', help='The teamserver password.')
parser.add_argument('path', help="Directory to CobaltStrike")
args = parser.parse_args()
return args
## Let's go
def main(args):
cs_host = args.host
cs_port = args.port
cs_user = args.username
cs_pass = args.password
cs_directory = args.path
## Connect to server
print(f"[*] Connecting to teamserver: {cs_host}")
with CSConnector(
cs_host=cs_host,
cs_port=cs_port,
cs_user=cs_user,
cs_pass=cs_pass,
cs_directory=cs_directory) as cs:
# Perform some actions
#
# Get beacon metadata - i.e., x beacons() from the script console
beacons = cs.get_beacons()
print("BEACONS")
pprint(beacons)
# Get list of listners - i.e., x listeners_stageless() from the script console
listeners = cs.get_listeners_stageless()
print("LISTENERS")
pprint(listeners)
if __name__ == "__main__":
args = parseArguments()
main(args)
Appeler le script
python3 example.py 127.0.0.1 50050 example password /path/to/cobaltstrike

Les journaux de beacon sont disponibles à l'exécution dans un teamserver ou via les fichiers de journaux de beacon enregistrés sur le teamserver. Les données sont toujours là, mais peuvent ne pas être présentées de la manière souhaitée. Ceci est un exemple de suivi des journaux qui utilise une grille de données HTML pour visualiser rapidement les journaux de beacon.
beaconlogtracker.py est un script qui se connecte à un teamserver, extrait les journaux de beacon en cours toutes les 30 secondes, les enregistre dans <code>beaconlogs.json` et les affiche dans une grille de données HTML consultable et triable.
Les journaux de beacon sont toujours enregistrés dans le répertoire logs, mais c'est une autre façon de suivre les journaux en mémoire avec un visualiseur alternatif. Si le teamserver est redémarré, les journaux en mémoire sont perdus et vous devez vous référer aux journaux stockés dans le répertoire logs du teamserver. Ce script garde les journaux en mémoire synchronisés avec le fichier beaconlogs.json. Ainsi, vous disposez d'un moyen rapide et simple de visualiser toutes les données sans fouiller dans le répertoire logs, même si Cobalt Strike est redémarré.
Démarrez le script en le connectant à votre teamserver pour synchroniser les journaux toutes les 30 secondes
Utilisation :
python3 beaconlogtracker.py 127.0.0.1 50050 logtracker password /path/to/cobaltstrike
Cela maintient beaconlogs.json synchronisé avec les journaux de beacon enregistrés et en cours. La synchronisation a lieu toutes les 30 secondes.
Démarrez un serveur web depuis le répertoire output/html
python3 -m http.server 8000
Connectez-vous à http://localhost:8000/beaconlogs.html
