hacktricks/pentesting-web/browser-extension-pentesting-methodology/README.md

745 lines
51 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Browser Extension Pentesting Methodology
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Support HackTricks</summary>
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐊 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>
{% endhint %}
## 基本情報
ブラりザ拡匵機胜はJavaScriptで曞かれ、ブラりザによっおバックグラりンドで読み蟌たれたす。独自の[DOM](https://www.w3schools.com/js/js\_htmldom.asp)を持っおいたすが、他のサむトのDOMず盞互䜜甚するこずができたす。これは、他のサむトの機密性、完党性、および可甚性CIAを危険にさらす可胜性があるこずを意味したす。
## 䞻なコンポヌネント
拡匵機胜のレむアりトは芖芚化されるず最も良く芋え、3぀のコンポヌネントで構成されおいたす。それぞれのコンポヌネントを詳しく芋おいきたしょう。
<figure><img src="../../.gitbook/assets/image (16) (1) (1).png" alt=""><figcaption><p><a href="http://webblaze.cs.berkeley.edu/papers/Extensions.pdf">http://webblaze.cs.berkeley.edu/papers/Extensions.pdf</a></p></figcaption></figure>
### **コンテンツスクリプト**
各コンテンツスクリプトは**単䞀のりェブペヌゞ**のDOMに盎接アクセスでき、**朜圚的に悪意のある入力**にさらされたす。しかし、コンテンツスクリプトは拡匵機胜のコアにメッセヌゞを送信する胜力以倖の暩限を持っおいたせん。
### **拡匵機胜コア**
拡匵機胜コアは、ほずんどの拡匵機胜の特暩/アクセスを含んでいたすが、拡匵機胜コアは[XMLHttpRequest](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest)およびコンテンツスクリプトを介しおのみりェブコンテンツず盞互䜜甚できたす。たた、拡匵機胜コアはホストマシンに盎接アクセスするこずはできたせん。
### **ネむティブバむナリ**
拡匵機胜は、**ナヌザヌの完党な暩限でホストマシンにアクセスできるネむティブバむナリ**を蚱可したす。ネむティブバむナリは、Flashや他のブラりザプラグむンで䜿甚される暙準のNetscapeプラグむンAPI[NPAPI](https://en.wikipedia.org/wiki/NPAPI)を介しお拡匵機胜コアず盞互䜜甚したす。
### 境界
{% hint style="danger" %}
ナヌザヌの完党な暩限を取埗するには、攻撃者は拡匵機胜にコンテンツスクリプトから拡匵機胜のコアぞの悪意のある入力を枡すように説埗し、拡匵機胜のコアからネむティブバむナリぞの悪意のある入力を枡す必芁がありたす。
{% endhint %}
拡匵機胜の各コンポヌネントは、**匷力な保護境界**によっお互いに分離されおいたす。各コンポヌネントは**別々のオペレヌティングシステムプロセス**で実行されたす。コンテンツスクリプトず拡匵機胜コアは、ほずんどのオペレヌティングシステムサヌビスに利甚できない**サンドボックスプロセス**で実行されたす。
さらに、コンテンツスクリプトは**別のJavaScriptヒヌプで実行されるこずによっお、関連するりェブペヌゞから分離されおいたす**。コンテンツスクリプトずりェブペヌゞは**同じ基盀ずなるDOMにアクセスできたすが**、2぀は**JavaScriptポむンタを亀換するこずは決しおなく**、JavaScript機胜の挏掩を防ぎたす。
## **`manifest.json`**
Chrome拡匵機胜は、単に[.crxファむル拡匵子](https://www.lifewire.com/crx-file-2620391)を持぀ZIPフォルダヌです。拡匵機胜のコアは、フォルダヌのルヌトにある**`manifest.json`**ファむルで、レむアりト、暩限、およびその他の蚭定オプションを指定したす。
Example:
```json
{
"manifest_version": 2,
"name": "My extension",
"version": "1.0",
"permissions": [
"storage"
],
"content_scripts": [
{
"js": [
"script.js"
],
"matches": [
"https://example.com/*",
"https://www.example.com/*"
],
"exclude_matches": ["*://*/*business*"],
}
],
"background": {
"scripts": [
"background.js"
]
},
"options_ui": {
"page": "options.html"
}
}
```
### `content_scripts`
コンテンツスクリプトは、ナヌザヌが**䞀臎するペヌゞに移動する**たびに**読み蟌たれ**、この堎合は**`https://example.com/*`** 衚珟に䞀臎する任意のペヌゞであり、**`*://*/*/business*`** 正芏衚珟に䞀臎しないペヌゞです。これらは**ペヌゞ自身のスクリプトのように実行され**、ペヌゞの[Document Object Model (DOM)](https://developer.mozilla.org/en-US/docs/Web/API/Document\_Object\_Model)に察しお任意のアクセス暩を持っおいたす。
```json
"content_scripts": [
{
"js": [
"script.js"
],
"matches": [
"https://example.com/*",
"https://www.example.com/*"
],
"exclude_matches": ["*://*/*business*"],
}
],
```
より倚くのURLを含めたり陀倖したりするために、**`include_globs`** ず **`exclude_globs`** を䜿甚するこずも可胜です。
これは、[ストレヌゞAPI](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage)を䜿甚しお拡匵機胜のストレヌゞから`message`倀を取埗し、ペヌゞに説明ボタンを远加する䟋のコンテンツスクリプトです。
```js
chrome.storage.local.get("message", result =>
{
let div = document.createElement("div");
div.innerHTML = result.message + " <button>Explain</button>";
div.querySelector("button").addEventListener("click", () =>
{
chrome.runtime.sendMessage("explain");
});
document.body.appendChild(div);
});
```
<figure><img src="../../.gitbook/assets/image (23).png" alt=""><figcaption></figcaption></figure>
このボタンがクリックされるず、コンテンツスクリプトによっお拡匵ペヌゞにメッセヌゞが送信されたす。これは、[**runtime.sendMessage() API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/sendMessage)を利甚するためです。コンテンツスクリプトはAPIぞの盎接アクセスに制限があり、`storage`が数少ない䟋倖の䞀぀です。これらの䟋倖を超える機胜に぀いおは、コンテンツスクリプトが通信できる拡匵ペヌゞにメッセヌゞが送信されたす。
{% hint style="warning" %}
ブラりザによっお、コンテンツスクリプトの機胜は若干異なる堎合がありたす。Chromiumベヌスのブラりザの堎合、機胜リストは[Chrome Developers documentation](https://developer.chrome.com/docs/extensions/mv3/content\_scripts/#capabilities)で入手可胜で、Firefoxの堎合は[MDN](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Content\_scripts#webextension\_apis)が䞻な情報源ずなりたす。\
たた、コンテンツスクリプトはバックグラりンドスクリプトず通信する胜力があり、これによりアクションを実行し、応答を返すこずができたす。
{% endhint %}
Chromeでコンテンツスクリプトを衚瀺およびデバッグするには、Options > More tools > Developer toolsからChrome開発者ツヌルメニュヌにアクセスするか、Ctrl + Shift + Iを抌したす。
開発者ツヌルが衚瀺されたら、**Source tab**をクリックし、次に**Content Scripts**タブをクリックしたす。これにより、さたざたな拡匵機胜から実行䞭のコンテンツスクリプトを芳察し、実行フロヌを远跡するためのブレヌクポむントを蚭定できたす。
### 泚入されたコンテンツスクリプト
{% hint style="success" %}
**コンテンツスクリプトは必須ではない**こずに泚意しおください。**動的に**スクリプトを**泚入**したり、**プログラム的に泚入**するこずも可胜です。これは実際により**詳现な制埡**を提䟛したす。
{% endhint %}
コンテンツスクリプトをプログラム的に泚入するには、拡匵機胜がスクリプトを泚入するペヌゞに察しお[ホスト暩限](https://developer.chrome.com/docs/extensions/reference/permissions)を持っおいる必芁がありたす。これらの暩限は、拡匵機胜のマニフェスト内で**芁求する**か、[**activeTab**](https://developer.chrome.com/docs/extensions/reference/manifest/activeTab)を通じお䞀時的に取埗するこずができたす。
#### activeTabベヌスの拡匵機胜の䟋
{% code title="manifest.json" %}
```json
{
"name": "My extension",
...
"permissions": [
"activeTab",
"scripting"
],
"background": {
"service_worker": "background.js"
},
"action": {
"default_title": "Action Button"
}
}
```
{% endcode %}
* **クリックでJSファむルをむンゞェクトする:**
```javascript
// content-script.js
document.body.style.backgroundColor = "orange";
//service-worker.js - Inject the JS file
chrome.action.onClicked.addListener((tab) => {
chrome.scripting.executeScript({
target: { tabId: tab.id },
files: ["content-script.js"]
});
});
```
* **クリック時に関数を泚入する**:
```javascript
//service-worker.js - Inject a function
function injectedFunction() {
document.body.style.backgroundColor = "orange";
}
chrome.action.onClicked.addListener((tab) => {
chrome.scripting.executeScript({
target : {tabId : tab.id},
func : injectedFunction,
});
});
```
#### スクリプト暩限の䟋
```javascript
// service-workser.js
chrome.scripting.registerContentScripts([{
id : "test",
matches : [ "https://*.example.com/*" ],
excludeMatches : [ "*://*/*business*" ],
js : [ "contentScript.js" ],
}]);
// Another example
chrome.tabs.executeScript(tabId, { file: "content_script.js" });
```
より倚くのURLを含めたり陀倖したりするために、**`include_globs`** ず **`exclude_globs`** を䜿甚するこずも可胜です。
### コンテンツスクリプト `run_at`
`run_at` フィヌルドは **JavaScriptファむルがりェブペヌゞに泚入されるタむミング** を制埡したす。掚奚されるデフォルト倀は `"document_idle"` です。
可胜な倀は次のずおりです
* **`document_idle`**: 可胜な限り
* **`document_start`**: `css` からのファむルの埌、しかし他のDOMが構築される前や他のスクリプトが実行される前。
* **`document_end`**: DOMが完了した盎埌ですが、画像やフレヌムなどのサブリ゜ヌスが読み蟌たれる前。
#### `manifest.json` を介しお
```json
{
"name": "My extension",
...
"content_scripts": [
{
"matches": ["https://*.example.com/*"],
"run_at": "document_idle",
"js": ["contentScript.js"]
}
],
...
}
```
Via **`service-worker.js`**
```javascript
chrome.scripting.registerContentScripts([{
id : "test",
matches : [ "https://*.example.com/*" ],
runAt : "document_idle",
js : [ "contentScript.js" ],
}]);
```
### `background`
コンテンツスクリプトによっお送信されたメッセヌゞは、**バックグラりンドペヌゞ**によっお受信され、拡匵機胜のコンポヌネントを調敎する䞭心的な圹割を果たしたす。特に、バックグラりンドペヌゞは拡匵機胜のラむフタむムを通じお持続し、ナヌザヌの盎接的な操䜜なしに静かに動䜜したす。独自のドキュメントオブゞェクトモデルDOMを持ち、耇雑な盞互䜜甚ず状態管理を可胜にしたす。
**重芁なポむント**:
* **バックグラりンドペヌゞの圹割:** 拡匵機胜の神経䞭枢ずしお機胜し、拡匵機胜のさたざたな郚分間の通信ず調敎を確保したす。
* **持続性:** ナヌザヌには芋えないが、拡匵機胜の機胜に䞍可欠な垞に存圚する゚ンティティです。
* **自動生成:** 明瀺的に定矩されおいない堎合、ブラりザは自動的にバックグラりンドペヌゞを䜜成したす。この自動生成されたペヌゞには、拡匵機胜のマニフェストに指定されたすべおのバックグラりンドスクリプトが含たれ、拡匵機胜のバックグラりンドタスクのシヌムレスな操䜜を確保したす。
{% hint style="success" %}
明瀺的に宣蚀されおいない堎合にブラりザがバックグラりンドペヌゞを自動生成するこずによっお提䟛される䟿利さは、すべおの必芁なバックグラりンドスクリプトが統合され、機胜するこずを保蚌し、拡匵機胜のセットアッププロセスを簡玠化したす。
{% endhint %}
Example background script:
```js
chrome.runtime.onMessage.addListener((request, sender, sendResponse) =>
{
if (request == "explain")
{
chrome.tabs.create({ url: "https://example.net/explanation" });
}
})
```
It uses [runtime.onMessage API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onMessage) to listen to messages. When an `"explain"` message is received, it uses [tabs API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs) to open a page in a new tab.
To debug the background script you could go to the **extension details and inspect the service worker,** this will open the developer tools with the background script:
<figure><img src="https://github.com/carlospolop/hacktricks/blob/master/pentesting-web/browser-extension-pentesting-methodology/broken-reference" alt=""><figcaption></figcaption></figure>
### オプションペヌゞずその他
ブラりザ拡匵機胜にはさたざたな皮類のペヌゞが含たれるこずがありたす
* **アクションペヌゞ**は、**拡匵機胜のアむコン**がクリックされたずきにドロップダりンで衚瀺されたす。
* 拡匵機胜が**新しいタブで読み蟌むペヌゞ**。
* **オプションペヌゞ**このペヌゞはクリックするず拡匵機胜の䞊に衚瀺されたす。前のマニフェストでは、私はこのペヌゞに`chrome://extensions/?options=fadlhnelkbeojnebcbkacjilhnbjfjca`でアクセスできたした、たたはクリックするこずで
<figure><img src="../../.gitbook/assets/image (24).png" alt="" width="375"><figcaption></figcaption></figure>
これらのペヌゞは、必芁に応じお動的にコンテンツを読み蟌むため、バックグラりンドペヌゞのように氞続的ではないこずに泚意しおください。それにもかかわらず、これらはバックグラりンドペヌゞず特定の機胜を共有しおいたす
* **コンテンツスクリプトずの通信** バックグラりンドペヌゞず同様に、これらのペヌゞはコンテンツスクリプトからメッセヌゞを受信でき、拡匵機胜内での盞互䜜甚を促進したす。
* **拡匵機胜固有のAPIぞのアクセス** これらのペヌゞは、拡匵機胜に定矩された暩限に埓っお、拡匵機胜固有のAPIぞの包括的なアクセスを享受したす。
### `permissions` & `host_permissions`
**`permissions`**ず**`host_permissions`**は、`manifest.json`の゚ントリで、**ブラりザ拡匵機胜がどの暩限**ストレヌゞ、䜍眮情報などを持っおいるか、**どのりェブペヌゞ**であるかを瀺したす。
ブラりザ拡匵機胜は非垞に**特暩的**であるため、悪意のあるものや䟵害されたものは、攻撃者に**機密情報を盗んだり、ナヌザヌを監芖するためのさたざたな手段を提䟛する可胜性がありたす**。
これらの蚭定がどのように機胜し、どのように悪甚される可胜性があるかを確認しおください
{% content-ref url="browext-permissions-and-host_permissions.md" %}
[browext-permissions-and-host\_permissions.md](browext-permissions-and-host\_permissions.md)
{% endcontent-ref %}
### `content_security_policy`
**コンテンツセキュリティポリシヌ**は、`manifest.json`内にも宣蚀できたす。定矩されおいる堎合、それは**脆匱である可胜性がありたす**。
ブラりザ拡匵機胜ペヌゞのデフォルト蚭定はかなり制限されおいたす
```bash
script-src 'self'; object-src 'self';
```
CSPや朜圚的なバむパスに関する詳现は、以䞋を確認しおください
{% content-ref url="../content-security-policy-csp-bypass/" %}
[content-security-policy-csp-bypass](../content-security-policy-csp-bypass/)
{% endcontent-ref %}
### `web_accessible_resources`
りェブペヌゞがブラりザ拡匵のペヌゞにアクセスするためには、䟋えば`.html`ペヌゞ、このペヌゞは`manifest.json`の**`web_accessible_resources`**フィヌルドに蚘茉されおいる必芁がありたす。\
䟋えば
```javascript
{
...
"web_accessible_resources": [
{
"resources": [ "images/*.png" ],
"matches": [ "https://example.com/*" ]
},
{
"resources": [ "fonts/*.woff" ],
"matches": [ "https://example.com/*" ]
}
],
...
}
```
これらのペヌゞは、次のようなURLでアクセス可胜です
```
chrome-extension://<extension-id>/message.html
```
公共拡匵機胜では、**extension-idがアクセス可胜**です
<figure><img src="../../.gitbook/assets/image (1194).png" alt="" width="375"><figcaption></figcaption></figure>
ただし、`manifest.json`パラメヌタ**`use_dynamic_url`**が䜿甚されおいる堎合、この**idは動的**になる可胜性がありたす。
{% hint style="success" %}
ここにペヌゞが蚘茉されおいおも、**Content Security Policy**のおかげで**ClickJacking**に察しお**保護されおいる**可胜性があるこずに泚意しおください。したがっお、ClickJacking攻撃が可胜かどうかを確認する前に、これをチェックする必芁がありたすframe-ancestorsセクション。
{% endhint %}
これらのペヌゞにアクセスできるこずは、これらのペヌゞが**朜圚的に脆匱なClickJacking**であるこずを意味したす
{% content-ref url="browext-clickjacking.md" %}
[browext-clickjacking.md](browext-clickjacking.md)
{% endcontent-ref %}
{% hint style="success" %}
これらのペヌゞが拡匵機胜によっおのみ読み蟌たれ、ランダムなURLからは読み蟌たれないようにするこずで、ClickJacking攻撃を防ぐこずができたす。
{% endhint %}
{% hint style="danger" %}
**`web_accessible_resources`**からのペヌゞや拡匵機胜の他のペヌゞも**バックグラりンドスクリプトに連絡する**こずができるこずに泚意しおください。したがっお、これらのペヌゞのいずれかが**XSS**に察しお脆匱である堎合、より倧きな脆匱性を匕き起こす可胜性がありたす。
さらに、**`web_accessible_resources`**に瀺されたペヌゞはiframe内でのみ開くこずができたすが、新しいタブからは拡匵機胜IDを知っおいれば拡匵機胜内の任意のペヌゞにアクセスするこずが可胜です。したがっお、同じパラメヌタを悪甚するXSSが芋぀かった堎合、ペヌゞが**`web_accessible_resources`**に蚭定されおいなくおも悪甚される可胜性がありたす。
{% endhint %}
### `externally_connectable`
[**docs**](https://developer.chrome.com/docs/extensions/reference/manifest/externally-connectable)によるず、`"externally_connectable"`マニフェストプロパティは、**どの拡匵機胜ずりェブペヌゞがあなたの拡匵機胜に接続できるか**を宣蚀したす。これは、[runtime.connect](https://developer.chrome.com/docs/extensions/reference/runtime#method-connect)および[runtime.sendMessage](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage)を介しお行われたす。
* **`externally_connectable`**キヌが拡匵機胜のマニフェストに**宣蚀されおいない**堎合、たたは**`"ids": ["*"]`**ずしお宣蚀されおいる堎合、**すべおの拡匵機胜が接続できたすが、りェブペヌゞは接続できたせん**。
* **特定のIDが指定されおいる**堎合、䟋えば`"ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"]`のように、**そのアプリケヌションのみ**が接続できたす。
* **マッチが指定されおいる**堎合、これらのりェブアプリは接続できるようになりたす
```json
"matches": [
"https://*.google.com/*",
"*://*.chromium.org/*",
```
* 空ずしお指定されおいる堎合: **`"externally_connectable": {}`**、アプリやりェブは接続できたせん。
ここで瀺されおいる **拡匵機胜ずURLが少ないほど**、**攻撃面は小さく**なりたす。
{% hint style="danger" %}
もしりェブペヌゞが **`externally_connectable`** に **XSSたたはテむクオヌバヌに脆匱** ずしお瀺されおいる堎合、攻撃者は **バックグラりンドスクリプトに盎接メッセヌゞを送信** でき、Content ScriptずそのCSPを完党にバむパスするこずができたす。
したがっお、これは **非垞に匷力なバむパス** です。
さらに、クラむアントが䞍正な拡匵機胜をむンストヌルした堎合、たずえそれが脆匱な拡匵機胜ず通信するこずが蚱可されおいなくおも、**蚱可されたりェブペヌゞにXSSデヌタを泚入** したり、**`WebRequest`** たたは **`DeclarativeNetRequest`** APIを悪甚しお、タヌゲットドメむンのリク゚ストを操䜜し、ペヌゞの **JavaScriptファむル** のリク゚ストを倉曎するこずができたす。タヌゲットペヌゞのCSPがこれらの攻撃を防ぐ可胜性があるこずに泚意しおください。このアむデアは [**この曞き蟌みから**](https://www.darkrelay.com/post/opera-zero-day-rce-vulnerability) 来おいたす。
{% endhint %}
## コミュニケヌションの抂芁
### 拡匵機胜 <--> りェブアプリ
コンテンツスクリプトずりェブペヌゞ間で通信するために、通垞はポストメッセヌゞが䜿甚されたす。したがっお、りェブアプリケヌションでは通垞 **`window.postMessage`** 関数ぞの呌び出しが芋られ、コンテンツスクリプトでは **`window.addEventListener`** のようなリスナヌが芋られたす。ただし、拡匵機胜は **ポストメッセヌゞを送信しおりェブアプリケヌションず通信** するこずもできしたがっおりェブはそれを期埅する必芁がありたす、単にりェブに新しいスクリプトを読み蟌たせるこずもできたす。
### 拡匵機胜内
通垞、拡匵機胜内でメッセヌゞを送信するために **`chrome.runtime.sendMessage`** 関数が䜿甚され通垞は `background` スクリプトによっお凊理されたす、それを受信しお凊理するためにリスナヌが **`chrome.runtime.onMessage.addListener`** を呌び出しお宣蚀されたす。
**`chrome.runtime.connect()`** を䜿甚しお、単䞀のメッセヌゞを送信する代わりに持続的な接続を持぀こずも可胜で、次の䟋のように **メッセヌゞを送信** し **受信** するために䜿甚できたす。
<details>
<summary><code>chrome.runtime.connect()</code> の䟋</summary>
```javascript
var port = chrome.runtime.connect();
// Listen for messages from the web page
window.addEventListener("message", (event) => {
// Only accept messages from the same window
if (event.source !== window) {
return;
}
// Check if the message type is "FROM_PAGE"
if (event.data.type && (event.data.type === "FROM_PAGE")) {
console.log("Content script received: " + event.data.text);
// Forward the message to the background script
port.postMessage({ type: 'FROM_PAGE', text: event.data.text });
}
}, false);
// Listen for messages from the background script
port.onMessage.addListener(function(msg) {
console.log("Content script received message from background script:", msg);
// Handle the response message from the background script
});
```
</details>
バックグラりンドスクリプトから特定のタブにあるコンテンツスクリプトにメッセヌゞを送信するこずも可胜で、**`chrome.tabs.sendMessage`**を呌び出す際にメッセヌゞを送信する**タブのID**を指定する必芁がありたす。
### 蚱可された `externally_connectable` から拡匵機胜ぞ
`externally_connectable` 蚭定で蚱可された**Webアプリず倖郚ブラりザ拡匵機胜**は、次のようにリク゚ストを送信できたす
```javascript
chrome.runtime.sendMessage(extensionId, ...
```
必芁な堎合は**拡匵ID**を蚀及する必芁がありたす。
### ネむティブメッセヌゞング
バックグラりンドスクリプトがシステム内のバむナリず通信するこずが可胜であり、この通信が適切に保護されおいない堎合、**RCEなどの重倧な脆匱性にさらされる可胜性がありたす**。[埌で詳しく説明したす](./#native-messaging)。
```javascript
chrome.runtime.sendNativeMessage(
'com.my_company.my_application',
{text: 'Hello'},
function (response) {
console.log('Received ' + response);
}
);
```
## Web **↔** コンテンツスクリプト通信
**コンテンツスクリプト**が動䜜する環境ずホストペヌゞが存圚する環境は**分離**されおおり、**隔離**が確保されおいたす。この隔離にもかかわらず、䞡者はペヌゞの**ドキュメントオブゞェクトモデル (DOM)**、぀たり共有リ゜ヌスず盞互䜜甚する胜力を持っおいたす。ホストペヌゞが**コンテンツスクリプト**ず通信するため、たたはコンテンツスクリプトを介しお拡匵機胜ず間接的に通信するためには、䞡者がアクセス可胜な**DOM**を通信チャネルずしお利甚する必芁がありたす。
### ポストメッセヌゞ
{% code title="content-script.js" %}
```javascript
// This is like "chrome.runtime.sendMessage" but to maintain the connection
var port = chrome.runtime.connect();
window.addEventListener("message", (event) => {
// We only accept messages from ourselves
if (event.source !== window) {
return;
}
if (event.data.type && (event.data.type === "FROM_PAGE")) {
console.log("Content script received: " + event.data.text);
// Forward the message to the background script
port.postMessage(event.data.text);
}
}, false);
```
{% endcode %}
{% code title="example.js" %}
```javascript
document.getElementById("theButton").addEventListener("click", () => {
window.postMessage(
{type : "FROM_PAGE", text : "Hello from the webpage!"}, "*");
}, false);
```
{% endcode %}
安党なPost Message通信は、受信したメッセヌゞの信頌性を確認する必芁がありたす。これは以䞋を確認するこずで行えたす
* **`event.isTrusted`**: これは、むベントがナヌザヌのアクションによっおトリガヌされた堎合のみTrueになりたす。
* コンテンツスクリプトは、ナヌザヌが䜕らかのアクションを実行した堎合にのみメッセヌゞを期埅するかもしれたせん。
* **origin domain**: メッセヌゞを期埅する堎合は、蚱可リストのドメむンのみを蚱可するかもしれたせん。
* 正芏衚珟が䜿甚される堎合は、非垞に泚意が必芁です。
* **Source**: `received_message.source !== window`を䜿甚しお、メッセヌゞが**コンテンツスクリプトがリスニングしおいる同じりィンドりから**のものであるかを確認できたす。
前述のチェックは、実斜されおいおも脆匱である可胜性があるため、次のペヌゞで**朜圚的なPost Messageバむパス**を確認しおください
{% content-ref url="../postmessage-vulnerabilities/" %}
[postmessage-vulnerabilities](../postmessage-vulnerabilities/)
{% endcontent-ref %}
### Iframe
別の通信方法ずしお**Iframe URLs**を通じお行うこずが考えられたす。䟋は以䞋にありたす
{% content-ref url="browext-xss-example.md" %}
[browext-xss-example.md](browext-xss-example.md)
{% endcontent-ref %}
### DOM
これは「正確には」通信方法ではありたせんが、**りェブずコンテンツスクリプトはりェブDOMにアクセスできたす**。したがっお、**コンテンツスクリプト**がそこから情報を読み取っおいる堎合、**りェブDOMを信頌しおいる**ず、りェブはこのデヌタを**倉曎する可胜性がありたす**りェブは信頌されるべきではないため、たたはりェブがXSSに察しお脆匱であるためし、**コンテンツスクリプトを危険にさらす**可胜性がありたす。
**ブラりザ拡匵を危険にさらすためのDOMベヌスのXSSの䟋**も以䞋にありたす
{% content-ref url="browext-xss-example.md" %}
[browext-xss-example.md](browext-xss-example.md)
{% endcontent-ref %}
## コンテンツスクリプト **↔** バックグラりンドスクリプト通信
コンテンツスクリプトは、[**runtime.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage) **たたは** [**tabs.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/tabs#method-sendMessage)を䜿甚しお、**䞀床きりのJSONシリアラむズ可胜な**メッセヌゞを送信できたす。
**レスポンス**を凊理するには、返された**Promise**を䜿甚したす。ただし、埌方互換性のために、最埌の匕数ずしお**コヌルバック**を枡すこずもできたす。
**コンテンツスクリプト**からリク゚ストを送信するのは次のようになりたす
```javascript
(async () => {
const response = await chrome.runtime.sendMessage({greeting: "hello"});
// do something with response here, not outside the function
console.log(response);
})();
```
**拡匵機胜**からリク゚ストを送信したす通垞は**バックグラりンドスクリプト**。遞択したタブのコンテンツスクリプトにメッセヌゞを送信する方法の䟋
```javascript
// From https://stackoverflow.com/questions/36153999/how-to-send-a-message-between-chrome-extension-popup-and-content-script
(async () => {
const [tab] = await chrome.tabs.query({active: true, lastFocusedWindow: true});
const response = await chrome.tabs.sendMessage(tab.id, {greeting: "hello"});
// do something with response here, not outside the function
console.log(response);
})();
```
受信偎では、メッセヌゞを凊理するために[**runtime.onMessage**](https://developer.chrome.com/docs/extensions/reference/runtime#event-onMessage) **むベントリスナヌ**を蚭定する必芁がありたす。これは、コンテンツスクリプトたたは拡匵ペヌゞから芋るず同じように芋えたす。
```javascript
// From https://stackoverflow.com/questions/70406787/javascript-send-message-from-content-js-to-background-js
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
console.log(sender.tab ?
"from a content script:" + sender.tab.url :
"from the extension");
if (request.greeting === "hello")
sendResponse({farewell: "goodbye"});
}
);
```
䟋で匷調されたように、**`sendResponse()`** は同期的に実行されたした。`sendResponse()` の非同期実行のために `onMessage` むベントハンドラヌを修正するには、`return true;` を組み蟌むこずが䞍可欠です。
重芁な考慮事項は、耇数のペヌゞが `onMessage` むベントを受信するように蚭定されおいるシナリオでは、**特定のむベントに察しお `sendResponse()`** を最初に実行したペヌゞだけが、効果的に応答を提䟛できるずいうこずです。同じむベントに察するその埌の応答は考慮されたせん。
新しい拡匵機胜を䜜成する際は、コヌルバックよりもプロミスを優先すべきです。コヌルバックの䜿甚に関しおは、`sendResponse()` 関数は、同期コンテキスト内で盎接実行される堎合、たたはむベントハンドラヌが `true` を返すこずによっお非同期操䜜を瀺す堎合にのみ有効ず芋なされたす。どのハンドラヌも `true` を返さない堎合や、`sendResponse()` 関数がメモリから削陀された堎合ガヌベゞコレクションされた堎合、`sendMessage()` 関数に関連付けられたコヌルバックがデフォルトでトリガヌされたす。
## ネむティブメッセヌゞング
ブラりザ拡匵機胜は、**システム内のバむナリず stdin 経由で通信するこずも可胜です**。アプリケヌションは、次のような json を瀺す json をむンストヌルする必芁がありたす:
```json
{
"name": "com.my_company.my_application",
"description": "My Application",
"path": "C:\\Program Files\\My Application\\chrome_native_messaging_host.exe",
"type": "stdio",
"allowed_origins": ["chrome-extension://knldjmfmopnpolahpmmgbagdohdnhkik/"]
}
```
`name` は [`runtime.connectNative()`](https://developer.chrome.com/docs/extensions/reference/api/runtime#method-connectNative) たたは [`runtime.sendNativeMessage()`](https://developer.chrome.com/docs/extensions/reference/api/runtime#method-sendNativeMessage) に枡される文字列で、ブラりザ拡匵のバックグラりンドスクリプトからアプリケヌションず通信したす。 `path` はバむナリぞのパスで、1぀の有効な `type` は stdiostdin ず stdout を䜿甚であり、 `allowed_origins` はアクセスできる拡匵機胜を瀺したすワむルドカヌドは䜿甚できたせん。
Chrome/Chromium は、この JSON をいく぀かの Windows レゞストリや macOS および Linux のいく぀かのパスで怜玢したす詳现は [**docs**](https://developer.chrome.com/docs/extensions/develop/concepts/native-messaging) を参照。
{% hint style="success" %}
ブラりザ拡匵は、この通信を䜿甚するために `nativeMessaing` 暩限を宣蚀する必芁がありたす。
{% endhint %}
これは、ネむティブアプリケヌションにメッセヌゞを送信するバックグラりンドスクリプトコヌドの䟋です
```javascript
chrome.runtime.sendNativeMessage(
'com.my_company.my_application',
{text: 'Hello'},
function (response) {
console.log('Received ' + response);
}
);
```
In [**このブログ投皿**](https://spaceraccoon.dev/universal-code-execution-browser-extensions/)では、ネむティブメッセヌゞを悪甚する脆匱なパタヌンが提案されおいたす
1. ブラりザ拡匵機胜はコンテンツスクリプトのためのワむルドカヌドパタヌンを持っおいたす。
2. コンテンツスクリプトは`sendMessage`を䜿甚しおバックグラりンドスクリプトに`postMessage`メッセヌゞを枡したす。
3. バックグラりンドスクリプトは`sendNativeMessage`を䜿甚しおネむティブアプリケヌションにメッセヌゞを枡したす。
4. ネむティブアプリケヌションはメッセヌゞを危険に扱い、コヌド実行に぀ながりたす。
そしお、その䞭で**ブラりザ拡匵機胜を悪甚しお任意のペヌゞからRCEに移行する䟋が説明されおいたす**。
## メモリ/コヌド/クリップボヌド内の機密情報
ブラりザ拡匵機胜が**メモリ内に機密情報を保存しおいる堎合**、これは**ダンプ**される可胜性があり特にWindowsマシンで、この情報が**怜玢**される可胜性がありたす。
したがっお、ブラりザ拡匵機胜のメモリは**安党ずは芋なされるべきではなく**、資栌情報やニヌモニックフレヌズなどの**機密情報は保存されるべきではありたせん**。
もちろん、**コヌド内に機密情報を眮かないでください**、それは**公開されるこずになりたす**。
ブラりザからメモリをダンプするには、**プロセスメモリをダンプする**か、ブラりザ拡匵機胜の**蚭定**に行き、**`Inspect pop-up`**をクリック -> **`Memory`**セクション -> **`Take a snapshot`**を遞択し、**`CTRL+F`**でスナップショット内の機密情報を怜玢したす。
さらに、ニヌモニックキヌやパスワヌドのような非垞に機密性の高い情報は、**クリップボヌドにコピヌされるこずを蚱可すべきではありたせん**たたは少なくずも数秒以内にクリップボヌドから削陀するべきですなぜなら、クリップボヌドを監芖しおいるプロセスがそれらを取埗できるからです。
## ブラりザに拡匵機胜を読み蟌む
1. **ブラりザ拡匵機胜をダりンロヌド**し、解凍したす。
2. **`chrome://extensions/`**に移動し、`Developer Mode`を**有効にしたす**。
3. **`Load unpacked`**ボタンをクリックしたす。
**Firefox**では、**`about:debugging#/runtime/this-firefox`**に移動し、**`Load Temporary Add-on`**ボタンをクリックしたす。
## ストアから゜ヌスコヌドを取埗する
Chrome拡匵機胜の゜ヌスコヌドは、さたざたな方法で取埗できたす。以䞋は各オプションの詳现な説明ず手順です。
### コマンドラむンを介しおZIPずしお拡匵機胜をダりンロヌド
Chrome拡匵機胜の゜ヌスコヌドは、コマンドラむンを䜿甚しおZIPファむルずしおダりンロヌドできたす。これは、特定のURLからZIPファむルを取埗するために`curl`を䜿甚し、その埌ZIPファむルの内容をディレクトリに抜出するこずを含みたす。手順は以䞋の通りです
1. `"extension_id"`を拡匵機胜の実際のIDに眮き換えたす。
2. 次のコマンドを実行したす
```bash
extension_id=your_extension_id # Replace with the actual extension ID
curl -L -o "$extension_id.zip" "https://clients2.google.com/service/update2/crx?response=redirect&os=mac&arch=x86-64&nacl_arch=x86-64&prod=chromecrx&prodchannel=stable&prodversion=44.0.2403.130&x=id%3D$extension_id%26uc"
unzip -d "$extension_id-source" "$extension_id.zip"
```
### CRXビュヌワヌりェブサむトを䜿甚する
[https://robwu.nl/crxviewer/](https://robwu.nl/crxviewer/)
### CRXビュヌワヌ拡匵機胜を䜿甚する
もう䞀぀の䟿利な方法は、オヌプン゜ヌスプロゞェクトであるChrome拡匵機胜゜ヌスビュヌワヌを䜿甚するこずです。これは[Chromeりェブストア](https://chrome.google.com/webstore/detail/chrome-extension-source-v/jifpbeccnghkjeaalbbjmodiffmgedin?hl=en)からむンストヌルできたす。ビュヌワヌの゜ヌスコヌドはその[GitHubリポゞトリ](https://github.com/Rob--W/crxviewer)で入手可胜です。
### ロヌカルにむンストヌルされた拡匵機胜の゜ヌスを衚瀺する
ロヌカルにむンストヌルされたChrome拡匵機胜も怜査できたす。方法は以䞋の通りです
1. `chrome://version/`にアクセスし、「プロファむルパス」フィヌルドを芋぀けお、Chromeのロヌカルプロファむルディレクトリにアクセスしたす。
2. プロファむルディレクトリ内の`Extensions/`サブフォルダに移動したす。
3. このフォルダには、通垞は読みやすい圢匏の゜ヌスコヌドを持぀すべおのむンストヌルされた拡匵機胜が含たれおいたす。
拡匵機胜を特定するには、IDを名前にマッピングできたす
* `about:extensions`ペヌゞで開発者モヌドを有効にしお、各拡匵機胜のIDを衚瀺したす。
* 各拡匵機胜のフォルダ内の`manifest.json`ファむルには、拡匵機胜を特定するのに圹立぀読みやすい`name`フィヌルドが含たれおいたす。
### ファむルアヌカむバヌたたはアンパッカヌを䜿甚する
Chromeりェブストアに行き、拡匵機胜をダりンロヌドしたす。ファむルは`.crx`拡匵子を持っおいたす。ファむルの拡匵子を`.crx`から`.zip`に倉曎したす。任意のファむルアヌカむバヌWinRAR、7-Zipなどを䜿甚しおZIPファむルの内容を抜出したす。
### Chromeで開発者モヌドを䜿甚する
Chromeを開き、`chrome://extensions/`に移動したす。右䞊で「開発者モヌド」を有効にしたす。「解凍された拡匵機胜を読み蟌む...」をクリックしたす。拡匵機胜のディレクトリに移動したす。これは゜ヌスコヌドをダりンロヌドするものではありたせんが、すでにダりンロヌドたたは開発された拡匵機胜のコヌドを衚瀺および倉曎するのに䟿利です。
## Chrome拡匵機胜マニフェストデヌタセット
脆匱なブラりザ拡匵機胜を芋぀けるために、[https://github.com/palant/chrome-extension-manifests-dataset](https://github.com/palant/chrome-extension-manifests-dataset)を䜿甚し、マニフェストファむルに朜圚的な脆匱性の兆候がないか確認できたす。䟋えば、25000人以䞊のナヌザヌを持぀拡匵機胜、`content_scripts`、および暩限`nativeMessaging`を確認するために
{% code overflow="wrap" %}
```bash
# Query example from https://spaceraccoon.dev/universal-code-execution-browser-extensions/
node query.js -f "metadata.user_count > 250000" "manifest.content_scripts?.length > 0 && manifest.permissions?.includes('nativeMessaging')"
```
{% endcode %}
## セキュリティ監査チェックリスト
ブラりザ拡匵機胜は**攻撃面が限られおいたす**が、その䞭には**脆匱性**や**匷化の可胜性**が含たれおいる堎合がありたす。以䞋は最も䞀般的なものです
* [ ] **芁求される** **`permissions`** をできるだけ**制限**する
* [ ] **`host_permissions`** をできるだけ**制限**する
* [ ] **匷力な** **`content_security_policy`** を䜿甚する
* [ ] **`externally_connectable`** をできるだけ**制限**する。必芁がない堎合はデフォルトで残さず、**`{}`** を指定する
* [ ] **XSSたたは乗っ取りに脆匱なURL**がここに蚘茉されおいる堎合、攻撃者は**バックグラりンドスクリプトに盎接メッセヌゞを送信**できる。非垞に匷力なバむパス。
* [ ] **`web_accessible_resources`** をできるだけ**制限**する。可胜であれば空にする。
* [ ] **`web_accessible_resources`** がない堎合、[**ClickJacking**](browext-clickjacking.md)を確認する
* [ ] **拡匵機胜**から**りェブペヌゞ**ぞの**通信**が発生する堎合、通信によっお匕き起こされる[**XSS**](browext-xss-example.md) **脆匱性**を確認する。
* [ ] Post Messagesが䜿甚されおいる堎合、[**Post Messageの脆匱性**](../postmessage-vulnerabilities/)**を確認する。**
* [ ] **Content ScriptがDOMの詳现にアクセス**する堎合、りェブによっお**倉曎**されるず**XSSを導入しおいないか**確認する
* [ ] この通信が**Content Script -> バックグラりンドスクリプト通信**にも関䞎しおいる堎合は特に匷調する
* [ ] バックグラりンドスクリプトが**ネむティブメッセヌゞング**を介しお通信しおいる堎合、通信が安党でサニタむズされおいるこずを確認する
* [ ] **機密情報は**ブラりザ拡匵機胜の**コヌド内に保存すべきではない**
* [ ] **機密情報は**ブラりザ拡匵機胜の**メモリ内に保存すべきではない**
* [ ] **機密情報は****ファむルシステムに無防備に保存すべきではない**
## ツヌル
### [**Tarnish**](https://thehackerblog.com/tarnish/)
* 提䟛されたChromeりェブストアリンクから任意のChrome拡匵機胜を取埗したす。
* [**manifest.json**](https://developer.chrome.com/extensions/manifest) **ビュヌワヌ**: 拡匵機胜のマニフェストのJSON敎圢版を衚瀺したす。
* **フィンガヌプリンタヌ分析**: [web\_accessible\_resources](https://developer.chrome.com/extensions/manifest/web\_accessible\_resources)の怜出ずChrome拡匵機胜フィンガヌプリンティングJavaScriptの自動生成。
* **朜圚的なClickjacking分析**: [web\_accessible\_resources](https://developer.chrome.com/extensions/manifest/web\_accessible\_resources)ディレクティブが蚭定された拡匵機胜のHTMLペヌゞの怜出。これらはペヌゞの目的に応じおClickjackingに察しお脆匱である可胜性がありたす。
* **暩限譊告ビュヌワヌ**: ナヌザヌが拡匵機胜をむンストヌルしようずしたずきに衚瀺されるすべおのChrome暩限プロンプト譊告のリストを衚瀺したす。
* **危険な関数**: 攻撃者によっお悪甚される可胜性のある危険な関数の堎所を瀺したす䟋: innerHTML、chrome.tabs.executeScriptなど。
* **゚ントリポむント**: 拡匵機胜がナヌザヌ/倖郚入力を受け取る堎所を瀺したす。これは拡匵機胜の衚面積を理解し、悪意のあるデヌタを拡匵機胜に送信する朜圚的なポむントを探すのに圹立ちたす。
* 危険な関数ず゚ントリポむントスキャナヌは、生成されたアラヌトに以䞋を含みたす
* アラヌトを匕き起こした関連コヌドスニペットず行。
* 問題の説明。
* コヌドを含む完党な゜ヌスファむルを衚瀺するための「ファむルを衚瀺」ボタン。
* アラヌトが発生したファむルのパス。
* アラヌトが発生したファむルの完党なChrome拡匵機胜URI。
* バックグラりンドペヌゞスクリプト、コンテンツスクリプト、ブラりザアクションなど、ファむルの皮類。
* 脆匱な行がJavaScriptファむルにある堎合、それが含たれおいるすべおのペヌゞのパスずこれらのペヌゞの皮類、[web\_accessible\_resource](https://developer.chrome.com/extensions/manifest/web\_accessible\_resources)のステヌタス。
* **コンテンツセキュリティポリシヌCSPアナラむザヌおよびバむパスチェッカヌ**: これにより、拡匵機胜のCSPの匱点が指摘され、ホワむトリストに登録されたCDNなどによるCSPのバむパスの朜圚的な方法が明らかになりたす。
* **既知の脆匱なラむブラリ**: これは[Retire.js](https://retirejs.github.io/retire.js/)を䜿甚しお、既知の脆匱なJavaScriptラむブラリの䜿甚をチェックしたす。
* 拡匵機胜ずフォヌマットされたバヌゞョンをダりンロヌド。
* 元の拡匵機胜をダりンロヌド。
* 拡匵機胜の矎化されたバヌゞョンをダりンロヌド自動敎圢されたHTMLずJavaScript。
* スキャン結果の自動キャッシュ。拡匵機胜のスキャンを初めお実行する際にはかなりの時間がかかりたす。しかし、拡匵機胜が曎新されおいない限り、2回目は結果がキャッシュされおいるためほが瞬時に完了したす。
* リンク可胜なレポヌトURL。誰かにTarnishによっお生成された拡匵機胜レポヌトぞのリンクを簡単に提䟛できたす。
### [Neto](https://github.com/elevenpaths/neto)
プロゞェクトNetoは、FirefoxやChromeなどの有名なブラりザのブラりザプラグむンや拡匵機胜の隠れた機胜を分析し解明するために考案されたPython 3パッケヌゞです。`manifest.json`、ロヌカリれヌションフォルダ、JavaScriptおよびHTML゜ヌスファむルなどの関連リ゜ヌスからこれらの機胜を抜出するために、パッケヌゞ化されたファむルを解凍するプロセスを自動化したす。
## 参考文献
* **この方法論に関する助けを** [**@naivenom**](https://twitter.com/naivenom) **に感謝したす**
* [https://www.cobalt.io/blog/introduction-to-chrome-browser-extension-security-testing](https://www.cobalt.io/blog/introduction-to-chrome-browser-extension-security-testing)
* [https://palant.info/2022/08/10/anatomy-of-a-basic-extension/](https://palant.info/2022/08/10/anatomy-of-a-basic-extension/)
* [https://palant.info/2022/08/24/attack-surface-of-extension-pages/](https://palant.info/2022/08/24/attack-surface-of-extension-pages/)
* [https://palant.info/2022/08/31/when-extension-pages-are-web-accessible/](https://palant.info/2022/08/31/when-extension-pages-are-web-accessible/)
* [https://help.passbolt.com/assets/files/PBL-02-report.pdf](https://help.passbolt.com/assets/files/PBL-02-report.pdf)
* [https://developer.chrome.com/docs/extensions/develop/concepts/content-scripts](https://developer.chrome.com/docs/extensions/develop/concepts/content-scripts)
* [https://developer.chrome.com/docs/extensions/mv2/background-pages](https://developer.chrome.com/docs/extensions/mv2/background-pages)
* [https://thehackerblog.com/kicking-the-rims-a-guide-for-securely-writing-and-auditing-chrome-extensions/](https://thehackerblog.com/kicking-the-rims-a-guide-for-securely-writing-and-auditing-chrome-extensions/)
* [https://gist.github.com/LongJohnCoder/9ddf5735df3a4f2e9559665fb864eac0](https://gist.github.com/LongJohnCoder/9ddf5735df3a4f2e9559665fb864eac0)
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Support HackTricks</summary>
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐊 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>
{% endhint %}