Raw socket

Z AMP Sec
Přejít na: navigace, hledání

Raw socket je výraz z oboru počítačových sítí který opisuje socket umožňujíci připojení na hlavičku paketu v příchozích a odchozích paketech. Raw sockety jsou obvykle používány na transportních nebo síťových vrstvách. Raw sockety nikdy nezahazují hlavičky paketů (oproti non-raw socketu který stripuje hlavičky a akceptuje [zpracuje] pouze payload). Pokud nebude hlavička zahozena nebo záměrně manipulována jedná se o záměr a socket se stáva konfigurovatelným. Stručně řečeno paket je ušetřen enkapsulace a dekapsulace kernel TCP/IP stacku a propluje přímo k aplikaci. Nesprocesovaný paket je raw paket.

Raw sockety nejsou konstruktorem žádne úrovně programovacího jazyka, ale pouze základní části systému operací síťového API.

Reference

Kód

Packet injection za použití raw socketu. Pokud vás zajíma víc navštivte Security Freak v odkazu kde to máte včetně videa.

  1. include<stdio.h>
  2. include<stdlib.h>
  3. include<sys/socket.h>
  4. include<features.h>
  5. include<linux/if_packet.h>
  6. include<linux/if_ether.h>
  7. include<errno.h>
  8. include<sys/ioctl.h>
  9. include<net/if.h>
  1. define PACKET_LENGTH 1024


int CreateRawSocket(int protocol_to_sniff) { int rawsock;

if((rawsock = socket(PF_PACKET, SOCK_RAW, htons(protocol_to_sniff)))== -1) { perror("Error creating raw socket: "); exit(-1); }

return rawsock; }

int BindRawSocketToInterface(char *device, int rawsock, int protocol) {

struct sockaddr_ll sll; struct ifreq ifr;

memset(&sll, 0, sizeof(sll)); memset(&ifr, 0, sizeof(ifr));

/* First Get the Interface Index */


strncpy((char *)ifr.ifr_name, device, IFNAMSIZ); if((ioctl(rawsock, SIOCGIFINDEX, &ifr)) == -1) { printf("Error getting Interface index !\n"); exit(-1); }

/* Bind our raw socket to this interface */

sll.sll_family = AF_PACKET; sll.sll_ifindex = ifr.ifr_ifindex; sll.sll_protocol = htons(protocol);


if((bind(rawsock, (struct sockaddr *)&sll, sizeof(sll)))== -1) { perror("Error binding raw socket to interface\n"); exit(-1); }

return 1;

}


int SendRawPacket(int rawsock, unsigned char *pkt, int pkt_len) { int sent= 0;

/* A simple write on the socket ..thats all it takes ! */

if((sent = write(rawsock, pkt, pkt_len)) != pkt_len) { return 0; }

return 1;


}


/* argv[1] is the device e.g. eth0

  argv[2] is the number of packets to send
  • /

main(int argc, char **argv) {

int raw; unsigned char packet[PACKET_LENGTH]; int num_of_pkts;

/* Set the packet to all A's */

memset(packet, 'A', PACKET_LENGTH);

/* Create the raw socket */

raw = CreateRawSocket(ETH_P_ALL);

/* Bind raw socket to interface */

BindRawSocketToInterface(argv[1], raw, ETH_P_ALL);

num_of_pkts = atoi(argv[2]);

while((num_of_pkts--)>0) {

if(!SendRawPacket(raw, packet, PACKET_LENGTH)) { perror("Error sending packet"); } else { printf("Packet sent successfully\n"); } }

close(raw);

return 0; }