Illuminate the unindexed web. Hunt threats at the source.
Mission Β·
Capabilities Β·
Architecture Β·
Install Β·
Modules Β·
Workflow Β·
Ethics
TORNET GRANTED is an intelligence-grade reconnaissance platform that discovers, validates, renders and enumerates Tor hidden services β turning the noise of the dark web into structured, attributable signal for analysts, investigators and defenders.
It was originally built in response to Problem Statement PSID-1455 of the Smart India Hackathon 2023, and has since matured into an open-source tactical console that operators can deploy on a single host β entirely self-contained, air-gappable, and fully attributable to a single operator identity per session.
The Onion Routing network provides legitimate anonymity to journalists, activists, and at-risk users. It is also abused by threat actors. The defensive cyber community needs lightweight tooling to observe, catalogue, and report on that abuse β without participating in it.
| Most OSINT Tools | TORNET GRANTED | |
|---|---|---|
| Tor-native collection | Optional add-on | First-class. Every request egresses over the local Tor SOCKS5 circuit. |
| Unified workflow | One tool per task | Six tightly-integrated modules in a single console. |
| Self-hosted | Cloud SaaS w/ telemetry | Drop on a single host. Zero outbound telemetry. |
| Operator-attributable | Anonymous bulk runs | Every artefact traceable to an operator session. |
| Scheduled collection | Manual or external cron | Built-in mission scheduler with SMTP delivery. |
| Forensic media support | Separate ExifTool wrapper | EXIF intelligence integrated with leak hunting. |
| # | Module | Purpose | Surfaces |
|---|---|---|---|
| 01 | Discover Onion URLs | Recursive multi-engine scraping of dark-web indexers by keyword. | Catalogued .onion endpoints, exportable as TXT/JSON/PDF |
| 02 | Validate Hidden Services | Liveness probing for single or bulk targets through SOCKS5. | Active / Dead segmentation, response headers, server banners |
| 03 | DOM Extraction | Static fetch & render of the document model of any hidden service. | Source markup, asset references, embedded artefacts |
| 04 | Enumerate & Fingerprint | Regex-driven leak hunt + fuzzing of common configuration paths. | Credentials, crypto wallets, emails, domain references, /.env leaks |
| 05 | EXIF / Media Forensics | Hidden metadata extraction from images and media. | GPS, device fingerprints, embedded comments, timestamps |
| 06 | Mission Scheduler | Cron-style recurring or one-shot operation queueing. | Automated delivery of intelligence digests via SMTP |
flowchart LR
Operator((π§ββοΈ Operator)) -->|Sign-in| Console[TORNET Console<br/>Flask + Jinja2]
Console --> ModDis[Discover]
Console --> ModVal[Validate]
Console --> ModDom[DOM Extract]
Console --> ModEnu[Enumerate]
Console --> ModExi[EXIF Forensics]
Console --> ModSch[Scheduler]
ModDis & ModVal & ModDom & ModEnu --> Tor[(Tor Daemon<br/>SOCKS5 :9050)]
Tor -->|Hidden Service Lookup| Hidden[Onion Services<br/>v3 .onion network]
ModExi --> ExifTool[(ExifTool)]
ModSch --> APS[(APScheduler<br/>Cron Triggers)]
APS -->|On trigger| Mail[(SMTP<br/>Gmail App Password)]
Mail --> Inbox{{Analyst Inbox}}
Console -.-> DB[(SQLite<br/>users.db<br/>operators Β· API keys)]
classDef ext fill:#0b1118,stroke:#00e5ff,color:#e6eef7,stroke-width:1px;
classDef core fill:#111a25,stroke:#6aa6ff,color:#e6eef7,stroke-width:1px;
class Console,ModDis,ModVal,ModDom,ModEnu,ModExi,ModSch core
class Tor,ExifTool,APS,Mail,DB,Hidden,Inbox ext
Design tenets
- Single binary host. Python 3 + Flask + SQLite. No external services required for collection.
- Tor-only egress. All recon traffic is routed through the local Tor SOCKS5 proxy (
127.0.0.1:9050). - Operator-attributable. Every session is bound to an authenticated operator identity stored in
users.db. - Pluggable export. Findings can be exported as
TXT,JSONor analyst-readyPDF.
flowchart LR
A[π COLLECT<br/><b>Discover</b><br/>Recursive keyword scrape] --> B[π©Ί TRIAGE<br/><b>Validate</b><br/>Liveness + banners]
B --> C[π INSPECT<br/><b>Render</b><br/>DOM + assets]
C --> D[π ENRICH<br/><b>Enumerate</b><br/>Leak hunt + fuzz]
D --> E[π¦ REPORT<br/><b>Schedule</b><br/>Auto-delivery]
classDef step fill:#111a25,stroke:#00e5ff,color:#e6eef7,stroke-width:1.5px;
class A,B,C,D,E step
- Collect β issue a keyword query at a chosen recursion depth.
- Triage β bulk-probe the catalogued endpoints to segment active vs. dead pools.
- Inspect β render the DOM of high-priority targets for manual review.
- Enrich β run regex-driven leak hunting and fuzz for misconfigurations.
- Report β schedule recurring collection and dispatch intelligence digests by email.
| Component | Purpose |
|---|---|
| Python 3.9+ | Runtime |
| Tor daemon | SOCKS5 egress for all collection |
| ExifTool | Media metadata extraction |
git clone https://github.com/prakhar0x01/Tornet_Granted.git
cd Tornet_Granted
pip install -r requirements.txt
# Install supporting binaries
sudo apt install tor exiftool # Debian / Ubuntu
brew install tor exiftool # macOS (Homebrew)
# Start the Tor daemon (SOCKS5 on 127.0.0.1:9050)
sudo systemctl start tor # systemd
# β or β
sudo service tor startgit clone https://github.com/prakhar0x01/Tornet_Granted.git
cd Tornet_Granted
pip install -r requirements.txtThen install the Windows binaries from:
- Tor β https://www.torproject.org/download/tor/
- ExifTool β https://exiftool.org/
python app.pyOpen the operator console at http://127.0.0.1:5000/ and authenticate.
π Bootstrap director credentials β
admin/admin. Rotate immediately from the Administration β Credentials panel on first sign-in.
flowchart TD
L[Landing /home] --> S{Operator?}
S -- No --> L
S -- Yes --> Auth[/POST /login/]
Auth -->|valid| D[Command Center /dashboard]
Auth -->|invalid| Auth
D --> Modules[Recon & Forensic Modules]
D --> Adm{Director?}
Adm -- Yes --> AdmPanel[Roster Β· Provision Β· Rotate]
Adm -- No --> Un[401 Β· Mission Aborted]
- The console does not allow self-registration.
- Only the
admindirector can provision new operators or rotate credentials. - All credentials are stored as SHA-256 digests in SQLite (
instance/users.db). - Every operator is issued a stateless
TORNETβ¦API key and a 40-char secret access key.
Recursive scraping of dark-web indexers for keyword-relevant hidden services.
- Search by keyword (e.g.
markets,leaks,crypto,forums) - Tune recursion depth (1β5) to balance breadth and runtime
- Export the catalogue as
TXT,JSON, or analyst-readyPDF
β Higher depths exponentially increase runtime. Depths β₯ 3 may take several minutes per circuit depending on ISP, network conditions and target latency.
02 Β· Validate Hidden Services
Single-shot or bulk-upload validation of .onion endpoints through Tor SOCKS5.
- Single-target probe β returns response code & full HTTP headers
- Bulk probe β
.txtupload, one URL per line - Active/Dead segmentation with exportable report
Static fetch of the document model of any hidden service.
- Useful for inspecting markup, asset references, embedded scripts, obfuscated payloads
- No JavaScript execution on the target β purely static fetch over Tor
- Syntax-highlighted source view (highlight.js Β· Atom One Dark)
Regex-driven leak detection plus guided fuzzing of common configuration paths.
| Category | Severity | Why it matters |
|---|---|---|
| Plaintext credentials | π΄ CRITICAL | Direct operator access |
Exposed .env / .git |
π΄ CRITICAL | Server attribution |
| Clearnet domain references | π HIGH | Pivot to clearnet infra |
| Crypto wallet addresses | π‘ MEDIUM | Financial attribution |
| Email / contact vectors | π‘ MEDIUM | Operator OPSEC failure |
| Usernames | π΅ LOW | Persona linkage |
π‘ Why fuzz for server config? Historical OPSEC failures (e.g. Silk Road, AlphaBay) often stemmed from misconfigured
phpinfo()pages, exposed.gitdirectories, or default server-status endpoints. The Fuzz toggle walks the platform wordlist (internal/wordlists.txt) for these vectors.
Metadata extraction from media artefacts collected from dark-web sources.
- GPS coordinates, device make/model, software signatures
DateTimeOriginal,UserComment, embedded thumbnail data- All analysis happens locally β artefacts are never uploaded externally
π‘ Why this matters. Adversaries communicating over dark-web chat rooms frequently exchange media files. Hidden EXIF metadata has historically exposed real-world geolocations and devices.
Cron-style scheduling of recurring reconnaissance.
- Schedule discovery operations by date/time
- Results delivered automatically via SMTP to a recipient inbox
- Powered by APScheduler
π¨ SMTP delivery requires Gmail credentials in
config.txt:email=youraddress@gmail.com password=your-16-char-gmail-app-password
| Layer | Technology |
|---|---|
| Runtime | Python 3.9+ |
| Web framework | Flask Β· Jinja2 templates |
| Sessions | Flask-Login |
| Persistence | SQLite 3 via Flask-SQLAlchemy |
| Scheduling | APScheduler (BackgroundScheduler + CronTrigger) |
| Anonymous egress | Tor daemon Β· SOCKS5 127.0.0.1:9050 |
| HTTP | Requests + SOCKS adapter |
| DOM parsing | BeautifulSoup 4 |
| Forensics | ExifTool |
| Reporting | ReportLab (PDF) |
| Crypto | pyOpenSSL Β· hashlib SHA-256 |
| Frontend | Vanilla CSS design system Β· zero build step |
Tornet_Granted/
βββ app.py # Flask routes, models, scheduler
βββ config.txt # SMTP credentials (Gmail App Password)
βββ requirements.txt
βββ instance/
β βββ users.db # SQLite operator store
βββ internal/
β βββ wordlists.txt # Fuzz wordlist
β βββ discover/ # Discovery scratch space
β βββ validate/ # Validation scratch space
β βββ details/ # Enumeration scratch space
β βββ uploads/ # EXIF artefact uploads
βββ static/ # Design system + assets
β βββ css/
β β βββ tokens.css # Color, type, spacing tokens
β β βββ components.css # Buttons, cards, tables, pills
β β βββ app.css # Console shell layout
β βββ js/app.js # UI helpers (toast, copy, dropzone, hero net)
β βββ img/
βββ templates/
βββ base.html # Shell extending all pages
βββ partials/
β βββ _brand.html
β βββ _sidebar.html
β βββ _topbar.html
βββ pages/
β βββ landing.html # Public marketing page (/home)
βββ login.html # Operator sign-in
βββ dashboard.html # Command Center
βββ discover.html # Module 01
βββ validate.html # Module 02
βββ render.html # Module 03
βββ details.html # Module 04
βββ metadata.html # Module 05
βββ schedule.html # Module 06
βββ users.html # Admin Β· Operator Roster
βββ add_user.html # Admin Β· Provision Operator
βββ update_user.html # Admin Β· Rotate Credential
βββ unauthorize.html # 401 Β· Mission Aborted
|
Track emergence of new marketplaces, leak forums, and ransomware blogs. Establish persistent collection on adversary infrastructure. |
Identify operators exposed through metadata, server misconfigurations, leaked
|
Detect brand impersonation, leaked customer data, and unauthorised resale of corporate intellectual property on hidden services. |
|
Pivot from observed indicators (Bitcoin addresses, contact emails, PGP keys) to attribute infrastructure across the hidden web. |
Longitudinal datasets of hidden service availability, content categorisation, and topology of the v3 onion graph. |
Structured evidence collection workflows with operator-attributable audit trails for accredited investigative units. |
Contributions from the community are very welcome.
Ways to contribute
- Fork the repository, branch from
main, submit a PR. - Match the existing code style and add tests where practical.
- Open an issue first for non-trivial features so we can align on scope.
- Include reproduction steps, expected vs. actual, and any logs.
- Tag with the affected module (e.g.
discover,validate,scheduler).
- README clarifications, in-app copy improvements, architectural diagrams.
- New analyst playbooks for specific investigative scenarios.
- Run the platform against synthetic / authorised test corpora.
- Report observed false-positives / false-negatives in the enumeration regexes.
If you discover a vulnerability in TORNET GRANTED, please do not open a public issue. Email the maintainer privately and allow a reasonable window for remediation before public disclosure.
Known design considerations and explicit non-goals:
- The platform does not attempt to deanonymise the Tor network itself or its users.
- The fuzz module operates only against a target the operator explicitly submits.
- Bootstrap credentials (
admin/admin) must be rotated before any non-trivial deployment. - The session-only username check on admin routes is intentional for a self-hosted single-operator deployment β harden before multi-tenant use.
TORNET GRANTED is built and distributed for:
- β Defensive cyber-security research
- β Authorised threat intelligence collection
- β Academic study of dark-web ecosystems
- β Brand-protection & takedown enablement
- β Law-enforcement use in lawful jurisdictions
It is not built for, and must not be used for:
- β Unauthorised access to systems
- β Harvesting illegal content
- β Harassment, doxing, or stalking
- β Circumvention of platform terms in jurisdictions where doing so is unlawful
Operators are solely responsible for ensuring all collection complies with local legislation, organisational policy, and the terms of any external services interacted with. The maintainers disclaim liability for misuse.
- Scheduler v2 β extend automation to Validate, Render, and Enumerate modules.
- Findings store β persistent SQLite-backed catalogue with operator-tagged history.
- API β first-class REST endpoints authenticated via the existing API/secret keypair.
- Operator roles β beyond
admin/analyst, fine-grained capability tiers. - Threat-actor graph β pivot between artefacts (wallets β onions β emails).
- Headless rendering β opt-in JS-rendered DOM capture for dynamic onions.
- Using Python to monitor the dark web
- Dark web scraping using Python
- Is Tor still anonymous?
- The Edward Snowden TOR STINKS slides
- DEFCON 22 Β· How people got caught
- DEFCON 22 Β· Touring the Darkside of the Internet
- Bad OPSEC Β· How Tor users got caught
- Deanonymisation of Tor HTTP hidden services
- Uncovering Tor hidden services with ETag
Distributed under the MIT License. See LICENSE for full text.
Built with focus by @prakhar0x01 Β· v2.0 Tactical Edition