
Este proyecto es un 'puente' entre el lenguaje sleep y python. Permite el control de un teamserver de Cobalt Strike a través de python sin necesidad del cliente GUI estándar. NOTA: Este proyecto está muy en BETA. El objetivo es proporcionar un campo de pruebas para pruebas y de ninguna manera es una característica oficialmente soportada. Quizás esto podría agregarse en el futuro al producto principal.
Este proyecto es un 'puente' entre el lenguaje sleep y python. Permite el control de un teamserver de Cobalt Strike a través de python sin necesidad del cliente GUI estándar.
NOTA: Este proyecto está muy en BETA. El objetivo es proporcionar un campo de pruebas para testing y de ninguna manera es una característica con soporte oficial. Quizás esto podría ser algo añadido en el futuro al producto principal.
El proyecto fue inspirado por el trabajo realizado por @BinaryFaultline y @Mcgigglez16 en el proyecto https://github.com/emcghee/PayloadAutomation. ¡¡Quiero ofrecer un agradecimiento especial a ambos!!
El corazón de este puente es una implementación en python de un cliente headless de Cobalt Strike. Esto se logra utilizando la Aggressor Script Console proporcionada por agscript como motor. Agscript permite la interacción headless con Cobalt Strike (https://www.cobaltstrike.com/aggressor-script/index.html). El 'bridge' funciona mediante funciones auxiliares de python en sleepy.py para generar los comandos sleep necesarios que espera la consola agscript. En lugar de escribir las funciones sleep, striker.py proporciona funciones auxiliares que abstraen sleep y permiten el uso de python.
Debido a que el proyecto PayloadAutomation inspiró esto, comenzó con gran parte del mismo código, pero quería reducirlo para usar los componentes necesarios para actuar como un wrapper de agscript.
| Item | Description |
|---|---|
| sleep_python_bridge | La biblioteca que permite a python interactuar con Cobalt Strike |
| output/html | ruta para los visores de datos html |
| output/html/data | ruta para los datos json usados por el visor de datos |
| output/payloads | ruta para los payloads guardados (usados por el generador de payloads) |
| payload_scripts | ruta para los scripts externos que serán cargados por payloadgenerator.py |
| beaconlogtracker.py | Implementación de un rastreador de logs de beacon que utiliza un datagrid HTML para mostrar los logs de beacon |
| payloadgenerator.py | Implementación de un generador de payloads de beacon que crea payloads para cada listener |
| beacongrapher.py | Implementación de un rastreador de grafos de beacon que utiliza un grafo dirigido HTML/javascript para los beacons |
Puede que la forma más fácil de entender este proyecto sean los ejemplos, pero el script es 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)
Ejecuta el script
python3 example.py 127.0.0.1 50050 example password /path/to/cobaltstrike

Los logs de beacon están disponibles en tiempo de ejecución en un teamserver o a través de los archivos de log de beacon guardados en el teamserver. Los datos siempre están ahí, pero puede que no se presenten de la forma que te gustaría. Este es un ejemplo de rastreador de logs que utiliza un data grid HTML para ver rápidamente los logs de beacon.
beaconlogtracker.py es un script que se conecta a un teamserver, extrae los logs de beacon en ejecución cada 30 segundos, guarda en <code>beaconlogs.json` y los muestra en un data grid HTML buscable y ordenable.
Los logs de beacon siempre se guardan en el directorio de logs, pero esta es una forma alternativa de rastrear los logs en memoria con un visor alternativo. Si el teamserver se reinicia, los logs en memoria se pierden y debes consultar los logs almacenados en el directorio de logs del teamserver. Este script mantiene los logs en memoria sincronizados con el archivo beaconlogs.json. De esta manera tienes una forma rápida y sencilla de visualizar todos los datos sin tener que revisar el directorio de logs incluso si Cobalt Strike se reinicia.
Inicia el script haciendo que se conecte a tu teamserver para sincronizar los logs cada 30 segundos
Uso:
python3 beaconlogtracker.py 127.0.0.1 50050 logtracker password /path/to/cobaltstrike
Esto mantendrá beaconlogs.json sincronizado con los logs de beacon guardados y en ejecución. Se sincroniza cada 30 segundos
Inicia un servidor web desde el directorio output/html
python3 -m http.server 8000
Conéctate a http://localhost:8000/beaconlogs.html
