Pentesting gRPC-Web
Tip
Impara e pratica il hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al đŹ gruppo Discord o al gruppo telegram o seguici su Twitter đŚ @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.
Rapida panoramica del protocollo e superficie dâattacco
- Trasporto: gRPCâWeb usa una variante compatibile con i browser di gRPC su HTTP/1.1 o HTTP/2 tramite un proxy (Envoy/APISIX/grpcwebproxy/etc.). Sono supportate solo chiamate unary e serverâstreaming.
- Content-Types che vedrai:
- application/grpc-web (con framing binario)
- application/grpc-web-text (framing codificato in base64 per lo streaming su HTTP/1.1)
- Framing: ogni messaggio è prefissato da unâintestazione gRPC di 5 byte (1âbyte flags + 4âbyte length). In gRPCâWeb, i trailers (grpc-status, grpc-message, âŚ) sono inviati dentro il body come un frame speciale: primo byte con MSB settato (0x80) seguito da una lunghezza e da un blocco di header in stile HTTP/1.1.
- Header di richiesta comuni: x-grpc-web: 1, x-user-agent: grpc-web-javascript/âŚ, grpc-timeout, grpc-encoding. Le risposte espongono grpc-status/grpc-message tramite trailers/frame nel body e spesso tramite Access-Control-Expose-Headers per i browser.
- Middleware rilevanti per la sicurezza spesso presenti:
- Envoy grpc_web filter e gRPCâJSON transcoder (ponte HTTP<->gRPC)
- Plugin gRPCâWeb per Nginx/APISIX
- Policy CORS sul proxy
Cosa implica per gli attaccanti:
- Puoi costruire richieste a mano (binario o testo base64), oppure lasciare che gli strumenti le generino/codifichino.
- Errori CORS sul proxy possono consentire chiamate gRPCâWeb crossâsite autenticate (simili ai classici problemi CORS).
- I bridge di JSON transcoding possono esporre involontariamente metodi gRPC come endpoint HTTP non autenticati se routes/auth sono mal configurati.
Testare gRPCâWeb dalla CLI
PiĂš semplice: buf curl (supporta nativamente gRPCâWeb)
- Elenca i metodi via reflection (se abilitato):
# list methods (uses reflection)
buf curl --protocol grpcweb https://host.tld --list-methods
- Chiama un metodo con input JSON, gestendo automaticamente il framing e gli headers di gRPCâWeb:
buf curl --protocol grpcweb \
-H 'Origin: https://example.com' \
-d '{"field":"value"}' \
https://host.tld/pkg.svc.v1.Service/Method
- Se reflection è disabilitata, fornisci un schema/descriptor set con âschema oppure punta a file .proto locali. Vedi buf help curl.
Raw con curl (intestazioni manuali + corpo incorniciato)
Per la modalitĂ binaria (application/grpc-web), invia un payload incorniciato (prefisso di 5âbyte + messaggio protobuf). Per la modalitĂ testo, codifica in base64 il payload incorniciato.
# 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
Suggerimento: Forza la modalitĂ base64/text con application/grpc-web-text quando gli intermediari HTTP/1.1 interrompono lo streaming binario.
Verificare il comportamento 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'
- Una configurazione vulnerabile spesso riflette un Origin arbitrario e invia Access-Control-Allow-Credentials: true, permettendo chiamate crossâsite autenticate. Controlla anche che Access-Control-Expose-Headers includa grpc-status, grpc-message (molti deployment espongono questi per le librerie client).
Per tecniche generiche per abusare di CORS, consulta CORS - Misconfigurations & Bypass.
Manipolare i payload di gRPCâWeb
gRPCâWeb usa Content-Type: application/grpc-web-text come stream di frame gRPC avvolto in base64 per la compatibilitĂ col browser. Puoi decodificare/modificare/ricodificare i frame per manomettere campi, invertire flag o iniettare payload.
Usa lo strumento gprc-coder (e la sua estensione per Burp) per velocizzare i roundâtrip.
Manuale con gGRPC Coder Tool
- Decodifica il payload:
echo "AAAAABYSC0FtaW4gTmFzaXJpGDY6BVhlbm9u" | python3 grpc-coder.py --decode --type grpc-web-text | protoscope > out.txt
- Modifica il contenuto del payload decodificato
nano out.txt
2: {"Amin Nasiri Xenon GRPC"}
3: 54
7: {"<script>alert(origin)</script>"}
- Codifica il nuovo payload
protoscope -s out.txt | python3 grpc-coder.py --encode --type grpc-web-text
- Usa lâoutput in Burp interceptor:
AAAAADoSFkFtaW4gTmFzaXJpIFhlbm9uIEdSUEMYNjoePHNjcmlwdD5hbGVydChvcmlnaW4pPC9zY3JpcHQ+
Manuale con gRPCâWeb Coder Burp Suite Extension
Puoi usare gRPCâWeb Coder Burp Suite Extension in gRPCâWeb Pentest Suite che è piĂš semplice. Puoi leggere le istruzioni di installazione e utilizzo nel suo repo.
Analisi dei file JavaScript gRPCâWeb
Le web app che utilizzano gRPCâWeb rilasciano almeno un bundle JS/TS generato. Effettua reverse-engineering su di essi per estrarre servizi, metodi e la struttura dei messaggi.
- Prova a usare gRPC-Scan per analizzare i bundle.
- Cerca percorsi di metodo come /
. / , numeri/tipi dei campi dei messaggi, e interceptor personalizzati che aggiungono header di autenticazione.
- Scarica il file JavaScript gRPCâWeb
- Scansionalo con grpc-scan.py:
python3 grpc-scan.py --file main.js
- Analizza lâoutput e testa i nuovi endpoint e i nuovi servizi:
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 |
+--------------+----------------+--------------+
Trappole del bridging e del JSON transcoding
Many deployments put an Envoy (or similar) proxy in front of the gRPC server:
- Il filtro grpc_web traduce HTTP/1.1 POSTs in HTTP/2 gRPC.
- Il gRPCâJSON Transcoder espone i metodi gRPC come endpoint HTTP JSON quando le opzioni .proto (google.api.http) sono presenti.
Dal punto di vista del pentesting:
- Prova chiamate HTTP JSON dirette a /
. / usando application/json quando è abilitato un transcoder (i mismatch di auth/route sono comuni):
curl -i https://host.tld/pkg.svc.v1.Service/Method \
-H 'Content-Type: application/json' \
-d '{"field":"value"}'
- Verificare se metodi/parametri sconosciuti vengono rifiutati o inoltrati. Alcune configurazioni inoltrano percorsi non corrispondenti upstream, talvolta eludendo lâauth o la validazione delle request.
- Osservare x-envoy-original-path e gli header correlati aggiunti dai proxy. Gli upstream che si fidano di questi possono essere abusati se il proxy non li sanitizza.
Riferimenti
- Hacking into gRPCâWeb Article by Amin Nasiri
- gRPCâWeb Pentest Suite
- gRPCâWeb protocol notes (PROTOCOLâWEB.md)
Tip
Impara e pratica il hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al đŹ gruppo Discord o al gruppo telegram o seguici su Twitter đŚ @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.
HackTricks

