Test Foro de elhacker.net SMF 2.1

Programación => Programación General => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: elmaro en 30 Noviembre 2009, 03:54 AM

Título: Raw Sockets y VB.NET
Publicado por: elmaro en 30 Noviembre 2009, 03:54 AM
Tal y como dice el titulo mi pregunta se trata de raw sockets y .net.

Estuve leyendo por ahí y mismo en el foro que desde XP SP2 Microsoft no admite mas trabajar con raw sockets. Entonces..

serverSocket = new Socket(AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Raw, ProtocolType.Raw)


Ahí estoy trabajando con raw sockets? O veo mal?

Espero puedan responder mi duda.

Saludos!
Título: Re: Raw Sockets y VB.NET
Publicado por: anarquistadel89 en 30 Noviembre 2009, 03:58 AM
pues diria que si, no tengo npi idea de que es un raw socket, pero ahi lo defines de ese tipo  :-X
Título: Re: Raw Sockets y VB.NET
Publicado por: elmaro en 30 Noviembre 2009, 04:04 AM
Mi idea es crear paquetes SYN. Trate de usar la lib wincap en vb.net pero no la logre hacer funcionar.
Título: Re: Raw Sockets y VB.NET
Publicado por: isseu en 30 Noviembre 2009, 04:06 AM
¿¿y por que usas la libreria que net te da??
Título: Re: Raw Sockets y VB.NET
Publicado por: elmaro en 30 Noviembre 2009, 06:33 AM
Porque me parece lo mas sencillo y porque no encontré otra cosa mas que me funcione. Aparte en lo personal prefiero usar algo que este integrado en .net antes que andar agregando referencias y no estar seguro de la estabilidad y compatibilidad que tenga. Pero si hay mas opciones, a probarlas. No estoy casado con nadie jaja :laugh:
Título: Re: Raw Sockets y VB.NET
Publicado por: Foxy Rider en 5 Diciembre 2009, 14:03 PM
http://msdn.microsoft.com/en-us/library/2b86d684.aspx

también podés buscar alguno de los ports de pcap a .NET, hay un par ...
este es uno --> http://www.codeproject.com/KB/IP/sharppcap.aspx
de última, PInvoke a lo guerrillero =P  (swig te puede ayudar)

Saludos ~
Título: Re: Raw Sockets y VB.NET
Publicado por: Meta en 5 Diciembre 2009, 14:33 PM
Si lo quieres en español...

http://msdn.microsoft.com/es-es/library/2b86d684.aspx

Saludo.
Título: Re: Raw Sockets y VB.NET
Publicado por: elmaro en 10 Diciembre 2009, 18:39 PM
Muchas gracias por las respuestas. En cuanto tenga un minuto reviso y pruebo.
Si me funciona bien posteo el code.

Gracias nuevamente
Título: Re: Raw Sockets y VB.NET
Publicado por: elmaro en 11 Diciembre 2009, 04:18 AM
estuve probando los ejemplos de CodeProject, muy buenos la verdad.
El ejemplo que envía paquetes, genera uno aleatorio

private static byte[] GetRandomPacket()
{
byte[] packet = new byte[200];
Random rand = new Random();
rand.NextBytes( packet );
return packet;
}


Como puedo crear los paquetes con los datos que yo quiera? Principalmente me interesa el Header y el puerto e IP de destino. Por algún lado había visto como eran los distintos tipos de paquetes, pero no recuerdo donde era y no lo puedo encontrar.
Encontré esto para crearlos, perlo la verdad no me sirve de mucho (http://www.netscantools.com/nstpro_packet_generator_tcp.html)
Necesitaría crearlos yo mismo mediante código.
Cualquier sugerencia es bienvenida.
Gracias!

Edit:
Algo interesante
http://foro.elhacker.net/redes/el_modelo_tcpip-t33974.0.html;wap2=
Título: Re: Raw Sockets y VB.NET
Publicado por: [D4N93R] en 13 Diciembre 2009, 19:34 PM
Apuesto a que estás haciendo un Port Scanner! jeje :P 

Dale dale que si se puede en .net! ;)

