/****************************************************************************
Program: $Id: spoof.h,v 1.13 2006/11/21 21:11:07 rbeverly Exp $
Author: Rob Beverly <rbeverly@mit.edu>
Date: $Date: 2006/11/21 21:11:07 $
Description: Spoofer header
****************************************************************************/
#ifdef _WIN32
#define OS "WIN32"
#define MISSING_HDRS
#define MISSING_IP_HDR
#define MISSING_IN_ADDR_T
#endif
#ifdef _LINUX
#define OS "LINUX"
#define MISSING_HDRS
#endif
#ifdef _BSD
#ifdef __FreeBSD__
#define OS "FBSD"
#define _FBSD 1
#else
#define OS "BSD"
#endif
#endif
#ifdef _SOLARIS
#define OS "SOLARIS"
#define _LINUX 1
#endif
#ifdef _OSX
#define OS "OSX"
#endif
#ifndef OS
#define OS "UNDEF"
#endif
#ifdef _WIN32
#pragma pack(1)
#include <winsock2.h>
#include <ws2tcpip.h>
#include "/usr/include/netinet/udp.h"
#include <unistd.h>
#else
#include <sys/types.h>
#define __FAVOR_BSD
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netinet/in_systm.h>
#include <netinet/ip.h>
#include <netinet/udp.h>
#include <netdb.h>
#endif
#ifndef MISSING_HDRS
#include <netinet/ip_var.h>
#include <netinet/udp_var.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <string.h>
#include <time.h>
#include <errno.h>
#define VERSION 5
#define DEBUG 0
#define ICMP_DIVERT_PORT 2002
#define UDP_DIVERT_PORT 2003
#define BUFSIZE 1500
#define SMALLBUF 80
#define BIGBUF 9000
#define MAXLINE 4096
#define TTL_OUT 64
#define SRC_PORT 5353
#if VERSION == 5
#define SERV_PORT 53
#define REPORT_PORT 80
#else
#define SERV_PORT 21
#define REPORT_PORT 8080
#endif
#define ADDRS 3 /* space for default 3 addrs */
#define SCANSPACE 24 /* adjacent scan width */
#define DUPLICATES 5 /* dups for each probe */
#define PAUSE 2 /* seconds */
#define NONCE "123456789abcde" /* nonce */
#define LISTENQ 1024
#define SERVER "18.26.0.235"
#define VALIDDST "18.26.1.3" /* different dest IP congruent with */
/* path to server */
#define REPORT_HOST "spoofer.csail.mit.edu"
#define SENDTO_ERROR -2
#define WINRAWSOCK_ERROR -3
#ifndef SOCKET_ERROR
#define SOCKET_ERROR -4
#endif
#ifdef MISSING_IP_HDR
#ifndef LITTLE_ENDIAN
#define LITTLE_ENDIAN 1234
#define BIG_ENDIAN 4321
#endif
#ifndef BYTE_ORDER
#define BYTE_ORDER LITTLE_ENDIAN
#endif
/*
* Structure of an internet header, naked of options.
*/
struct ip {
#ifdef _IP_VHL
u_char ip_vhl; /* version << 4 | header length >> 2 */
#else
#if BYTE_ORDER == LITTLE_ENDIAN
u_int ip_hl:4, /* header length */
ip_v:4; /* version */
#endif
#if BYTE_ORDER == BIG_ENDIAN
u_int ip_v:4, /* version */
ip_hl:4; /* header length */
#endif
#endif /* not _IP_VHL */
u_char ip_tos; /* type of service */
u_short ip_len; /* total length */
u_short ip_id; /* identification */
u_short ip_off; /* fragment offset field */
#define IP_RF 0x8000 /* reserved fragment flag */
#define IP_DF 0x4000 /* dont fragment flag */
#define IP_MF 0x2000 /* more fragments flag */
#define IP_OFFMASK 0x1fff /* mask for fragmenting bits */
u_char ip_ttl; /* time to live */
u_char ip_p; /* protocol */
u_short ip_sum; /* checksum */
struct in_addr ip_src,ip_dst; /* source and dest address */
};
#endif /* MISSING_IP_HDR */
#ifdef MISSING_HDRS
/*
* Overlay for ip header used by other protocols (tcp, udp).
*/
struct ipovly {
u_char ih_x1[9]; /* (unused) */
u_char ih_pr; /* protocol */
u_short ih_len; /* protocol length */
struct in_addr ih_src; /* source internet address */
struct in_addr ih_dst; /* destination internet address */
};
/*
* UDP kernel structures and variables.
*/
struct udpiphdr {
struct ipovly ui_i; /* overlaid ip structure */
struct udphdr ui_u; /* udp header */
};
#define ui_x1 ui_i.ih_x1
#define ui_pr ui_i.ih_pr
#define ui_len ui_i.ih_len
#define ui_src ui_i.ih_src
#define ui_dst ui_i.ih_dst
#define ui_sport ui_u.uh_sport
#define ui_dport ui_u.uh_dport
#define ui_ulen ui_u.uh_ulen
#define ui_sum ui_u.uh_sum
#endif /* MISSING_HDRS */
#ifdef MISSING_IN_ADDR_T
typedef unsigned int in_addr_t;
#endif
#ifndef IPVERSION
#define IPVERSION 4
#endif
#ifndef IP_DF
#define IP_DF 0x4000
#endif
/* prevent windows error messages from closing DOS window */
#define winpause(x...) do { fprintf(stdout,x); \
fflush(stdout); \
while ( getchar() != '\n'); \
} while (0)
#define winfatal(x...) do { fprintf(stdout,x); \
fprintf(stdout,"\nPress any key to continue.\n"); \
fflush(stdout); \
while ( getchar() != '\n'); \
exit(-1); \
} while (0)
/* ugh, portable endianness detection is painful */
#if ((defined(BYTE_ORDER) && (BYTE_ORDER == LITTLE_ENDIAN)) | defined(_LITTLE_ENDIAN))
#define SPOOFER_LITTLE_ENDIAN
#else
#define SPOOFER_BIG_ENDIAN
#endif
/* prettyprint */
#define NIPQUAD(addr) \
((unsigned char *)&addr)[0], \
((unsigned char *)&addr)[1], \
((unsigned char *)&addr)[2], \
((unsigned char *)&addr)[3]
/* error messages */
#define WIN_SEND_ERR "** This Windows system blocks raw sockets; reverting to raw ethernet.\n"
#define WINFAIL 999
/* Payload format */
#define SEQNOSIZE 14
typedef struct spoof_rpt {
unsigned short ver;
unsigned short unused;
unsigned long addr;
unsigned char seqno[SEQNOSIZE];
} spoof_t;
#define PAYLOADSIZE sizeof(spoof_t)
typedef void Sigfunc(int);
/* precasts: net.c */
int craftPacket(char *, char *, int, struct sockaddr_in *, struct sockaddr_in *, u_char);
void craftReport(spoof_t *, unsigned short, unsigned long, char *);
unsigned short in_cksum(unsigned short *, int);
void dumpPacket(unsigned char *, int);
void genSequence(unsigned char *, int);
Sigfunc *signal(int signo, Sigfunc *func);
Sigfunc *Signal(int signo, Sigfunc *func);
void sig_chld(int signo);
ssize_t Readn(int fd, void *ptr, size_t nbytes);
void Writen(int fd, void *ptr, size_t nbytes);
ssize_t Readline(int fd, void *ptr, size_t maxlen);
int checkRFC1918(struct in_addr *in);
int newSocket(int, int);
int connectSock(int, struct sockaddr_in *, int);
int optSocketTTL(int, int);
int optSocketHDRINCL(int);
int socketSend(int, void *, int, struct sockaddr_in *, int);
int socketSendSpoof(int, void *, int, struct sockaddr_in *, int);
/* precasts: util.c */
unsigned long byte32Swap(unsigned long);
unsigned short byte16Swap(unsigned short);
void checkroot();
void win_init();
void banner();
void spoofSleep();
void fatal(char *, ...);
void pfatal(char *);
/* precasts: trace.c */
int findtr(char *traceroute);
int runtrace(char *tracecmd, char *dest, char *result);
/* precasts: dnetspoof.c */
int etherSend();
int registerEther();
int deregisterEther();
int findInterfaces();
void selectInterface();
syntax highlighted by Code2HTML, v. 0.9.1