Skip to content
KitploitKITPLOIT
ToolsBlog
Submit
ToolsBlog
Submit

Hacking, PenTest, and Cybersecurity Tools for Your Security Arsenal!

Kitploit is a directory of hacking, cybersecurity, and pentesting tools. Discover the latest project updates to find vulnerabilities, analyze systems, automate testing, and strengthen your security.

··Feeds·Contact·Privacy·© 2026 Kitploit

Tool Directory

Categories

View all categories
Loading categories
Tools/GitHubGitHub/ivancabrera02/hashsiphon
Defensive ToolsPassword AttacksInformation GatheringPost-ExploitationPenetration TestingRed Teaming
GitHubivancabrera02/hashsiphon

HashSiphon

Extracts the current user's NetNTLMv2 hash via HTTP authentication proxying, avoiding direct SSPI calls; v2 delegates auth to the BITS service to break process attribution.

View Repository
32567 days agoNot yet reviewed

Most Popular

View all →

Discover the most used tools by our community.

Explore all tools

Browse our collection of tools

View all tools →
Share

HashSiphon

NTLM hash extraction through HTTP-layer authentication proxying, zero SSPI calls from the attacker process.

HashSiphon extracts the current user's NetNTLMv2 hash by manipulating HTTP authentication flows instead of calling SSPI APIs directly. It ships two variants: v1 routes NTLM auth through .NET's HTTP stack within the same process, and v2 delegates authentication entirely to the BITS service (svchost.exe) in a different PID, breaking process-level attribution altogether.

Why This Matters

Every known NTLM hash self-extraction tool Internal Monologue, manual SSPI scripts, and their derivatives calls AcquireCredentialsHandle → InitializeSecurityContext → AcceptSecurityContext from the attacker's own process. EDRs hook these SSPI functions and flag the call chain.

HashSiphon takes a fundamentally different path:

AspectInternal MonologueHashSiphon v1HashSiphon v2
SSPI calls from attacker PID4+ direct calls0 direct (WinHTTP calls internally)0 in any process we own
Auth processAttacker PIDAttacker PID (via HTTP stack)svchost.exe (BITS service)
Security API importsSSPI DLL imports requiredNone in our codeNone in our code
Detection surfaceSSPI hooks, API call patternsHTTP loopback trafficBITS job + loopback traffic
Process attributionAttacker PIDAttacker PIDBroken, different PID entirely

How It Works

Both variants share the same core: a minimal TCP server on 127.0.0.1 that speaks just enough HTTP to perform an NTLM challenge-response exchange, with a controlled 8-byte challenge so the captured hash is crackable offline.

v1 — HTTP Self-Authentication (HashSiphon.ps1)

