
Microsoft Teams ユーザーにフィッシングメッセージと添付ファイルを送信する
...
:-++++++=-.
.=+++++++++++-
.++++++++++++++= :------: :-:--.
:+++++++++++++++. .---------- #= .-+.
:+++++++++++++++. -----------: :#= :#.
:--------------------------=++++++++- .------------ .=+ ++
----------------------------+++++*+-. :+=-----===: -+-.+:
:---------------------------++++=-. .=+++++=-. .=+:.
:------=%%%%%%%%%%%%--------:... .:::.. -*=-:
:------=****#@@#****--------=++++++++++++++-----------. -#++-
:----------:+@@+:-----------+++++++++++++++=----------- -#++-
:-----------+@@*------------+++++++++++++++=-----------. -*+*-
:-----------+@@*------------+++++++++++++++=-----------. . -*++-
:-----------+@@*------------+++++++++++++++=-----------. -- -*++-
:-----------+@@*------------+++++++++++++++=-----------. . == -*++- .=
:-----------+@@+------------+++++++++++++++=-----------. .+ -= :+==- .*
:---------------------------+++++++++++++++=-----------. =* -= -+=+= .::
----------------------------+++++++++++++++=----------- ** -+ -+=++. .*=
.:-------------------------=+++++++++++++++=---------=: #+ := ++-:*= ==
-++++++++++++++++++++++++++=-------=+=: :#= .:. *=: -*- ==
.=+++++++++++++++++++++++++*+++++++=-. -#- ::++= :+=. .==
:++++++++++++++++++++++++=:.:::::. -*: .=+-. .=+-. -+:
.=+*+++++++++++++++++++- -+- .:-=. .-====----:-==:
.-+**+++++++++++**+-. .++: .-=-: .:-====-:.
:-=++******+=-: .=+===--.
..:::.. ...
_____ ______ _ _ _
|_ _| | ___ \| | (_) | |
| | ___ __ _ _ __ ___ ___ | |_/ /| |__ _ ___ | |__ ___ _ __
| | / _ \ / _` || '_ ` _ \ / __|| __/ | '_ \ | |/ __|| '_ \ / _ \| '__|
| || __/| (_| || | | | | |\__ \| | | | | || |\__ \| | | || __/| |
\_ \___| \__,_||_| |_| |_||___/\_| |_| |_||_||___/|_| |_| \___||_|
v1.2 developed by @Octoberfest73 (https://github.com/Octoberfest7)
TeamsPhisher は、組織が外部通信を許可している Microsoft Teams ユーザーに対して、フィッシングメッセージや添付ファイルを配信することを支援する Python3 プログラムです。
通常、組織外の Teams ユーザーにファイルを送信することはできません。JUMPSEC の Max Corbridge (@CorbridgeMax) と Tom Ellson (@tde_sec) は、最近この制限を回避する方法を公開しました。これは、Teams の Web リクエストを操作して、添付ファイル付きメッセージの受信者を変更する手法です。
TeamsPhisher は、Andrea Santese (@Medu554) が公開したいくつかの初期の手法に加えて、この技術を組み込んでいます。
また、攻撃フローの認証部分やいくつかの汎用ヘルパー関数については、SSE の Bastian Kanbach (@bka) による素晴らしい成果物である TeamsEnum に大きく依存しています。
TeamsPhisher は、これらのプロジェクトから最善の部分を取り入れ、認可された Red Team 運用が Microsoft Teams をフィッシングによるアクセスシナリオに活用するための、堅牢でカスタマイズ可能、かつ効率的な手段を提供することを目指しています。
緩和策の推奨事項については、この README の末尾を参照してください。
TeamsPhisher に添付ファイル、メッセージ、および対象 Teams ユーザーのリストを渡します。すると、添付ファイルを送信者の SharePoint にアップロードし、対象のリストを反復処理します。
TeamsPhisher はまず対象ユーザーを列挙し、そのユーザーが存在し、外部メッセージを受信できることを確認します。その後、対象ユーザーとの新しいスレッドを作成します。これは技術的には「グループ」チャットであることに注意してください。TeamsPhisher が対象のメールアドレスを 2 回含めるためです。これは @Medu554 による巧妙なトリックで、「組織外の誰かからメッセージが届きました。表示してもよろしいですか?」というスプラッシュスクリーンをバイパスできます。このスプラッシュスクリーンは対象ユーザーに一時停止を促す可能性があります。 (v1.2)注: このスプラッシュスクリーンバイパスは修正されましたが、対象ユーザーをグループチャットに追加することは、現在のスプラッシュスクリーンバイパスにも関連しています。
送信者と対象の間で新しいスレッドが作成されると、指定されたメッセージが、SharePoint 内の添付ファイルへのリンクとともにユーザーに送信されます。
この最初のメッセージが送信されると、対象ユーザーは作成されたグループチャットから削除されます。これにより、送信者はそれ以上対象にメッセージを送信できなくなりますが、「この人物は組織外のユーザーです」というスプラッシュスクリーンも除去され、成功率が大幅に向上します。この現在のバイパスは、@pfiatde が Teams と意図しない動作に関する多くのブログのうちの1つ で公開し、DensSecure の Steve Nelson (@stevesec128) と Alex Martirosyan (@almartiros) によって TeamsPhisher に統合されました。
TeamsPhisher を実際に実行します。対象にフィッシングメッセージを送信します。
コマンド:

Targets.txt:

Message.txt:

TeamsPhisher の出力:

送信者のビュー:

対象のビュー:

添付ファイル:

TeamsPhisher をプレビューモードで実行して、対象のリストを確認し、それらの「フレンドリ名」をプレビューし(TeamsPhisher が --personalize スイッチを使用して解決できる場合)、自分の送信者アカウントにテストメッセージを送信して、すべてが意図した通りになっているかを確認します。
TeamsPhisher の出力:

送信者のビュー:

TeamsPhisher を使用するには、ユーザーが有効な Teams および SharePoint ライセンスを持つ Microsoft Business アカウント(@hotmail、@outlook などの個人用アカウントではなく)を持っている必要があります。
つまり、AAD テナントとそれに対応するライセンスを持つ少なくとも 1 人のユーザーが必要です。公開時点では、AAD ライセンスセンターで、このツールの要件を満たす無料試用版ライセンスがいくつか利用可能です。
TeamsPhisher でアカウントを使用する前に、メッセージの送信に使用するユーザーの個人用 SharePoint に少なくとも一度ログインする必要があります。これは、tenantname-my.sharepoint.com/personal/myusername_mytenantname_onmicrosoft_com や tenantname-my.sharepoint.com/personal/myusername_mytenantname_mycustomdomain_tld のような URL になります。
ローカルの要件としては、Python3 の最新バージョンに更新することをお勧めします。また、Microsoft の認証ライブラリが必要です。``` pip3 install msal
# 使い方```
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
メッセージの送信元となるMicrosoftアカウントのユーザー名(例:[email protected])
上記アカウントのパスワード。特殊文字が含まれている場合は、全体をシングルクォーテーションで囲むと便利です。
対象ユーザーに送信したいファイル。送信アカウントのSharePointにアップロードされ、Teams経由でリンクが共有されます。
添付ファイルに添えて対象者に送信するテキストメッセージが記述されたファイル。
単一の対象メールアドレス(例:[email protected])、または対象メールアドレスが1行に1つずつ記述されたファイル。
添付ファイルをアップロードするSharePointサイト名を手動で指定します。送信者のテナントがカスタムドメイン名を使用している場合(例:xxx.onmicrosoft.comの形式ではない場合)は、この指定が必要になる可能性があります。 一意の名前のみを指定してください。たとえば、SharePointサイトが mytest.sharepoint.com の場合は --sharepoint mytest と指定します。
TeamPhisherのデフォルトの挨拶("Hi, ")を上書きし、--message で指定されたメッセージの前に付加するカスタム挨拶を設定します。例:"Good afternoon, " や "Sales team, "。
デフォルトでは、対象者に送信されるSharePointリンクはリンクを知っている誰でも閲覧できます。--securelink を使用すると、SharePointファイルはリンクを受け取った対象者のみが閲覧可能になります。マルウェアをブルーチームから保護するのに役立つ可能性があります。
TeamsPhisherは各対象ユーザーの名(ファーストネーム)を特定し、挨拶文に使用しようと試みます。例えば、[email protected] には "Hi Tom, " で始まるメッセージが届きます。これは完璧ではなく、対象メールアドレスの形式に依存します。対象リストに適しているかどうかを確認するには --preview を使用してください。
TeamsPhisherはプレビューモードで動作します。このモードでは対象ユーザーにメッセージは送信されませんが、--personalize スイッチで使用される「表示名」が表示されます。さらに、現在の設定で対象者が受け取るであろうテストメッセージが送信者のTeamsに送信されます。ログインしてメッセージの見え方を確認し、必要に応じて修正してください。
対象ユーザーへのメッセージ送信間に x 秒の遅延を指定します。レート制限の問題を軽減するのに役立つ可能性があります。
TeamsPhisherの組み込みの挨拶を無効にします。また、--personalize 機能も無効になります。--message で指定したメッセージ内に挨拶を含める場合にこのオプションを使用します。
TeamsPhisherの出力をログファイルに書き込みます(ユーザーのホームディレクトリに書き込まれます)。
python3 teamsphisher.py -u [email protected] -p 'xxxxxxxxxxxx' -l /root/targets.txt -a /root/attachment.zip -m /root/message.txt --log
このコマンドは testuser アカウントのアクセストークンを取得し、添付ファイル '/root/attachment.zip' を testuser の Sharepoint にアップロードします。
次に、'/root/targets.txt' にリストされた各ターゲットに対して個別の Teams スレッドを作成し、'/root/message.txt' で指定されたメッセージと、Sharepoint 内の添付ファイルへのリンクを送信します。
TeamsPhisher からのすべての端末出力は、ユーザーのホームディレクトリに出力されるファイルに記録されます。```
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
このコマンドは、testuserアカウントのアクセストークンを取得し、添付ファイル「/root/attachment.zip」をtestuserのSharepointにアップロードします。
その後、「/root/targets.txt」にリストされた各ターゲットに対して一意のTeamsスレッドを作成し、「/root/message.txt」で指定されたメッセージと、Sharepoint内の添付ファイルへのリンクを送信します。
メッセージの先頭には「Good afternoon ,」という挨拶が付加されます。
TeamsPhisherは挨拶に「フレンドリー」な名前を使用しようとします。これで挨拶は「Good afternoon ,」となります。
送信される各SharePointリンクは一意であり、特定のターゲットに対してのみ有効です。
TeamsPhisherは、外部組織からのメッセージ送信が許可されていないアカウント、存在しないアカウント、およびこの攻撃ベクトルに対応していないサブスクリプションプランを持つアカウントを識別します。

TeamsEnumプロジェクトのコードにより、TeamsPhisherはMFAを使用する送信者アカウントでのログインをサポートしています。

--securelink スイッチを使用すると、ターゲットはSharepointで添付ファイルを表示するために認証を求められます。これにより手順が増えすぎるか、実際のMicrosoftログイン機能を経由することで「正当性」が高まるか、判断できます。


TeamsPhisher.py を編集することで、以降の実行で使用するいくつかのグローバル変数を変更できます。```
Greeting = "Hi"
useragent = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko)"
## パーソナライゼーションと「フレンドリー」な名前
`--personalize` フラグは、各ターゲットの「フレンドリー」な名前を解決しようとします。これは、enumUser 関数から返されるデータを調べ、最初に `displayName` フィールドを確認することで行われます。
`displayName` フィールドにスペースが含まれている場合(例:「Tom Jones」)、TeamsPhisher はスペースで分割し、最初のチャンクを「フレンドリー」な名前として取得します。
`displayName` フィールドにスペースがない場合(例:一部の組織では、`displayName` フィールドに UPN を設定している場合があります。例:[email protected])、TeamsPhisher は UPN 自体を解析しようとします。
[email protected] のような UPN の例では、TeamsPhisher は '@' 文字で分割し、最初のチャンクを '.' 文字で分割して最初のチャンクを取得します。この場合、「Tom」という「フレンドリー」な名前が得られます。
これが TeamsPhisher が「フレンドリー」な名前を識別しようとする範囲です。「[email protected]」や「[email protected]」のようなターゲットは、`displayName` フィールドが上記の解析規則に一致しない場合、「フレンドリー」な名前が識別されません。
# 緩和策
組織は、Microsoft Teams 管理センターの [ユーザー] -> [外部アクセス] で外部アクセスに関連するオプションを管理することで、この脆弱性によってもたらされるリスクを軽減できます。

Microsoft は、組織がニーズに最適なアクセス許可を選択できる柔軟性を提供しており、包括的なブロックや、通信のための特定の外部テナントのみのホワイトリスト登録も含まれます。

# 変更履歴
## v1.2
DenSecure チームからのプルリクエストをマージしました。これには、(2024年2月7日時点で)動作する外部ユーザースプラッシュ画面バイパスが含まれています。
TeamsPhisher のワークフローへの変更は、幸いにも非常に小さく、統合が容易です。ターゲットユーザーとのグループチャットが作成されメッセージが送信された後、ターゲットユーザーをグループチャットから削除する追加のリクエストが行われます。これにより、ユーザーは外部ユーザースプラッシュ画面なしでメッセージを受信します。
TeamsPhisher で現在使用されている手法に関する最新情報で README を更新しました。
## v1.1.2
添付ファイルを Sharepoint にアップロードする際にユーザーが報告していたエラーを修正しました。これは、ユーザーがテナントでカスタムドメインを使用する際に発生する名前付け/名前変更の規則に起因していました。
検証チェックを追加し、ユーザーが @domain.onmicrosoft.com 以外のドメインを使用する場合は、問題を回避するために手動で Sharepoint サイトを指定するように -s スイッチを使用することを確認しました。
セットアップセクションを更新し、TeamsPhisher を使用する前に少なくとも一度は Sharepoint にログインすることを含めました。あるユーザーが、アカウントで事前にログインしていないと TeamsPhisher が失敗することを特定したためです。
getSenderInfo Web リクエストに &top=999 パラメータを追加し、1ページあたりに取得するユーザー数を増やし、ユーザーを見つけるために必要なリクエスト数を減らしました。
### Sharepoint URI 組み立て時のユーザー名内の '.' 解析に関する変更の差し戻し
v1.1 では、必要な Sharepoint URI を作成する目的で、ユーザー名に '.' 文字が含まれる場合の解析方法が変更されました。いくつかの異なる問題が発生しており、私は誤ってこれを原因の一つと特定しました。この変更は差し戻されました。その結果、[email protected] のようなユーザー名は、Sharepoint URI が "tom_jones_mytest_onmicrosoft_com" として組み立てられるようになり、"tom.jones_mytest_onmicrosoft_com" ではなくなりました。
## v1.1.1
軽微な修正
## v1.1
バージョン番号を上げずにさまざまな小さな問題に対処するためにいくつかのコミットが行われました。ずさんで申し訳ありません。
v1.1 では、ユーザーが直面していた一般的な問題のいくつかに対処するためのいくつかの変更が導入されています。
### -s, --sharepoint 引数
このオプション引数は、ユーザーが手動で Sharepoint ルート名を指定できるように追加されました。ユーザーがテナントのドメイン名をカスタムのものに変更した場合に、一般的な問題が発生しました。たとえば、ユーザー名が [email protected] ではなく、[email protected] になる場合です。TeamsPhisher の最初のリリースでは、送信者のユーザープリンシパル名をユーザー情報から解析して Sharepoint アドレスと必要な URI パスを組み立てていました。テナントのドメインがカスタムのものに変更されると、ユーザーの UPN もそれに応じて変更されます。ただし、テナントの Sharepoint アドレスは常に同じまま(テナントが最初に作成された時のまま)です。
テナントの現在の Sharepoint アドレスを解決する良い方法が見つかりませんでした。Graph API を使用すれば簡単にできますが、このツールに Graph を実装するには、ユーザーが TeamsPhisher を使用するために多くの追加設定が必要になります。最も簡単な修正として、手動で Sharepoint 名を指定するオプションを提供することにしました。
### 手動オプションを使用しない場合の Sharepoint アドレスと必要な URI の解析の改善
カスタムドメインを使用していないにもかかわらず、Sharepoint に関して 404 エラーが発生していたユーザーからの報告がありました。これは、ユーザー名に '.' が含まれていたためだと考えられます(例:[email protected])。以前のバージョンの TeamsPhisher では、必要な Sharepoint URI を組み立てるために、ユーザーの UPN に対する単純な検索と置換機能がありました。v1.1 では、置換が必要な '.' 文字を具体的にターゲットにし、ユーザー名フィールド内の他の '.' はそのまま残します。
### メッセージ本文内の特殊文字(例:「ö」)がサーバーエラーを引き起こさなくなりました
これは非常に簡単な修正でしたが、追跡に時間がかかりすぎました。sendFile POST リクエストに utf-8 エンコーディングを追加しました。これにより、メッセージ内で特殊文字を使用できるようになりました。
### 軽微なコードクリーンアップ
いくつかのコメントを修正し、main 内のいくつかのステップを並べ替えて、認証を試みる前に必要なファイルをチェックするようにしました。
## v1.0 - 初回リリース
# 謝辞と謝意
1. JUMPSEC の Max Corbridge (@CorbridgeMax) と Tom Ellson (@tde_sec) による[この記事](https://labs.jumpsec.com/advisory-idor-in-microsoft-teams-allows-for-external-tenants-to-introduce-malware/)。Max には、非常に迅速に対応し、彼の研究について個人的に話し合う意欲を示してくれたことに特に感謝します。
2. Andrea Santese (@Medu554) による[この研究](https://posts.inthecyber.com/leveraging-microsoft-teams-for-initial-access-42beb07f12c4)。繰り返しになりますが、彼の迅速な対応と、仕事について個人的に議論する意欲に特に感謝します。
3. SSE の Bastian Kanbach (@_bka_) による [TeamsEnum](https://github.com/sse-secure-systems/TeamsEnum)。このプロジェクトは、Bearer トークンを取得し、さまざまな方法で認証するための出発点として役立ちました。私はこれらの目的で Graph API を使用していましたが、彼のプロジェクト(およびこのプロジェクト)は通常のエンドポイントを使用しているため、すでにこの問題に取り組み、それを達成するための信頼性の高い関数を持っている人がいて素晴らしかったです。
4. @pfiatde。彼は[Teams フィッシングに関する多部構成のシリーズ](https://badoption.eu/blog/2024/01/12/teams5.html)を執筆しています。彼のブログは TeamsPhisher の初期開発中に参照され、現在のバージョンのツールは、彼が後日公開した新しいスプラッシュ画面バイパスを使用しています。
5. DenSecure の Steve Nelson (@stevesec128) と Alex Martirosyan (@almartiros)。彼らは、@pfiatde のまだ動作するスプラッシュ画面バイパスを統合した TeamsPhisher のアップデート(2024年2月7日)を提供しました。
6. [ASCII テキスト生成サイト](https://patorjk.com/software/taag/#p=display&f=Graffiti&t=Type%20Something%20)
7. [画像を ASCII アートに変換するこのクレイジーなプロジェクト](https://github.com/TheZoraiz/ascii-image-converter)