
C2 de PowerShell a Slack
Este módulo de PowerShell incluye varias funciones que utilizan la API de Slack para crear un canal de comando y control. La función principal, Start-Shell, se conectará a un canal de Slack especificado por el usuario y autenticará utilizando un token de autenticación de API proporcionado para un equipo y usuario de Slack determinados. Cualquier comando escrito en el canal se ejecutará en PowerShell en el host.
El proyecto SlackShell requiere PowerShell v3 o superior debido al uso de Invoke-RestMethod para llamadas a la API. El desarrollo futuro continuará utilizando cmdlets y funciones actuales de PowerShell. Sin embargo, se creó un puerto para PowerShell v2 en SlackShell-Poshv2.psm1.
Se pueden importar scripts adicionales de PS en la sesión en ejecución subiéndolos primero al canal de Slack. La función de importación descargará los archivos, que por defecto están alojados en https://slack-files.com, y los importará en memoria. Los archivos no tocan el disco. Por el contrario, la función de descarga se puede utilizar para guardar una copia local de cualquier archivo en el disco.
Los archivos locales se pueden subir al canal de Slack a través de la API utilizando la función de subida.
Si es necesario, se puede iniciar un proceso PS separado para ejecutar un comando que utilice el cmdlet Invoke-Command incorporado.
Inicia la monitorización de un canal de Slack para comandos a ejecutar en PowerShell. Se conectará al canal de Slack cada $sleep segundos y obtendrá todos los comandos nuevos. Los comandos se ejecutarán en el host en PowerShell.
Envía un mensaje al canal de Slack específico a través de la API. Los mensajes se envían con un encabezado de texto, y el cuerpo del mensaje es un adjunto de Slack.
Inicia un nuevo proceso y ejecuta un comando en PowerShell en el host. Utiliza el método Start-Job en PowerShell para generar un nuevo proceso, esperar a que el trabajo termine y devolver la salida.
Ejecuta un comando en PowerShell en el host en el contexto actual del proceso en ejecución y devuelve la salida.
Devuelve todos los mensajes en un canal de Slack específico desde el período más antiguo hasta el presente. Los mensajes se devuelven en formato JSON según las especificaciones de la API.
Utiliza una llamada a la API de Slack para probar si el token de API proporcionado es válido.
Utiliza una llamada a la API de Slack para devolver una lista de archivos actualmente alojados en el canal de Slack.
Actualiza la lista de archivos, luego descarga el archivo especificado en memoria, crea un nuevo módulo y luego importa ese módulo. Los comandos específicos de ese módulo se pueden ingresar directamente en el canal de Slack. El archivo descargado no toca el disco. Esta función debe considerarse en Beta mientras se realizan pruebas adicionales. Algunos módulos se comportan de manera errática
Actualiza la lista de archivos y luego descarga el archivo especificado al disco. Se puede incluir una ruta de almacenamiento adicional; por defecto, la ubicación actual.
Sube un archivo local al canal de Slack.
El token de API que se utiliza para la autenticación. Este token representa a un usuario específico en un equipo específico de Slack. Puede encontrar más información aquí: https://api.slack.com/custom-integrations/legacy-tokens
El identificador del canal que especifica qué canal de Slack del equipo se utilizará. Todo el texto en este canal se procesará como comandos en el host cuando se ejecute Start-Shell. El ID del canal se puede encontrar en la URL al acceder a la página del canal desde el sitio web de Slack.
Ejemplo: https://slackteam1.slack.com/messages/ABC123456. El ID del canal es "ABC123456".
Import-Module ./SlackShell.psm1
Start-Shell -Token "xoxp-175828824580-175707545555-176600001223-826315a84e533c482bb7e20e8312fh45k" -Channel "ABC123456" -Sleep 5
Únase al mismo canal de Slack como un usuario diferente al que se usó para crear el token. Cualquier cosa escrita en el canal por el usuario diferente se ejecutará en el host bajo el mismo contexto de usuario local que se usó para iniciar el script. Alternativamente, se puede usar 'runjob' para ejecutar comandos en un proceso de PowerShell recién generado.
Cierra el shell y la conexión.
Cambia el directorio en el contexto del proceso principal. Se pueden usar rutas relativas (ej. cd ..)
Cambia el tiempo de espera.
Lista los archivos disponibles en el canal de Slack asociado.
Importa el archivo especificado. El archivo debe estar compartido con el canal de Slack que se está utilizando.
Descarga el archivo especificado al disco y lo almacena en la ubicación opcional del parámetro de ruta. El archivo debe estar compartido con el canal de Slack que se está utilizando.
Sube el archivo local a Slack y lo comparte con el canal que se está utilizando.
Ejecuta el comando especificado en un nuevo proceso de PowerShell.
La inspiración para trabajar con la API de Slack en PowerShell se atribuye a Warren Frame. Su repositorio fue un gran recurso para comenzar: https://github.com/RamblingCookieMonster/PSSlack
Agradecimientos especiales a @thesubtlety por portar a POSHv2 y por las mejoras añadidas.