we care because you do

ARP Sniff (Sniffer Lite) Tool

ARP Sniff (Sniffer Lite) Tool
Posted Mar 17, 2010
Authored by K.K.Senthil Velan

ARP Sniff (Sniffer Lite) is a tiny ARP sniffer. This tool will be useful to analyze the ARP packets in the network. The tool gives out two types of information, the 14 byte Ethernet header and 28 byte ARP header. The tool requires G++ compiler and a libpcap package. Three arguments are coded as of now. One is to list the available devices, second is to sniff the default device and third is to sniff the device given as argument. The sniffer outputs the Ethernet header (Source MAC address, Destination MAC address and Ethernet type), ARP Header (Hardware type, Protocol type, Hardware address length, Protocol address length, Opcode, Source Hardware address and Protocol address, Destination hardware address and Protocol address).

tags | exploit, protocol
MD5 | 18ae58b999b218c41f4714dc43037caf

ARP Sniff (Sniffer Lite) Tool

Change Mirror Download
/***************************************************************************
* Copyright (C) 2010 by Velan. *
* vlabs.c@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
// 0.0.5 - included ethernet header, modified ARP header, changing APR processing by including ntohs; etc
// dependencies - libpcap -> tcpdump.org
// compilation - g++ arp_sniff.cc -o arp_sniff -lpcap -w


#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

//#include <iostream>
//#include <cstdlib>

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//#include <features.h>
#include <sys/types.h>
#include <sys/socket.h>

#include <netinet/in.h>
#include <arpa/inet.h>
#include <netinet/tcp.h>

#include <pcap.h>

using namespace std;

void List_Devices();
void Sniff_Device(char *Device);
void Got_ARP_Packet(u_char *args, const struct pcap_pkthdr *header, const u_char *packet);

// Ethernet header
typedef u_int32_t tcp_seq;



main(int argc, char *argv[])
{
//printf("Shellcode detector. \n");
char *ArgDevice;
ArgDevice = (char*)malloc(256);
bzero(ArgDevice, 256);

printf("Sniffer Lite. by Velan. vlabs.c@gmail.com\nThis module contains the ARPSniffer.\n");
if(argc < 2)
{
printf("\nUsage: %s [ld] [device name]\narg\t\tfunction\n", argv[0]);
printf("-l\t\tlisting available devices\n");
printf("-d\t\tuse default device\n");
printf("\n");
exit(0);
}
else if(strncmp(argv[1], "-l", 2) == 0)
{
List_Devices();
}
else if(strncmp(argv[1], "-d", 2) == 0)
{
printf("Selecting default device. ");
snprintf(ArgDevice, 3, "%s", "-d");
Sniff_Device(ArgDevice);
}
else if(argc == 2 && strncmp(argv[1], "-l", 2) != 0 && strncmp(argv[1], "-d", 2) != 0)
{
snprintf(ArgDevice, 256, "%s", argv[1]);
Sniff_Device(ArgDevice);
}
}

void List_Devices()
{
pcap_if_t *All_Devices_SP, *d;
int ret = 0;
char pcap_errbuf[PCAP_ERRBUF_SIZE];

printf("Listing available devices.\n");
ret = pcap_findalldevs(&All_Devices_SP, pcap_errbuf);
if(ret == -1)
{
printf("Error in looking up all available devices. %s\n", pcap_errbuf);
exit(-1);
}

printf("\n----------------------------\nDevice\t\tDescription\n----------------------------\n");
for(d = All_Devices_SP; d; d = d->next)
{
printf("%s\t\t%s\n", d->name, d->description);

}
printf("\n");
exit(0);
}


void Sniff_Device(char *Device)
{
char *dev = NULL;
char pcap_errbuf[PCAP_ERRBUF_SIZE];
const u_char *packet = NULL;
int ret = 0, i = 0;
unsigned int ts = 0;

pcap_t *pcap_handle;
bpf_u_int32 pcap_device_mask;
bpf_u_int32 pcap_device_ip;
struct pcap_pkthdr header;
struct bpf_program filter;

dev = (char*) malloc(256);
if(strncmp(Device, "-d", 2) == 0)
{
dev = pcap_lookupdev(pcap_errbuf);
printf("Default device: %s, ", dev);
}
else
{
snprintf(dev, 256, "%s", Device);
}

if(dev == NULL)
{
printf("Error in looking up default device. %s\n", pcap_errbuf);
exit(0);
}
ret = pcap_lookupnet(dev, &pcap_device_ip, &pcap_device_mask, pcap_errbuf);
if(ret == -1)
{
printf("Error in lookup device. %s\n", pcap_errbuf);
exit(0);
}
printf("opening the device %s for sniffing\n", dev);

// print sniffing IP - start
ts = pcap_device_ip;
ts = (ts << 24) >> 24;
printf("Sniffing device IP: %u.", ts);

ts = pcap_device_ip;
ts = (ts << 16) >> 24;
printf("%u.", ts);

ts = pcap_device_ip;
ts = (ts << 8) >> 24;
printf("%u.", ts);

ts = pcap_device_ip;
ts = (ts >> 24);
printf("%u, ", ts);
// print sniffing IP - end

// print sniffing IP Mask - start
ts = pcap_device_mask;
ts = (ts << 24) >> 24;
printf("Mask: %u.", ts);

ts = pcap_device_mask;
ts = (ts << 16) >> 24;
printf("%u.", ts);

ts = pcap_device_mask;
ts = (ts << 8) >> 24;
printf("%u.", ts);

ts = pcap_device_mask;
ts = (ts >> 24);
printf("%u\n", ts);
// print sniffing IP Mask - end
printf("\n\n");

pcap_handle = pcap_open_live(dev, 1000, 0, 10000, pcap_errbuf);
if(pcap_handle == NULL){ printf("Error!\n"); }

pcap_compile(pcap_handle, &filter, "arp", 1, pcap_device_mask); // create filter to grab only ARP
pcap_setfilter(pcap_handle, &filter); // apply the filter to the handle
printf("______________________________________________________\n\n");
pcap_loop(pcap_handle, -1, Got_ARP_Packet, NULL); // -1 means unlimited packet

}


void Got_ARP_Packet(u_char *args, const struct pcap_pkthdr *header, const u_char *packet)
{

typedef struct EthernetHeader_StructMain{
u_char DestinationMACAddress[6];
u_char SourceMACAddress[6];
u_short Type;
}Struct_EthernetHeader; // 14 bytes


typedef struct ARPHeader_StructMain{
u_int16_t HardwareType; // hardware type
u_int16_t ProtocolType; // protocol type

u_char HardwareAddressLength; // harware address length
u_char ProtocolAddressLength; // protocol address length
u_int16_t Opcode; // opcode - request, reply, re request

u_char SourceHardwareAddress[6]; // source MAC address
u_char SourceProtocolAddress[4]; // source IP address
u_char DestinationHardwareAddress[6]; // target MAC address
u_char DestinationProtocolAddress[4]; // target IP address
}Struct_ARPHeader; // 28 bytes

unsigned int ts = 0, j = 0 ;
u_int16_t HardwareType_Host = 0, ProtocolType_Host = 0, Opcode_Host = 0;
u_char HardwareAddressLength_Host = 0, ProtocolAddressLength_Host = 0;

Struct_EthernetHeader *EthernetHeader = NULL;
Struct_ARPHeader *ARPHeader = NULL;
bzero(&EthernetHeader, sizeof(Struct_EthernetHeader));
bzero(&ARPHeader, sizeof(Struct_ARPHeader));

EthernetHeader = (Struct_EthernetHeader *) packet;
ARPHeader = (Struct_ARPHeader *) (packet+14);

HardwareType_Host = ntohs(ARPHeader->HardwareType);
ProtocolType_Host = ntohs(ARPHeader->ProtocolType);
Opcode_Host = ntohs(ARPHeader->Opcode);

HardwareAddressLength_Host = ARPHeader->HardwareAddressLength;
ProtocolAddressLength_Host = ARPHeader->ProtocolAddressLength;

// print Ethernet header - 14 bytes - start

printf("Ethernet packet - Frame II: ");
// print source MAC address
for(j = 0; j < 6; j++)
{
//printf("(%u, %02X)", ARPHeader->SourceHardwareAddress[j], ARPHeader->SourceHardwareAddress[j]);
printf("%02X", EthernetHeader->SourceMACAddress[j]);
if(j != 5){ printf(":"); }
}
printf(" > ");
// print destination MAC address
for(j = 0; j < 6; j++)
{
//printf("(%u, %02X)", ARPHeader->SourceHardwareAddress[j], ARPHeader->SourceHardwareAddress[j]);
printf("%02X", EthernetHeader->DestinationMACAddress[j]);
if(j != 5){ printf(":"); }
}
// print Ethernet type
printf(", Type: 0x%X", ntohs(EthernetHeader->Type));

// print Ethernet header - 14 bytes - end

printf("\n");

// print ARP header - 28 bytes - start

printf("ARP Header: ");

// print source ip address
for(j = 0; j < 4; j++)
{
printf("%d", ARPHeader->SourceProtocolAddress[j]);
if(j != 3){ printf("."); }
}
printf(" > ");
// print target ip address
for(j = 0; j < 4; j++)
{
printf("%d", ARPHeader->DestinationProtocolAddress[j]);
if(j != 3){ printf("."); }
}

printf("\t\t=\t");
//printf("\n\t\t");
printf("MAC: ");

// print source hardware address
for(j = 0; j < 6; j++)
{
//printf("(%u, %02X)", ARPHeader->SourceHardwareAddress[j], ARPHeader->SourceHardwareAddress[j]);
printf("%02X", ARPHeader->SourceHardwareAddress[j]);
if(j != 5){ printf(":"); }
}
printf(" > ");
// print target hardware address
for(j = 0; j < 6; j++)
{
printf("%02X", ARPHeader->DestinationHardwareAddress[j]);
if(j != 5){ printf(":"); }
}
printf("\n\t\t");

//print hardware type - start
printf("Hardware type: ");

if(HardwareType_Host == 0)
{ printf("Reserved"); }
else if(HardwareType_Host == 1)
{ printf("Ethernet"); }
else if(HardwareType_Host == 2)
{ printf("Experimental Ethernet"); }
else if(HardwareType_Host == 3)
{ printf("Amateur Radio AX25"); }
else if(HardwareType_Host == 4)
{ printf("Proteon ProNET Token Ring"); }
else if(HardwareType_Host == 5)
{ printf("Chaos"); }
else if(HardwareType_Host == 6)
{ printf("IEEE 802"); }
else if(HardwareType_Host == 7)
{ printf("ARCNET"); }
else if(HardwareType_Host == 8)
{ printf("Hyperchannel"); }
else if(HardwareType_Host == 9)
{ printf("Lanstar"); }
else if(HardwareType_Host == 10)
{ printf("Atuonet Short Address"); }
else if(HardwareType_Host == 11)
{ printf("LocalTalk"); }
else if(HardwareType_Host == 12)
{ printf("LocalNet (IBM PCNet or SYTEK LocalNET)"); }
else if(HardwareType_Host == 13)
{ printf("Ultra link"); }
else if(HardwareType_Host == 14)
{ printf("SMDS"); }
else if(HardwareType_Host == 15)
{ printf("Frame Relay"); }
else if(HardwareType_Host == 16)
{ printf("ATM, Asynchronous Transmission Mode"); }
else if(HardwareType_Host == 17)
{ printf("HDLC"); }
else if(HardwareType_Host == 18)
{ printf("Fibre Channel"); }
else if(HardwareType_Host == 19)
{ printf("ATM, Asynchronous Transmission Mode"); }
else if(HardwareType_Host == 20)
{ printf("Serial Line"); }
else if(HardwareType_Host == 21)
{ printf("ATM, Asynchronous Transmission Mode"); }
else if(HardwareType_Host == 22)
{ printf("MIL-STD-188-220"); }
else if(HardwareType_Host == 23)
{ printf("Metricom"); }
else if(HardwareType_Host == 24)
{ printf("IEEE 1394.1995"); }
else if(HardwareType_Host == 25)
{ printf("MAPOS"); }
else if(HardwareType_Host == 26)
{ printf("Twinazial"); }
else if(HardwareType_Host == 27)
{ printf("EUI-64"); }
else if(HardwareType_Host == 28)
{ printf("HIPARP"); }
else if(HardwareType_Host == 29)
{ printf("IP and ARP over ISO 7816-3"); }
else if(HardwareType_Host == 30)
{ printf("ARPSec"); }
else if(HardwareType_Host == 31)
{ printf("IPsec tunnel"); }
else if(HardwareType_Host == 32)
{ printf("Infiniband"); }
else if(HardwareType_Host == 33)
{ printf("CAI, TIA-102 Project 25 Common Air Interface"); }
else if(HardwareType_Host == 34)
{ printf("Wiegand Interface"); }
else if(HardwareType_Host == 35)
{ printf("Pure IP"); }
else if(HardwareType_Host == 36)
{ printf("HW_EXP1"); }
else if(HardwareType_Host > 36 && HardwareType_Host <256)
{ printf("Unknown"); }
else if(HardwareType_Host == 256)
{ printf("HW_EXP2"); }
else if(HardwareType_Host > 256 && HardwareType_Host <65535)
{ printf("Unknown"); }
else if(HardwareType_Host == 65535)
{ printf("Reserved"); }
printf(" (0x%X)", HardwareType_Host);
// print hardware type - end

// print protocol type - start
printf(", ");
printf("Protocol: ");
if(ProtocolType_Host == 0x0800) // 0x0800 - IP
{ printf("IP "); }
printf(" (0x%X)", ProtocolType_Host);
// print protocol type - end


// print opcode type - start
printf(", ");
printf("Opcode: ");
if(Opcode_Host == 0)
{ printf("Reserved"); }
else if(Opcode_Host == 1)
{ printf("Request"); }
else if(Opcode_Host == 2)
{ printf("Reply"); }
else if(Opcode_Host == 3)
{ printf("Request Reverse"); }
else if(Opcode_Host == 4)
{ printf("Reply Reverse"); }
else if(Opcode_Host == 5)
{ printf("DRARP Request"); }
else if(Opcode_Host == 6)
{ printf("DRARP Reply"); }
else if(Opcode_Host == 7)
{ printf("DRARP Error"); }
else if(Opcode_Host == 8)
{ printf("InARP Request"); }
else if(Opcode_Host == 9)
{ printf("InARP Reply"); }
else if(Opcode_Host == 10)
{ printf("ARP NAK"); }
else if(Opcode_Host == 11)
{ printf("MARS Request"); }
else if(Opcode_Host == 12)
{ printf("MARS Multi"); }
else if(Opcode_Host == 13)
{ printf("MARS MServ"); }
else if(Opcode_Host == 14)
{ printf("MARS Join"); }
else if(Opcode_Host == 15)
{ printf("MARS Leave"); }
else if(Opcode_Host == 16)
{ printf("MARS NAK"); }
else if(Opcode_Host == 17)
{ printf("MARS Unserv"); }
else if(Opcode_Host == 18)
{ printf("MARS SJoin"); }
else if(Opcode_Host == 19)
{ printf("MARS SLeave"); }
else if(Opcode_Host == 20)
{ printf("MARS Grouplist Reply"); }
else if(Opcode_Host == 21)
{ printf("MARS Grouplist Reply"); }
else if(Opcode_Host == 22)
{ printf("MARS Redirect Map"); }
else if(Opcode_Host == 23)
{ printf("MAPOS UNARP"); }
else if(Opcode_Host == 24)
{ printf("OP_EXP1"); }
else if(Opcode_Host == 25)
{ printf("OP_EXP2"); }
else if(Opcode_Host > 25 && Opcode_Host < 65535)
{ printf("Unknown"); }
else if(Opcode_Host == 65535)
{ printf("Unknown"); }
printf(" (0x%X)", Opcode_Host);
// print opcode type - end

printf("\n\t\t");

// print hardware address length and protocol address length - start
printf("Hardware address length: %u, Protocol address length: %u", HardwareAddressLength_Host, ProtocolAddressLength_Host);
// print hardware address length and protocol address length - end

printf("\n\t\t");

// print hardware vendor name - start

// 000000, 000001, 000002, 000003, 000004, 000005, 000006, 000007, 000008, 000009 - XEROX CORPORATION.
// 00000C - CISCO SYSTEMS, INC.
// 00001A - ADVANCED MICRO DEVICES
// 0002B3 - Intel Corporation.
// 0001E6 - Hewlett-Packard Company.
// 000255 - IBM Corporation
// 00065B - Dell Computer Corp.
// 000102 - 3COM CORPORATION
// 00178D - Checkpoint Systems, Inc.
// 000585 - Juniper Networks, Inc.
//000569, 000C29, 001C14, 005056 - VMWare Inc.

char *MAC_IDs[23] = {"000000", "000001", "000002", "000003", "000004", "000005", "000006", "000007", "000008", "000009", "00000C", "00001A", "0002B3", "0001E6", "000255", "00065B", "000102", "00178D", "000585", "000569", "000C29", "001C14", "005056"};

char *MAC_Vendors[23] = {"XEROX CORPORATION", "XEROX CORPORATION", "XEROX CORPORATION", "XEROX CORPORATION", "XEROX CORPORATION", "XEROX CORPORATION", "XEROX CORPORATION", "XEROX CORPORATION", "XEROX CORPORATION", "XEROX CORPORATION", "CISCO SYSTEMS, INC.", "ADVANCED MICRO DEVICES", "Intel Corporation.", "Hewlett-Packard Company.", "IBM Corporation", "Dell Computer Corp.", "3COM CORPORATION", "Checkpoint Systems, Inc.", "Juniper Networks, Inc.", "VMWare Inc.", "VMWare Inc.", "VMWare Inc.", "VMWare Inc."};
char *MACID;

MACID = (char *)malloc(6);
sprintf(MACID, "%02X%02X%02X", ARPHeader->SourceHardwareAddress[0], ARPHeader->SourceHardwareAddress[1], ARPHeader->SourceHardwareAddress[2]);

printf("Source Ethernet Vendor: ");
ts = 0;
for(j = 0; j < 23; j++)
{
if(strncmp(MAC_IDs[j], MACID, 6) == 0)
{
printf("%s\n", MAC_Vendors[j]);
ts = 1;
break;
}
}
if(ts == 0)
{
printf("Unknown. oui id: %s. Refer http://standards.ieee.org/regauth/oui/oui.txt\n", MACID);
}
// print hardware vendor name - end

// print ARP header - 28 bytes - end

printf("\n______________________________________________________\n\n");
}

Comments

RSS Feed Subscribe to this comment feed

No comments yet, be the first!

Login or Register to post a comment

File Archive:

May 2012

  • Su
  • Mo
  • Tu
  • We
  • Th
  • Fr
  • Sa
  • 1
    May 1st
    37 Files
  • 2
    May 2nd
    53 Files
  • 3
    May 3rd
    33 Files
  • 4
    May 4th
    4 Files
  • 5
    May 5th
    10 Files
  • 6
    May 6th
    17 Files
  • 7
    May 7th
    19 Files
  • 8
    May 8th
    36 Files
  • 9
    May 9th
    34 Files
  • 10
    May 10th
    35 Files
  • 11
    May 11th
    20 Files
  • 12
    May 12th
    18 Files
  • 13
    May 13th
    11 Files
  • 14
    May 14th
    27 Files
  • 15
    May 15th
    58 Files
  • 16
    May 16th
    54 Files
  • 17
    May 17th
    25 Files
  • 18
    May 18th
    53 Files
  • 19
    May 19th
    9 Files
  • 20
    May 20th
    15 Files
  • 21
    May 21st
    25 Files
  • 22
    May 22nd
    32 Files
  • 23
    May 23rd
    35 Files
  • 24
    May 24th
    26 Files
  • 25
    May 25th
    25 Files
  • 26
    May 26th
    11 Files
  • 27
    May 27th
    8 Files
  • 28
    May 28th
    0 Files
  • 29
    May 29th
    0 Files
  • 30
    May 30th
    0 Files
  • 31
    May 31st
    0 Files

Top Authors In Last 30 Days

File Tags

Systems

packet storm

© 2012 Packet Storm. All rights reserved.

close