Documents & code‎ > ‎

IPPacket Redirecting

post id18 
post length8558 
post datetime12/9/2009 7:26:01 PM 
post ip77.51.3.219 

 

IPPacket Redirecting 

Дата подачи: 05.04.2009 


IPPacket Redirecting 

Главная наша хитрость будет заключаться в том, что вместо раздельного (и даже не побоюсь этого слова – кошерного) портирования типа proxy , мы снова воспользуемся режимом прослушивания, но на этот раз средствами framework`ka. 

Что нам это даёт: 
1. Не ограничены необходимостью выделения и прослушивания каких-то конкретных портов и имеем возможность реализовать полноценный редирект пакетов по несущему протоколу IP и всем остальным (как то ICMP, IGMP, TCP, UDP, GRE, ESP, IGRP, OSPF и т.д.), прямым или косвенным образом в него инкапсулированным. 
2. более того, полное отсутствие открытых портов и полное либо частичное отключение ICMP (в части: запрос/ответ входящего эха, штампа времени, времени доставки, маски, занижения скорости обмена, превышения длины пакета, ICMP перенаправления) позволяет работать в режиме невидимости а так же уберечься от атак через ICMP- сообщения. (Для ISA Server`а в локальной Access Policy  IP Packet Filters задействовать фильтрацию, при IP routing = Enable.) 
3. А реализация посредством framework освобождает нас от таких утомительных операций, как сборка/разборка базового пакета IP и пересчёт его CRC. 

Важно: т.к. сокет работает в режиме [принимать всё], очень забавным может стать проксирование трафика тех участников сети (а может быть и нескольких сетей), которые об этом даже и не просили. И если эти сети имеют медленные маршрутизаторы, либо по какой-либо причине длинные векторы расстояний при внутренней маршрутизации, либо большую (избыточную) таблицу маршрутов, то можно путём опережения подменять ответы на запросы некоего конкретного хоста. Т.е. например, если большинство пользователей в такой сети предпочитают пользовать Rambler в качестве поисковой системы, то достаточно перехватить их запрос и вернуть на него ответ быстрее, чем оригинал. При этом в качестве дополнительной меры будет уместно выставление приоритета дейтаграммы и желаемого типа маршрутизации в поле TOS IP-заголовка, замедление (или отсечение/десинхронизация) произвольного участка (звена) сети через атаку на маршрутизатор и принуждение конкретного хоста (либо группы) к передаче данных на заниженной скорости через [ICMP::Source Quench]. 


Будет состоять из двух классов [Listener] и [Client]. 