root@kitploit:~
┌──────────────────────────┐
│     PowerShell (PID X)   │
│                          │
│  ┌────────────────────┐  │          ┌──────────────────────┐
│  │ TCP Server (C#)    │◄─┼──────────┤ HttpWebRequest +     │
│  │ Loopback :random   │  │  HTTP    │ DefaultCredentials   │
│  │                    │──┼──────────►                      │
│  │ 1. Send 401+NTLM   │  │  NTLM    │ WinHTTP auto-auths   │
│  │ 2. Send Type 2     │  │  Type    │ using current user's │
│  │ 3. Capture Type 3  │  │  1/2/3   │ credentials          │
│  │ 4. Extract hash    │  │          │                      │
│  └────────────────────┘  │          └──────────────────────┘
└──────────────────────────┘
  1. Compiles a C# TCP server via Add-Type, binds to 127.0.0.1:0 (OS-assigned port)
  2. Client connects with HttpWebRequest + CredentialCache.DefaultCredentials
  3. Server responds HTTP 401 with WWW-Authenticate: NTLM to trigger negotiation
  4. WinHTTP sends NTLM Type 1 → server replies with a crafted Type 2 (controlled challenge) → WinHTTP sends Type 3
  5. Server parses Type 3 and extracts the NetNTLMv2 hash

Trade-off: WinHTTP internally calls SSPI within the same PID, no direct imports, but the call stack still traces back to us.

v2 — BITS Service Proxy (HashSiphonV2.ps1)

root@kitploit:~
┌─────────────────────┐         ┌───────────────────────────┐
│  PowerShell (PID X) │         │  svchost.exe (PID Y)      │
│                     │         │  BITS Service             │
│  ┌───────────────┐  │  HTTP   │                           │
│  │ TCP Server    │◄─┼─────────┤  BITS downloads from our  │
│  │ (Background   │  │  NTLM   │  server, auto-authenticates│
│  │  Runspace)    │──┼─────────►  using job owner's creds   │
│  └───────────────┘  │  Type   │                           │
│                     │  1/2/3  │  SSPI calls happen HERE,  │
│  Start-BitsTransfer─┼────────►│  not in PID X             │
│  (Trigger only)     │  COM    │                           │
└─────────────────────┘         └───────────────────────────┘
          │
          └── Our process: TcpListener + Start-BitsTransfer
              Zero SSPI. Zero security API imports.
  1. Same C# TCP server starts in a background PowerShell Runspace
  2. Start-BitsTransfer creates a download job pointing at http://127.0.0.1:<port>/hashsiphon.bin
  3. The BITS service (svchost.exe, a completely different PID) connects to our server
  4. BITS authenticates with the job owner's credentials, NTLM exchange captured by our server
  5. Server returns HTTP 200 with a body so BITS considers the transfer successful
  6. Hash extracted from the Type 3 message

Breakthrough: Our process never calls SSPI, not directly, not through WinHTTP, not at all. The entire NTLM computation happens in svchost.exe. EDR SSPI hooks see the call stack in the BITS service process, not ours.

Usage

Requirements

  • Windows 10/11
  • PowerShell 5.1+
  • Standard user privileges (no admin required)
  • BITS service running (default on Windows)

Running v1

root@kitploit:~
powershell -ExecutionPolicy Bypass -File HashSiphon.ps1

Running v2

root@kitploit:~
powershell -ExecutionPolicy Bypass -File HashSiphonV2.ps1

Expected Output (v2)

root@kitploit:~
  [*] Compiling HashSiphon v2 server...
  [+] Server compiled

  HashSiphon v2.0 - BITS Service Proxy Authentication
  Auth by svchost.exe (BITS), not our process

  [1] NTLM HTTP server ready on 127.0.0.1:52847
  [2] Controlled challenge: 1122334455667788
  [3] Triggering BITS transfer to our server...
  [4] BITS transfer initiated

  [+] User:        ivan
  [+] Domain:      DESKTOP-ABCDEF
  [+] NT response: 280 bytes (NTLMv2)

  +----------------------------------------------------------+
  |     NetNTLMv2 HASH - Extracted via BITS service proxy!   |
  +----------------------------------------------------------+
  |  hashcat -m 5600 | john --format=netntlmv2               |
  +----------------------------------------------------------+

  ivan::DESKTOP-ABCDEF:1122334455667788:<NTProofStr>:<ClientBlob>

  +----------------------------------------------------------+
  |  ATTRIBUTION ANALYSIS                                    |
  +----------------------------------------------------------+
  |  Our PID:      844  (PowerShell)                         |
  |  Auth by:      BITS service (svchost.exe, PID 5500)      |
  |  SSPI calls:   Zero from PID 844                         |
  |  Our APIs:     TcpListener + Start-BitsTransfer only     |
  +----------------------------------------------------------+

Fallback Behavior

If BITS fails (service disabled, module unavailable), v2 automatically falls back to launching a child powershell.exe process with Invoke-WebRequest -UseDefaultCredentials. This still achieves PID separation, though the child process is more visible than BITS.

Download Tool