Pentesting gRPC-Web
Tip
Вивчайте та практикуйте AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
Коротке резюме протоколу та поверхні атаки
- Транспорт: gRPC‑Web використовує сумісний з браузером варіант gRPC поверх HTTP/1.1 або HTTP/2 через проксі (Envoy/APISIX/grpcwebproxy/etc.). Підтримуються лише unary та server‑streaming виклики.
- Content-Types, які ви побачите:
- application/grpc-web (бінарне фреймування)
- application/grpc-web-text (base64-кодуване фреймування для стрімінгу через HTTP/1.1)
- Фреймування: кожне повідомлення префіксується 5‑байтовим gRPC-заголовком (1‑байт flags + 4‑байт length). У gRPC‑Web trailers (grpc-status, grpc-message, …) відсилаються всередині тіла як спеціальний фрейм: перший байт з встановленим MSB (0x80), за ним довжина та блок заголовків у стилі HTTP/1.1.
- Типові заголовки запиту: x-grpc-web: 1, x-user-agent: grpc-web-javascript/…, grpc-timeout, grpc-encoding. Відповіді передають grpc-status/grpc-message через trailers/body frames і часто через Access-Control-Expose-Headers для браузерів.
- Проміжне ПЗ (middleware), релевантне для безпеки, яке часто присутнє:
- Envoy grpc_web filter and gRPC‑JSON transcoder (HTTP<->gRPC bridge)
- Nginx/APISIX gRPC‑Web plugins
- CORS-політики на проксі
Що це означає для атакувальників:
- Ви можете формувати запити вручну (бінарні або base64-текст), або дозволити інструментам генерувати/кодувати їх.
- Помилки CORS на проксі можуть дозволити міжсайтові, автентифіковані gRPC‑Web виклики (аналогічно класичним проблемам з CORS).
- JSON transcoding bridges можуть ненавмисно відкривати gRPC методи як неавтентифіковані HTTP endpoint-и, якщо маршрути/автентифікація неправильно налаштовані.
Testing gRPC‑Web from the CLI
Найпростіше: buf curl (нативна підтримка gRPC‑Web)
- Перелічити методи через reflection (якщо увімкнено):
# list methods (uses reflection)
buf curl --protocol grpcweb https://host.tld --list-methods
- Викликати метод із JSON-вхідними даними, автоматично обробляючи gRPC‑Web фреймінг та заголовки:
buf curl --protocol grpcweb \
-H 'Origin: https://example.com' \
-d '{"field":"value"}' \
https://host.tld/pkg.svc.v1.Service/Method
- Якщо reflection вимкнено, надайте набір схем/дескрипторів за допомогою –schema або вкажіть локальні .proto файли. Див. buf help curl.
Raw with curl (ручні заголовки + фреймоване тіло)
Для двійкового режиму (application/grpc-web) відправте фреймований payload (5‑byte prefix + protobuf message). Для текстового режиму закодуйте фреймований payload у base64.
# Build a protobuf message, then gRPC-frame it (1 flag byte + 4 length + msg)
# Example using protoscope to compose/edit the message and base64 for grpc-web-text
protoscope -s msg.txt | python3 grpc-coder.py --encode --type grpc-web-text | \
tee body.b64
curl -i https://host.tld/pkg.svc.v1.Service/Method \
-H 'Content-Type: application/grpc-web-text' \
-H 'X-Grpc-Web: 1' \
-H 'X-User-Agent: grpc-web-javascript/0.1' \
--data-binary @body.b64
Порада: Примусово використовуйте режим base64/text з application/grpc-web-text, коли HTTP/1.1 проміжні вузли порушують бінарний стрімінг.
Перевірте поведінку CORS (preflight + response)
- Preflight:
curl -i -X OPTIONS https://host.tld/pkg.svc.v1.Service/Method \
-H 'Origin: https://evil.tld' \
-H 'Access-Control-Request-Method: POST' \
-H 'Access-Control-Request-Headers: content-type,x-grpc-web,x-user-agent,grpc-timeout'
- Уразливе налаштування часто відображає довільний Origin і відправляє Access-Control-Allow-Credentials: true, що дозволяє міжсайтові аутентифіковані виклики. Також перевіряйте, чи Access-Control-Expose-Headers включає grpc-status, grpc-message (багато розгортань відкривають їх для клієнтських бібліотек).
For generic techniques to abuse CORS, check CORS - Misconfigurations & Bypass.
Маніпулювання gRPC‑Web payloads
gRPC‑Web використовує Content-Type: application/grpc-web-text як base64‑wrapped потік фреймів gRPC для сумісності з браузерами. Ви можете декодувати/модифікувати/заново кодувати фрейми, щоб підміняти поля, змінювати прапорці або інжектити payloads.
Use the gprc-coder tool (and its Burp extension) to speed up round‑trips.
Ручний спосіб з gGRPC Coder Tool
- Декодуйте payload:
echo "AAAAABYSC0FtaW4gTmFzaXJpGDY6BVhlbm9u" | python3 grpc-coder.py --decode --type grpc-web-text | protoscope > out.txt
- Редагувати вміст декодованого payload
nano out.txt
2: {"Amin Nasiri Xenon GRPC"}
3: 54
7: {"<script>alert(origin)</script>"}
- Закодуйте новий payload
protoscope -s out.txt | python3 grpc-coder.py --encode --type grpc-web-text
- Використати вивід у Burp interceptor:
AAAAADoSFkFtaW4gTmFzaXJpIFhlbm9uIEdSUEMYNjoePHNjcmlwdD5hbGVydChvcmlnaW4pPC9zY3JpcHQ+
Інструкція для gRPC‑Web Coder Burp Suite Extension
You can use gRPC‑Web Coder Burp Suite Extension in gRPC‑Web Pentest Suite which is easier. You can read the installation and usage instruction in its repo.
Аналіз JavaScript файлів gRPC‑Web
Веб-додатки, що використовують gRPC‑Web, постачають щонайменше один згенерований JS/TS bundle. Реверсуйте їх, щоб витягти сервіси, методи та структури повідомлень.
- Спробуйте використати gRPC-Scan для розбору bundle’ів.
- Шукайтe шляхи методів на кшталт /
. / , номери/типи полів повідомлень та custom interceptors, що додають auth headers.
- Завантажте JavaScript-файл gRPC‑Web
- Проскануйте його за допомогою grpc-scan.py:
python3 grpc-scan.py --file main.js
- Аналізуйте output і тестуйте нові endpoints та нові services:
Output:
Found Endpoints:
/grpc.gateway.testing.EchoService/Echo
/grpc.gateway.testing.EchoService/EchoAbort
/grpc.gateway.testing.EchoService/NoOp
/grpc.gateway.testing.EchoService/ServerStreamingEcho
/grpc.gateway.testing.EchoService/ServerStreamingEchoAbort
Found Messages:
grpc.gateway.testing.EchoRequest:
+------------+--------------------+--------------+
| Field Name | Field Type | Field Number |
+============+====================+==============+
| Message | Proto3StringField | 1 |
+------------+--------------------+--------------+
| Name | Proto3StringField | 2 |
+------------+--------------------+--------------+
| Age | Proto3IntField | 3 |
+------------+--------------------+--------------+
| IsAdmin | Proto3BooleanField | 4 |
+------------+--------------------+--------------+
| Weight | Proto3FloatField | 5 |
+------------+--------------------+--------------+
| Test | Proto3StringField | 6 |
+------------+--------------------+--------------+
| Test2 | Proto3StringField | 7 |
+------------+--------------------+--------------+
| Test3 | Proto3StringField | 16 |
+------------+--------------------+--------------+
| Test4 | Proto3StringField | 20 |
+------------+--------------------+--------------+
grpc.gateway.testing.EchoResponse:
+--------------+--------------------+--------------+
| Field Name | Field Type | Field Number |
+==============+====================+==============+
| Message | Proto3StringField | 1 |
+--------------+--------------------+--------------+
| Name | Proto3StringField | 2 |
+--------------+--------------------+--------------+
| Age | Proto3IntField | 3 |
+--------------+--------------------+--------------+
| IsAdmin | Proto3BooleanField | 4 |
+--------------+--------------------+--------------+
| Weight | Proto3FloatField | 5 |
+--------------+--------------------+--------------+
| Test | Proto3StringField | 6 |
+--------------+--------------------+--------------+
| Test2 | Proto3StringField | 7 |
+--------------+--------------------+--------------+
| Test3 | Proto3StringField | 16 |
+--------------+--------------------+--------------+
| Test4 | Proto3StringField | 20 |
+--------------+--------------------+--------------+
| MessageCount | Proto3IntField | 8 |
+--------------+--------------------+--------------+
grpc.gateway.testing.ServerStreamingEchoRequest:
+-----------------+-------------------+--------------+
| Field Name | Field Type | Field Number |
+=================+===================+==============+
| Message | Proto3StringField | 1 |
+-----------------+-------------------+--------------+
| MessageCount | Proto3IntField | 2 |
+-----------------+-------------------+--------------+
| MessageInterval | Proto3IntField | 3 |
+-----------------+-------------------+--------------+
grpc.gateway.testing.ServerStreamingEchoResponse:
+------------+-------------------+--------------+
| Field Name | Field Type | Field Number |
+============+===================+==============+
| Message | Proto3StringField | 1 |
+------------+-------------------+--------------+
grpc.gateway.testing.ClientStreamingEchoRequest:
+------------+-------------------+--------------+
| Field Name | Field Type | Field Number |
+============+===================+==============+
| Message | Proto3StringField | 1 |
+------------+-------------------+--------------+
grpc.gateway.testing.ClientStreamingEchoResponse:
+--------------+----------------+--------------+
| Field Name | Field Type | Field Number |
+==============+================+==============+
| MessageCount | Proto3IntField | 1 |
+--------------+----------------+--------------+
Мости та підводні камені JSON-транскодування
У багатьох розгортаннях перед gRPC-сервером ставлять проксі Envoy (або подібний):
- Фільтр grpc_web перетворює HTTP/1.1 POST-запити у HTTP/2 gRPC.
- gRPC‑JSON Transcoder відкриває gRPC-методи як HTTP JSON ендпоїнти, коли присутні опції .proto (google.api.http).
З точки зору pentesting:
- Спробуйте прямі HTTP JSON виклики до /
. / з application/json, коли transcoder увімкнено (auth/route mismatches are common):
curl -i https://host.tld/pkg.svc.v1.Service/Method \
-H 'Content-Type: application/json' \
-d '{"field":"value"}'
- Перевірте, чи unknown methods/parameters відкидаються або пропускаються далі. Деякі configs пересилають unmatched paths upstream, іноді обходячи auth або request validation.
- Спостерігайте за x-envoy-original-path та related headers, які додаються proxies. Upstreams, що довіряють цим, можуть ставати вразливими, якщо proxy не очищує їх.
Посилання
- Hacking into gRPC‑Web Article by Amin Nasiri
- gRPC‑Web Pentest Suite
- gRPC‑Web protocol notes (PROTOCOL‑WEB.md)
Tip
Вивчайте та практикуйте AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
HackTricks

