Pentesting gRPC-Web
Reading time: 7 minutes
tip
AWS Hacking'i öğrenin ve pratik yapın: HackTricks Training AWS Red Team Expert (ARTE)
HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın:  HackTricks Training GCP Red Team Expert (GRTE)
HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking'i öğrenin ve pratik yapın:
Azure Hacking'i öğrenin ve pratik yapın:  HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter'da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.
Hızlı protokol özeti ve saldırı yüzeyi
- Transport: gRPC‑Web, bir proxy (Envoy/APISIX/grpcwebproxy/etc.) aracılığıyla HTTP/1.1 veya HTTP/2 üzerinde tarayıcı‑uyumlu bir gRPC varyantı konuşur. Only unary and server‑streaming calls are supported.
- Görülecek Content-Types:
- application/grpc-web (ikili çerçeveleme)
- application/grpc-web-text (HTTP/1.1 streaming için base64 ile kodlanmış çerçeveleme)
- Framing: her mesaj 5‑baytlık bir gRPC başlığı ile ön eklenir (1‑bayt flags + 4‑bayt length). gRPC‑Web'de, trailers (grpc-status, grpc-message, …) özel bir frame olarak gövde içinde gönderilir: MSB setli ilk byte (0x80), ardından bir uzunluk ve HTTP/1.1‑stilinde bir header bloğu gelir.
- Yaygın istek başlıkları: x-grpc-web: 1, x-user-agent: grpc-web-javascript/…, grpc-timeout, grpc-encoding. Yanıtlar grpc-status/grpc-message'ı trailers/body frame'leri aracılığıyla ve tarayıcılar için sıklıkla Access-Control-Expose-Headers ile açığa çıkarır.
- Güvenlikle ilgili sık görülen middleware:
- Envoy grpc_web filter and gRPC‑JSON transcoder (HTTP<->gRPC bridge)
- Nginx/APISIX gRPC‑Web plugins
- Proxy üzerindeki CORS politikaları
Bu saldırganlar için ne anlama gelir:
- İstekleri elle oluşturabilirsiniz (binary veya base64 metin), ya da araçların bunları üretip/encode etmesine izin verebilirsiniz.
- Proxy'deki CORS hataları cross‑site, kimlikli gRPC‑Web çağrılarına izin verebilir (klasik CORS sorunlarına benzer).
- JSON transcoding köprüleri, routes/auth yanlış yapılandırılmışsa gRPC yöntemlerini istemeden kimliksiz HTTP endpointleri olarak açığa çıkarabilir.
CLI'den gRPC‑Web testi
En kolay: buf curl (gRPC‑Web'i yerel olarak destekler)
- Reflection üzerinden yöntemleri listele (etkinse):
# list methods (uses reflection)
buf curl --protocol grpcweb https://host.tld --list-methods
- JSON girişiyle bir method çağırın, gRPC‑Web framing ve headers'ı otomatik olarak yöneten:
buf curl --protocol grpcweb \
-H 'Origin: https://example.com' \
-d '{"field":"value"}' \
https://host.tld/pkg.svc.v1.Service/Method
- Reflection devre dışıysa, --schema ile bir schema/descriptor set sağlayın veya yerel .proto dosyalarına işaret edin. Detaylar için: buf help curl.
Curl ile ham (manuel başlıklar + çerçevelenmiş gövde)
Binary modunda (application/grpc-web) çerçevelenmiş bir payload gönderin (5‑byte prefix + protobuf message). Text modunda ise çerçevelenmiş payload'u base64‑encode edin.
# 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
İpucu: HTTP/1.1 aracılar binary streaming'i bozduğunda application/grpc-web-text ile base64/text modunu zorlayın.
CORS davranışını kontrol edin (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'
- Savunmasız bir kurulum genellikle rastgele Origin'i yansıtır ve Access-Control-Allow-Credentials: true gönderir; bu cross‑site kimlikli çağrılara izin verir. Ayrıca Access-Control-Expose-Headers'ın grpc-status, grpc-message içerdiğini kontrol edin (birçok dağıtım bunları client kütüphaneleri için açar).
For generic techniques to abuse CORS, check CORS - Misconfigurations & Bypass.
gRPC‑Web payload'larını manipüle etme
gRPC‑Web, tarayıcı uyumluluğu için Content-Type: application/grpc-web-text kullanır; bu, base64 ile sarılmış bir gRPC frame akışıdır. Frame'leri dekode/değiştir/enkode ederek alanlarla oynayabilir, flag'leri çevirebilir veya payload'lar enjekte edebilirsiniz.
Use the gprc-coder tool (and its Burp extension) to speed up round‑trips.
gGRPC Coder Tool ile Manuel
- Payload'ı dekode et:
echo "AAAAABYSC0FtaW4gTmFzaXJpGDY6BVhlbm9u" | python3 grpc-coder.py --decode --type grpc-web-text | protoscope > out.txt
- Dekode edilmiş payload içeriğini düzenle
nano out.txt
2: {"Amin Nasiri Xenon GRPC"}
3: 54
7: {"<script>alert(origin)</script>"}
- Yeni payload'ı kodla
protoscope -s out.txt | python3 grpc-coder.py --encode --type grpc-web-text
- Çıktıyı Burp interceptor'da kullan:
AAAAADoSFkFtaW4gTmFzaXJpIFhlbm9uIEdSUEMYNjoePHNjcmlwdD5hbGVydChvcmlnaW4pPC9zY3JpcHQ+
gRPC‑Web Coder Burp Suite Extension ile Manuel
Daha kolay olması için gRPC‑Web Pentest Suite içindeki gRPC‑Web Coder Burp Suite Extension'ı kullanabilirsiniz. Kurulum ve kullanım talimatlarını repo'sunda okuyabilirsiniz.
gRPC‑Web JavaScript dosyalarını analiz etme
gRPC‑Web kullanan web uygulamaları en az bir üretilmiş JS/TS bundle ile gelir. Hizmetleri, metodları ve mesaj yapılarını çıkarmak için bunları tersine mühendislik yapın.
- Bundle'ları ayrıştırmak için gRPC-Scan kullanmayı deneyin.
- /. / gibi method path'lerini, mesaj alan numaralarını/tiplerini ve auth header ekleyen özel interceptor'ları arayın. 
- gRPC‑Web JavaScript dosyasını indirin
- Bunu grpc-scan.py ile tarayın:
python3 grpc-scan.py --file main.js
- Çıktıyı analiz edin ve yeni endpoints'leri ve yeni services'leri test edin:
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
Birçok dağıtım, gRPC sunucusunun önüne Envoy (veya benzeri) bir proxy koyar:
- grpc_web filter HTTP/1.1 POSTs'ı HTTP/2 gRPC'ye çevirir.
- gRPC‑JSON Transcoder, .proto options (google.api.http) mevcut olduğunda gRPC methods'ı HTTP JSON endpoints olarak açar.
Pentesting açısından:
- Bir transcoder etkin olduğunda, /. / adresine application/json ile doğrudan HTTP JSON çağrıları yapmayı dene (auth/route mismatches yaygındır): 
curl -i https://host.tld/pkg.svc.v1.Service/Method \
-H 'Content-Type: application/json' \
-d '{"field":"value"}'
- Bilinmeyen method/parametrelerin reddedilip reddedilmediğini veya geçirildiğini inceleyin. Bazı konfigürasyonlar eşleşmeyen path'leri upstream'e ileterek bazen auth veya request validation'ı atlayabilir.
- Proxy'lerin eklediği x-envoy-original-path ve ilgili header'ları gözlemleyin. Bu header'lara güvenen upstream'ler, proxy bunları sanitize edemezse istismar edilebilir.
Referanslar
- Hacking into gRPC‑Web Article by Amin Nasiri
- gRPC‑Web Pentest Suite
- gRPC‑Web protocol notes (PROTOCOL‑WEB.md)
tip
AWS Hacking'i öğrenin ve pratik yapın: HackTricks Training AWS Red Team Expert (ARTE)
HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın:  HackTricks Training GCP Red Team Expert (GRTE)
HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking'i öğrenin ve pratik yapın:
Azure Hacking'i öğrenin ve pratik yapın:  HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter'da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.
 HackTricks
HackTricks