Skip to content

Your C2 Resolver Is a Public GitHub Gist (and Sometimes a Twitter Bio)

GitHub Gist Dead-Drop C2 Resolver: Lab Tradecraft and Hunts

Your C2 Resolver Is a Public GitHub Gist (and Sometimes a Twitter Bio)

hard-coded C2 IPs get you burned. so the implant only knows a gist id. every hour it GETs a JSON blob from gist.githubusercontent.com, learns the real next hop, and downloads an ELF from a CDN. your proxy sees “developer browsing github.” the developer is a beacon.

Lab only. the gist id, JSON, and CDN URL below are synthetic (labdead01, lab-cdn.example). do not publish real redirectors on github as a “research project” tied to live victims. this is for red teams designing channel agility under rules of engagement, and for blue teams building detections around dead-drop resolvers.

dead drops, but with raw.githubusercontent.com

a dead drop is a place both sides can read/write without talking directly. cold war: a park bench. 2026: a public gist, a pastebin, a DNS TXT, a stego image, a social profile field. the implant ships with a pointer to the drop, not to the C2. operators rotate the drop content when infrastructure burns. github is popular because it is globally allowed, cached, and trusted by every corporate SSL intercept whitelist that gave up years ago.

Kali terminal creating a lab dead-drop JSON and noting the gist raw URL.
Step 1: operator publishes a tiny resolver JSON to a throwaway gist (lab simulation).
Kali terminal curling the gist raw URL, jq-printing the resolver, then fetching the next-stage ELF.
Step 2: implant resolves the drop, then pulls the next stage from the CDN URL inside.
Kali terminal decoding a base32 host from a mocked social media bio field.
Step 3: alternate drop. a social bio field carrying b32:host=… that looks like influencer sludge.
Kali terminal hunting hourly gist fetches followed by CDN binary downloads in proxy JSONL.
Step 4: hunt. hourly gist GET then CDN binary is not a human reading a readme.

why defenders care

  • github / gist / raw.githubusercontent.com from non-dev fleets (kiosks, servers, VDI pools that never commit code).
  • periodic GETs to the same gist path with a non-browser user-agent.
  • gist fetch followed quickly by a binary download from a young domain or odd CDN path.
  • signed vs unsigned: serious implants verify an ed25519 signature over the drop. if you catch the drop unsigned and mutable by anyone, that is also an IR gift (poison it in your sinkhole).
  • social bios / location fields scraped by odd processes. browsers render bios. python scripts should not.

detections and controls

  1. proxy categories: alert when endpoints outside eng/dev hit gist raw URLs on a schedule.
  2. correlate: gist/raw GET + subsequent file write + new egress within N minutes.
  3. canary: publish your own sinkhole gists and alert if anything internal resolves them (fun, petty, effective).
  4. for red team under ROE: prefer private gists or operator-controlled sites, sign every drop, and never leave live resolvers after the engagement.
  5. github itself: report abuse when you find live malware drops. do not DDoS the gist. that is not defense, that is a felony with extra steps.
honesty check: blocking all of github to “stop C2” is how you learn what a developer revolt looks like. prefer behavioral detection over nuclear allow-lists. if your only control is “github is scary,” you have already lost to the next paste site.

sloth take

attackers outsourced their redirector to a fortune-scale SaaS with a raw content CDN and a reputation your SSL appliance will not touch. that is not advanced. that is lazy in a way that works. hunt the pattern (periodic drop fetch, then stage), not the brand name. and maybe stop pretending every GET to githubusercontent is a human reading a license file at 3am.