Saludos! :D
Título: Re: Raw Sockets y VB.NET
Publicado por: elmaro en 15 Diciembre 2009, 00:07 AM
D4N93R , tu lo has hecho? Tienes el code para crear los paquetes?  ;D
Si es así, navidad llego temprano para mi  :laugh:
Título: Re: Raw Sockets y VB.NET
Publicado por: [D4N93R] en 15 Diciembre 2009, 00:20 AM
Si lo llegué a hacer, pero no tengo el código.. Perdí eso y mucho más :(

Pero igual es demasiado enredado. mejor dale en c++.net :) te lo haces en una libreria y luego la llamas desde tu aplicación principal en C#..

Un saludo!
Título: Re: Raw Sockets y VB.NET
Publicado por: elmaro en 15 Diciembre 2009, 00:24 AM
Excelente idea. Voy a ponerme con c++ jeje

Gracias y cualquier novedad la posteo. Nunca esta de mas
Título: Re: Raw Sockets y VB.NET
Publicado por: [D4N93R] en 15 Diciembre 2009, 00:41 AM
C++ .Net, es mejor si quieres interactuar con .Net y Win32... :D
Título: Re: Raw Sockets y VB.NET
Publicado por: Foxy Rider en 16 Diciembre 2009, 01:40 AM
Como veo que tuviste dificultades para armar paquetes ... te tiro una ayudita ...

