-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtotle_hook.ps1
More file actions
130 lines (109 loc) · 4.58 KB
/
Copy pathtotle_hook.ps1
File metadata and controls
130 lines (109 loc) · 4.58 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# =============================================
# PSProxy.ps1 — Pure PowerShell HTTP Proxy
# No admin required, no external tools
# =============================================
$listenPort = 8888
$targetPort = 8443
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = { $true }
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12
$listener = New-Object System.Net.HttpListener
$listener.Prefixes.Add("http://127.0.0.1:$listenPort/")
$listener.Start()
Write-Host "[*] Proxy listening: http://127.0.0.1:$listenPort/"
Write-Host "[*] Press Ctrl+C to stop`n"
while ($listener.IsListening) {
$ctx = $listener.GetContext()
$req = $ctx.Request
$res = $ctx.Response
$ts = Get-Date -Format "HH:mm:ss"
$rawUrl = $req.RawUrl
$reqHost = $req.Headers["Host"]
# Build forward URI
if ($rawUrl -match "^https?://") {
$forwardUri = $rawUrl -replace "^http://", "https://"
} elseif ($reqHost) {
$forwardUri = "https://$reqHost$rawUrl"
} else {
Write-Host " [SKIP] Cannot resolve URI: $rawUrl" -ForegroundColor Yellow
$res.StatusCode = 400
$res.OutputStream.Close()
continue
}
Write-Host "`n[$ts] >> $($req.HttpMethod) $forwardUri"
foreach ($key in $req.Headers.AllKeys) {
Write-Host " REQ-H> $key : $($req.Headers[$key])"
}
$reqBody = ""
if ($req.HasEntityBody) {
$reader = New-Object System.IO.StreamReader($req.InputStream, $req.ContentEncoding)
$reqBody = $reader.ReadToEnd()
$reader.Close()
Write-Host " REQ-B> $reqBody"
}
try {
$webReq = [System.Net.WebRequest]::Create($forwardUri)
$webReq.Method = $req.HttpMethod
# Disable auto redirect to capture 3xx as-is
$webReq.AllowAutoRedirect = $false
$restrictedHeaders = @("Host","Content-Length","Transfer-Encoding","Connection","Proxy-Connection","Content-Type")
foreach ($key in $req.Headers.AllKeys) {
if ($key -notin $restrictedHeaders) {
try { $webReq.Headers.Add($key, $req.Headers[$key]) } catch {}
}
}
# Only set body-related properties when method has a body
$methodsWithBody = @("POST","PUT","PATCH")
if ($req.HttpMethod -in $methodsWithBody) {
if ($req.ContentType) {
$webReq.ContentType = $req.ContentType
}
if ($reqBody) {
$bodyBytes = [System.Text.Encoding]::UTF8.GetBytes($reqBody)
$webReq.ContentLength = $bodyBytes.Length
$stream = $webReq.GetRequestStream()
$stream.Write($bodyBytes, 0, $bodyBytes.Length)
$stream.Close()
} else {
$webReq.ContentLength = 0
}
}
$webRes = $webReq.GetResponse()
$resReader = New-Object System.IO.StreamReader($webRes.GetResponseStream())
$resBody = $resReader.ReadToEnd()
$resReader.Close()
Write-Host " RES-S> $([int]$webRes.StatusCode)"
foreach ($key in $webRes.Headers.AllKeys) {
Write-Host " RES-H> $key : $($webRes.Headers[$key])"
}
Write-Host " RES-B> $resBody"
$resBytes = [System.Text.Encoding]::UTF8.GetBytes($resBody)
$res.StatusCode = [int]$webRes.StatusCode
$res.ContentType = $webRes.ContentType
$res.ContentLength64 = $resBytes.Length
$res.OutputStream.Write($resBytes, 0, $resBytes.Length)
$webRes.Close()
} catch [System.Net.WebException] {
$webEx = $_.Exception
$errRes = $webEx.Response
if ($errRes) {
# Forward error response body for analysis
$errReader = New-Object System.IO.StreamReader($errRes.GetResponseStream())
$errBody = $errReader.ReadToEnd()
$errReader.Close()
$errStatus = [int]$errRes.StatusCode
Write-Host " [ERR] HTTP $errStatus" -ForegroundColor Red
Write-Host " ERR-B> $errBody" -ForegroundColor Red
$errBytes = [System.Text.Encoding]::UTF8.GetBytes($errBody)
$res.StatusCode = $errStatus
$res.ContentLength64 = $errBytes.Length
$res.OutputStream.Write($errBytes, 0, $errBytes.Length)
} else {
Write-Host " [ERR] $($webEx.Message)" -ForegroundColor Red
$res.StatusCode = 502
}
} catch {
Write-Host " [ERR] $_" -ForegroundColor Red
$res.StatusCode = 502
}
$res.OutputStream.Close()
}