Skip to main content

Discord OSINT Assistant v2.1: 31 Commands for Team OSINT

· 5 min read
gl0bal01
Researcher

OSINT CTFs are a team sport, and the bottleneck is almost never knowledge — it's coordination. During a competition, our team was hitting maritime challenges, aviation challenges, username enumeration, the full spread. And a significant chunk of time just evaporated into "which tool do I use for this?" and "is that source reliable enough to submit on?"

The experienced members had their go-to sources. The newer ones didn't, and asking mid-CTF burns time for everyone. What I wanted was one bot covering the reliable tools for the most common challenge types — so the question becomes "what do I know about this target?" instead of "where do I even start?"

That's Discord OSINT Assistant. 31 slash commands across 8 categories, results in the channel where the whole team sees them. No divergent environments, no "which Python version do you have", no shared credentials in chat.

31 Commands Across 8 Categories

Identity & Social

/bob-sherlock    username search across 400+ platforms
/bob-maigret deep username profiling
/bob-nuclei username enumeration via Nuclei OSINT templates
/bob-linkook link analysis
/bob-ghunt Google account investigation
/bob-generate-usernames 500+ username variations from a name

Domain & Network

/bob-dns         DNS records lookup
/bob-whoxy WHOIS history and reverse WHOIS
/bob-hostio hosting intel
/bob-recon-web web reconnaissance
/bob-redirect-chain follow redirect chains
/bob-favicons favicon hashing for infrastructure pivoting

Image & Media

/bob-exif        EXIF metadata with GPS mapping
/bob-rekognition AWS Rekognition facial analysis and object detection

Blockchain

/bob-blockchain        multi-chain address lookup (BTC/ETH/BSC/Polygon)
/bob-blockchain-detect auto-detect address format

Transportation

/bob-aviation     flight tracking
/bob-airport airport data
/bob-flight-number flight history by number
/bob-vessels maritime vessel intelligence

Business & Identity

/bob-pappers  French company registry (Pappers)
/bob-vpic vehicle VIN lookup
/bob-nike Nike Run Club profile search

Analysis

/bob-chat          AI chat (multi-model)
/bob-jwt decode, tamper, and crack JWT tokens
/bob-xeuledoc Google Docs metadata
/bob-extract-links extract all links from a page
/bob-dork Google dorking

Ops

/bob-monitor  target monitoring with alerts
/bob-health system health check

External CLI tools — Sherlock, Maigret, Nuclei, ExifTool, GHunt, xeuledoc, Linkook, jwt_tool — are optional. Commands that need a missing tool tell you what to install. Third-party API keys (Whoxy, Host.io, AviationStack, AWS) unlock additional commands, but none are required to start.

A CTF Session

Maritime challenge: vessel name, you need the flag state and last known port. /bob-vessels with the name. Results in the channel, everybody sees it, someone immediately cross-references with the aviation challenge because they noticed the same port city.

That cross-reference happens because the data is shared. When one person runs a tool locally, that connection never gets made — you'd have to describe what you found, paste it, wait. In the channel it's just there, and the team reacts to it in real time.

Same for username enumeration. /bob-sherlock username:target fires Sherlock across 400+ platforms. While that's running, someone else hits /bob-generate-usernames name:"First Last" to get the variation list. Two people, one channel, no coordination overhead.

v2.1.0: Security Hardening Pass

A bot that runs external tools on user-supplied input has an interesting attack surface. v2.1.0 is a full sweep of what happens when someone types something creative into a command field.

Shell injection eliminated — all external tools now run via spawn() with shell: false through utils/process.js. Arguments are passed as arrays, never interpolated into command strings. I audited every old shell-interpolation call after realizing a single quote in a username was enough to break out. Child processes get a stripped environment (PATH, HOME, LANG only — no API keys or tokens leak into subprocesses).

SSRF protectionutils/ssrf.js validates resolved IPs against private ranges at both DNS resolution and connect time via pinned HTTP agents. Blocks IPv4-mapped IPv6 bypasses. Redirect targets re-validated on each hop.

Input validationutils/validation.js centralizes validation for usernames, domains, URLs, emails, and IPs. Strips shell metacharacters, null bytes, newlines, and Unicode fullwidth bypass characters before anything reaches an external tool.

XSS prevention — HTML reports (GHunt, Nike) now escape all user-controlled content via escapeHtml().

Permission gating — Nuclei requires Administrator. Sherlock, Maigret, GHunt, JWT cracking, Rekognition, Monitor, Linkook, and xeuledoc require ManageGuild. Configurable via OSINT_ALLOWED_ROLES.

Rate limiting — per-user cooldowns at 3s (lightweight), 10s (medium), and 30s (heavy tools) with configurable daily limits.

Guild whitelist — set ALLOWED_GUILD_IDS to restrict which servers the bot operates in. Auto-leaves unauthorized servers on startup and when invited.

Docker hardeningcap_drop: ALL, read-only filesystem, non-root user, memory and PID limits, tmpfs mounts with size caps, health check.

CI — test matrix across Node 20/22, eslint, npm audit, Trivy image scanning, all Actions pinned to commit SHAs. 45 vitest tests covering validation, SSRF, process execution, and rate limiting.

Breaking Changes in v2.1.0

  • Node.js ≥20 required
  • Login monitoring removed from /bob-monitor — the previous implementation stored plaintext credentials. Gone.
  • Sensitive commands now require ManageGuild by default

Quick Start

git clone https://github.com/gl0bal01/discord-osint-assistant.git
cd discord-osint-assistant
bun install
cp .env.example .env # add DISCORD_TOKEN and CLIENT_ID at minimum
bun run deploy # register slash commands
bun run start

Docker:

cp .env.example .env
docker compose up -d

If your team runs OSINT work or CTFs in Discord, this fits without adding a new tool to the stack — it lives where the conversation already happens. github.com/gl0bal01/discord-osint-assistant