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

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):
bash
# 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:
bash
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.

bash
# 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:
bash
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

  1. Dekodirajte payload:
bash
echo "AAAAABYSC0FtaW4gTmFzaXJpGDY6BVhlbm9u" | python3 grpc-coder.py --decode --type grpc-web-text | protoscope > out.txt
  1. Izmenite sadržaj dekodiranog payload
nano out.txt
2: {"Amin Nasiri Xenon GRPC"}
3: 54
7: {"<script>alert(origin)</script>"}
  1. Kodiraj novi payload
bash
protoscope -s out.txt | python3 grpc-coder.py --encode --type grpc-web-text
  1. 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.
  1. Preuzmite JavaScript gRPC‑Web fajl
  2. Skenirajte ga sa grpc-scan.py:
bash
python3 grpc-scan.py --file main.js
  1. 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):
bash
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

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