
Inviare messaggi di phishing e allegati agli utenti di Microsoft Teams
...
:-++++++=-.
.=+++++++++++-
.++++++++++++++= :------: :-:--.
:+++++++++++++++. .---------- #= .-+.
:+++++++++++++++. -----------: :#= :#.
:--------------------------=++++++++- .------------ .=+ ++
----------------------------+++++*+-. :+=-----===: -+-.+:
:---------------------------++++=-. .=+++++=-. .=+:.
:------=%%%%%%%%%%%%--------:... .:::.. -*=-:
:------=****#@@#****--------=++++++++++++++-----------. -#++-
:----------:+@@+:-----------+++++++++++++++=----------- -#++-
:-----------+@@*------------+++++++++++++++=-----------. -*+*-
:-----------+@@*------------+++++++++++++++=-----------. . -*++-
:-----------+@@*------------+++++++++++++++=-----------. -- -*++-
:-----------+@@*------------+++++++++++++++=-----------. . == -*++- .=
:-----------+@@+------------+++++++++++++++=-----------. .+ -= :+==- .*
:---------------------------+++++++++++++++=-----------. =* -= -+=+= .::
----------------------------+++++++++++++++=----------- ** -+ -+=++. .*=
.:-------------------------=+++++++++++++++=---------=: #+ := ++-:*= ==
-++++++++++++++++++++++++++=-------=+=: :#= .:. *=: -*- ==
.=+++++++++++++++++++++++++*+++++++=-. -#- ::++= :+=. .==
:++++++++++++++++++++++++=:.:::::. -*: .=+-. .=+-. -+:
.=+*+++++++++++++++++++- -+- .:-=. .-====----:-==:
.-+**+++++++++++**+-. .++: .-=-: .:-====-:.
:-=++******+=-: .=+===--.
..:::.. ...
_____ ______ _ _ _
|_ _| | ___ \| | (_) | |
| | ___ __ _ _ __ ___ ___ | |_/ /| |__ _ ___ | |__ ___ _ __
| | / _ \ / _` || '_ ` _ \ / __|| __/ | '_ \ | |/ __|| '_ \ / _ \| '__|
| || __/| (_| || | | | | |\__ \| | | | | || |\__ \| | | || __/| |
\_ \___| \__,_||_| |_| |_||___/\_| |_| |_||_||___/|_| |_| \___||_|
v1.2 developed by @Octoberfest73 (https://github.com/Octoberfest7)
TeamsPhisher è un programma Python3 che facilita l'invio di messaggi e allegati di phishing agli utenti di Microsoft Teams le cui organizzazioni consentono comunicazioni esterne.
Normalmente non è possibile inviare file agli utenti di Teams al di fuori della propria organizzazione. Max Corbridge (@CorbridgeMax) e Tom Ellson (@tde_sec) di JUMPSEC hanno recentemente divulgato un metodo per aggirare questa restrizione manipolando le richieste web di Teams per alterare il destinatario di un messaggio con un file allegato.
TeamsPhisher incorpora questa tecnica oltre ad alcune precedenti divulgate da Andrea Santese (@Medu554).
Si basa pesantemente anche su TeamsEnum, un fantastico lavoro di Bastian Kanbach (@bka) di SSE, per la parte di autenticazione del flusso di attacco e per alcune funzioni di utilità generale.
TeamsPhisher cerca di prendere il meglio da tutti questi progetti e fornire un mezzo robusto, personalizzabile ed efficiente per operazioni autorizzate di Red Team per sfruttare Microsoft Teams per scenari di phishing per l'accesso iniziale.
Vedi la fine di questo README per raccomandazioni di mitigazione.
Fornisci a TeamsPhisher un allegato, un messaggio e un elenco di utenti Teams target. Caricherà l'allegato nello Sharepoint del mittente, e poi scorrerà l'elenco dei target.
TeamsPhisher enumererà prima l'utente target e si assicurerà che l'utente esista e possa ricevere messaggi esterni. Creerà quindi una nuova conversazione con l'utente target. Nota che si tratta tecnicamente di una chat di "gruppo" perché TeamsPhisher include l'email del target due volte; questo è un espediente intelligente di @Medu554 che aggirerà la schermata di avviso "Qualcuno al di fuori della tua organizzazione ti ha inviato un messaggio, sei sicuro di volerlo visualizzare?" che potrebbe far esitare i nostri target. (v1.2)Nota: questo bypass della schermata di avviso è stato corretto, ma aggiungere l'utente target a una chat di gruppo è ancora rilevante per l'attuale bypass della schermata di avviso.
Una volta creata la nuova conversazione tra il nostro mittente e il target, il messaggio specificato verrà inviato all'utente insieme a un link all'allegato in Sharepoint.
Una volta inviato questo messaggio iniziale, l'utente target verrà rimosso dalla chat di gruppo creata. Questo rimuove la capacità del mittente di inviare ulteriori messaggi al target, ma rimuove anche la schermata "Questa persona proviene da un'organizzazione esterna" e rende il successo molto più probabile. Questo bypass attuale è stato pubblicato da @pfiatde in uno dei suoi numerosi blog su Teams e comportamenti indesiderati e integrato in TeamsPhisher da Steve Nelson (@stevesec128) e Alex Martirosyan (@almartiros) di DenSecure.
Esegui TeamsPhisher per davvero. Invia messaggi di phishing ai target.
Comando:

Targets.txt:

Message.txt:

Output di TeamsPhisher:

Vista del mittente:

Vista del target:

File allegato:

Esegui TeamsPhisher in modalità anteprima per verificare l'elenco dei target, visualizzare in anteprima i loro "nomi amichevoli" (se TeamsPhisher riesce a risolverli usando l'opzione --personalize) e inviare un messaggio di prova al tuo account mittente per verificare che tutto sia come desideri.
Output di TeamsPhisher:

Vista del mittente:

TeamsPhisher richiede che gli utenti abbiano un account Microsoft Business (non personale, ad esempio @hotmail, @outlook, ecc.) con una licenza valida per Teams e Sharepoint.
Ciò significa che avrai bisogno di un tenant AAD e almeno un utente con una licenza corrispondente. Al momento della pubblicazione, sono disponibili alcune licenze di prova gratuite nel centro licenze AAD che soddisfano i requisiti di questo strumento.
Dovrai accedere allo Sharepoint personale dell'utente con cui invierai i messaggi almeno una volta prima di utilizzare l'account con TeamsPhisher. Dovrebbe essere qualcosa come tenantname-my.sharepoint.com/personal/myusername_mytenantname_onmicrosoft_com o tenantname-my.sharepoint.com/personal/myusername_mytenantname_mycustomdomain_tld.
Per quanto riguarda i requisiti locali, consiglio di aggiornare all'ultima versione di Python3. Avrai anche bisogno della libreria di autenticazione Microsoft:``` pip3 install msal
# Utilizzo```
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
Il nome utente dell'account Microsoft da cui invierai i messaggi (es. [email protected])
La password per l'account menzionato. Se contiene caratteri speciali, può essere utile racchiudere l'intera stringa tra virgolette singole.
Il file che desideri inviare agli utenti target. Questo verrà caricato su SharePoint dell'account mittente e un link sarà condiviso tramite Teams.
Un file contenente il testo del messaggio che dovrebbe accompagnare l'allegato e essere inviato ai target
O un singolo indirizzo email target (es. [email protected]) o un file contenente una lista di email target, una per riga.
Specifica manualmente il nome del sito SharePoint su cui caricare l'allegato. Ciò sarà probabilmente necessario se il tenant del mittente utilizza un nome di dominio personalizzato (es. non segue la convenzione xxx.onmicrosoft.com). Specifica solo il nome univoco, ad esempio se il tuo sito SharePoint è mytest.sharepoint.com dovresti usare --sharepoint mytest
Sostituisci il saluto predefinito di TeamsPhisher ("Hi, ") con uno personalizzato da prependere al messaggio specificato tramite --message. Ad esempio, "Buon pomeriggio, " o "Team vendite, "
Di default, il link di SharePoint inviato ai target può essere visualizzato da chiunque abbia il link; usa --securelink in modo che il file su SharePoint sia visibile solo al target che lo ha ricevuto. Può aiutare a proteggere il tuo malware dal Blue team.
TeamsPhisher tenterà di identificare il nome di battesimo di ogni utente target e di usarlo con il saluto. Ad esempio, [email protected] riceverebbe un messaggio che inizia con "Ciao Tom, ". Questo non è perfetto e dipende dal formato delle email target; usa --preview per vedere se è adatto alla tua lista target o meno.
TeamsPhisher eseguirà in modalità anteprima. Questo NON invierà alcun messaggio agli utenti target, ma mostrerà invece il nome "amichevole" che verrebbe utilizzato dall'opzione --personalize. Inoltre, verrà inviato un messaggio di prova rappresentativo di ciò che i target riceverebbero con le impostazioni correnti su Teams del mittente; accedi e guarda come appare il tuo messaggio e modificalo se necessario.
Specifica un ritardo di x secondi tra i messaggi ai target. Può aiutare con potenziali problemi di limitazione delle richieste.
Disabilita il saluto predefinito utilizzato da TeamsPhisher. Disabilita anche la funzione --personalize. Usa questa opzione se includi il tuo saluto all'interno del messaggio specificato da --message.
Scrive l'output di TeamsPhisher in un file di log (scriverà nella home directory dell'utente).
python3 teamsphisher.py -u [email protected] -p 'xxxxxxxxxxxx' -l /root/targets.txt -a /root/attachment.zip -m /root/message.txt --log
Questo comando recupererà i token di accesso per l'account testuser e caricherà l'allegato '/root/attachment.zip' nello Sharepoint di testuser.
Creerà quindi un thread Teams unico per ogni destinatario elencato in '/root/targets.txt' e invierà loro il messaggio specificato in '/root/message.txt' e un link all'allegato su Sharepoint.
Tutto l'output del terminale di TeamsPhisher verrà registrato in un file che verrà generato nella home directory dell'utente.```
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
Questo comando recupererà i token di accesso per l'account testuser e caricherà l'allegato '/root/attachment.zip' nello Sharepoint di testuser.
Creerà quindi un thread Teams unico con ogni target elencato in '/root/targets.txt' e invierà loro il messaggio specificato in '/root/message.txt' oltre a un link all'allegato nello Sharepoint.
Il messaggio sarà preceduto dal saluto "Good afternoon , ".
TeamsPhisher proverà a usare nomi "amichevoli" nel saluto. Ora il saluto sarà "Good afternoon , ".
Ogni link di SharePoint inviato è unico e valido solo per quel target specifico.
TeamsPhisher identificherà gli account che non possono ricevere messaggi da organizzazioni esterne, gli account che non esistono e gli account che hanno un piano di abbonamento non compatibile con questo vettore di attacco:

Grazie al codice del progetto TeamsEnum, TeamsPhisher supporta il login con account mittenti che utilizzano MFA:

Usando l'opzione --securelink, i target verranno invitati ad autenticarsi per visualizzare l'allegato in Sharepoint. Puoi decidere se questo aggiunge troppi passaggi extra, o se aggiunge 'legittimità' inviandoli attraverso la reale funzionalità di login Microsoft.


Modificando TeamsPhisher.py puoi alterare alcune variabili globali per l'uso nelle esecuzioni successive:```
Greeting = "Hi"
useragent = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko)"
## Personalizzazione e nomi "amichevoli"
Il flag `--personalize` tenta di risolvere un nome "amichevole" per ogni target; lo fa esaminando i dati restituiti dalla funzione `enumUser` e controllando prima il campo "displayName".
Se il campo displayName contiene uno spazio (ad es. "Tom Jones"), TeamsPhisher suddivide in base allo spazio e prende il primo pezzo come nome "amichevole".
Se non c'è uno spazio nel campo displayName (ad es. alcune organizzazioni potrebbero mettere l'UPN nel campo displayName come [email protected]), TeamsPhisher tenta di analizzare l'UPN stesso.
Con un esempio di UPN come [email protected], TeamsPhisher suddivide in base al carattere '@', e poi nel primo pezzo suddivide in base al carattere '.' e prende il primo pezzo. Questo produrrebbe un nome "amichevole" di "Tom" in questo caso.
Questo è tutto ciò che TeamsPhisher fa per identificare nomi "amichevoli". Target come "[email protected]" e "[email protected]" NON avranno nomi "amichevoli" identificati se i loro campi displayName non corrispondono alla convenzione di analisi sopra descritta.
# Mitigazione
Le organizzazioni possono mitigare il rischio posto da questa vulnerabilità gestendo le opzioni relative all'accesso esterno tramite il centro amministrativo di Microsoft Teams in Utenti -> Accesso esterno.