<SuppressUnmanagedCodeSecurity()> _ 
Public NotInheritable Class Listener 

      Public Structure INFO 
       '-----------------------------{{ 
       Public Socket As Socket, _ 
             Buffer() As Byte 'receive... 
       '              .........
       '              .........
       '}}----------------------------- 
       Sub New(ByVal size As Integer) 
            ReDim Preserve Buffer(size) 
       End Sub 
      End Structure 

      '-----------{{ 
      'I IPHeader [размер: 20 byte] 
      '---------------------------- 
      <StructLayout(LayoutKind.Sequential, Pack:=1)> _ 
      Public Structure IPHeader 
       ' 
       <MarshalAs(UnmanagedType.ByValArray, SizeConst:=12)> _ 
                               Public body() As Byte 
       ' 
       Public src _ 
             , dest As AdrIP 
       ' 
       Public Structure AdrIP 
            Dim q1 As Byte _ 
             , q2 As Byte _ 
             , q3 As Byte _ 
             , q4 As Byte 

            Public ReadOnly Property Parse() As String 
             Get 
                  ' 
                  Return String.Concat( _ 
                   q1, ".", _ 
                   q2, ".", _ 
                   q3, ".", _ 
                   q4 _ 
                   ) 
                  ' 
             End Get 
             ' 
            End Property 

       End Structure 

       Public Sub New(ByVal arr As Byte()) 
            ' 
            Dim size = Marshal.SizeOf(Me) 
            ' 
            Dim ptr As IntPtr = Marshal.AllocHGlobal(size) 
            ' 
            Marshal.Copy(arr, 0, ptr, size) 
            ' 
            Dim IPHead As IPHeader = Marshal.PtrToStructure( _ 
             ptr, GetType(IPHeader) _ 
             ) 
            '... 
            'кое что пропущено… 
            '... 
            Marshal.FreeHGlobal(ptr) 
            ' 
       End Sub 

      End Structure 

      Private Shared Sub ReceiveCallback(ByVal ar As IAsyncResult) 
       ' 
       Dim state As INFO = CType(ar.AsyncState, INFO) 
       ' 
       With state 
            ' 
            Dim BytesReceived = .Socket.EndReceive(ar) 
            ' 
            If BytesReceived > 0 Then 
             ' 
             Dim IPHead As New IPHeader(.Buffer) 
             ' 
             ' ReSend 
             ' 
             ' Если кроме заголовка пакет содержит 
             ' данные, его нужно перенаправить. 
             ' 
             ' где dest 
             ' – на кого перенаправляем. 
             ' 
             Dim dest = IPAddress.Parse("127.0.0.1") 
             ' 
             If Not [УСЛОВИЕ] Then 
                  ' 
                  ' Не стоит забывать, что мы работаем в прослушивающем 
                  'режиме, а следовательно необходимо перенаправлять 
                  'только те пакеты, которые пришли на хост извне, 
                  'отбрасывая внутренние, чтобы оградить 
                  'слушатель от зацикливания. 
                  ' 
                  .Buffer = Client.ReSend(dest, .Buffer) 
                  ' 
                  '... 
                  'кое что пропущено… 
                  '... 
                  ' 
                  ' Если редирект что-то вернул, ответ 
                  ' возвращаем внешнему клиенту 
                  ' 
             End If 
             ' 
             ar = .Socket.BeginReceive( _ 
                  .Buffer, 0, .Buffer.Length - 1, SocketFlags.Partial _ 
                  , New AsyncCallback(AddressOf ReceiveCallback) _ 
                  , state) 
             ' 
            End If 
            ' 
       End With 
       ' 
      End Sub 

      Public Shared Sub Processing() 
       ' 
       Dim client As New Socket( _ 
       AddressFamily.InterNetwork, SocketType.Raw, _ 
       ProtocolType.Unspecified _ 
       ) 
       ' 
       Dim host = Dns.GetHostEnTry(Dns.GetHostName()) 
       ' 
       For Each address As IPAddress In host.AddressList 
            ' 
            If Not IPAddress.IsLoopback(address) Then 
             ' 
             client.Bind(New IPEndPoint(address, Nothing)) 
             ' 
            End If 
            ' 
       Next 
       ' 
       ' Желательно использовать размер 
       ' пакета по умолчанию (8, 192, 512, 
       ' 1024, [4096] - 262144) 
       
       Dim state As New INFO(250) 
       With state 
            .Socket = client 
       End With 
       ' 
       client.IOControl(IOControlCode.ReceiveAll _ 
       , BitConverter.GetBytes(1) _ 
       , Nothing _ 
       ) 
       ' 
       Dim ar As IAsyncResult _ 
            = client.BeginReceive(state.Buffer, CInt(0) _ 
            , state.Buffer.Length - 1, SocketFlags.Partial _ 
            , New AsyncCallback(AddressOf ReceiveCallback) _ 
            , state) 
       ' 
       While True 
            ' 
            ' 
       End While 
       ' 
      End Sub 

End Class 






<SuppressUnmanagedCodeSecurity()> _ 
Public NotInheritable Class Client 

      Public Shared Function ReSend(ByVal IP As IPAddress _ 
                        , ByVal [buff] As Byte()) 
       ' 
       Try 
            ' 
            Dim EndPoint As New IPEndPoint(IP, Nothing
            ' 
            Dim client As New Socket(AddressFamily.InterNetwork _ 
             , SocketType.Raw, ProtocolType.IP _ 
             ) 
            ' 
            client.Blocking = False 
            ' 
            '* send... 
            ' 
            Dim ret As Integer _ 
             = client.SendTo(buff, 0, buff.Length _ 
             , SocketFlags.None, EndPoint _ 
             ) 
            ' 
            ReDim buff(buff.Length) 
            ' 
            '* Receive... 
            ' 
            While client.Receive(buff, client.Available _ 
             , SocketFlags.None) = 0 
             ' 
             ' 
            End While 
            ' 
            client.Close() 
            '... 
            'кое что пропущено… 
            '... 
            ' 
       Catch As Exception 
            Console.WriteLine(String.Concat( _ 
            e.Message _ 
            )) 
       End Try 
       ' 
      End Sub 

End Class 



THE END 
Comments