IPPacket Redirecting

post id: 18

post length: 8558

post datetime: 12/9/2009 7:26:01 PM

post ip: 77.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 e As Exception

Console.WriteLine(String.Concat( _

e.Message _

))

End Try

'

End Sub

End Class

THE END