BlackLight Moderatore
Numero di messaggi : 277 Età : 37 Data d'iscrizione : 22.08.07
| Titolo: [C] Basi di packet injection Ven Nov 09, 2007 11:11 pm | |
| Qui di seguito riporto un codice in C abbastanza inutile di sé (invia un pacchetto HTTP vuoto a localhost, tra l'altro senza fare controlli di checksum a livello dell'header IP e TCP, quindi preparandosi molto probabilmente a essere scartato già al livello 2 dello stack TCP/IP), ma estremamente utile per capire come fare packet injection, quindi come costruirsi da sé un pacchetto come si vuole (quindi volendo falsificando dati del mittente e del destinatario, sia come MAC sia come IP). Il pacchetto lo costruisco semplicemente con un minimo di conoscenza della struttura dei pacchetti TCP/IP, quindi è una costruzione manuale e MOLTO a basso livello. Per l'iniezione del pacchetto così costruito ho usato le PCAP e la relativa funzione pcap_inject. - Codice:
-
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <pcap.h>
typedef unsigned char u8; typedef unsigned short int u16; typedef unsigned long int u32;
typedef struct { u8 src_mac[6]; u8 dst_mac[6]; u16 type; u8 ip_head_len; u8 zero1; u16 tot_len; u16 id; u8 ip_flags; u8 zero2; u8 ip_ttl; u8 proto; u16 ip_checksum; u32 src_ip; u32 dst_ip; u16 src_port; u16 dst_port; u32 seq_num; u32 ack_num; u8 tcp_head_len; u8 tcp_flags; u16 win_size; u16 tcp_checksum; u8 options[20]; } packet;
packet pkt;
void init_packet (char *data) { u8 ip_head[52]; int i; u8 src[] = { 0x00, 0x16, 0x36, 0x93, 0xd4, 0xdb }; u8 dst[] = { 0x00, 0x0f, 0x3d, 0x8d, 0xfd, 0xf5 };
srand((unsigned) time(NULL));
memcpy (pkt.src_mac,src,sizeof(pkt.src_mac)); memcpy (pkt.dst_mac,dst,sizeof(pkt.dst_mac)); pkt.type = 0x0800; pkt.ip_head_len = 0x45; pkt.zero1=0x0; pkt.tot_len=20; pkt.id = (u16) rand()%65535; pkt.ip_flags = 0x40; pkt.zero2 = 0x0; pkt.ip_ttl = 0x40; pkt.proto = 0x06; pkt.ip_checksum=0x0; pkt.src_ip=inet_addr("127.0.0.1"); pkt.dst_ip=inet_addr("127.0.0.1"); pkt.src_port = (u16) rand()%65535; pkt.dst_port=80; pkt.seq_num = (u32) rand(); pkt.ack_num = (u32) rand(); pkt.tcp_head_len=0x50; pkt.tcp_flags=0x10; pkt.win_size = (u16) rand()%65535; pkt.tcp_checksum=0x0;
memcpy (ip_head,&pkt,sizeof(ip_head));
for (i=0; i<36; i++) printf ("%.2x ",ip_head[i]); printf ("\n"); }
main(int argc, char **argv) { int i; pcap_t *sniff; char err[PCAP_ERRBUF_SIZE]; char data[BUFSIZ]; bpf_u_int32 net,mask; u8 ip_head[36];
init_packet(NULL); memcpy (ip_head,&pkt,sizeof(ip_head));
if (argc==1) { fprintf (stderr,"%s <interface>\n",argv[0]); exit(-1); }
if (pcap_lookupnet(NULL,&net,&mask,err)==-1) { fprintf (stderr,"%s\n",err); exit(1); }
if (!(sniff=pcap_open_live(argv[1],1024,1,0,err))) { fprintf (stderr,"%s\n",err); exit(2); }
pcap_inject (sniff,&pkt,sizeof(packet)); } | |
|