Microsoft offre flessibilità alle organizzazioni per scegliere le autorizzazioni migliori per le loro esigenze, inclusi un blocco universale e la whitelist di solo tenant esterni specifici per le comunicazioni.

# Changelog
## v1.2
Unisce una pull request dal team di DenSecure che include un bypass funzionante (al 7/2/24) della schermata splash per utenti esterni.
La modifica al flusso di lavoro di TeamsPhisher è fortunatamente molto piccola e facile da integrare. Dopo che la chat di gruppo è stata creata con un utente target e il messaggio inviato, viene effettuata una richiesta aggiuntiva per rimuovere l'utente target dalla chat di gruppo. Ciò fa sì che l'utente riceva il messaggio senza una schermata splash per utenti esterni.
Aggiornato il README con informazioni più aggiornate sulla tecnica attualmente utilizzata da TeamsPhisher.
## v1.1.2
Risolto un errore segnalato dagli utenti riguardante il caricamento dell'allegato su Sharepoint; ciò derivava dalle convenzioni di denominazione/rinominazione che si verificano quando gli utenti utilizzano un dominio personalizzato con i loro tenant.
Aggiunto un controllo di verifica per assicurarsi che se gli utenti utilizzano un dominio NON @domain.onmicrosoft.com, usino anche il parametro -s per specificare manualmente il loro sito sharepoint per evitare problemi.
Aggiornata la sezione di configurazione per includere l'accesso a Sharepoint almeno una volta prima di utilizzare TeamsPhisher, poiché un utente ha identificato che non aver effettuato l'accesso in precedenza con l'account avrebbe causato il fallimento di TeamsPhisher.
Aggiunto il parametro `&top=999` alla richiesta web `getSenderInfo` per aumentare il numero di utenti recuperati per pagina/diminuire il numero di richieste necessarie per trovare il nostro utente.
### Inversione della modifica relativa all'analisi dei '.' nei nomi utente durante l'assemblaggio dell'URI di Sharepoint
La v.1.1 ha modificato il modo in cui i nomi utente con il carattere '.' venivano analizzati ai fini della creazione degli URI di Sharepoint necessari. C'erano diversi problemi distinti in corso e io ho erroneamente identificato questo come la causa di uno di essi. Questa modifica è stata annullata. Il risultato è che un nome utente come [email protected] ora avrà un URI sharepoint assemblato come "tom_jones_mytest_onmicrosoft_com" anziché "tom.jones_mytest_onmicrosoft_com".
## v1.1.1
Correzioni minori
## v1.1
Sono stati fatti alcuni commit per risolvere vari piccoli problemi senza incrementare il numero di versione; scusa per la sciatteria.
La v1.1 porta alcune modifiche volte a risolvere problemi comuni che gli utenti incontravano.
### Argomento -s, --sharepoint
Questo argomento opzionale è stato aggiunto per consentire agli utenti di specificare manualmente il nome root del loro sharepoint. Un problema comune è sorto quando gli utenti avevano cambiato il nome di dominio del loro tenant in qualcosa di personalizzato; ad es. invece che il loro nome utente fosse [email protected], poteva essere [email protected]. La versione originale di TeamsPhisher assemblava l'indirizzo Sharepoint e i percorsi URI necessari analizzando il nome UPN del mittente dalle sue informazioni utente. Quando il dominio di un tenant viene cambiato in uno personalizzato, gli UPN degli utenti cambiano per riflettere questo. Tuttavia l'indirizzo sharepoint del tenant rimane sempre lo stesso/come era quando il tenant è stato creato originariamente.
Non sono riuscito a trovare un buon modo per risolvere l'indirizzo Sharepoint corrente per un tenant; può essere fatto facilmente con Graph API, ma implementare Graph in questo strumento richiederebbe molta più configurazione da parte degli utenti per utilizzare TeamsPhisher. Ho optato per fornire l'opzione di specificare manualmente il nome sharepoint come soluzione più semplice.
### Migliorata l'analisi dell'indirizzo Sharepoint e dell'URI richiesto quando NON si utilizza l'opzione manuale
È stata segnalata da un utente che NON utilizzava un dominio personalizzato con il suo tenant, che riceveva comunque l'errore 404 non trovato riguardante Sharepoint. Credo che questo avesse a che fare con il fatto che il suo nome utente contenesse un '.' ad es. [email protected]. La versione precedente di TeamsPhisher aveva una funzionalità più semplice di ricerca + sostituzione per l'UPN dell'utente al fine di assemblare gli URI Sharepoint necessari; la v1.1 ora prende di mira specificamente i caratteri '.' che devono essere sostituiti e lascia intatti altri '.' nel campo nome utente.
### Caratteri speciali (ad es. 'ö') all'interno del corpo del messaggio non causano più un errore del server
Questa è stata una correzione molto semplice che ha richiesto troppo tempo per essere rintracciata. Aggiunta codifica utf-8 alla richiesta POST di sendFile. Ora i caratteri speciali possono essere utilizzati nei messaggi.
### Pulizia minore del codice
Corretti alcuni commenti e riordinate alcune fasi in main per verificare ora la presenza dei file necessari prima di tentare l'autenticazione.
## v1.0 - Versione iniziale
# Crediti e ringraziamenti
1. Max Corbridge (@CorbridgeMax) e Tom Ellson (@tde_sec) di JUMPSEC per [questo articolo](https://labs.jumpsec.com/advisory-idor-in-microsoft-teams-allows-for-external-tenants-to-introduce-malware/). Un ringraziamento speciale a Max per essere stato molto reattivo e disponibile a parlare in privato della sua ricerca.
2. Andrea Santese (@Medu554) [per questa ricerca](https://posts.inthecyber.com/leveraging-microsoft-teams-for-initial-access-42beb07f12c4). Ancora un ringraziamento speciale per la sua reattività e disponibilità a discutere il suo lavoro in privato.
3. Bastian Kanbach (@_bka_) di SSE per [TeamsEnum](https://github.com/sse-secure-systems/TeamsEnum). Questo progetto è servito come punto di partenza per recuperare i Bearer token e autenticarsi tramite diversi metodi. Io avevo utilizzato Graph API per questi scopi, ma il suo progetto (e questo) utilizza gli endpoint normali, quindi è stato fantastico avere qualcuno che aveva già affrontato questo problema e aveva funzioni affidabili per realizzarlo.
4. @pfiatde che ha una [serie in più parti sul phishing in Teams](https://badoption.eu/blog/2024/01/12/teams5.html). I suoi blog sono stati consultati durante lo sviluppo originale di TeamsPhisher, e la versione attuale dello strumento utilizza un nuovo bypass della schermata splash da ricerche successive da lui pubblicate.
5. Steve Nelson (@stevesec128) e Alex Martirosyan (@almartiros) di DenSecure per il loro aggiornamento a Teamsphisher (7/2/24) che ha integrato il bypass della schermata splash ancora funzionante di @pfiatde.
6. [Questo sito per generare testo ASCII](https://patorjk.com/software/taag/#p=display&f=Graffiti&t=Type%20Something%20)
7. [Questo fantastico progetto per convertire immagini in arte ASCII](https://github.com/TheZoraiz/ascii-image-converter)