runtime: publish SUPPORT-261007-WINDOWS-DACHA-64022-BRIDGE-EXACT-SOURCE-RCA-99783R1
This commit is contained in:
+38
File diff suppressed because one or more lines are too long
+234
@@ -0,0 +1,234 @@
|
|||||||
|
CHAT_OUTPUT_BEGIN
|
||||||
|
COMMAND_ID=SUPPORT-261007-WINDOWS-DACHA-64022-BRIDGE-EXACT-SOURCE-RCA-99783R1
|
||||||
|
STATUS=OK
|
||||||
|
RC=0
|
||||||
|
HOST=pve01
|
||||||
|
MODE=read-only
|
||||||
|
COMPONENT=windows-dacha-64022-bridge-exact-source-rca
|
||||||
|
REFERENCE_REGISTER_CHECK=OK
|
||||||
|
REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66
|
||||||
|
ERROR_REGISTER_CHECK=OK
|
||||||
|
ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0
|
||||||
|
COMMAND_SHA256=29c3f3ddfe92bc5d9c1bb03713be42ea2a98feb62a5dfc18888c66feaec02ee3
|
||||||
|
DUPLICATE_FAILED_COMMAND_BLOCKED=false
|
||||||
|
EXECUTION_STARTED=true
|
||||||
|
CHANGE_DECLARED=false
|
||||||
|
RESULT_CONTRACT_VALID=true
|
||||||
|
RESULT_CONTRACT_STATUS=NOT_APPLICABLE
|
||||||
|
RESULT_CONTRACT_ERROR=NONE
|
||||||
|
COMMAND_RC=0
|
||||||
|
CHANGES_MADE=false
|
||||||
|
ROLLBACK_STARTED=false
|
||||||
|
ROLLBACK_RESTORED=null
|
||||||
|
MUTATION_OUTCOME=NO_MUTATION
|
||||||
|
SANITIZED=yes
|
||||||
|
SECRETS_INCLUDED=no
|
||||||
|
PRIVATE_ADDRESSES_INCLUDED=no
|
||||||
|
RAW_EVIDENCE_SHA256=66b16d6cb988213a72ed70a9ed3e7d0cce65c7f44b3752973ecd7e161e40042b
|
||||||
|
SANITIZED_OUTPUT_SHA256=66b16d6cb988213a72ed70a9ed3e7d0cce65c7f44b3752973ecd7e161e40042b
|
||||||
|
OUTPUT_BEGIN
|
||||||
|
WINDOWS_DACHA_64022_BRIDGE_EXACT_SOURCE_RCA=V1
|
||||||
|
MODE=read-only
|
||||||
|
NO_MUTATION=true
|
||||||
|
WINDOWS_LOCAL_INSPECT_RC=0
|
||||||
|
WINDOWS_EVIDENCE_PRESENT=true
|
||||||
|
WINDOWS_DACHA_64022_BRIDGE_EXACT_SOURCE_RCA=V1
|
||||||
|
MODE=read-only
|
||||||
|
NO_MUTATION=true
|
||||||
|
STARTUP_MATCH_COUNT=2
|
||||||
|
REC|STARTUP|IDX=1|SCRIPT_RESOLVED=true|ARGS_SANITIZED=-NoProfile -ExecutionPolicy Bypass -WindowStyle Hidden -File "<BRIDGE_PATH>" -ListenPort 64022 -SocksPort 64020
|
||||||
|
REC|STARTUP|IDX=2|SCRIPT_RESOLVED=true|ARGS_SANITIZED=-NoProfile -ExecutionPolicy Bypass -WindowStyle Hidden -File "<BRIDGE_PATH>" -ListenPort 64022 -SocksPort 64020
|
||||||
|
BRIDGE_PATH_COUNT=1
|
||||||
|
REC|BRIDGE_FILE|BASENAME=bridge.ps1|SHA256=d6ed793d7cfd3ec4894ff766f1c20a5de80cf3be6615a27ae4dc0f836da4cf0e|SIZE=5696|EXPECTED_SHA_MATCH=true
|
||||||
|
EXACT_BRIDGE_SHA_MATCH_COUNT=1
|
||||||
|
BRIDGE_LINE_COUNT=162
|
||||||
|
SRC|001|param([int]$ListenPort=64021,[int]$SocksPort=64020)
|
||||||
|
SRC|002|$ErrorActionPreference='Stop'
|
||||||
|
SRC|003|$src=@"
|
||||||
|
SRC|004|using System;
|
||||||
|
SRC|005|using System.IO;
|
||||||
|
SRC|006|using System.Net;
|
||||||
|
SRC|007|using System.Net.Sockets;
|
||||||
|
SRC|008|using System.Text;
|
||||||
|
SRC|009|using System.Threading.Tasks;
|
||||||
|
SRC|010|using System.Collections.Generic;
|
||||||
|
SRC|011|
|
||||||
|
SRC|012|public static class W2HttpSocksBridge {
|
||||||
|
SRC|013| static int SocksPort;
|
||||||
|
SRC|014|
|
||||||
|
SRC|015| static byte[] ReadHeaders(NetworkStream s, out int headerEnd) {
|
||||||
|
SRC|016| var buf = new List<byte>(4096);
|
||||||
|
SRC|017| int state=0;
|
||||||
|
SRC|018| while (buf.Count < 65536) {
|
||||||
|
SRC|019| int b=s.ReadByte();
|
||||||
|
SRC|020| if (b < 0) break;
|
||||||
|
SRC|021| buf.Add((byte)b);
|
||||||
|
SRC|022| if (state==0 && b==13) state=1;
|
||||||
|
SRC|023| else if (state==1 && b==10) state=2;
|
||||||
|
SRC|024| else if (state==2 && b==13) state=3;
|
||||||
|
SRC|025| else if (state==3 && b==10) { headerEnd=buf.Count; return buf.ToArray(); }
|
||||||
|
SRC|026| else state=(b==13)?1:0;
|
||||||
|
SRC|027| }
|
||||||
|
SRC|028| headerEnd=buf.Count;
|
||||||
|
SRC|029| return buf.ToArray();
|
||||||
|
SRC|030| }
|
||||||
|
SRC|031|
|
||||||
|
SRC|032| static TcpClient ConnectSocks(string host, int port) {
|
||||||
|
SRC|033| var c=new TcpClient();
|
||||||
|
SRC|034| c.Connect(IPAddress.Loopback,SocksPort);
|
||||||
|
SRC|035| var s=c.GetStream();
|
||||||
|
SRC|036| s.Write(new byte[]{5,1,0},0,3);
|
||||||
|
SRC|037| byte[] r=new byte[2];
|
||||||
|
SRC|038| if (s.Read(r,0,2)!=2 || r[0]!=5 || r[1]!=0) throw new IOException("SOCKS_GREETING");
|
||||||
|
SRC|039| byte[] hb=Encoding.ASCII.GetBytes(host);
|
||||||
|
SRC|040| if (hb.Length<1 || hb.Length>255) throw new IOException("SOCKS_HOST");
|
||||||
|
SRC|041| using(var ms=new MemoryStream()) {
|
||||||
|
SRC|042| ms.WriteByte(5); ms.WriteByte(1); ms.WriteByte(0); ms.WriteByte(3); ms.WriteByte((byte)hb.Length);
|
||||||
|
SRC|043| ms.Write(hb,0,hb.Length); ms.WriteByte((byte)((port>>8)&255)); ms.WriteByte((byte)(port&255));
|
||||||
|
SRC|044| var q=ms.ToArray(); s.Write(q,0,q.Length);
|
||||||
|
SRC|045| }
|
||||||
|
SRC|046| byte[] h4=new byte[4];
|
||||||
|
SRC|047| if (s.Read(h4,0,4)!=4 || h4[0]!=5 || h4[1]!=0) throw new IOException("SOCKS_CONNECT");
|
||||||
|
SRC|048| int remain=0;
|
||||||
|
SRC|049| if (h4[3]==1) remain=4+2;
|
||||||
|
SRC|050| else if (h4[3]==4) remain=16+2;
|
||||||
|
SRC|051| else if (h4[3]==3) {
|
||||||
|
SRC|052| int len=s.ReadByte(); if(len<0) throw new IOException("SOCKS_REPLY");
|
||||||
|
SRC|053| remain=len+2;
|
||||||
|
SRC|054| } else throw new IOException("SOCKS_ATYP");
|
||||||
|
SRC|055| byte[] junk=new byte[remain];
|
||||||
|
SRC|056| int off=0;
|
||||||
|
SRC|057| while(off<remain) { int n=s.Read(junk,off,remain-off); if(n<=0) throw new IOException("SOCKS_REPLY_EOF"); off+=n; }
|
||||||
|
SRC|058| return c;
|
||||||
|
SRC|059| }
|
||||||
|
SRC|060|
|
||||||
|
SRC|061| static void ParseHostPort(string target, int defPort, out string host, out int port) {
|
||||||
|
SRC|062| host=target; port=defPort;
|
||||||
|
SRC|063| if(target.StartsWith("[")) {
|
||||||
|
SRC|064| int e=target.IndexOf(']');
|
||||||
|
SRC|065| if(e>0) {
|
||||||
|
SRC|066| host=target.Substring(1,e-1);
|
||||||
|
SRC|067| if(e+1<target.Length && target[e+1]==':') int.TryParse(target.Substring(e+2),out port);
|
||||||
|
SRC|068| }
|
||||||
|
SRC|069| return;
|
||||||
|
SRC|070| }
|
||||||
|
SRC|071| int k=target.LastIndexOf(':');
|
||||||
|
SRC|072| if(k>0 && target.IndexOf(':')==k) {
|
||||||
|
SRC|073| int p;
|
||||||
|
SRC|074| if(int.TryParse(target.Substring(k+1),out p)) { host=target.Substring(0,k); port=p; }
|
||||||
|
SRC|075| }
|
||||||
|
SRC|076| }
|
||||||
|
SRC|077|
|
||||||
|
SRC|078| static void Relay(TcpClient a, TcpClient b) {
|
||||||
|
SRC|079| var sa=a.GetStream(); var sb=b.GetStream();
|
||||||
|
SRC|080| var t1=sa.CopyToAsync(sb);
|
||||||
|
SRC|081| var t2=sb.CopyToAsync(sa);
|
||||||
|
SRC|082| try { Task.WaitAny(t1,t2); } catch {}
|
||||||
|
SRC|083| try { a.Close(); } catch {}
|
||||||
|
SRC|084| try { b.Close(); } catch {}
|
||||||
|
SRC|085| }
|
||||||
|
SRC|086|
|
||||||
|
SRC|087| static void Handle(TcpClient client) {
|
||||||
|
SRC|088| TcpClient upstream=null;
|
||||||
|
SRC|089| try {
|
||||||
|
SRC|090| var cs=client.GetStream();
|
||||||
|
SRC|091| int hend;
|
||||||
|
SRC|092| byte[] raw=ReadHeaders(cs,out hend);
|
||||||
|
SRC|093| if(raw.Length==0) return;
|
||||||
|
SRC|094| string header=Encoding.ASCII.GetString(raw,0,hend);
|
||||||
|
SRC|095| string[] lines=header.Split(new string[]{"\r\n"},StringSplitOptions.None);
|
||||||
|
SRC|096| string[] first=lines[0].Split(new char[]{' '},3);
|
||||||
|
SRC|097| if(first.Length<3) return;
|
||||||
|
SRC|098| string method=first[0], target=first[1], version=first[2];
|
||||||
|
SRC|099| string host=null; int port=80;
|
||||||
|
SRC|100|
|
||||||
|
SRC|101| if(method.Equals("CONNECT",StringComparison.OrdinalIgnoreCase)) {
|
||||||
|
SRC|102| ParseHostPort(target,443,out host,out port);
|
||||||
|
SRC|103| upstream=ConnectSocks(host,port);
|
||||||
|
SRC|104| byte[] ok=Encoding.ASCII.GetBytes("HTTP/1.1 200 Connection Established\r\nProxy-Agent: Workers2\r\n\r\n");
|
||||||
|
SRC|105| cs.Write(ok,0,ok.Length);
|
||||||
|
SRC|106| Relay(client,upstream);
|
||||||
|
SRC|107| return;
|
||||||
|
SRC|108| }
|
||||||
|
SRC|109|
|
||||||
|
SRC|110| Uri u;
|
||||||
|
SRC|111| string path=target;
|
||||||
|
SRC|112| if(Uri.TryCreate(target,UriKind.Absolute,out u)) {
|
||||||
|
SRC|113| host=u.Host; port=u.IsDefaultPort ? (u.Scheme=="https"?443:80) : u.Port;
|
||||||
|
SRC|114| path=String.IsNullOrEmpty(u.PathAndQuery)?"/":u.PathAndQuery;
|
||||||
|
SRC|115| } else {
|
||||||
|
SRC|116| foreach(string line in lines) {
|
||||||
|
SRC|117| if(line.StartsWith("Host:",StringComparison.OrdinalIgnoreCase)) {
|
||||||
|
SRC|118| string hv=line.Substring(5).Trim();
|
||||||
|
SRC|119| ParseHostPort(hv,80,out host,out port);
|
||||||
|
SRC|120| break;
|
||||||
|
SRC|121| }
|
||||||
|
SRC|122| }
|
||||||
|
SRC|123| }
|
||||||
|
SRC|124| if(String.IsNullOrEmpty(host)) return;
|
||||||
|
SRC|125| upstream=ConnectSocks(host,port);
|
||||||
|
SRC|126| var us=upstream.GetStream();
|
||||||
|
SRC|127| var sb=new StringBuilder();
|
||||||
|
SRC|128| sb.Append(method).Append(" ").Append(path).Append(" ").Append(version).Append("\r\n");
|
||||||
|
SRC|129| for(int i=1;i<lines.Length;i++) {
|
||||||
|
SRC|130| string line=lines[i];
|
||||||
|
SRC|131| if(line.Length==0) continue;
|
||||||
|
SRC|132| if(line.StartsWith("Proxy-Connection:",StringComparison.OrdinalIgnoreCase)) continue;
|
||||||
|
SRC|133| sb.Append(line).Append("\r\n");
|
||||||
|
SRC|134| }
|
||||||
|
SRC|135| sb.Append("\r\n");
|
||||||
|
SRC|136| byte[] nh=Encoding.ASCII.GetBytes(sb.ToString());
|
||||||
|
SRC|137| us.Write(nh,0,nh.Length);
|
||||||
|
SRC|138| Relay(client,upstream);
|
||||||
|
SRC|139| } catch {
|
||||||
|
SRC|140| try {
|
||||||
|
SRC|141| byte[] er=Encoding.ASCII.GetBytes("HTTP/1.1 502 Bad Gateway\r\nContent-Length:0\r\nConnection: close\r\n\r\n");
|
||||||
|
SRC|142| client.GetStream().Write(er,0,er.Length);
|
||||||
|
SRC|143| } catch {}
|
||||||
|
SRC|144| try { client.Close(); } catch {}
|
||||||
|
SRC|145| try { if(upstream!=null) upstream.Close(); } catch {}
|
||||||
|
SRC|146| }
|
||||||
|
SRC|147| }
|
||||||
|
SRC|148|
|
||||||
|
SRC|149| public static void Run(int listenPort, int socksPort) {
|
||||||
|
SRC|150| SocksPort=socksPort;
|
||||||
|
SRC|151| var l=new TcpListener(IPAddress.Loopback,listenPort);
|
||||||
|
SRC|152| l.Start();
|
||||||
|
SRC|153| while(true) {
|
||||||
|
SRC|154| TcpClient c=l.AcceptTcpClient();
|
||||||
|
SRC|155| Task.Run(()=>Handle(c));
|
||||||
|
SRC|156| }
|
||||||
|
SRC|157| }
|
||||||
|
SRC|158|}
|
||||||
|
SRC|159|"@
|
||||||
|
SRC|160|Add-Type -TypeDefinition $src -Language CSharp
|
||||||
|
SRC|161|[W2HttpSocksBridge]::Run($ListenPort,$SocksPort)
|
||||||
|
SRC|162|
|
||||||
|
PORT64022_LISTENER_COUNT=1
|
||||||
|
PORT64022_OWNER_PID_COUNT=1
|
||||||
|
OWNER_NAME=powershell.exe
|
||||||
|
OWNER_SESSION_ID=1
|
||||||
|
OWNER_COMMAND_SANITIZED="<PATH>" -NoProfile -ExecutionPolicy Bypass -WindowStyle Hidden -File "<BRIDGE_PATH>" -ListenPort 64022 -SocksPort 64020
|
||||||
|
OWNER_CMD_HAS_BRIDGE=true
|
||||||
|
OWNER_CMD_HAS_64020=true
|
||||||
|
OWNER_CMD_HAS_64022=true
|
||||||
|
REC|PROTOCOL|MODE=SOCKS5|IOBIT_RC=28|GOOGLE_RC=28
|
||||||
|
REC|PROTOCOL|MODE=SOCKS4A|IOBIT_RC=28|GOOGLE_RC=28
|
||||||
|
REC|PROTOCOL|MODE=HTTP|IOBIT_RC=0|GOOGLE_RC=0
|
||||||
|
CONTROL_64020_IOBIT_RC=0
|
||||||
|
CONTROL_64020_GOOGLE_RC=0
|
||||||
|
WINDOWS_64022_EXACT_SOURCE_COMPLETE=true
|
||||||
|
PVE_UNIT_ACTIVE=active
|
||||||
|
PVE_UNIT_ENABLED=enabled
|
||||||
|
PVE64020_LISTENER_COUNT=1
|
||||||
|
DECISION=HOLD_WINDOWS_64022_EXACT_BRIDGE_SOURCE_INCOMPLETE
|
||||||
|
NEXT_GATE=NO_MUTATION_UNTIL_EXACT_BRIDGE_PROVEN
|
||||||
|
TASK_RESULT=WINDOWS_DACHA_64022_BRIDGE_EXACT_SOURCE_RCA
|
||||||
|
CHANGES_MADE=false
|
||||||
|
ROLLBACK_STARTED=false
|
||||||
|
ROLLBACK_RESTORED=null
|
||||||
|
MUTATION_OUTCOME=NO_MUTATION
|
||||||
|
HOMELAB_RESULT_CONTRACT={"version":1,"command_id":"SUPPORT-261007-WINDOWS-DACHA-64022-BRIDGE-EXACT-SOURCE-RCA-99783R1","status":"OK","changes_made":false,"rollback_started":false,"rollback_restored":null}
|
||||||
|
|
||||||
|
OUTPUT_END
|
||||||
|
CHAT_OUTPUT_END
|
||||||
+8
-8
File diff suppressed because one or more lines are too long
+190
-17
@@ -1,15 +1,15 @@
|
|||||||
CHAT_OUTPUT_BEGIN
|
CHAT_OUTPUT_BEGIN
|
||||||
COMMAND_ID=SUPPORT-261007-WINDOWS-DACHA-64022-OWNER-SHAPE-RCA-99782R1
|
COMMAND_ID=SUPPORT-261007-WINDOWS-DACHA-64022-BRIDGE-EXACT-SOURCE-RCA-99783R1
|
||||||
STATUS=OK
|
STATUS=OK
|
||||||
RC=0
|
RC=0
|
||||||
HOST=pve01
|
HOST=pve01
|
||||||
MODE=read-only
|
MODE=read-only
|
||||||
COMPONENT=windows-dacha-64022-owner-shape-rca
|
COMPONENT=windows-dacha-64022-bridge-exact-source-rca
|
||||||
REFERENCE_REGISTER_CHECK=OK
|
REFERENCE_REGISTER_CHECK=OK
|
||||||
REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66
|
REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66
|
||||||
ERROR_REGISTER_CHECK=OK
|
ERROR_REGISTER_CHECK=OK
|
||||||
ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0
|
ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0
|
||||||
COMMAND_SHA256=2727847ac01a9bccebd6a20c44fd420e4320470f3ad398de4b680d1c84a759f7
|
COMMAND_SHA256=29c3f3ddfe92bc5d9c1bb03713be42ea2a98feb62a5dfc18888c66feaec02ee3
|
||||||
DUPLICATE_FAILED_COMMAND_BLOCKED=false
|
DUPLICATE_FAILED_COMMAND_BLOCKED=false
|
||||||
EXECUTION_STARTED=true
|
EXECUTION_STARTED=true
|
||||||
CHANGE_DECLARED=false
|
CHANGE_DECLARED=false
|
||||||
@@ -24,38 +24,211 @@ MUTATION_OUTCOME=NO_MUTATION
|
|||||||
SANITIZED=yes
|
SANITIZED=yes
|
||||||
SECRETS_INCLUDED=no
|
SECRETS_INCLUDED=no
|
||||||
PRIVATE_ADDRESSES_INCLUDED=no
|
PRIVATE_ADDRESSES_INCLUDED=no
|
||||||
RAW_EVIDENCE_SHA256=39c69b18eea90932aa22dda702fb457f73dca990cf8c8d60f4ba526efd5f7cd1
|
RAW_EVIDENCE_SHA256=66b16d6cb988213a72ed70a9ed3e7d0cce65c7f44b3752973ecd7e161e40042b
|
||||||
SANITIZED_OUTPUT_SHA256=39c69b18eea90932aa22dda702fb457f73dca990cf8c8d60f4ba526efd5f7cd1
|
SANITIZED_OUTPUT_SHA256=66b16d6cb988213a72ed70a9ed3e7d0cce65c7f44b3752973ecd7e161e40042b
|
||||||
OUTPUT_BEGIN
|
OUTPUT_BEGIN
|
||||||
WINDOWS_DACHA_64022_OWNER_SHAPE_RCA=V1
|
WINDOWS_DACHA_64022_BRIDGE_EXACT_SOURCE_RCA=V1
|
||||||
MODE=read-only
|
MODE=read-only
|
||||||
NO_MUTATION=true
|
NO_MUTATION=true
|
||||||
WINDOWS_LOCAL_INSPECT_RC=0
|
WINDOWS_LOCAL_INSPECT_RC=0
|
||||||
WINDOWS_EVIDENCE_PRESENT=true
|
WINDOWS_EVIDENCE_PRESENT=true
|
||||||
WINDOWS_DACHA_64022_OWNER_SHAPE_RCA=V1
|
WINDOWS_DACHA_64022_BRIDGE_EXACT_SOURCE_RCA=V1
|
||||||
MODE=read-only
|
MODE=read-only
|
||||||
NO_MUTATION=true
|
NO_MUTATION=true
|
||||||
|
STARTUP_MATCH_COUNT=2
|
||||||
|
REC|STARTUP|IDX=1|SCRIPT_RESOLVED=true|ARGS_SANITIZED=-NoProfile -ExecutionPolicy Bypass -WindowStyle Hidden -File "<BRIDGE_PATH>" -ListenPort 64022 -SocksPort 64020
|
||||||
|
REC|STARTUP|IDX=2|SCRIPT_RESOLVED=true|ARGS_SANITIZED=-NoProfile -ExecutionPolicy Bypass -WindowStyle Hidden -File "<BRIDGE_PATH>" -ListenPort 64022 -SocksPort 64020
|
||||||
|
BRIDGE_PATH_COUNT=1
|
||||||
|
REC|BRIDGE_FILE|BASENAME=bridge.ps1|SHA256=d6ed793d7cfd3ec4894ff766f1c20a5de80cf3be6615a27ae4dc0f836da4cf0e|SIZE=5696|EXPECTED_SHA_MATCH=true
|
||||||
|
EXACT_BRIDGE_SHA_MATCH_COUNT=1
|
||||||
|
BRIDGE_LINE_COUNT=162
|
||||||
|
SRC|001|param([int]$ListenPort=64021,[int]$SocksPort=64020)
|
||||||
|
SRC|002|$ErrorActionPreference='Stop'
|
||||||
|
SRC|003|$src=@"
|
||||||
|
SRC|004|using System;
|
||||||
|
SRC|005|using System.IO;
|
||||||
|
SRC|006|using System.Net;
|
||||||
|
SRC|007|using System.Net.Sockets;
|
||||||
|
SRC|008|using System.Text;
|
||||||
|
SRC|009|using System.Threading.Tasks;
|
||||||
|
SRC|010|using System.Collections.Generic;
|
||||||
|
SRC|011|
|
||||||
|
SRC|012|public static class W2HttpSocksBridge {
|
||||||
|
SRC|013| static int SocksPort;
|
||||||
|
SRC|014|
|
||||||
|
SRC|015| static byte[] ReadHeaders(NetworkStream s, out int headerEnd) {
|
||||||
|
SRC|016| var buf = new List<byte>(4096);
|
||||||
|
SRC|017| int state=0;
|
||||||
|
SRC|018| while (buf.Count < 65536) {
|
||||||
|
SRC|019| int b=s.ReadByte();
|
||||||
|
SRC|020| if (b < 0) break;
|
||||||
|
SRC|021| buf.Add((byte)b);
|
||||||
|
SRC|022| if (state==0 && b==13) state=1;
|
||||||
|
SRC|023| else if (state==1 && b==10) state=2;
|
||||||
|
SRC|024| else if (state==2 && b==13) state=3;
|
||||||
|
SRC|025| else if (state==3 && b==10) { headerEnd=buf.Count; return buf.ToArray(); }
|
||||||
|
SRC|026| else state=(b==13)?1:0;
|
||||||
|
SRC|027| }
|
||||||
|
SRC|028| headerEnd=buf.Count;
|
||||||
|
SRC|029| return buf.ToArray();
|
||||||
|
SRC|030| }
|
||||||
|
SRC|031|
|
||||||
|
SRC|032| static TcpClient ConnectSocks(string host, int port) {
|
||||||
|
SRC|033| var c=new TcpClient();
|
||||||
|
SRC|034| c.Connect(IPAddress.Loopback,SocksPort);
|
||||||
|
SRC|035| var s=c.GetStream();
|
||||||
|
SRC|036| s.Write(new byte[]{5,1,0},0,3);
|
||||||
|
SRC|037| byte[] r=new byte[2];
|
||||||
|
SRC|038| if (s.Read(r,0,2)!=2 || r[0]!=5 || r[1]!=0) throw new IOException("SOCKS_GREETING");
|
||||||
|
SRC|039| byte[] hb=Encoding.ASCII.GetBytes(host);
|
||||||
|
SRC|040| if (hb.Length<1 || hb.Length>255) throw new IOException("SOCKS_HOST");
|
||||||
|
SRC|041| using(var ms=new MemoryStream()) {
|
||||||
|
SRC|042| ms.WriteByte(5); ms.WriteByte(1); ms.WriteByte(0); ms.WriteByte(3); ms.WriteByte((byte)hb.Length);
|
||||||
|
SRC|043| ms.Write(hb,0,hb.Length); ms.WriteByte((byte)((port>>8)&255)); ms.WriteByte((byte)(port&255));
|
||||||
|
SRC|044| var q=ms.ToArray(); s.Write(q,0,q.Length);
|
||||||
|
SRC|045| }
|
||||||
|
SRC|046| byte[] h4=new byte[4];
|
||||||
|
SRC|047| if (s.Read(h4,0,4)!=4 || h4[0]!=5 || h4[1]!=0) throw new IOException("SOCKS_CONNECT");
|
||||||
|
SRC|048| int remain=0;
|
||||||
|
SRC|049| if (h4[3]==1) remain=4+2;
|
||||||
|
SRC|050| else if (h4[3]==4) remain=16+2;
|
||||||
|
SRC|051| else if (h4[3]==3) {
|
||||||
|
SRC|052| int len=s.ReadByte(); if(len<0) throw new IOException("SOCKS_REPLY");
|
||||||
|
SRC|053| remain=len+2;
|
||||||
|
SRC|054| } else throw new IOException("SOCKS_ATYP");
|
||||||
|
SRC|055| byte[] junk=new byte[remain];
|
||||||
|
SRC|056| int off=0;
|
||||||
|
SRC|057| while(off<remain) { int n=s.Read(junk,off,remain-off); if(n<=0) throw new IOException("SOCKS_REPLY_EOF"); off+=n; }
|
||||||
|
SRC|058| return c;
|
||||||
|
SRC|059| }
|
||||||
|
SRC|060|
|
||||||
|
SRC|061| static void ParseHostPort(string target, int defPort, out string host, out int port) {
|
||||||
|
SRC|062| host=target; port=defPort;
|
||||||
|
SRC|063| if(target.StartsWith("[")) {
|
||||||
|
SRC|064| int e=target.IndexOf(']');
|
||||||
|
SRC|065| if(e>0) {
|
||||||
|
SRC|066| host=target.Substring(1,e-1);
|
||||||
|
SRC|067| if(e+1<target.Length && target[e+1]==':') int.TryParse(target.Substring(e+2),out port);
|
||||||
|
SRC|068| }
|
||||||
|
SRC|069| return;
|
||||||
|
SRC|070| }
|
||||||
|
SRC|071| int k=target.LastIndexOf(':');
|
||||||
|
SRC|072| if(k>0 && target.IndexOf(':')==k) {
|
||||||
|
SRC|073| int p;
|
||||||
|
SRC|074| if(int.TryParse(target.Substring(k+1),out p)) { host=target.Substring(0,k); port=p; }
|
||||||
|
SRC|075| }
|
||||||
|
SRC|076| }
|
||||||
|
SRC|077|
|
||||||
|
SRC|078| static void Relay(TcpClient a, TcpClient b) {
|
||||||
|
SRC|079| var sa=a.GetStream(); var sb=b.GetStream();
|
||||||
|
SRC|080| var t1=sa.CopyToAsync(sb);
|
||||||
|
SRC|081| var t2=sb.CopyToAsync(sa);
|
||||||
|
SRC|082| try { Task.WaitAny(t1,t2); } catch {}
|
||||||
|
SRC|083| try { a.Close(); } catch {}
|
||||||
|
SRC|084| try { b.Close(); } catch {}
|
||||||
|
SRC|085| }
|
||||||
|
SRC|086|
|
||||||
|
SRC|087| static void Handle(TcpClient client) {
|
||||||
|
SRC|088| TcpClient upstream=null;
|
||||||
|
SRC|089| try {
|
||||||
|
SRC|090| var cs=client.GetStream();
|
||||||
|
SRC|091| int hend;
|
||||||
|
SRC|092| byte[] raw=ReadHeaders(cs,out hend);
|
||||||
|
SRC|093| if(raw.Length==0) return;
|
||||||
|
SRC|094| string header=Encoding.ASCII.GetString(raw,0,hend);
|
||||||
|
SRC|095| string[] lines=header.Split(new string[]{"\r\n"},StringSplitOptions.None);
|
||||||
|
SRC|096| string[] first=lines[0].Split(new char[]{' '},3);
|
||||||
|
SRC|097| if(first.Length<3) return;
|
||||||
|
SRC|098| string method=first[0], target=first[1], version=first[2];
|
||||||
|
SRC|099| string host=null; int port=80;
|
||||||
|
SRC|100|
|
||||||
|
SRC|101| if(method.Equals("CONNECT",StringComparison.OrdinalIgnoreCase)) {
|
||||||
|
SRC|102| ParseHostPort(target,443,out host,out port);
|
||||||
|
SRC|103| upstream=ConnectSocks(host,port);
|
||||||
|
SRC|104| byte[] ok=Encoding.ASCII.GetBytes("HTTP/1.1 200 Connection Established\r\nProxy-Agent: Workers2\r\n\r\n");
|
||||||
|
SRC|105| cs.Write(ok,0,ok.Length);
|
||||||
|
SRC|106| Relay(client,upstream);
|
||||||
|
SRC|107| return;
|
||||||
|
SRC|108| }
|
||||||
|
SRC|109|
|
||||||
|
SRC|110| Uri u;
|
||||||
|
SRC|111| string path=target;
|
||||||
|
SRC|112| if(Uri.TryCreate(target,UriKind.Absolute,out u)) {
|
||||||
|
SRC|113| host=u.Host; port=u.IsDefaultPort ? (u.Scheme=="https"?443:80) : u.Port;
|
||||||
|
SRC|114| path=String.IsNullOrEmpty(u.PathAndQuery)?"/":u.PathAndQuery;
|
||||||
|
SRC|115| } else {
|
||||||
|
SRC|116| foreach(string line in lines) {
|
||||||
|
SRC|117| if(line.StartsWith("Host:",StringComparison.OrdinalIgnoreCase)) {
|
||||||
|
SRC|118| string hv=line.Substring(5).Trim();
|
||||||
|
SRC|119| ParseHostPort(hv,80,out host,out port);
|
||||||
|
SRC|120| break;
|
||||||
|
SRC|121| }
|
||||||
|
SRC|122| }
|
||||||
|
SRC|123| }
|
||||||
|
SRC|124| if(String.IsNullOrEmpty(host)) return;
|
||||||
|
SRC|125| upstream=ConnectSocks(host,port);
|
||||||
|
SRC|126| var us=upstream.GetStream();
|
||||||
|
SRC|127| var sb=new StringBuilder();
|
||||||
|
SRC|128| sb.Append(method).Append(" ").Append(path).Append(" ").Append(version).Append("\r\n");
|
||||||
|
SRC|129| for(int i=1;i<lines.Length;i++) {
|
||||||
|
SRC|130| string line=lines[i];
|
||||||
|
SRC|131| if(line.Length==0) continue;
|
||||||
|
SRC|132| if(line.StartsWith("Proxy-Connection:",StringComparison.OrdinalIgnoreCase)) continue;
|
||||||
|
SRC|133| sb.Append(line).Append("\r\n");
|
||||||
|
SRC|134| }
|
||||||
|
SRC|135| sb.Append("\r\n");
|
||||||
|
SRC|136| byte[] nh=Encoding.ASCII.GetBytes(sb.ToString());
|
||||||
|
SRC|137| us.Write(nh,0,nh.Length);
|
||||||
|
SRC|138| Relay(client,upstream);
|
||||||
|
SRC|139| } catch {
|
||||||
|
SRC|140| try {
|
||||||
|
SRC|141| byte[] er=Encoding.ASCII.GetBytes("HTTP/1.1 502 Bad Gateway\r\nContent-Length:0\r\nConnection: close\r\n\r\n");
|
||||||
|
SRC|142| client.GetStream().Write(er,0,er.Length);
|
||||||
|
SRC|143| } catch {}
|
||||||
|
SRC|144| try { client.Close(); } catch {}
|
||||||
|
SRC|145| try { if(upstream!=null) upstream.Close(); } catch {}
|
||||||
|
SRC|146| }
|
||||||
|
SRC|147| }
|
||||||
|
SRC|148|
|
||||||
|
SRC|149| public static void Run(int listenPort, int socksPort) {
|
||||||
|
SRC|150| SocksPort=socksPort;
|
||||||
|
SRC|151| var l=new TcpListener(IPAddress.Loopback,listenPort);
|
||||||
|
SRC|152| l.Start();
|
||||||
|
SRC|153| while(true) {
|
||||||
|
SRC|154| TcpClient c=l.AcceptTcpClient();
|
||||||
|
SRC|155| Task.Run(()=>Handle(c));
|
||||||
|
SRC|156| }
|
||||||
|
SRC|157| }
|
||||||
|
SRC|158|}
|
||||||
|
SRC|159|"@
|
||||||
|
SRC|160|Add-Type -TypeDefinition $src -Language CSharp
|
||||||
|
SRC|161|[W2HttpSocksBridge]::Run($ListenPort,$SocksPort)
|
||||||
|
SRC|162|
|
||||||
PORT64022_LISTENER_COUNT=1
|
PORT64022_LISTENER_COUNT=1
|
||||||
PORT64022_OWNER_PID_COUNT=1
|
PORT64022_OWNER_PID_COUNT=1
|
||||||
OWNER_NAME=powershell.exe
|
OWNER_NAME=powershell.exe
|
||||||
OWNER_NAME_SSH=false
|
|
||||||
OWNER_NAME_PLINK=false
|
|
||||||
OWNER_NAME_POWERSHELL=true
|
|
||||||
OWNER_SESSION_ID=1
|
OWNER_SESSION_ID=1
|
||||||
OWNER_PARENT_PID_HASH=
|
OWNER_COMMAND_SANITIZED="<PATH>" -NoProfile -ExecutionPolicy Bypass -WindowStyle Hidden -File "<BRIDGE_PATH>" -ListenPort 64022 -SocksPort 64020
|
||||||
OWNER_EXE_SHA256=9785001b0dcf755eddb8af294a373c0b87b2498660f724e76c4d53f9c217c7a3
|
OWNER_CMD_HAS_BRIDGE=true
|
||||||
OWNER_COMMANDLINE_AVAILABLE=true
|
OWNER_CMD_HAS_64020=true
|
||||||
|
OWNER_CMD_HAS_64022=true
|
||||||
|
REC|PROTOCOL|MODE=SOCKS5|IOBIT_RC=28|GOOGLE_RC=28
|
||||||
|
REC|PROTOCOL|MODE=SOCKS4A|IOBIT_RC=28|GOOGLE_RC=28
|
||||||
|
REC|PROTOCOL|MODE=HTTP|IOBIT_RC=0|GOOGLE_RC=0
|
||||||
|
CONTROL_64020_IOBIT_RC=0
|
||||||
|
CONTROL_64020_GOOGLE_RC=0
|
||||||
|
WINDOWS_64022_EXACT_SOURCE_COMPLETE=true
|
||||||
PVE_UNIT_ACTIVE=active
|
PVE_UNIT_ACTIVE=active
|
||||||
PVE_UNIT_ENABLED=enabled
|
PVE_UNIT_ENABLED=enabled
|
||||||
PVE64020_LISTENER_COUNT=1
|
PVE64020_LISTENER_COUNT=1
|
||||||
DECISION=HOLD_WINDOWS_64022_OWNER_SHAPE_INCOMPLETE
|
DECISION=HOLD_WINDOWS_64022_EXACT_BRIDGE_SOURCE_INCOMPLETE
|
||||||
NEXT_GATE=NO_MUTATION_UNTIL_OWNER_SHAPE_PROVEN
|
NEXT_GATE=NO_MUTATION_UNTIL_EXACT_BRIDGE_PROVEN
|
||||||
TASK_RESULT=WINDOWS_DACHA_64022_OWNER_SHAPE_RCA
|
TASK_RESULT=WINDOWS_DACHA_64022_BRIDGE_EXACT_SOURCE_RCA
|
||||||
CHANGES_MADE=false
|
CHANGES_MADE=false
|
||||||
ROLLBACK_STARTED=false
|
ROLLBACK_STARTED=false
|
||||||
ROLLBACK_RESTORED=null
|
ROLLBACK_RESTORED=null
|
||||||
MUTATION_OUTCOME=NO_MUTATION
|
MUTATION_OUTCOME=NO_MUTATION
|
||||||
HOMELAB_RESULT_CONTRACT={"version":1,"command_id":"SUPPORT-261007-WINDOWS-DACHA-64022-OWNER-SHAPE-RCA-99782R1","status":"OK","changes_made":false,"rollback_started":false,"rollback_restored":null}
|
HOMELAB_RESULT_CONTRACT={"version":1,"command_id":"SUPPORT-261007-WINDOWS-DACHA-64022-BRIDGE-EXACT-SOURCE-RCA-99783R1","status":"OK","changes_made":false,"rollback_started":false,"rollback_restored":null}
|
||||||
|
|
||||||
OUTPUT_END
|
OUTPUT_END
|
||||||
CHAT_OUTPUT_END
|
CHAT_OUTPUT_END
|
||||||
|
|||||||
Reference in New Issue
Block a user