usando Raw sockets tenés que armar el paquete by hand, vamos al ejemplo de armar un paquete TCP (http://www.freesoft.org/CIE/Course/Section4/8.htm)  :

Código (csharp) [Seleccionar]

// Somewhere in the code ...

class Package
{
public Int16 SourcePort,DestinationPort,Window,CheckSum,UrgentPtr;
public Int32 SequenceNumber,AckNumber;
public Byte DataOffset,Reserved,ControlBits;
public Byte [] Options = new Byte[1],Data = new Byte[1];
};


private static Byte[] makeTCPackage(Package PackageInfo)
{

// El paquete per se ... en una lista
System.Collections.Generic.List<Byte> mPacketBytes = new System.Collections.Generic.List<Byte>();
int optionBytes = 0;

// Empaquetamos el Puerto de origen y agregamos
// no limpiamos los bits que se truncan anyways
mPacketBytes.Add((Byte) (PackageInfo.SourcePort >> 8));
mPacketBytes.Add((Byte)  PackageInfo.SourcePort ); // truncamos y dejamos donde estaba

// Empaquetamos el de Destino y agregamos
mPacketBytes.Add((Byte) (PackageInfo.DestinationPort >> 8));
mPacketBytes.Add((Byte)  PackageInfo.DestinationPort);

// Empaquetamos el Sequence Number (en 4 pasos de un byte) y agregamos
mPacketBytes.Add((Byte) (PackageInfo.SequenceNumber >> 24));
mPacketBytes.Add((Byte) (PackageInfo.SequenceNumber >> 16));
mPacketBytes.Add((Byte) (PackageInfo.SequenceNumber >> 8));
mPacketBytes.Add((Byte)  PackageInfo.SequenceNumber);

// Empaquetamos el Ack Number (en 4 pasos de un byte) y agregamos
mPacketBytes.Add((Byte) (PackageInfo.AckNumber >> 24));
mPacketBytes.Add((Byte) (PackageInfo.AckNumber >> 16));
mPacketBytes.Add((Byte) (PackageInfo.AckNumber >> 8));
mPacketBytes.Add((Byte)  PackageInfo.AckNumber);

// 4 Bits de Data Offset + 2 de reserved
mPacketBytes.Add((Byte) (PackageInfo.DataOffset <<4));

// 2 de reserved + 6 de control bit
mPacketBytes.Add((Byte) ((PackageInfo.ControlBits << 2) >> 2));

// 2 bytes de Window
mPacketBytes.Add((Byte) (PackageInfo.Window >> 8));
mPacketBytes.Add((Byte)  PackageInfo.Window);

// 2 de checksum
mPacketBytes.Add((Byte) (PackageInfo.CheckSum >> 8));
mPacketBytes.Add((Byte)  PackageInfo.CheckSum);

// urgentPtr .. 2 bytes
mPacketBytes.Add((Byte) (PackageInfo.UrgentPtr >> 8));
mPacketBytes.Add((Byte) PackageInfo.UrgentPtr);

// Options
foreach(Byte mOptions in PackageInfo.Options)
{
mPacketBytes.Add(mOptions);
++optionBytes;
}

// Padding (4 columnas de 8 bits)

while((optionBytes++)%4 != 0)
{
mPacketBytes.Add((Byte) 0);
}

//Data
foreach(Byte mBData in PackageInfo.Data)
{
mPacketBytes.Add(mBData);

}

Byte[] mRawPacket = new Byte[mPacketBytes.Count];
mPacketBytes.CopyTo(mRawPacket);
return mRawPacket;
}


usás package para rellenar los datos y obtenerlos en un Byte[] para más tarde  enviarlo ...
o de última usás algún port de PCap a .net, si bien podés PInvokear, mejor evitalo ...
otro detalle : forget about Managed C++

Saludos ~

P.S : en Linux se requiere privilegios root para poder mandar paquetes raw, sino : Exception -> Access denied

P.S 2 : eso no está optimizado, está escrito de manera que se vea bien
Título: Re: Raw Sockets y VB.NET
Publicado por: elmaro en 16 Diciembre 2009, 05:02 AM
Vertex.Symphony fue de gran ayuda el code para entender un poco mas del tema (es la primera vez que me pongo con armado y envío de paquetes)

Antes de empezar a hacer algo, el paquete lo voy a enviar usando pcap seguramente.
Usando como referencia el link que me dejaste:
En checksum:

This pseudo header contains the Source
    Address, the Destination Address, the Protocol, and TCP length.


                     +--------+--------+--------+--------+
                     |           Source Address          |
                     +--------+--------+--------+--------+
                     |         Destination Address       |
                     +--------+--------+--------+--------+
                     |  zero  |  PTCL  |    TCP Length   |
                     +--------+--------+--------+--------+


De que manera se arma? Porque la clase Package tiene puertos de origen y destino, pero no las direcciones. Las cuales se tienen que poner en CheckSum, si estoy equivocado en algo, estoy atento a correcciones.

Gracias por tu tiempo
Título: Re: Raw Sockets y VB.NET
Publicado por: [D4N93R] en 16 Diciembre 2009, 16:54 PM
Excelente, se ve muy bien.. acá te dejo un enlace de la wiki para que estudies la estructura, deberías leerlo:

http://en.wikipedia.org/wiki/Transmission_Control_Protocol#TCP_segment_structure (http://en.wikipedia.org/wiki/Transmission_Control_Protocol#TCP_segment_structure)
Título: Re: Raw Sockets y VB.NET
Publicado por: Foxy Rider en 16 Diciembre 2009, 21:35 PM
Si, el code jamás completa algo, no era la intención, solo mostrar como empaquetar a Byte[] los datos del paquete que indiques en la clase para enviarlo (con lo que te trabaste...la implementación queda de tarea...incluído el checksum)
si quisieses hacerlo bien, dentro de la clase incluirías la data que falta (y que no puse ..), armás el pseudoheader, el header tcp y operás para obtener el checksum ...

te dejo como calcular el checksum :
http://www.tcpipguide.com/free/t_TCPChecksumCalculationandtheTCPPseudoHeader-2.htm
http://wwwse.inf.tu-dresden.de/data/courses/SE1/exercises/se_ws0405_exercise8_tcp_checksum.pdf
http://www.netfor2.com/tcpsum.htm

aunque si vas para pcap, then, don't make a big fuzz about this =P

Saludos ~