
Enviar mensagens de phishing e anexos para usuários do Microsoft Teams
...
:-++++++=-.
.=+++++++++++-
.++++++++++++++= :------: :-:--.
:+++++++++++++++. .---------- #= .-+.
:+++++++++++++++. -----------: :#= :#.
:--------------------------=++++++++- .------------ .=+ ++
----------------------------+++++*+-. :+=-----===: -+-.+:
:---------------------------++++=-. .=+++++=-. .=+:.
:------=%%%%%%%%%%%%--------:... .:::.. -*=-:
:------=****#@@#****--------=++++++++++++++-----------. -#++-
:----------:+@@+:-----------+++++++++++++++=----------- -#++-
:-----------+@@*------------+++++++++++++++=-----------. -*+*-
:-----------+@@*------------+++++++++++++++=-----------. . -*++-
:-----------+@@*------------+++++++++++++++=-----------. -- -*++-
:-----------+@@*------------+++++++++++++++=-----------. . == -*++- .=
:-----------+@@+------------+++++++++++++++=-----------. .+ -= :+==- .*
:---------------------------+++++++++++++++=-----------. =* -= -+=+= .::
----------------------------+++++++++++++++=----------- ** -+ -+=++. .*=
.:-------------------------=+++++++++++++++=---------=: #+ := ++-:*= ==
-++++++++++++++++++++++++++=-------=+=: :#= .:. *=: -*- ==
.=+++++++++++++++++++++++++*+++++++=-. -#- ::++= :+=. .==
:++++++++++++++++++++++++=:.:::::. -*: .=+-. .=+-. -+:
.=+*+++++++++++++++++++- -+- .:-=. .-====----:-==:
.-+**+++++++++++**+-. .++: .-=-: .:-====-:.
:-=++******+=-: .=+===--.
..:::.. ...
_____ ______ _ _ _
|_ _| | ___ \| | (_) | |
| | ___ __ _ _ __ ___ ___ | |_/ /| |__ _ ___ | |__ ___ _ __
| | / _ \ / _` || '_ ` _ \ / __|| __/ | '_ \ | |/ __|| '_ \ / _ \| '__|
| || __/| (_| || | | | | |\__ \| | | | | || |\__ \| | | || __/| |
\_ \___| \__,_||_| |_| |_||___/\_| |_| |_||_||___/|_| |_| \___||_|
v1.2 developed by @Octoberfest73 (https://github.com/Octoberfest7)
TeamsPhisher é um programa Python3 que facilita o envio de mensagens de phishing e anexos para usuários do Microsoft Teams cujas organizações permitem comunicações externas.
Normalmente não é possível enviar arquivos para usuários do Teams fora da sua organização. Max Corbridge (@CorbridgeMax) e Tom Ellson (@tde_sec) da JUMPSEC recentemente divulgaram uma maneira de contornar essa restrição manipulando requisições web do Teams para alterar o destinatário de uma mensagem com um arquivo anexado.
TeamsPhisher incorpora essa técnica além de algumas anteriores divulgadas por Andrea Santese (@Medu554).
Ele também se apoia fortemente no TeamsEnum, um trabalho fantástico de Bastian Kanbach (@bka) da SSE, para a parte de autenticação do fluxo de ataque, bem como algumas funções auxiliares gerais.
TeamsPhisher busca aproveitar o melhor de todos esses projetos e fornecer um meio robusto, customizável e eficiente para operações autorizadas de Red Team utilizarem o Microsoft Teams para phishing em cenários de acesso.
Consulte o final deste README para recomendações de mitigação.
Forneça ao TeamsPhisher um anexo, uma mensagem e uma lista de usuários alvo do Teams. Ele fará o upload do anexo para o Sharepoint do remetente e então iterará pela lista de alvos.
TeamsPhisher primeiro enumerará o usuário alvo e garantirá que o usuário existe e pode receber mensagens externas. Em seguida, criará um novo thread com o usuário alvo. Observe que isso é tecnicamente um chat "em grupo" porque o TeamsPhisher inclui o e-mail do alvo duas vezes; este é um truque interessante de @Medu554 que contorna a tela de aviso "Alguém de fora da sua organização enviou uma mensagem para você, tem certeza de que deseja visualizá-la?" que pode dar aos nossos alvos motivo para pausa. (v1.2)Nota: essa bypass da tela de aviso foi corrigida, mas adicionar o usuário alvo a um chat em grupo ainda é relevante para a bypass atual da tela de aviso.
Com o novo thread criado entre nosso remetente e o alvo, a mensagem especificada será enviada ao usuário juntamente com um link para o anexo no Sharepoint.
Depois que esta mensagem inicial for enviada, o usuário alvo será removido do chat em grupo criado. Isso remove a capacidade do remetente de enviar mais mensagens ao alvo, mas também remove a tela de aviso "Esta pessoa é de fora da sua organização" e torna o sucesso muito mais provável. Esta bypass atual foi publicada por @pfiatde em um de seus muitos blogs sobre Teams e comportamento não intencional e integrada ao TeamsPhisher por Steve Nelson (@stevesec128) e Alex Martirosyan (@almartiros) da DenSecure.
Execute o TeamsPhisher de verdade. Envie mensagens de phishing para os alvos.
Comando:

Targets.txt:

Message.txt:

Saída do TeamsPhisher:

Visualização do remetente:

Visualização do alvo:

Arquivo anexado:

Execute o TeamsPhisher no modo de pré-visualização para verificar sua lista de alvos, pré-visualizar seus "nomes amigáveis" (se o TeamsPhisher conseguir resolvê-los usando a opção --personalize) e enviar uma mensagem de teste para sua própria conta de remetente para verificar se tudo está como você deseja.
Saída do TeamsPhisher:

Visualização do remetente:

TeamsPhisher exige que os usuários tenham uma conta Microsoft Business (em oposição a uma conta pessoal, por exemplo, @hotmail, @outlook etc.) com uma licença válida do Teams e Sharepoint.
Isso significa que você precisará de um tenant do AAD e de pelo menos um usuário com uma licença correspondente. No momento da publicação, existem algumas licenças de avaliação gratuita disponíveis no centro de licenças do AAD que atendem aos requisitos desta ferramenta.
Você precisará fazer login no Sharepoint pessoal do usuário com o qual enviará mensagens pelo menos uma vez antes de usar a conta com o TeamsPhisher. Isso deve ser algo como tenantname-my.sharepoint.com/personal/myusername_mytenantname_onmicrosoft_com ou tenantname-my.sharepoint.com/personal/myusername_mytenantname_mycustomdomain_tld.
Em termos de requisitos locais, recomendo atualizar para a versão mais recente do Python3. Você também precisará da biblioteca de autenticação da 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
O nome de usuário da conta Microsoft da qual você enviará as mensagens (ex.: [email protected])
A senha da conta mencionada. Se contiver caracteres especiais, pode ser útil envolver tudo entre aspas simples.
O arquivo que você deseja enviar para os usuários-alvo. Ele será carregado no SharePoint da conta remetente e um link será compartilhado via Teams.
Um arquivo contendo a mensagem de texto que deve acompanhar o anexo e ser enviada aos alvos
Ou um único e-mail de destino (ex.: [email protected]) ou um arquivo contendo uma lista de e-mails de destino, um por linha.
Especifique manualmente o nome do site do SharePoint para fazer o upload do anexo. Provavelmente será necessário se o locatário do remetente usar um nome de domínio personalizado (ex.: não segue a convenção xxx.onmicrosoft.com). Informe apenas o nome exclusivo, por exemplo, se seu site do SharePoint for mytest.sharepoint.com, use --sharepoint mytest
Substitua a saudação padrão do TeamPhisher ("Hi, ") por uma personalizada a ser adicionada ao início da mensagem especificada por --message. Por exemplo, "Good afternoon, " ou "Sales team, "
Por padrão, o link do SharePoint enviado aos alvos pode ser visualizado por qualquer pessoa com o link; use --securelink para que o arquivo do SharePoint seja visível apenas pelo alvo que o recebeu. Pode ajudar a proteger seu malware da equipe de defesa.
O TeamsPhisher tentará identificar o primeiro nome de cada usuário-alvo e usá-lo com a saudação. Por exemplo, [email protected] receberia uma mensagem que começava com "Hi Tom, ". Isso não é perfeito e depende do formato dos e-mails-alvo; use --preview para ver se isso é adequado para sua lista de alvos.
O TeamsPhisher será executado em modo de pré-visualização. Isso NÃO enviará nenhuma mensagem para os usuários-alvo, mas exibirá o nome "amigável" que seria usado pela opção --personalize. Além disso, uma mensagem de teste representativa do que os alvos receberiam com as configurações atuais será enviada para o Teams do remetente; faça login e veja como sua mensagem fica e revise conforme necessário.
Especifique um atraso de x segundos entre as mensagens para os alvos. Pode ajudar com possíveis problemas de limitação de taxa.
Desabilite a saudação integrada usada pelo TeamsPhisher. Também desabilita o recurso --personalize. Use esta opção se você estiver incluindo sua saudação dentro da mensagem especificada por --message.
Grave a saída do TeamsPhisher em um arquivo de log (será gravado no diretório inicial do usuário).
python3 teamsphisher.py -u [email protected] -p 'xxxxxxxxxxxx' -l /root/targets.txt -a /root/attachment.zip -m /root/message.txt --log
Este comando obterá tokens de acesso para a conta testuser e fará o upload do anexo '/root/attachment.zip' para o Sharepoint do testuser.
Em seguida, criará um thread Teams único para cada alvo listado em '/root/targets.txt' e enviará a eles a mensagem especificada em '/root/message.txt', bem como um link para o anexo no Sharepoint.
Toda a saída do terminal do TeamsPhisher será registrada em um arquivo que é gerado no diretório pessoal do usuário.```
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 irá buscar os tokens de acesso para a conta testuser e fazer upload do anexo '/root/attachment.zip' para o Sharepoint do testuser.
Em seguida, criará um thread único do Teams com cada alvo listado em '/root/targets.txt' e enviará a eles a mensagem especificada em '/root/message.txt', além de um link para o anexo no Sharepoint.
A mensagem será prefixada com a saudação "Boa tarde , ".
O TeamsPhisher tentará usar nomes "amigáveis" na saudação. Agora a saudação será "Boa tarde ,".
Cada link do SharePoint enviado é único e válido apenas para aquele alvo específico.
O TeamsPhisher identificará contas que não podem receber mensagens de organizações externas, contas que não existem e contas que possuem um plano de assinatura incompatível com este vetor de ataque:

Graças ao código do projeto TeamsEnum, o TeamsPhisher suporta login com contas de remetente usando MFA:

Usar a opção --securelink fará com que os alvos sejam solicitados a autenticar para visualizar o anexo no Sharepoint. Você pode decidir se isso adiciona muitas etapas extras ou se adiciona 'legitimidade' ao enviá-los através da funcionalidade real de login da Microsoft.


Ao editar o TeamsPhisher.py você pode alterar algumas variáveis globais para uso em execuções subsequentes:```
Greeting = "Hi"
useragent = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko)"
## Personalização e nomes "amigáveis"
A flag `--personalize` tentará resolver um nome "amigável" para cada alvo; ela faz isso examinando os dados retornados pela função `enumUser` e primeiro verificando o campo `displayName`.
Se o campo `displayName` contiver um espaço (por exemplo, "Tom Jones"), o TeamsPhisher dividirá no espaço e pegará o primeiro pedaço como o nome "amigável".
Se não houver um espaço no campo `displayName` (por exemplo, algumas organizações podem colocar o UPN no campo `displayName`, como `[email protected]`), o TeamsPhisher tentará analisar o próprio UPN.
Com um UPN de exemplo como `[email protected]`, o TeamsPhisher dividirá no caractere '@' e, em seguida, no primeiro pedaço, dividirá no caractere '.' e pegará o primeiro pedaço. Neste caso, isso resultaria em um nome "amigável" de "Tom".
Esta é a extensão de como o TeamsPhisher tentará identificar nomes "amigáveis". Alvos como `[email protected]` e `[email protected]` NÃO terão nomes "amigáveis" identificados se seus campos `displayName` não corresponderem à convenção de análise descrita acima.
# Mitigação
As organizações podem mitigar o risco representado por esta vulnerabilidade gerenciando as opções relacionadas ao acesso externo no centro de administração do Microsoft Teams, em Usuários -> Acesso externo.

A Microsoft oferece flexibilidade para que as organizações escolham as melhores permissões para atender às suas necessidades, incluindo um bloqueio universal e a lista de permissões apenas de locatários externos específicos para comunicações.

# Histórico de alterações
## v1.2
Faz o merge de um pull request da equipe da DenSecure que inclui uma bypass funcional (a partir de 07/02/24) para a tela de splash de usuário externo.
Felizmente, a mudança no fluxo de trabalho do TeamsPhisher é muito pequena e fácil de integrar. Após a criação do chat em grupo com um usuário alvo e o envio da mensagem, é feita uma requisição adicional para remover o usuário alvo do chat em grupo. Isso resulta no usuário recebendo a mensagem sem uma tela de splash de usuário externo.
Atualiza o README com informações mais atuais sobre a técnica atualmente usada pelo TeamsPhisher.
## v1.1.2
Corrige um erro que usuários estavam relatando ao fazer upload do anexo para o Sharepoint; isso decorria de convenções de nomenclatura/renomeação que ocorrem quando os usuários usam domínio personalizado com seus locatários.
Adiciona uma verificação para garantir que, se os usuários estiverem usando um domínio que NÃO seja `@domain.onmicrosoft.com`, eles também usem a flag `-s` para especificar manualmente o site do Sharepoint, a fim de evitar problemas.
Atualiza a seção de configuração para incluir o login no Sharepoint pelo menos uma vez antes de usar o TeamsPhisher, pois um usuário identificou que não ter feito login anteriormente com a conta faria o TeamsPhisher falhar.
Adiciona o parâmetro `&top=999` à requisição web `getSenderInfo` para aumentar o número de usuários recuperados por página/diminuir o número de requisições necessárias para encontrar nosso usuário.
### Reversão da alteração relacionada à análise de '.' em nomes de usuário ao montar a URI do Sharepoint
A v1.1 alterou como os nomes de usuário com o caractere '.' eram analisados para criar as URIs necessárias do Sharepoint. Havia várias questões distintas em andamento e eu identifiquei erroneamente isso como a causa de uma delas. Esta alteração foi revertida. O resultado é que um nome de usuário como `[email protected]` agora terá uma URI do Sharepoint montada como `tom_jones_mytest_onmicrosoft_com` em vez de `tom.jones_mytest_onmicrosoft_com`.
## v1.1.1
Correções menores
## v1.1
Houve alguns commits feitos para resolver vários problemas pequenos sem incrementar o número da versão; desculpe pela informalidade.
A v1.1 traz algumas mudanças com o objetivo de resolver alguns problemas comuns que os usuários estavam enfrentando.
### Argumento -s, --sharepoint
Este argumento opcional foi adicionado para que os usuários possam especificar manualmente o nome raiz do Sharepoint. Um problema comum surgiu quando os usuários alteraram o nome de domínio do locatário para algo personalizado; por exemplo, em vez de o nome de usuário ser `[email protected]`, poderia ser `[email protected]`. A versão original do TeamsPhisher montava o endereço do Sharepoint e os caminhos URI necessários analisando o nome principal do usuário (UPN) do remetente a partir das informações do usuário. Quando o domínio de um locatário é alterado para um personalizado, os UPNs dos usuários mudam para refletir isso. No entanto, o endereço do Sharepoint do locatário sempre permanecerá o mesmo/qual era quando o locatário foi criado originalmente.
Não consegui encontrar uma boa maneira de resolver o endereço atual do Sharepoint para um locatário; pode ser feito facilmente com a Graph API, mas implementar Graph nesta ferramenta exigiria muito mais configuração por parte dos usuários para usar o TeamsPhisher. Optei por fornecer a opção de especificar manualmente o nome do Sharepoint como a correção mais fácil.
### Melhoria na análise do endereço do Sharepoint e URI necessária ao NÃO usar a opção manual
Houve um relato de um usuário que NÃO estava usando um domínio personalizado com seu locatário e ainda assim estava recebendo o erro 404 Não Encontrado em relação ao Sharepoint. Acredito que isso estava relacionado ao seu nome de usuário conter um '.', por exemplo, `[email protected]`. A versão anterior do TeamsPhisher tinha uma funcionalidade mais simples de localizar e substituir para o UPN do usuário, a fim de montar as URIs necessárias do Sharepoint; a v1.1 agora tem como alvo específico os caracteres '.' que precisam ser substituídos e deixará outros '.' no campo de nome de usuário intactos.
### Caracteres especiais (por exemplo, 'ö') no corpo da mensagem não resultam mais em erro do servidor
Esta foi uma correção muito simples que levou muito tempo para ser rastreada. Adicionada codificação utf-8 à requisição POST do `sendFile`. Caracteres especiais agora podem ser usados nas mensagens.
### Limpeza menor no código
Corrigidos alguns comentários e reordenadas algumas etapas no `main` para agora verificar os arquivos necessários antes de tentar autenticar.
## v1.0 - Lançamento inicial
# Créditos e Agradecimentos
1. Max Corbridge (@CorbridgeMax) e Tom Ellson (@tde_sec) da JUMPSEC por [este artigo](https://labs.jumpsec.com/advisory-idor-in-microsoft-teams-allows-for-external-tenants-to-introduce-malware/). Um agradecimento extra ao Max por ser muito receptivo e disposto a conversar em particular sobre sua pesquisa.
2. Andrea Santese (@Medu554) [por esta pesquisa](https://posts.inthecyber.com/leveraging-microsoft-teams-for-initial-access-42beb07f12c4). Novamente, um agradecimento extra pela sua receptividade e disposição para discutir seu trabalho em particular.
3. Bastian Kanbach (@_bka_) da SSE por [TeamsEnum](https://github.com/sse-secure-systems/TeamsEnum). Este projeto serviu como ponto de partida para recuperar tokens Bearer e autenticar por diferentes métodos. Eu usei a Graph API para esses fins, mas o projeto dele (e este) usa os endpoints normais, então foi ótimo ter alguém que já havia enfrentado isso e tinha funções confiáveis para conseguir.
4. @pfiatde, que tem uma [série de várias partes sobre phishing no Teams](https://badoption.eu/blog/2024/01/12/teams5.html). Seus blogs foram referenciados durante o desenvolvimento original do TeamsPhisher, e a versão atual da ferramenta usa uma nova bypass de tela de splash baseada em pesquisas posteriores que ele divulgou.
5. Steve Nelson (@stevesec128) e Alex Martirosyan (@almartiros) da DenSecure por sua atualização no Teamsphisher (07/02/24) que integrou a bypass de tela de splash ainda funcional do @pfiatde.
6. [Este site para gerar texto ASCII](https://patorjk.com/software/taag/#p=display&f=Graffiti&t=Type%20Something%20)
7. [Este projeto maluco para converter imagens em arte ASCII](https://github.com/TheZoraiz/ascii-image-converter)