
Enviar mensajes de phishing y archivos adjuntos a usuarios de Microsoft Teams
...
:-++++++=-.
.=+++++++++++-
.++++++++++++++= :------: :-:--.
:+++++++++++++++. .---------- #= .-+.
:+++++++++++++++. -----------: :#= :#.
:--------------------------=++++++++- .------------ .=+ ++
----------------------------+++++*+-. :+=-----===: -+-.+:
:---------------------------++++=-. .=+++++=-. .=+:.
:------=%%%%%%%%%%%%--------:... .:::.. -*=-:
:------=****#@@#****--------=++++++++++++++-----------. -#++-
:----------:+@@+:-----------+++++++++++++++=----------- -#++-
:-----------+@@*------------+++++++++++++++=-----------. -*+*-
:-----------+@@*------------+++++++++++++++=-----------. . -*++-
:-----------+@@*------------+++++++++++++++=-----------. -- -*++-
:-----------+@@*------------+++++++++++++++=-----------. . == -*++- .=
:-----------+@@+------------+++++++++++++++=-----------. .+ -= :+==- .*
:---------------------------+++++++++++++++=-----------. =* -= -+=+= .::
----------------------------+++++++++++++++=----------- ** -+ -+=++. .*=
.:-------------------------=+++++++++++++++=---------=: #+ := ++-:*= ==
-++++++++++++++++++++++++++=-------=+=: :#= .:. *=: -*- ==
.=+++++++++++++++++++++++++*+++++++=-. -#- ::++= :+=. .==
:++++++++++++++++++++++++=:.:::::. -*: .=+-. .=+-. -+:
.=+*+++++++++++++++++++- -+- .:-=. .-====----:-==:
.-+**+++++++++++**+-. .++: .-=-: .:-====-:.
:-=++******+=-: .=+===--.
..:::.. ...
_____ ______ _ _ _
|_ _| | ___ \| | (_) | |
| | ___ __ _ _ __ ___ ___ | |_/ /| |__ _ ___ | |__ ___ _ __
| | / _ \ / _` || '_ ` _ \ / __|| __/ | '_ \ | |/ __|| '_ \ / _ \| '__|
| || __/| (_| || | | | | |\__ \| | | | | || |\__ \| | | || __/| |
\_ \___| \__,_||_| |_| |_||___/\_| |_| |_||_||___/|_| |_| \___||_|
v1.2 developed by @Octoberfest73 (https://github.com/Octoberfest7)
TeamsPhisher es un programa en Python3 que facilita la entrega de mensajes de phishing y archivos adjuntos a usuarios de Microsoft Teams cuyas organizaciones permiten comunicaciones externas.
Normalmente no es posible enviar archivos a usuarios de Teams fuera de la propia organización. Max Corbridge (@CorbridgeMax) y Tom Ellson (@tde_sec) de JUMPSEC recientemente revelaron una forma de sortear esta restricción manipulando las solicitudes web de Teams para alterar el destinatario de un mensaje con un archivo adjunto.
TeamsPhisher incorpora esta técnica además de algunas anteriores divulgadas por Andrea Santese (@Medu554).
También se apoya en gran medida en TeamsEnum, un fantástico trabajo de Bastian Kanbach (@bka) de SSE, para la parte de autenticación del flujo de ataque, así como en algunas funciones auxiliares generales.
TeamsPhisher busca tomar lo mejor de todos estos proyectos y proporcionar un medio robusto, personalizable y eficiente para que operaciones de Red Team autorizadas aprovechen Microsoft Teams para phishing en escenarios de acceso inicial.
Consulte el final de este README para obtener recomendaciones de mitigación.
Entregue a TeamsPhisher un archivo adjunto, un mensaje y una lista de usuarios de Teams objetivo. Cargará el archivo adjunto en el Sharepoint del remitente y luego iterará a través de la lista de objetivos.
TeamsPhisher primero enumerará al usuario objetivo y se asegurará de que exista y pueda recibir mensajes externos. Luego creará un nuevo hilo con el usuario objetivo. Note que esto es técnicamente un chat "grupal" porque TeamsPhisher incluye el correo del objetivo dos veces; este es un truco ingenioso de @Medu554 que evitará la pantalla de presentación "Alguien fuera de tu organización te envió un mensaje, ¿estás seguro de que quieres verlo?" que podría hacer que nuestros objetivos se detengan. (v1.2) Nota: esta elusión de la pantalla de presentación fue parcheada, pero agregar al usuario objetivo a un chat grupal sigue siendo relevante para la elusión actual de la pantalla de presentación.
Una vez creado el nuevo hilo entre nuestro remitente y el objetivo, el mensaje especificado se enviará al usuario junto con un enlace al archivo adjunto en Sharepoint.
Una vez que se haya enviado este mensaje inicial, el usuario objetivo será eliminado del chat grupal creado. Esto elimina la capacidad del remitente de enviar más mensajes al objetivo, pero también elimina la pantalla de "Esta persona es de fuera de tu organización" y aumenta significativamente las probabilidades de éxito. Esta elusión actual fue publicada por @pfiatde en uno de sus muchos blogs sobre Teams y comportamientos no deseados e integrada en TeamsPhisher por Steve Nelson (@stevesec128) y Alex Martirosyan (@almartiros) de DenSecure.
Ejecute TeamsPhisher de verdad. Envíe mensajes de phishing a los objetivos.
Comando:

Targets.txt:

Message.txt:

Salida de TeamsPhisher:

Vista del remitente:

Vista del objetivo:

Archivo adjunto:

Ejecute TeamsPhisher en modo vista previa para verificar su lista de objetivos, previsualizar sus "nombres descriptivos" (si TeamsPhisher puede resolverlos usando el parámetro --personalize) y enviar un mensaje de prueba a su propia cuenta de remitente para verificar que todo se vea como desea.
Salida de TeamsPhisher:

Vista del remitente:

TeamsPhisher requiere que los usuarios tengan una cuenta comercial de Microsoft (a diferencia de una personal, por ejemplo @hotmail, @outlook, etc.) con una licencia válida de Teams y Sharepoint.
Esto significa que necesitará un inquilino de AAD y al menos un usuario con la licencia correspondiente. Al momento de esta publicación, hay algunas licencias de prueba gratuitas disponibles en el centro de licencias de AAD que cumplen con los requisitos de esta herramienta.
Deberá iniciar sesión en el Sharepoint personal del usuario desde el cual va a enviar mensajes al menos una vez antes de usar la cuenta con TeamsPhisher. Esto debería ser algo como tenantname-my.sharepoint.com/personal/myusername_mytenantname_onmicrosoft_com o tenantname-my.sharepoint.com/personal/myusername_mytenantname_mycustomdomain_tld.
En cuanto a los requisitos locales, recomiendo actualizar a la última versión de Python3. También necesitará la biblioteca de autenticación de Microsoft:``` pip3 install msal
# Uso```
usage: teamsphisher.py [-h] -u USERNAME -p PASSWORD -a ATTACHMENT -m MESSAGE (-e EMAIL | -l LIST) [--greeting GREETING] [--securelink] [--personalize]
[--preview] [--delay DELAY] [--nogreeting] [--log] [--sharepoint SHAREPOINT]
options:
-h, --help show this help message and exit
-u USERNAME, --username USERNAME
Username for authentication
-p PASSWORD, --password PASSWORD
Password for authentication
-a ATTACHMENT, --attachment ATTACHMENT
Full path to the attachment to send to targets.
-m MESSAGE, --message MESSAGE
A file containing a message to send with attached file.
-e EMAIL, --targetemail EMAIL
Single target email address
-s SHAREPOINT, --sharepoint SHAREPOINT
Manually specify sharepoint name (e.g. mytenant.sharepoint.com would be --sharepoint mytenant)
-l LIST, --list LIST Full path to a file containing target emails. One per line.
--greeting GREETING Override default greeting with a custom one. Use double quotes if including spaces!
--securelink Send link to file only viewable by the individual target recipient.
--personalize Try and use targets names in greeting when sending messages.
--preview Run in preview mode. See personalized names for targets and send test message to sender's Teams.
--delay DELAY Delay in [s] between each attempt. Default: 0
--nogreeting Do not use built in greeting or personalized names, only send message specified with --message
--log Write TeamsPhisher output to logfile
El nombre de usuario de la cuenta de Microsoft desde la que enviará mensajes (por ejemplo, [email protected])
La contraseña de la cuenta mencionada. Si contiene caracteres especiales, puede ser útil envolverla entre comillas simples.
El archivo que desea enviar a los usuarios objetivo. Se subirá al SharePoint de la cuenta remitente y se compartirá un enlace a través de Teams.
Un archivo que contiene el mensaje de texto que debe acompañar al archivo adjunto y enviarse a los objetivos
Ya sea un solo correo electrónico objetivo (por ejemplo, [email protected]) o un archivo que contenga una lista de correos electrónicos objetivo, uno por línea.
Especifique manualmente el nombre del sitio de SharePoint al que subir el archivo adjunto. Esto probablemente será necesario si el inquilino de su remitente utiliza un nombre de dominio personalizado (por ejemplo, no sigue la convención xxx.onmicrosoft.com). Especifique solo el nombre único, por ejemplo, si su sitio de SharePoint es mytest.sharepoint.com, usaría --sharepoint mytest
Sobrescriba el saludo predeterminado de TeamPhisher ("Hola, ") con uno personalizado que se antepondrá al mensaje especificado por --message. Por ejemplo, "Buenas tardes, " o "Equipo de ventas, "
Por defecto, el enlace de SharePoint enviado a los objetivos puede ser visto por cualquier persona que tenga el enlace; use --securelink para que el archivo de SharePoint solo sea visible para el objetivo que lo recibió. Puede ayudar a proteger su malware del Blue team.
TeamsPhisher intentará identificar el nombre de pila de cada usuario objetivo y usarlo con el saludo. Por ejemplo, [email protected] recibiría un mensaje que comenzaría con "Hola Tom, ". Esto no es perfecto y depende del formato de los correos electrónicos objetivo; use --preview para ver si esto es adecuado para su lista de objetivos o no.
TeamsPhisher se ejecutará en modo de vista previa. Esto NO enviará ningún mensaje a los usuarios objetivo, sino que mostrará el nombre "amigable" que usaría el modificador --personalize. Además, se enviará un mensaje de prueba representativo de lo que recibirían los objetivos con la configuración actual al Teams del remitente; inicie sesión y vea cómo se ve su mensaje y revise según sea necesario.
Especifique un retardo de x segundos entre mensajes a los objetivos. Puede ayudar con posibles problemas de limitación de velocidad.
Deshabilita el saludo integrado que usa TeamsPhisher. También deshabilita la función --personalize. Use esta opción si está incluyendo su saludo dentro del mensaje especificado por --message.
Escribe la salida de TeamsPhisher en un archivo de registro (se escribirá en el directorio personal del usuario).
python3 teamsphisher.py -u [email protected] -p 'xxxxxxxxxxxx' -l /root/targets.txt -a /root/attachment.zip -m /root/message.txt --log
Este comando obtendrá tokens de acceso para la cuenta testuser y subirá el archivo adjunto '/root/attachment.zip' al Sharepoint de testuser.
Luego creará un hilo único de Teams con cada objetivo listado en '/root/targets.txt' y les enviará el mensaje especificado en '/root/message.txt', además de un enlace al archivo adjunto en Sharepoint.
Toda la salida de terminal de TeamsPhisher se registrará en un archivo que se generará en el directorio home del usuario.```
python3 teamsphisher.py -u [email protected] -p 'xxxxxxxxxxxx' -l /root/targets.txt -a /root/attachment.zip -m /root/message.txt --greeting "Good afternoon" --personalize --securelink
Este comando obtendrá tokens de acceso para la cuenta testuser y cargará el archivo adjunto '/root/attachment.zip' al SharePoint de testuser.
Luego creará un hilo de Teams único con cada objetivo listado en '/root/targets.txt' y les enviará el mensaje especificado en '/root/message.txt', además de un enlace al archivo adjunto en SharePoint.
El mensaje tendrá como prefijo el saludo "Buenas tardes , ".
TeamsPhisher intentará usar nombres "amigables" en el saludo. Ahora el saludo será "Buenas tardes ,".
Cada enlace de SharePoint enviado es único y válido solo para ese objetivo específico.
TeamsPhisher identificará cuentas que no pueden recibir mensajes de organizaciones externas, cuentas que no existen y cuentas que tienen un plan de suscripción no compatible con este vector de ataque:

Gracias al código del proyecto TeamsEnum, TeamsPhisher admite el inicio de sesión con cuentas de remitente que usan MFA:

Usar el modificador --securelink hará que los objetivos deban autenticarse para ver el archivo adjunto en SharePoint. Puedes decidir si esto agrega demasiados pasos adicionales o si agrega 'legitimidad' al enviarlos a través de la funcionalidad real de inicio de sesión de Microsoft.


Editando TeamsPhisher.py puedes modificar algunas variables globales para usarlas en ejecuciones posteriores:```
Greeting = "Hi"
useragent = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko)"
## Personalización y nombres "amigables"
El flag --personalize intentará resolver un nombre "amigable" para cada objetivo; lo hace mirando los datos devueltos por la función enumUser y primero verificando el campo "displayName".
Si el campo displayName contiene un espacio (por ejemplo, "Tom Jones"), TeamsPhisher dividirá en el espacio y tomará el primer fragmento como el nombre "amigable".
Si no hay un espacio en el campo displayName (por ejemplo, algunas organizaciones podrían poner el UPN en el campo displayName como [email protected]), TeamsPhisher intentará analizar el UPN por sí mismo.
Con un UPN de ejemplo como [email protected], TeamsPhisher dividirá en el carácter '@', y luego en el primer fragmento dividirá en el carácter '.' y tomará el primer fragmento. Esto daría como resultado un nombre "amigable" de "Tom" en este caso.
Este es el alcance de cómo TeamsPhisher intentará identificar nombres "amigables". Objetivos como "[email protected]" y "[email protected]" NO tendrán nombres "amigables" identificados si sus campos displayName no coinciden con la convención de análisis descrita anteriormente.
# Mitigación
Las organizaciones pueden mitigar el riesgo que plantea esta vulnerabilidad gestionando las opciones relacionadas con el acceso externo a través del centro de administración de Microsoft Teams en Usuarios -> Acceso externo.

Microsoft brinda flexibilidad a las organizaciones para elegir los mejores permisos que se ajusten a sus necesidades, incluyendo un bloqueo universal así como la inclusión en lista blanca solo de inquilinos externos específicos para las comunicaciones.

# Registro de cambios
## v1.2
Fusiona una solicitud de extracción del equipo de DenSecure que incluye una omisión funcional (a partir del 2/7/24) de la pantalla de presentación de usuarios externos.
El cambio en el flujo de trabajo de TeamsPhisher es afortunadamente muy menor y fácil de integrar. Después de que se haya creado el chat grupal con un usuario objetivo y se haya enviado el mensaje, se realiza una solicitud adicional para eliminar al usuario objetivo del chat grupal. Esto resulta en que el usuario recibe el mensaje sin una pantalla de presentación de usuario externo.
Actualización del README con información más actualizada sobre la técnica utilizada actualmente por TeamsPhisher.
## v1.1.2
Se corrigió un error que los usuarios reportaban con respecto a la carga del archivo adjunto a Sharepoint; esto se debía a las convenciones de nomenclatura/renombrado que ocurren cuando los usuarios usan un dominio personalizado con sus inquilinos.
Se agregó una verificación para asegurar que si los usuarios están usando un dominio que NO es @domain.onmicrosoft.com, también usen el modificador -s para especificar su sitio de sharepoint manualmente y evitar problemas.
Se actualizó la sección de configuración para incluir iniciar sesión en Sharepoint al menos una vez antes de usar TeamsPhisher, ya que un usuario identificó que no haber iniciado sesión antes con la cuenta haría que TeamsPhisher fallara.
Se agregó el parámetro &top=999 a la solicitud web getSenderInfo para aumentar el número de usuarios recuperados por página/disminuir el número de solicitudes necesarias para encontrar nuestro usuario.
### Reversión del cambio con respecto al análisis de '.' en nombres de usuario al ensamblar la uri de Sharepoint
v.1.1 cambió cómo se analizaban los nombres de usuario con el carácter '.' en ellos para crear las URI de Sharepoint necesarias. Había varios problemas distintos y yo identifiqué erróneamente esto como la causa de uno de ellos. Este cambio se ha revertido. El resultado es que un nombre de usuario como [email protected] ahora tendrá una uri de sharepoint ensamblada como "tom_jones_mytest_onmicrosoft_com" en lugar de "tom.jones_mytest_onmicrosoft_com".
## v1.1.1
Correcciones menores
## v1.1
Se realizaron algunos commits para abordar varios problemas pequeños sin incrementar el número de versión; disculpen por ser descuidado.
v1.1 trae algunos cambios destinados a abordar algunos problemas comunes que los usuarios estaban encontrando.
### Argumento -s, --sharepoint
Este argumento opcional se agregó para que los usuarios puedan especificar manualmente su nombre raíz de sharepoint. Surgió un problema común cuando los usuarios cambiaban el nombre de dominio de su inquilino a uno personalizado; por ejemplo, en lugar de que su nombre de usuario fuera [email protected], podría ser [email protected]. La versión original de TeamsPhisher ensamblaba la dirección de Sharepoint y las rutas URI requeridas analizando el nombre principal de usuario (UPN) del remitente a partir de su información de usuario. Cuando el dominio de un inquilino se cambia a uno personalizado, los UPN de los usuarios cambian para reflejar esto. Sin embargo, la dirección de sharepoint del inquilino siempre permanecerá igual/lo que era cuando el inquilino se creó originalmente.
No pude encontrar una buena manera de resolver la dirección actual de Sharepoint para un inquilino; se puede hacer con Graph API fácilmente, pero implementar Graph en esta herramienta requeriría mucha más configuración por parte de los usuarios para usar TeamsPhisher. Opté por proporcionar la opción de especificar manualmente el nombre de sharepoint como la solución más fácil.
### Mejora en el análisis de la dirección de Sharepoint y la uri requerida cuando NO se usa la opción manual
Hubo un informe de un usuario que NO estaba usando un dominio personalizado con su inquilino y que aún recibía el error 404 no encontrado con respecto a Sharepoint. Creo que esto tenía que ver con que su nombre de usuario contenía un '.', por ejemplo, [email protected]. La versión anterior de TeamsPhisher tenía una funcionalidad más simple de buscar y reemplazar para el UPN del usuario con el fin de ensamblar las uri de Sharepoint requeridas; v1.1 ahora apunta específicamente a los caracteres '.' que necesitan ser reemplazados y dejará otros '.' en el campo de nombre de usuario intactos.
### Los caracteres especiales (p. ej., 'ö') dentro del cuerpo del mensaje ya no resultan en un error del servidor
Esta fue una corrección muy simple que tomó demasiado tiempo de encontrar. Se agregó codificación utf-8 a la solicitud POST sendFile. Ahora se pueden usar caracteres especiales en los mensajes.
### Limpieza menor de código
Se corrigieron algunos comentarios y se reordenaron algunos pasos en main para ahora verificar los archivos necesarios antes de intentar autenticar.
## v1.0 - Versión inicial
# Créditos y Agradecimientos
1. Max Corbridge (@CorbridgeMax) y Tom Ellson (@tde_sec) de JUMPSEC por [este artículo](https://labs.jumpsec.com/advisory-idor-in-microsoft-teams-allows-for-external-tenants-to-introduce-malware/). Un agradecimiento especial a Max por ser muy receptivo y estar dispuesto a charlar en privado sobre su investigación.
2. Andrea Santese (@Medu554) [por esta investigación](https://posts.inthecyber.com/leveraging-microsoft-teams-for-initial-access-42beb07f12c4). Nuevamente, un agradecimiento especial por su receptividad y disposición a discutir su trabajo en privado.
3. Bastian Kanbach (@_bka_) de SSE por [TeamsEnum](https://github.com/sse-secure-systems/TeamsEnum). Este proyecto sirvió como punto de partida para recuperar tokens Bearer y autenticarse mediante diferentes métodos. Yo había usado Graph API para estos fines, pero su proyecto (y este) usa los endpoints normales, por lo que fue genial tener a alguien que ya había lidiado con esto y tenía funciones confiables para lograrlo.
4. @pfiatde quien tiene una [serie de varias partes sobre phishing en Teams](https://badoption.eu/blog/2024/01/12/teams5.html). Sus blogs fueron referenciados durante el desarrollo original de TeamsPhisher, y la versión actual de la herramienta utiliza una nueva omisión de pantalla de presentación de investigaciones posteriores que él publicó.
5. Steve Nelson (@stevesec128) y Alex Martirosyan (@almartiros) de DenSecure por su actualización a Teamsphisher (2/7/24) que integró la omisión de la pantalla de presentación aún funcional de @pfiatde.
6. [Este sitio para generar texto ASCII](https://patorjk.com/software/taag/#p=display&f=Graffiti&t=Type%20Something%20)
7. [Este proyecto loco para convertir imágenes a arte ASCII](https://github.com/TheZoraiz/ascii-image-converter)