agentleFS
mahumadadmahumadad/quarry/skills/hunt/grpc/SKILL.md

grpc

Skill1 starsChanged 12 days agoMITView on GitHub

Test gRPC services: reflection enumeration, plaintext/TLS downgrade, auth in metadata, message-level authorization gaps, and known-method fuzzing. Use when recon finds an HTTP/2 service speaking gRPC (content-type application/grpc, :status trailers, grpc-web proxies) or a mobile/microservices backend with protobuf APIs. Keywords: grpc, protobuf, grpcurl, reflection, grpc-web, HTTP/2, metadata auth, server reflection, protoset, microservices. Do NOT use for plain REST/JSON APIs (use api-abuse) or GraphQL (use graphql).

6 other projects use a version of this.

Adopted by

Most recently taken up by

Used with

Projects with it also use nodejs, gcp and 2 more.

Other files people use alongside this one.

Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
  • rogue-dev-studioSkill

    nodejs

    Node.js development environment. Use when the project needs this capability or the user / team manifest asks for it. Use for specialized `nodejs` work when listed in TEAM.yaml or explicitly requested.

    Also in 3 projects that use this

  • ffsshhttiikkSkill

    gcp

    Google Cloud Platform services and best practices

    Also in 3 projects that use this

  • JetBrainsSkill

    vue

    Vue 3 Composition API, script setup macros, reactivity system, and built-in components. Use when writing Vue SFCs, defineProps/defineEmits/defineModel, watchers, or using Transition/Teleport/Suspense/KeepAlive.

    Also in 3 projects that use this

  • MicrosoftSkill

    github-actions

    Use when creating, editing, reviewing, or troubleshooting GitHub Actions workflows in Scope.

    Also in 3 projects that use this

The file

We split this skill into the rules it gives an agent

3 rules. 0 are common, 3 are distinctive, and 0 are very specific to this project.

  • 0

    Common

    Most of the 5 edited versions we read keep these.

  • 3

    Distinctive

    This author's own choices. Worth a look.

  • 0

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Transport security: test plaintext acceptance on TLS-expecting ports and h2c exposure.

    line 53
  2. Distinctive:

    Test: (a) no metadata at all — many internal-trust services answer unauthenticated.

    line 61
  3. Distinctive:

    grpc-web divergence: if the app exposes BOTH grpc-web (browser) and native gRPC (partners/internal), diff their auth and rate-limit …

    line 79

“Common” is measured: kept by at least 6 in 10 of the 5 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Signals

  • Port serving HTTP/2 with content-type: application/grpc responses, or h2c (cleartext HTTP/2) on internal-exposed ports (8080, 50051 typical).
  • application/grpc-web endpoints on the main web app (browser clients via a proxy — often with DIFFERENT auth handling than native gRPC).
  • Mobile app or SPA shipping .proto-derived clients; protobuf wire format visible in proxied traffic.
  • Microservices architecture from app-profile — internal gRPC services sometimes surface through misconfigured ingress/gateways.

Methodology

  1. Enumerate via server reflection (the jackpot):
    grpcurl -plaintext target:50051 list
    grpcurl -plaintext target:50051 list package.ServiceName
    grpcurl -plaintext target:50051 describe package.ServiceName.Method
    Reflection enabled in production = full API schema disclosure (finding on its own, info/low) AND the map for everything below.
  2. No reflection → reconstruct the schema. Pull protos from: mobile app decompilation, public GitHub (github-dorking skill), grpc-web JS bundles, or guess well-known service names (health checks grpc.health.v1, common CRUD naming). Build a protoset:
    protoc --descriptor_set_out=api.protoset --include_imports api.proto
    grpcurl -protoset api.protoset -plaintext target:50051 list
  3. Transport security: test plaintext acceptance on TLS-expecting ports and h2c exposure. Cleartext gRPC carrying auth tokens = CWE-319.
  4. Auth in metadata, not messages. gRPC auth rides in metadata headers:
    grpcurl -H "authorization: Bearer TOKEN" -plaintext target:50051 \
      package.Service/Method -d '{"id": "1"}'
    Test: (a) no metadata at all — many internal-trust services answer unauthenticated; (b) expired/foreign token; (c) token from a different service/audience (confused-deputy between microservices).
  5. Message-level authorization (the gRPC IDOR). AuthN happens at the metadata layer; object-level checks live in handler code and are often missing because "the gateway checks that". Swap object IDs in message fields using the session-context discipline (same call as user_a/user_b):
    grpcurl -H "authorization: Bearer USER_B_TOKEN" target:443 \
      billing.Billing/GetInvoice -d '{"invoice_id": "USER_A_INVOICE"}'
  6. Input validation on scalar/bytes fields: protobuf is typed, but string and bytes fields carry the same injection classes as REST — SQLi, SSTI, command injection, oversized messages (decompression bombs with grpc-encoding gzip). Route through the relevant hunt skill on a hit.
  7. grpc-web divergence: if the app exposes BOTH grpc-web (browser) and native gRPC (partners/internal), diff their auth and rate-limit behavior — proxies frequently normalize differently and one path skips checks.

Tooling

  • grpcurl — the core client (reflection, protoset, custom metadata).
  • grpcui — interactive exploration once a protoset exists.
  • protoc --descriptor_set_out — build protosets from recovered .proto files.
  • nuclei -tags grpc — quick exposure/misconfig triage.

Validation Gate (minimum proof)

  • Schema disclosure: list/describe output captured from the live service (not from repo files alone).
  • Missing authN: a successful response to a call that per app-profile requires authentication, with the exact -d message and absent metadata documented.
  • Missing authZ (IDOR): identity-swapped call returning another tenant's object — session-context diff evidence applies.
  • Cleartext: successful -plaintext call carrying real data on a port reachable from the tested network position.

Gotchas

  • Reflection absent ≠ secure. State it as schema-not-enumerated (a coverage gap), never as "not vulnerable".
  • Health service responding (grpc.health.v1.Health/Check) is normal — note it, don't report it as exposure unless it leaks service internals.
  • Load balancers terminate HTTP/2 badly: some LBs downgrade or strip trailers — a flaky grpcurl may be infra, not the app. Retry with -v and note transport behavior in evidence.
  • Streaming methods need explicit message counts in grpcurl (-d per message); a hanging stream is not a crash — set deadlines.
  • Internal gRPC exposed via misconfigured ingress is in scope only if the endpoint is reachable from your authorized network position — check scope before deep testing of an internal service surfaced by accident.

Chain Anchors

  1. Unauthenticated gRPC → enumerate ALL services/methods via reflection → map which mutate state (operator gate before invoking).
  2. Metadata-confusion possible → test cross-service token reuse for lateral movement between microservices (chain-multi-app).
  3. Injection in a string field → hand to sqli/rce with the working gRPC transport as the delivery mechanism (payload via -d).

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.