<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Sidharthsmenon on Medium]]></title>
        <description><![CDATA[Stories by Sidharthsmenon on Medium]]></description>
        <link>https://medium.com/@sidharthsmenon1?source=rss-4d8fc63c7f48------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/0*aGDfcJK9ariKoQTd</url>
            <title>Stories by Sidharthsmenon on Medium</title>
            <link>https://medium.com/@sidharthsmenon1?source=rss-4d8fc63c7f48------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Wed, 27 May 2026 00:38:01 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@sidharthsmenon1/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[I Built a 10-Phase Attack Surface Recon Framework from Scratch — Here’s Everything I Learned]]></title>
            <link>https://medium.com/@sidharthsmenon1/i-built-a-10-phase-attack-surface-recon-framework-from-scratch-heres-everything-i-learned-a6bac051cc7c?source=rss-4d8fc63c7f48------2</link>
            <guid isPermaLink="false">https://medium.com/p/a6bac051cc7c</guid>
            <category><![CDATA[bug-bounty]]></category>
            <category><![CDATA[penetration-testing]]></category>
            <category><![CDATA[cybersecurity-news]]></category>
            <category><![CDATA[ethical-hacking]]></category>
            <category><![CDATA[cybersecurity]]></category>
            <dc:creator><![CDATA[Sidharthsmenon]]></dc:creator>
            <pubDate>Fri, 22 May 2026 07:45:27 GMT</pubDate>
            <atom:updated>2026-05-22T07:51:01.310Z</atom:updated>
            <content:encoded><![CDATA[<p>A deep technical walkthrough of how I designed, built, and deployed an automated bug bounty recon dashboard using Node.js, React, and 12 open-source security tools — and why every pentester should understand what’s happening under the hood.</p><h3>The Problem I Was Solving</h3><p>When you start a bug bounty engagement or a penetration test, the first 3–4 hours are always the same: you’re hopping between terminals, running Subfinder, checking DNS records, probing for live hosts, scanning ports, crawling URLs — all manually, all disconnected from each other.</p><p>Results pile up in scattered .txt files across your desktop. You forget which subdomains you already checked. You re-run the same tool twice. You miss a live host because it disappeared from your terminal scroll.</p><p><strong>I wanted one dashboard that ran everything in the right order, stored every result neatly per target, and let me see what’s happening in real time.</strong></p><p>That’s what this project is.</p><h3>What the Project Is — In One Sentence</h3><p>A self-hosted, browser-based recon dashboard that runs 10 automated phases of attack surface reconnaissance against a target domain, storing all results locally in a structured workspace, with a React frontend that polls the backend live as scans run.</p><p><strong>GitHub:</strong> <a href="https://github.com/sidharthsmenon2003/recon-framework">https://github.com/sidharthsmenon2003/recon-framework</a></p><h3>The 10-Phase Pipeline — What Each One Does and Why</h3><p>This is the core of the project. Every phase has a reason for existing and a specific place in the recon kill chain.</p><h3>PH-01 — Subdomain Enumeration</h3><p><strong>Tools:</strong> Subfinder, Amass, Assetfinder, CRT.sh, Sublist3r</p><p><strong>What it does:</strong> Hits 5 different subdomain discovery sources simultaneously and merges the results. Each tool has a different data source — Subfinder uses passive DNS APIs, Amass does both passive and active brute-force, Assetfinder scrapes certificate transparency logs, CRT.sh queries the crt.sh database directly, and Sublist3r uses search engines.</p><p><strong>Why 5 tools instead of 1:</strong> No single tool finds everything. In testing, running all 5 together consistently finds 30–40% more subdomains than using Subfinder alone. The overlap is deduplicated; only the unique discoveries get saved.</p><p><strong>Output:</strong> workspace/&lt;target&gt;/subdomain/merged.txt</p><p><strong>When to use this:</strong> Always — this is your foundation. Every subsequent phase depends on the subdomain list. Skip this and you’re testing blind.</p><h3>PH-02 — DNS Resolution</h3><p><strong>Tools:</strong> dnsx</p><p><strong>What it does:</strong> Takes the merged subdomain list and resolves each entry to find its A records (IPv4), CNAME records (where it points), MX records (mail servers), and TXT records (SPF, DKIM, verification tokens). Only domains that actually resolve get passed forward.</p><p><strong>Why this matters:</strong> A subdomain that doesn’t resolve is dead — testing it wastes time. More importantly, CNAME records pointing to services like Heroku, GitHub Pages, or Fastly that no longer have a claim registered on them are <strong>subdomain takeover vulnerabilities</strong> — an often critical finding.</p><p><strong>Output:</strong> workspace/&lt;target&gt;/dns/records.json</p><p><strong>When to use this:</strong> Immediately after PH-01. Always before PH-03. The DNS data also tells you a lot about the infrastructure — AWS? Cloudflare? Azure? That context shapes your later phases.</p><h3>PH-03 — Live Host Detection</h3><p><strong>Tools:</strong> httpx</p><p><strong>What it does:</strong> Probes each resolved subdomain over HTTP and HTTPS to check which ones actually respond to web requests. It records the status code, title, content length, and web technology fingerprint for each live host.</p><p><strong>Why this matters:</strong> DNS resolving doesn’t mean a web server is running. This phase is the real filter — on a large program, you might go from 2,000 resolved subdomains to 400 live web hosts. Those 400 are your actual attack surface.</p><p><strong>Output:</strong> workspace/&lt;target&gt;/live/merged.txt and live/hosts.txt</p><p><strong>When to use this:</strong> Before any active testing. You should never fire a vulnerability scanner at a host until you’ve confirmed it’s live and understood what it’s serving.</p><h3>PH-04 — Port Scanning</h3><p><strong>Tools:</strong> Naabu (fast scan), Nmap (service detection)</p><p><strong>What it does:</strong> Naabu does a rapid TCP SYN scan across common ports for all live hosts. Then Nmap runs service version detection on the open ports found. The combination gives you speed (Naabu) plus depth (Nmap service banners).</p><p><strong>Why this matters:</strong> Most bug bounty programs only want web vulnerabilities, but their scope includes the IP ranges. An exposed MongoDB on port 27017, a Redis instance on 6379, or a VNC server on 5900 — none of these would show up in a web scan. Port scanning catches the forgotten services.</p><p><strong>Output:</strong> workspace/&lt;target&gt;/ports/open_ports.json</p><p><strong>When to use this:</strong> After live host detection. Also run it when you suspect the target has cloud infrastructure — AWS security groups misconfigured to allow :5432 or :3306 to the world are extremely common.</p><h3>PH-05 — URL Crawling</h3><p><strong>Tools:</strong> gau (passive), katana (active), gospider, waybackurls</p><p><strong>What it does:</strong> Discovers every URL associated with the target. gau and waybackurls pull from the Wayback Machine and Common Crawl passively — no requests touch the target&#39;s servers. katana actively spiders live hosts by following links. gospider crawls for JavaScript-linked endpoints.</p><p><strong>Why this matters:</strong> URLs reveal the application’s internal structure — API endpoints, admin paths, file upload handlers, legacy pages that developers forgot to remove. JavaScript files in particular often contain hardcoded API keys, internal hostnames, and undocumented endpoints.</p><p><strong>Output:</strong> workspace/&lt;target&gt;/urls/merged.txt</p><p><strong>When to use this:</strong> Before any manual testing. The URL list is your map of the application. You’ll use it to decide where to spend your time.</p><h3>PH-06 — Screenshots</h3><p><strong>Tools:</strong> Chromium (headless)</p><p><strong>What it does:</strong> Takes a browser screenshot of every live host. Runs headless Chrome against each URL and saves the rendered page as a PNG.</p><p><strong>Why this matters:</strong> This phase saves enormous time during triage. Instead of manually visiting 400 subdomains, you scroll through screenshots in 15 minutes and immediately spot: login panels you didn’t know existed, default server pages (IIS, nginx, Apache) that indicate misconfiguration, internal tools accidentally exposed, dashboards with no authentication, and error pages that leak software versions.</p><p><strong>Output:</strong> workspace/&lt;target&gt;/screenshots/imgs/*.png</p><p><strong>When to use this:</strong> Right after live host detection. It’s your first visual pass across the entire attack surface.</p><h3>PH-07 — Confidential File Discovery</h3><p><strong>Tools:</strong> ffuf (fuzzing), passive checks, git metadata probing</p><p><strong>What it does:</strong> Actively probes every live host for sensitive paths that are commonly exposed by misconfiguration:</p><ul><li>.env files (database credentials, API keys, secrets)</li><li>.git/ directories (full source code)</li><li>backup.zip, backup.sql, db.sql (database dumps)</li><li>config.php, config.json, settings.py (configuration files)</li><li>wp-config.php, .htaccess, web.config</li></ul><p><strong>Why this matters:</strong> Finding a .env file exposed on a production server is an <strong>instant critical vulnerability</strong> on most bug bounty programs. These files typically contain database URLs with credentials, cloud provider API keys (AWS_ACCESS_KEY_ID, etc.), and JWT secrets. A single .env exposure can mean full application compromise.</p><p><strong>Output:</strong> workspace/&lt;target&gt;/confidential/findings.json</p><p><strong>When to use this:</strong> During any engagement. On bug bounty programs, run this early — it’s one of the highest-value, lowest-effort phases.</p><h3>PH-08 — Origin IP Discovery</h3><p><strong>Tools:</strong> DNS/certificate history analysis, Shodan lookups</p><p><strong>What it does:</strong> Attempts to find the real IP address of the web server behind a CDN (Cloudflare, Akamai, Fastly, etc.). Methods include: querying old DNS records before CDN was implemented, checking SSL certificate history databases (Censys, crt.sh), looking for mail server IPs that point to the same origin, and checking subdomains that might not be behind the CDN.</p><p><strong>Why this matters:</strong> Cloudflare hides the real server IP and provides a WAF. If you can find the origin IP and it accepts direct connections, you bypass the WAF entirely and test the application without any firewall protection. This is one of the most valuable techniques in a pentest against a Cloudflare-protected application.</p><p><strong>Output:</strong> workspace/&lt;target&gt;/originip/results.json</p><p><strong>When to use this:</strong> When you find a target hiding behind a CDN and want to test for WAF bypass. Also valuable when you find vulnerabilities that Cloudflare is blocking — reaching the origin lets you confirm they’re real.</p><h3>PH-09–403 Bypass</h3><p><strong>Tools:</strong> Custom header/path manipulation</p><p><strong>What it does:</strong> When a URL returns HTTP 403 (Forbidden), this phase tries 20+ techniques to bypass the restriction:</p><ul><li>Header injection: X-Original-URL, X-Rewrite-URL, X-Forwarded-For: 127.0.0.1</li><li>Path manipulation: /admin/ → /admin%2F, /%2e/admin, /admin/.</li><li>Method switching: GET → POST, HEAD, OPTIONS</li><li>Protocol tricks and double encoding</li></ul><p><strong>Why this matters:</strong> Many web applications enforce access control in the application layer but not at the reverse proxy or CDN layer. A 403 is not always a hard block — it’s often a misconfigured restriction that can be trivially bypassed. A 403 → 200 bypass on an admin panel is typically a <strong>high severity</strong> finding.</p><p><strong>Output:</strong> workspace/&lt;target&gt;/bypass403/results.json</p><p><strong>When to use this:</strong> Whenever you encounter a 403 during manual testing or when URL crawling finds paths that return 403. It’s a quick check with potentially high rewards.</p><h3>PH-10 — Intelligence / Nuclei CVE Scan</h3><p><strong>Tools:</strong> Nuclei (with community template library), JavaScript analysis</p><p><strong>What it does:</strong> Two sub-phases run here. First, the intelligence engine analyzes the URLs discovered in PH-05 to extract JavaScript files and scan them for hardcoded secrets (API keys, tokens, credentials) using pattern matching. Second, Nuclei runs its full template library against every live host — this includes known CVEs, exposed panels, misconfigurations, default credentials, and hundreds of vulnerability checks.</p><p><strong>Why this matters:</strong> Nuclei’s template library is maintained by a community of thousands of security researchers and covers everything from Log4Shell to exposed Grafana dashboards to default Jenkins credentials. Running it against your discovered attack surface often produces findings within minutes on larger programs.</p><p><strong>Output:</strong> workspace/&lt;target&gt;/nuclei/findings.json</p><p><strong>When to use this:</strong> At the end of the pipeline after you have a confirmed list of live hosts. Also run it on any newly discovered subdomains during continuous monitoring.</p><h3>The Architecture — How It All Connects</h3><p>Browser (localhost:5173)<br> │<br> │ REST API calls<br> ▼<br>Express Server (localhost:8000)<br> │<br> ├── POST /api/scan → triggers PH-01<br> ├── POST /api/dns → triggers PH-02<br> ├── POST /api/live → triggers PH-03<br> ├── POST /api/ports → triggers PH-04<br> ├── POST /api/urls → triggers PH-05<br> ├── POST /api/screenshots → triggers PH-06<br> ├── POST /api/confidential → triggers PH-07<br> ├── POST /api/originip → triggers PH-08<br> ├── POST /api/bypass403 → triggers PH-09<br> └── POST /api/nuclei → triggers PH-10<br> │<br> ▼<br> workspace/&lt;target&gt;/<br> ├── subdomain/merged.txt<br> ├── dns/records.json<br> ├── live/merged.txt<br> ├── ports/open_ports.json<br> ├── urls/merged.txt<br> ├── screenshots/imgs/*.png<br> ├── confidential/findings.json<br> ├── originip/results.json<br> ├── bypass403/results.json<br> └── nuclei/findings.json</p><p>Each phase runs as a <strong>child process</strong> spawned by Express. The backend streams output to disk while the frontend polls the GET endpoint every few seconds to show live progress. This means you can close the browser, come back 30 minutes later, and your scan is still running.</p><h3><strong>How to Run It</strong></h3><p># Clone the repo<br>git clone <a href="https://github.com/sidharthsmenon2003/recon-framework.git">https://github.com/sidharthsmenon2003/recon-framework.git</a><br>cd recon-framework</p><p># Install Go tools (see README for full list)<br>go install github.com/projectdiscovery/subfinder/v2/cmd/subfinder@latest<br># … (install all tools from README)</p><p># Install npm dependencies<br>npm install</p><p># Terminal 1 — start backend<br>node server.cjs</p><p># Terminal 2 — start frontend<br>npm run dev</p><p>Open http://localhost:5173, enter a target domain you have permission to test, and click through each phase in order.</p><h3>Ethical and Legal Note</h3><p>This framework is a tool. Tools have no ethics — users do.</p><p><strong>Only scan targets you have explicit written permission to test.</strong> For bug bounty, that means targets listed in an active program’s scope. For pentesting, that means a signed engagement agreement.</p><p>Unauthorized scanning is illegal in most jurisdictions under laws like the Computer Fraud and Abuse Act (US), Computer Misuse Act (UK), and equivalent statutes globally. The README includes this notice. Follow it.</p><h3>Conclusion</h3><p>Building this framework taught me more about the recon phase of penetration testing than any course I’ve taken. When you have to write the code that orchestrates 12 security tools, pipe their outputs together, store results cleanly, and surface them in a UI — you understand <em>why</em> each tool exists and <em>when</em> to reach for it.</p><p>The framework is open source, MIT licensed, and lives at: <a href="https://github.com/sidharthsmenon2003/recon-framework"><strong>https://github.com/sidharthsmenon2003/recon-framework</strong></a></p><p>If you’re a security student building your portfolio, a bug bounty hunter who wants a structured recon workflow, or a pentester tired of scattered terminal windows — clone it, modify it, and make it yours.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a6bac051cc7c" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>