<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>HunterX Blog</title>
    <description>Technical articles and updates about HunterX — the open-source AI-assisted vulnerability scanner.</description>
    <link>https://nullc0d30.github.io/HunterX/HunterX/blog/</link>
    <atom:link href="https://nullc0d30.github.io/HunterX/HunterX/blog/feed.xml" rel="self" type="application/rss+xml"/>
    <language>en-us</language>
    <lastBuildDate>Fri, 31 Jul 2026 10:20:26 +0000</lastBuildDate>
    
    <item>
      <title>HunterX Goes Open Source — Apache 2.0 Relicensing</title>
      <description>HunterX is now fully open source under the Apache License 2.0. Learn about the licensing change, what it means for users and contributors, and the future of the project.</description>
      <link>https://nullc0d30.github.io/HunterX/HunterX/blog/2026/07/22/hunterx-goes-open-source/</link>
      <guid isPermaLink="true">https://nullc0d30.github.io/HunterX/HunterX/blog/2026/07/22/hunterx-goes-open-source/</guid>
      <pubDate>Wed, 22 Jul 2026 00:00:00 +0000</pubDate>
      <dc:creator>Ahmed Awad (NullC0d3)</dc:creator>
      <content:encoded><![CDATA[<h2 id="hunterx-goes-open-source">HunterX Goes Open Source</h2>

<p>Today I’m excited to announce that HunterX — the AI-assisted vulnerability scanner and Red Team framework — is now fully open source under the <strong>Apache License 2.0</strong>.</p>

<h2 id="why-apache-20">Why Apache 2.0?</h2>

<p>Apache 2.0 is the industry standard for security tools. It’s used by OWASP ZAP, Kubernetes, TensorFlow, and thousands of other projects. The license offers:</p>

<ul>
  <li><strong>Permissive terms</strong>: Fork, modify, distribute freely</li>
  <li><strong>Attribution required</strong>: Proper credit to the original work</li>
  <li><strong>Patent protection</strong>: Grants patent rights from contributors</li>
  <li><strong>No GPL-style copyleft</strong>: Can be used in proprietary environments</li>
</ul>

<h2 id="what-changed">What Changed</h2>

<ul>
  <li>All 57 Python source files updated to <code class="language-plaintext highlighter-rouge">SPDX-License-Identifier: Apache-2.0</code></li>
  <li>All documentation files updated</li>
  <li>NOTICE file added with third-party attributions</li>
  <li>CONTRIBUTING.md updated with DCO requirement</li>
  <li>Docker Hub images rebuilt with Apache 2.0 labels</li>
</ul>

<h2 id="what-this-means">What This Means</h2>

<ul>
  <li><strong>For users</strong>: You can now use HunterX without concerns about the prior Proprietary license</li>
  <li><strong>For contributors</strong>: You retain copyright, grant a license to the project</li>
  <li><strong>For the community</strong>: You can fork, modify, and redistribute</li>
</ul>

<h2 id="whats-next">What’s Next</h2>

<p>The <a href="/HunterX/roadmap">roadmap</a> remains unchanged. v4.1 will focus on gRPC, OAuth2, Redis queue, and TUI. v5.0 will bring autonomous agent capabilities.</p>

<p>Thank you to everyone who has supported the project. This is just the beginning.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Understanding HunterX&apos;s 4-Stage Reasoning Pipeline</title>
      <description>Deep dive into the 4-stage reasoning pipeline: Passive Intelligence, Probe, Confirm, and Verify. How HunterX uses response differential analysis and evidence correlation for accurate vulnerability detection.</description>
      <link>https://nullc0d30.github.io/HunterX/HunterX/blog/2026/07/21/understanding-the-4-stage-reasoning-pipeline/</link>
      <guid isPermaLink="true">https://nullc0d30.github.io/HunterX/HunterX/blog/2026/07/21/understanding-the-4-stage-reasoning-pipeline/</guid>
      <pubDate>Tue, 21 Jul 2026 00:00:00 +0000</pubDate>
      <dc:creator>Ahmed Awad (NullC0d3)</dc:creator>
      <content:encoded><![CDATA[<h2 id="understanding-hunterxs-4-stage-reasoning-pipeline">Understanding HunterX’s 4-Stage Reasoning Pipeline</h2>

<p>Traditional vulnerability scanners operate on a simple model: send a payload, check for a match. HunterX replaces this with a <strong>reasoning pipeline</strong> inspired by how human penetration testers think.</p>

<h2 id="stage-0-passive-intelligence">Stage 0: Passive Intelligence</h2>

<p>Before sending a single request, HunterX gathers context:</p>

<ul>
  <li><strong>WAF detection</strong>: 50+ WAF fingerprint signatures</li>
  <li><strong>Technology fingerprinting</strong>: Server headers, cookies, response patterns</li>
  <li><strong>Endpoint discovery</strong>: WebSocket, GraphQL, API paths</li>
  <li><strong>Authentication state detection</strong>: Login forms, session patterns</li>
</ul>

<p>This context informs all subsequent stages. If a WAF is detected, HunterX adjusts its probe strategy and may auto-abort.</p>

<h2 id="stage-1-probe">Stage 1: Probe</h2>

<p>HunterX sends diverse probes across all enabled attack categories. Each probe targets a specific vulnerability class and includes markers for response differential analysis.</p>

<p>Key principle: <strong>low confidence, broad coverage</strong>. The goal is not to confirm vulnerabilities but to identify interesting response anomalies.</p>

<h2 id="stage-2-confirm">Stage 2: Confirm</h2>

<p>For categories that showed anomalies in Stage 1, HunterX deepens its investigation:</p>

<ul>
  <li>More sophisticated payloads</li>
  <li>Multi-variant testing</li>
  <li>Time-based blind injection detection</li>
  <li>OOB (out-of-band) callback monitoring</li>
</ul>

<p>Evidence is correlated across probes. A single anomaly is not enough — HunterX looks for consistent patterns.</p>

<h2 id="stage-3-verify">Stage 3: Verify</h2>

<p>Confirmed vulnerabilities are verified with safe, impact-minimizing payloads. The verification stage produces the final evidence that goes into the report.</p>

<h2 id="why-this-matters">Why This Matters</h2>

<p>The 4-stage pipeline gives HunterX three key advantages:</p>

<ol>
  <li><strong>Safety</strong>: By starting broad and narrowing, HunterX minimizes impact on targets that show no anomalies</li>
  <li><strong>Accuracy</strong>: Evidence is correlated across multiple probes before a finding is confirmed</li>
  <li><strong>Explainability</strong>: Every finding has a chain of evidence across stages</li>
</ol>

<p>This is fundamentally different from brute-force payload matching. It’s a reasoning engine, not a template matcher.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Optimizing Your Bug Bounty Workflow with HunterX</title>
      <description>A practical guide to using HunterX in bug bounty hunting. Profile selection, rate limiting, authenticated scanning, and integration with existing bug bounty toolchains.</description>
      <link>https://nullc0d30.github.io/HunterX/HunterX/blog/2026/07/20/bug-bounty-workflow-with-hunterx/</link>
      <guid isPermaLink="true">https://nullc0d30.github.io/HunterX/HunterX/blog/2026/07/20/bug-bounty-workflow-with-hunterx/</guid>
      <pubDate>Mon, 20 Jul 2026 00:00:00 +0000</pubDate>
      <dc:creator>Ahmed Awad (NullC0d3)</dc:creator>
      <content:encoded><![CDATA[<h2 id="optimizing-your-bug-bounty-workflow-with-hunterx">Optimizing Your Bug Bounty Workflow with HunterX</h2>

<p>Bug bounty hunting requires a careful balance between coverage and safety. HunterX’s <strong>Bounty profile</strong> is specifically designed for this.</p>

<h2 id="the-bounty-profile">The Bounty Profile</h2>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Max Requests: 500
Rate Limit:   10 req/s
Destructive:  false
</code></pre></div></div>

<p>This profile ensures you stay within program limits while maximizing coverage.</p>

<h2 id="workflow">Workflow</h2>

<h3 id="1-recon-phase">1. Recon Phase</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Gather intelligence without sending probes</span>
hunterx scan http://target.com <span class="nt">--dry-run</span>
</code></pre></div></div>

<h3 id="2-focused-scanning">2. Focused Scanning</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Scan with Bounty profile, JSON output for analysis</span>
hunterx scan http://target.com <span class="se">\</span>
  <span class="nt">--profile</span> bounty <span class="se">\</span>
  <span class="nt">-o</span> findings.json
</code></pre></div></div>

<h3 id="3-authenticated-testing">3. Authenticated Testing</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>hunterx scan http://target.com <span class="se">\</span>
  <span class="nt">--auth</span> form <span class="se">\</span>
  <span class="nt">--username</span> user@example.com <span class="se">\</span>
  <span class="nt">--password</span> s3cret <span class="se">\</span>
  <span class="nt">--profile</span> bounty
</code></pre></div></div>

<h3 id="4-results-analysis">4. Results Analysis</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Scan with SARIF output for VS Code integration</span>
hunterx scan http://target.com <span class="se">\</span>
  <span class="nt">--profile</span> bounty <span class="se">\</span>
  <span class="nt">-o</span> report.sarif
</code></pre></div></div>

<h2 id="tips">Tips</h2>

<ul>
  <li>Always use the <strong>Bounty profile</strong> on third-party programs</li>
  <li>Combine with Nuclei for broad template coverage</li>
  <li>Use Docker for consistent environments</li>
  <li>Enable OOB detection for SSRF/blind XXE</li>
</ul>

<h2 id="safety-first">Safety First</h2>

<p>Remember: the Bounty profile blocks destructive payloads. If you need to disable a category, use <code class="language-plaintext highlighter-rouge">--exclude-category</code>. Never bypass safety constraints on third-party targets.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Deploying HunterX in Production with Docker</title>
      <description>Best practices for deploying HunterX in production Docker environments. Secure configuration, resource limits, CI/CD integration, and container orchestration.</description>
      <link>https://nullc0d30.github.io/HunterX/HunterX/blog/2026/07/19/hunterx-docker-production-guide/</link>
      <guid isPermaLink="true">https://nullc0d30.github.io/HunterX/HunterX/blog/2026/07/19/hunterx-docker-production-guide/</guid>
      <pubDate>Sun, 19 Jul 2026 00:00:00 +0000</pubDate>
      <dc:creator>Ahmed Awad (NullC0d3)</dc:creator>
      <content:encoded><![CDATA[<h2 id="deploying-hunterx-in-production-with-docker">Deploying HunterX in Production with Docker</h2>

<p>HunterX provides an optimized 271MB multi-stage Docker image running as a non-root user.</p>

<h2 id="quick-start">Quick Start</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker run <span class="nt">--rm</span> nullc0d30/hunterx:latest scan http://example.com <span class="nt">--profile</span> bounty
</code></pre></div></div>

<h2 id="production-deployment">Production Deployment</h2>

<h3 id="volume-mounting">Volume Mounting</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker run <span class="nt">--rm</span> <span class="se">\</span>
  <span class="nt">-v</span> <span class="si">$(</span><span class="nb">pwd</span><span class="si">)</span>/hunterx.yaml:/app/hunterx.yaml:ro <span class="se">\</span>
  <span class="nt">-v</span> <span class="si">$(</span><span class="nb">pwd</span><span class="si">)</span>/reports:/data <span class="se">\</span>
  nullc0d30/hunterx:latest <span class="se">\</span>
  scan http://example.com <span class="nt">-o</span> /data
</code></pre></div></div>

<h3 id="resource-limits">Resource Limits</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker run <span class="nt">--rm</span> <span class="se">\</span>
  <span class="nt">--memory</span><span class="o">=</span><span class="s2">"512m"</span> <span class="se">\</span>
  <span class="nt">--cpus</span><span class="o">=</span><span class="s2">"2"</span> <span class="se">\</span>
  nullc0d30/hunterx:latest scan http://example.com
</code></pre></div></div>

<h3 id="api-server">API Server</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker run <span class="nt">--rm</span> <span class="se">\</span>
  <span class="nt">-p</span> 8443:8443 <span class="se">\</span>
  <span class="nt">-v</span> <span class="si">$(</span><span class="nb">pwd</span><span class="si">)</span>/reports:/data <span class="se">\</span>
  nullc0d30/hunterx:latest api <span class="nt">--port</span> 8443
</code></pre></div></div>

<h2 id="cicd-integration">CI/CD Integration</h2>

<h3 id="github-actions">GitHub Actions</h3>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">jobs</span><span class="pi">:</span>
  <span class="na">scan</span><span class="pi">:</span>
    <span class="na">runs-on</span><span class="pi">:</span> <span class="s">ubuntu-latest</span>
    <span class="na">container</span><span class="pi">:</span>
      <span class="na">image</span><span class="pi">:</span> <span class="no">null</span><span class="s">c0d30/hunterx:latest</span>
    <span class="na">steps</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="na">run</span><span class="pi">:</span> <span class="s">hunterx scan ${{ secrets.TARGET_URL }} \</span>
          <span class="s">-o /data/report.sarif</span>
</code></pre></div></div>

<h3 id="gitlab-ci">GitLab CI</h3>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">scan</span><span class="pi">:</span>
  <span class="na">image</span><span class="pi">:</span> <span class="no">null</span><span class="s">c0d30/hunterx:latest</span>
  <span class="na">script</span><span class="pi">:</span>
    <span class="pi">-</span> <span class="s">hunterx scan $TARGET_URL -o report.sarif</span>
  <span class="na">artifacts</span><span class="pi">:</span>
    <span class="na">paths</span><span class="pi">:</span> <span class="pi">[</span><span class="nv">report.sarif</span><span class="pi">]</span>
</code></pre></div></div>

<h2 id="security">Security</h2>

<ul>
  <li>Container runs as <strong>non-root user</strong> (UID 1000)</li>
  <li>Read-only root filesystem recommended</li>
  <li>Use Docker secrets for credentials</li>
  <li>Enable Docker Content Trust</li>
</ul>

<h2 id="image-tags">Image Tags</h2>

<ul>
  <li><code class="language-plaintext highlighter-rouge">latest</code>: Most recent stable release</li>
  <li><code class="language-plaintext highlighter-rouge">6.0.0</code>: Specific version</li>
  <li><code class="language-plaintext highlighter-rouge">dev</code>: Development build (unstable)</li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>Plugin Development with HunterX — A Complete Walkthrough</title>
      <description>Complete guide to building custom plugins for HunterX. Detector plugins, reporter plugins, and hook plugins with practical code examples and best practices.</description>
      <link>https://nullc0d30.github.io/HunterX/HunterX/blog/2026/07/18/plugin-development-walkthrough/</link>
      <guid isPermaLink="true">https://nullc0d30.github.io/HunterX/HunterX/blog/2026/07/18/plugin-development-walkthrough/</guid>
      <pubDate>Sat, 18 Jul 2026 00:00:00 +0000</pubDate>
      <dc:creator>Ahmed Awad (NullC0d3)</dc:creator>
      <content:encoded><![CDATA[<h2 id="plugin-development-with-hunterx">Plugin Development with HunterX</h2>

<p>HunterX has a decorator-based plugin system with three plugin types: detector, reporter, and hook.</p>

<h2 id="plugin-types">Plugin Types</h2>

<h3 id="detector-plugin">Detector Plugin</h3>

<p>Analyze HTTP responses for vulnerabilities:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="nn">hunterx.plugin</span> <span class="kn">import</span> <span class="n">detector</span>

<span class="o">@</span><span class="n">detector</span><span class="p">(</span><span class="s">"custom_header_check"</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">CustomHeaderDetector</span><span class="p">:</span>
    <span class="s">"""Check for missing security headers."""</span>

    <span class="k">def</span> <span class="nf">detect</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">response</span><span class="p">,</span> <span class="n">context</span><span class="p">):</span>
        <span class="n">headers</span> <span class="o">=</span> <span class="n">response</span><span class="p">.</span><span class="n">headers</span>
        <span class="n">missing</span> <span class="o">=</span> <span class="p">[]</span>

        <span class="k">if</span> <span class="s">"X-Frame-Options"</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">headers</span><span class="p">:</span>
            <span class="n">missing</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="s">"X-Frame-Options"</span><span class="p">)</span>

        <span class="k">if</span> <span class="s">"Content-Security-Policy"</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">headers</span><span class="p">:</span>
            <span class="n">missing</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="s">"Content-Security-Policy"</span><span class="p">)</span>

        <span class="k">if</span> <span class="n">missing</span><span class="p">:</span>
            <span class="k">return</span> <span class="p">{</span>
                <span class="s">"name"</span><span class="p">:</span> <span class="s">"Missing Security Headers"</span><span class="p">,</span>
                <span class="s">"category"</span><span class="p">:</span> <span class="s">"config"</span><span class="p">,</span>
                <span class="s">"severity"</span><span class="p">:</span> <span class="s">"medium"</span><span class="p">,</span>
                <span class="s">"evidence"</span><span class="p">:</span> <span class="p">{</span>
                    <span class="s">"missing"</span><span class="p">:</span> <span class="n">missing</span><span class="p">,</span>
                    <span class="s">"url"</span><span class="p">:</span> <span class="n">response</span><span class="p">.</span><span class="n">url</span>
                <span class="p">}</span>
            <span class="p">}</span>
        <span class="k">return</span> <span class="bp">None</span>
</code></pre></div></div>

<h3 id="reporter-plugin">Reporter Plugin</h3>

<p>Export results in custom formats:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="nn">hunterx.plugin</span> <span class="kn">import</span> <span class="n">reporter</span>

<span class="o">@</span><span class="n">reporter</span><span class="p">(</span><span class="s">"csv"</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">CSVReporter</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">report</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">results</span><span class="p">,</span> <span class="n">output_path</span><span class="p">):</span>
        <span class="kn">import</span> <span class="nn">csv</span>
        <span class="n">path</span> <span class="o">=</span> <span class="n">output_path</span><span class="p">.</span><span class="n">with_suffix</span><span class="p">(</span><span class="s">".csv"</span><span class="p">)</span>
        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="s">"w"</span><span class="p">,</span> <span class="n">newline</span><span class="o">=</span><span class="s">""</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
            <span class="n">writer</span> <span class="o">=</span> <span class="n">csv</span><span class="p">.</span><span class="n">writer</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
            <span class="n">writer</span><span class="p">.</span><span class="n">writerow</span><span class="p">([</span><span class="s">"name"</span><span class="p">,</span> <span class="s">"severity"</span><span class="p">,</span> <span class="s">"url"</span><span class="p">,</span> <span class="s">"category"</span><span class="p">])</span>
            <span class="k">for</span> <span class="n">finding</span> <span class="ow">in</span> <span class="n">results</span><span class="p">.</span><span class="n">findings</span><span class="p">:</span>
                <span class="n">writer</span><span class="p">.</span><span class="n">writerow</span><span class="p">([</span>
                    <span class="n">finding</span><span class="p">.</span><span class="n">name</span><span class="p">,</span> <span class="n">finding</span><span class="p">.</span><span class="n">severity</span><span class="p">,</span>
                    <span class="n">finding</span><span class="p">.</span><span class="n">url</span><span class="p">,</span> <span class="n">finding</span><span class="p">.</span><span class="n">category</span>
                <span class="p">])</span>
        <span class="k">return</span> <span class="n">path</span>
</code></pre></div></div>

<h3 id="hook-plugin">Hook Plugin</h3>

<p>Execute code at scan lifecycle events:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="nn">hunterx.plugin</span> <span class="kn">import</span> <span class="n">hook</span>

<span class="o">@</span><span class="n">hook</span><span class="p">(</span><span class="s">"scan_complete"</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">send_slack_notification</span><span class="p">(</span><span class="n">results</span><span class="p">,</span> <span class="n">context</span><span class="p">):</span>
    <span class="s">"""Send notification when scan completes."""</span>
    <span class="n">webhook_url</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">environ</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="s">"SLACK_WEBHOOK"</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">webhook_url</span><span class="p">:</span>
        <span class="n">payload</span> <span class="o">=</span> <span class="p">{</span>
            <span class="s">"text"</span><span class="p">:</span> <span class="sa">f</span><span class="s">"Scan complete: </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">results</span><span class="p">.</span><span class="n">findings</span><span class="p">)</span><span class="si">}</span><span class="s"> findings"</span>
        <span class="p">}</span>
        <span class="n">requests</span><span class="p">.</span><span class="n">post</span><span class="p">(</span><span class="n">webhook_url</span><span class="p">,</span> <span class="n">json</span><span class="o">=</span><span class="n">payload</span><span class="p">)</span>
</code></pre></div></div>

<h2 id="installation">Installation</h2>

<p>Place plugin files in the <code class="language-plaintext highlighter-rouge">plugins/</code> directory. They are auto-discovered at startup.</p>

<h2 id="best-practices">Best Practices</h2>

<ul>
  <li>One plugin per file</li>
  <li>Use descriptive decorator names</li>
  <li>Return <code class="language-plaintext highlighter-rouge">None</code> from detectors that don’t match</li>
  <li>Handle exceptions gracefully</li>
  <li>Test plugins independently</li>
</ul>
]]></content:encoded>
    </item>
    
  </channel>
</rss>
