# Pentesting gRPC-Web {{#include ../banners/hacktricks-training.md}} ## **Manipulation des charges utiles gRPC-Web** gRPC-Web utilise Content-Type: `application/grpc-web-text` dans les requêtes, qui est une sorte de protobuf sous forme encodée en base64. Vous pouvez utiliser l'outil [gprc-coder](https://github.com/nxenon/grpc-pentest-suite) et vous pouvez également installer son [Burp Suite Extension](https://github.com/nxenon/grpc-pentest-suite). ### **Manuel avec l'outil gGRPC Coder** 1. Tout d'abord, décodez la charge utile : ```bash echo "AAAAABYSC0FtaW4gTmFzaXJpGDY6BVhlbm9u" | python3 grpc-coder.py --decode --type grpc-web-text | protoscope > out.txt ``` 2. Modifier le contenu de la charge utile décodée ``` nano out.txt 2: {"Amin Nasiri Xenon GRPC"} 3: 54 7: {""} ``` 3. Encoder le nouveau payload ```bash protoscope -s out.txt | python3 grpc-coder.py --encode --type grpc-web-text ``` 4. Utilisez la sortie dans l'intercepteur Burp : ``` AAAAADoSFkFtaW4gTmFzaXJpIFhlbm9uIEdSUEMYNjoePHNjcmlwdD5hbGVydChvcmlnaW4pPC9zY3JpcHQ+ ``` ### **Manuel avec l'extension gRPC-Web Coder Burp Suite** Vous pouvez utiliser l'extension gRPC-Web Coder Burp Suite dans [gRPC-Web Pentest Suite](https://github.com/nxenon/grpc-pentest-suite) qui est plus facile. Vous pouvez lire les instructions d'installation et d'utilisation dans son dépôt. ## **Analyse des fichiers Javascript gRPC-Web** Il y a au moins un fichier Javascript dans chaque application gRPC-Web. Vous pouvez analyser le fichier pour trouver de nouveaux messages, points de terminaison et services. Essayez d'utiliser l'outil [gRPC-Scan](https://github.com/nxenon/grpc-pentest-suite). 1. Téléchargez le fichier Javascript gRPC-Web 2. Scannez-le avec grpc-scan.py : ```bash python3 grpc-scan.py --file main.js ``` 3. Analysez la sortie et testez les nouveaux points de terminaison et les nouveaux 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 | +--------------+----------------+--------------+ ``` ## Références - [Hacking into gRPC-Web Article by Amin Nasiri](https://infosecwriteups.com/hacking-into-grpc-web-a54053757a45) - [gRPC-Web Pentest Suite](https://github.com/nxenon/grpc-pentest-suite) {{#include ../banners/hacktricks-training.md}}