Pentesting gRPC-Web
Reading time: 7 minutes
tip
Učite i vežbajte AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:
HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Brzi pregled protokola i površine napada
- Transport: gRPC‑Web koristi browser‑kompatibilnu varijantu gRPC preko HTTP/1.1 ili HTTP/2 preko proxyja (Envoy/APISIX/grpcwebproxy/etc.). Podržani su samo unary i server‑streaming pozivi.
- Content-Types koje ćete videti:
- application/grpc-web (binary framing)
- application/grpc-web-text (base64-encoded framing for HTTP/1.1 streaming)
- Framing: svaka poruka je prefiksirana 5‑bajtnim gRPC headerom (1‑bajt flags + 4‑bajt length). U gRPC‑Web, trailers (grpc-status, grpc-message, …) se šalju unutar body‑ja kao poseban frame: prvi bajt sa MSB postavljenim (0x80) praćen dužinom i HTTP/1.1‑stil header blokom.
- Uobičajeni request headeri: x-grpc-web: 1, x-user-agent: grpc-web-javascript/…, grpc-timeout, grpc-encoding. Odgovori izlažu grpc-status/grpc-message putem trailers/body frame‑ova i često preko Access-Control-Expose-Headers za pregledače.
- Sigurnosno relevantni middleware koji se često sreće:
- Envoy grpc_web filter and gRPC‑JSON transcoder (HTTP<->gRPC bridge)
- Nginx/APISIX gRPC‑Web plugins
- CORS politike na proxyju
Šta ovo znači za napadače:
- Možete ručno sastaviti zahteve (binarne ili base64 tekstualne), ili dozvoliti alatima da ih generišu/enkodiraju.
- Greške u CORS konfiguraciji na proxyju mogu omogućiti cross‑site, autentifikovane gRPC‑Web pozive (slično klasičnim CORS problemima).
- JSON transcoding bridgeovi mogu nenamerno izložiti gRPC metode kao neautentifikovane HTTP endpoint‑e ako su routes/auth pogrešno konfigurisani.
Testiranje gRPC‑Web iz CLI
Najlakše: buf curl (nativno podržava gRPC‑Web)
- Prikaži metode pomoću reflection (ako je omogućeno):
# list methods (uses reflection)
buf curl --protocol grpcweb https://host.tld --list-methods
- Pozovite metodu sa JSON ulazom, automatski obrađujući gRPC‑Web framing i headers:
buf curl --protocol grpcweb \
-H 'Origin: https://example.com' \
-d '{"field":"value"}' \
https://host.tld/pkg.svc.v1.Service/Method
- Ako je reflection onemogućen, obezbedite schema/descriptor set pomoću --schema ili ukažite na lokalne .proto fajlove. Pogledajte buf help curl.
Raw with curl (ručna zaglavlja + framed body)
Za binarni režim (application/grpc-web), pošaljite framed payload (prefiks od 5 bajtova + protobuf message). Za tekstualni režim, base64-enkodirajte framed payload.
# 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
Savet: Primorajte base64/text režim koristeći application/grpc-web-text kada HTTP/1.1 posrednici prekidaju binarno strimovanje.
Proverite CORS ponašanje (preflight + odgovor)
- 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'
- Ranljiv setup često reflektuje proizvoljan Origin i šalje Access-Control-Allow-Credentials: true, što omogućava cross‑site autentifikovane pozive. Takođe proverite da li Access-Control-Expose-Headers uključuje grpc-status, grpc-message (mnogi deploymenti ih izlažu za client libs).
For generic techniques to abuse CORS, check CORS - Misconfigurations & Bypass.
Manipulisanje gRPC‑Web payloads
gRPC‑Web koristi Content-Type: application/grpc-web-text kao base64‑om umotan stream gRPC frejmova radi kompatibilnosti sa browserima. Možete dekodirati/modifikovati/enkodirati frejmove da biste manipulisali poljima, menjali flagove ili ubacivali payloads.
Use the gprc-coder tool (and its Burp extension) to speed up round‑trips.
Ručno sa gGRPC Coder Tool
- Dekodirajte payload:
echo "AAAAABYSC0FtaW4gTmFzaXJpGDY6BVhlbm9u" | python3 grpc-coder.py --decode --type grpc-web-text | protoscope > out.txt
- Izmenite sadržaj dekodiranog payload
nano out.txt
2: {"Amin Nasiri Xenon GRPC"}
3: 54
7: {"<script>alert(origin)</script>"}
- Kodiraj novi payload
protoscope -s out.txt | python3 grpc-coder.py --encode --type grpc-web-text
- Koristite output u Burp interceptor:
AAAAADoSFkFtaW4gTmFzaXJpIFhlbm9uIEdSUEMYNjoePHNjcmlwdD5hbGVydChvcmlnaW4pPC9zY3JpcHQ+
Uputstvo sa gRPC‑Web Coder Burp Suite Extension
Možete koristiti gRPC‑Web Coder Burp Suite Extension u gRPC‑Web Pentest Suite koji je lakši. Uputstvo za instalaciju i upotrebu pročitajte u njegovom repo-u.
Analiza gRPC‑Web JavaScript fajlova
Web aplikacije koje koriste gRPC‑Web isporučuju najmanje jedan generisani JS/TS bundle. Reverzujte ih da izvučete servise, metode i strukture poruka.
- Pokušajte koristiti gRPC-Scan za parsiranje bundle-ova.
- Tražite puteve metoda kao /
. / , brojeve/tipove polja poruka i prilagođene interceptore koji dodaju auth zaglavlja.
- Preuzmite JavaScript gRPC‑Web fajl
- Skenirajte ga sa grpc-scan.py:
python3 grpc-scan.py --file main.js
- Analizirajte izlaz i testirajte nove endpoints i nove 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 |
+--------------+----------------+--------------+
Zamke pri bridgingu i JSON transkodiranju
Mnoge implementacije stavljaju Envoy (ili sličan) proxy ispred gRPC servera:
- grpc_web filter prevodi HTTP/1.1 POST-ove u HTTP/2 gRPC.
- gRPC‑JSON Transcoder izlaže gRPC metode kao HTTP JSON krajnje tačke kada su .proto options (google.api.http) prisutne.
Sa stanovišta pentestinga:
- Pokušajte direktne HTTP JSON pozive na /
. / sa application/json kada je transcoder omogućen (auth/route neusaglašenosti su česte):
curl -i https://host.tld/pkg.svc.v1.Service/Method \
-H 'Content-Type: application/json' \
-d '{"field":"value"}'
- Proverite da li se nepoznate metode/parametri odbacuju ili prosleđuju. Neke konfiguracije prosleđuju nepodudarne putanje upstream, povremeno zaobilazeći auth ili request validation.
- Obratite pažnju na x-envoy-original-path i srodne headers koje dodaju proxy-ji. Upstreams koji im veruju mogu biti zloupotrebljeni ako proxy ne uspe da ih sanitizuje.
Izvori
- Hacking into gRPC‑Web Article by Amin Nasiri
- gRPC‑Web Pentest Suite
- gRPC‑Web protocol notes (PROTOCOL‑WEB.md)
tip
Učite i vežbajte AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:
HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
HackTricks