16 files changed, 437 insertions, 93 deletions
diff --git a/noncore/net/wellenreiter/daemon/source/Makefile b/noncore/net/wellenreiter/daemon/source/Makefile new file mode 100644 index 0000000..dc459af --- a/dev/null +++ b/noncore/net/wellenreiter/daemon/source/Makefile @@ -0,0 +1,31 @@ +# $Id$ + +CPP = g++ + +CFLAGS = +OPTIMFLAGS = -g +WARNFLAGS = -Wall -pedantic -DDEBUG +LDFLAGS = +LIBS = -lpcap +OBJ = daemon.o log.o sendgui.o getgui.o sniffer.o + +.SUFFIXES: +.PHONY: all wellenreiterd clean distclean realclean + +%.o : %.cc + $(CPP) $(CFLAGS) $(WARNFLAGS) $(OPTIMFLAGS) -c $< -o $@ + +all: wellenreiterd + +wellenreiterd: $(OBJ) + $(CPP) $(OPTIMFLAGS) $(WARNFLAGS) $(CFLAGS) $(OBJ) $(LDFLAGS) $(LIBS) -o $@ + @echo Build wellenreiterd + +clean distclean realclean: + @rm -rf wellenreiterd *~ *.o + @echo All dependent files have been removed. + +wellenreiterd.o: config.hh +serve.o: config.hh +log.o: config.hh +sendgui.o: config.hh diff --git a/noncore/net/wellenreiter/daemon/source/README b/noncore/net/wellenreiter/daemon/source/README deleted file mode 100644 index 249d950..0000000 --- a/noncore/net/wellenreiter/daemon/source/README +++ b/dev/null @@ -1,5 +0,0 @@ -compile it using: - -gcc -o sniffer ./sniffer.c -lpcap - - diff --git a/noncore/net/wellenreiter/daemon/source/TODO b/noncore/net/wellenreiter/daemon/source/TODO new file mode 100644 index 0000000..39b1a05 --- a/dev/null +++ b/noncore/net/wellenreiter/daemon/source/TODO @@ -0,0 +1,5 @@ +implement communication protocol +security analysis +implement sniffer (last step) +security analysis +code cleanup
\ No newline at end of file diff --git a/noncore/net/wellenreiter/daemon/source/config.hh b/noncore/net/wellenreiter/daemon/source/config.hh new file mode 100644 index 0000000..b124f41 --- a/dev/null +++ b/noncore/net/wellenreiter/daemon/source/config.hh @@ -0,0 +1,22 @@ +/* + * + * Global configuration for wellenreiter + * + * $Id$ + * + * Written by Martin J. Muench <mjm@codito.de> + * + */ + +#ifndef CONFIG_HH +#define CONFIG_HH + +#define PROGNAME "wellenreiter" /* Name of program (for syslog et.al.) */ +#define VERSION "0.2" /* Version of wellenreiter */ + +#define DAEMONPORT 37772 /* Port of Daemon */ + +#define GUIADDR "127.0.0.1" /* Adress of GUI, later specified in configfile */ +#define GUIPORT 37773 /* Port of GUI, " " */ + +#endif /* CONFIG_HH */ diff --git a/noncore/net/wellenreiter/daemon/source/daemon.cc b/noncore/net/wellenreiter/daemon/source/daemon.cc new file mode 100644 index 0000000..7972c0f --- a/dev/null +++ b/noncore/net/wellenreiter/daemon/source/daemon.cc @@ -0,0 +1,82 @@ +/* + * Startup functions of wellenreiter + * + * $Id$ + */ + +#include "config.hh" +#include "daemon.hh" +#include "log.hh" +#include "sendgui.hh" +#include "getgui.hh" + +/* Main function of wellenreiterd */ +int main(int argc, char **argv) +{ + int sock, maxfd; + struct sockaddr_in *cliaddr; + socklen_t len=sizeof(struct sockaddr); + char buffer[128]; + FILE *fp=stdin; /* Will be replaced with sniffer */ + fd_set rset; + + fprintf(stderr, "wellenreiterd %s\n\n", VERSION); + + /* Setup socket for incoming commands */ + if(!commsock(&sock)) + return 0; + + log_info("Set up socket '%d' for GUI communication", sock); + + FD_ZERO(&rset); + + /* Start main loop */ + log_info("Starting main loop"); + while(1) + { + + FD_SET(sock, &rset); + FD_SET(fileno(fp), &rset); + maxfd=sock+fileno(fp)+1; + if(select(maxfd, &rset, NULL, NULL, NULL) < 0) + { + log_err("Error calling select: %s", strerror(errno)); + break; + } + + /* Got data on local socket from GUI */ + if(FD_ISSET(sock, &rset)) + { + memset(buffer, 0, sizeof(buffer)); + if(recvfrom(sock, buffer, sizeof(buffer)-1, 0, (struct sockaddr *)cliaddr, &len) < 0) + { + log_err("Cannot read from socket: %s", strerror(errno)); + break; + } + log_info("Received command from '%s': %s", inet_ntoa(cliaddr->sin_addr), buffer); + + /* Pass string to analyze function */ + commstring(buffer); + + } + + /* Will be replaced with sniffer ... later */ + if(FD_ISSET(fileno(fp), &rset)) + { + memset(buffer, 0, sizeof(buffer)); + if(fgets(buffer, sizeof(buffer) - 1, fp) == NULL) + { + log_err("Cannot read from stdin: %s", strerror(errno)); + break; + } + + /* Send string to GUI */ + sendgui("%d: %s", 1234, buffer); + + } + + } + + close(sock); + return 0; +} diff --git a/noncore/net/wellenreiter/daemon/source/daemon.hh b/noncore/net/wellenreiter/daemon/source/daemon.hh new file mode 100644 index 0000000..6776d37 --- a/dev/null +++ b/noncore/net/wellenreiter/daemon/source/daemon.hh @@ -0,0 +1,16 @@ +/* $Id$ */ + +#ifndef DAEMON_HH +#define DAEMON_HH + +#include <stdio.h> +#include <string.h> +#include <sys/types.h> +#include <sys/time.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <arpa/inet.h> +#include <unistd.h> +#include <errno.h> + +#endif /* DAEMON_HH */ diff --git a/noncore/net/wellenreiter/daemon/source/extract.h b/noncore/net/wellenreiter/daemon/source/extract.hh index c1bcdcd..21dcffa 100644 --- a/noncore/net/wellenreiter/daemon/source/extract.h +++ b/noncore/net/wellenreiter/daemon/source/extract.hh @@ -1 +1,2 @@ +/* $Id */ /* @@ -19,8 +20,8 @@ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * @(#) $Header$ (LBL) */ - /* Network to host order macros */ +#ifndef EXTRACT_HH +#define EXTRACT_HH + #ifdef LBL_ALIGN @@ -57 +58,3 @@ (u_int32_t)*((const u_int8_t *)(p) + 0))) + +#endif /* EXTRACT_HH */ diff --git a/noncore/net/wellenreiter/daemon/source/getgui.cc b/noncore/net/wellenreiter/daemon/source/getgui.cc new file mode 100644 index 0000000..f56f40b --- a/dev/null +++ b/noncore/net/wellenreiter/daemon/source/getgui.cc @@ -0,0 +1,43 @@ +/* + * Setup UDP socket for commands + * Misc wrapper functions for incoming commands + * + * $Id$ + */ + +#include "config.hh" +#include "getgui.hh" +#include "log.hh" + +struct sockaddr_in saddr; + +/* Setup UDP Socket for incoming commands */ +int commsock(int *sock) +{ + + if((*sock=socket(AF_INET, SOCK_DGRAM, 0)) < 0) + { + log_err("Cannot set up socket: %s", strerror(errno)); + return 0; + } + + memset(&saddr, 0, sizeof(saddr)); + saddr.sin_family = PF_INET; + saddr.sin_port = htons(DAEMONPORT); + saddr.sin_addr.s_addr = htonl(INADDR_ANY); + + if(bind(*sock,(struct sockaddr *)&saddr, sizeof(saddr)) < 0) + { + log_err("Cannot bind socket: %s", strerror(errno)); + close(*sock); + return 0; + } + + return 1; +} + +int commstring(const char *input) +{ + + return 1; +} diff --git a/noncore/net/wellenreiter/daemon/source/getgui.hh b/noncore/net/wellenreiter/daemon/source/getgui.hh new file mode 100644 index 0000000..f5a37f9 --- a/dev/null +++ b/noncore/net/wellenreiter/daemon/source/getgui.hh @@ -0,0 +1,16 @@ +/* $id */ + +#ifndef GETGUI_HH +#define GETGUI_HH + +#include <sys/types.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <string.h> +#include <unistd.h> +#include <errno.h> + +int commsock(int *); +int commstring(const char *); + +#endif /* GETGUI_HH */ diff --git a/noncore/net/wellenreiter/daemon/source/ieee802_11.h b/noncore/net/wellenreiter/daemon/source/ieee802_11.hh index 497e6ed..3cc5343 100644 --- a/noncore/net/wellenreiter/daemon/source/ieee802_11.h +++ b/noncore/net/wellenreiter/daemon/source/ieee802_11.hh @@ -1,2 +1,2 @@ -/* @(#) $Header$ (LBL) */ +/* $Id$ */ /* @@ -23,2 +23,5 @@ +#ifndef IEEE802_11_HH +#define IEEE802_11_HH + #define IEEE802_11_FC_LEN 2 @@ -245 +248,3 @@ struct ctrl_end_ack_t { #define IV_KEYID(iv) (((iv) >> 30) & 0x03) + +#endif /* IEEE802_11_HH */ diff --git a/noncore/net/wellenreiter/daemon/source/log.cc b/noncore/net/wellenreiter/daemon/source/log.cc new file mode 100644 index 0000000..47589d2 --- a/dev/null +++ b/noncore/net/wellenreiter/daemon/source/log.cc @@ -0,0 +1,52 @@ +/* + * Small functions to log to syslog + * + * $Id$ + */ + +#include "config.hh" +#include "log.hh" + +/* Log to syslog INFO */ +void log_info(const char *fmt,...) +{ + + char buffer[4096]; + va_list ap; + + memset(buffer, 0, sizeof(buffer)), + va_start(ap, fmt); + vsnprintf(buffer, sizeof(buffer)-1, fmt, ap); + va_end(ap); + + openlog(PROGNAME, LOG_PID, LOG_SYSLOG); + syslog(LOG_INFO, "(info) %s", buffer); + closelog(); + +#ifdef DEBUG + fprintf(stderr, "(info) %s\n", buffer); +#endif + +} + +/* Log to syslog ERR */ +void log_err(const char *fmt,...) +{ + + char buffer[4096]; + va_list ap; + + memset(buffer, 0, sizeof(buffer)); + va_start(ap, fmt); + vsnprintf(buffer, sizeof(buffer)-1, fmt, ap); + va_end(ap); + + openlog(PROGNAME, LOG_PID, LOG_SYSLOG); + syslog(LOG_INFO, "(err) %s", buffer); + closelog(); + +#ifdef DEBUG + fprintf(stderr, "(err) %s\n", buffer); +#endif + +} diff --git a/noncore/net/wellenreiter/daemon/source/log.hh b/noncore/net/wellenreiter/daemon/source/log.hh new file mode 100644 index 0000000..bdea7e4 --- a/dev/null +++ b/noncore/net/wellenreiter/daemon/source/log.hh @@ -0,0 +1,14 @@ +/* $Id$ */ + +#ifndef LOG_HH +#define LOG_HH + +#include <stdio.h> +#include <syslog.h> +#include <stdarg.h> +#include <string.h> + +void log_info(const char *, ...); +void log_err(const char *, ...); + +#endif /* LOG_HH */ diff --git a/noncore/net/wellenreiter/daemon/source/sendgui.cc b/noncore/net/wellenreiter/daemon/source/sendgui.cc new file mode 100644 index 0000000..48ad5b8 --- a/dev/null +++ b/noncore/net/wellenreiter/daemon/source/sendgui.cc @@ -0,0 +1,75 @@ +/* + * Send string to GUI + * + * $Id$ + */ + +#include "config.hh" +#include "sendgui.hh" +#include "log.hh" + +/* Simple dummy for alarm timer */ +static void alarmdummy(int signo) +{ + alarm (0); +} + +/* Connect to given IP on given port */ +int connect_server(int *sock, unsigned int ipaddr, int port) +{ + struct sockaddr_in saddr; + int retval=0; + + *sock = socket (PF_INET, SOCK_STREAM, 0); + saddr.sin_family = PF_INET; + saddr.sin_port = htons (port); + saddr.sin_addr.s_addr = ipaddr; + + signal (SIGALRM, alarmdummy); + siginterrupt (SIGALRM, 1); + + alarm(5); + retval=connect (*sock, (struct sockaddr *) &saddr, sizeof (saddr)); + alarm(0); + + if(retval < 0) + { + close (*sock); + return 0; + } + + return 1; +} + +/* Send a string to the GUI */ +int sendgui(const char *string, ...) +{ + int sock=0; + char buffer[4096]; + va_list ap; + + /* Generate string */ + memset(buffer, 0, sizeof(buffer)); + va_start(ap, string); + vsnprintf(buffer, sizeof(buffer)-1, string, ap); + va_end(ap); + + if(!connect_server(&sock, inet_addr(GUIADDR), GUIPORT)) + { + log_err("Connect to GUI at '%s' failed: %s", GUIADDR, strerror(errno)); + return 0; + } + + if(write(sock, buffer, sizeof(buffer)) < 0) + { + log_err("Cannot write to socket: %s", strerror(errno)); + close(sock); + return 0; + } + + if(close(sock) < 0) + log_err("Cannot close socket: %s", strerror(errno)); + + return 1; +} + diff --git a/noncore/net/wellenreiter/daemon/source/sendgui.hh b/noncore/net/wellenreiter/daemon/source/sendgui.hh new file mode 100644 index 0000000..e083704 --- a/dev/null +++ b/noncore/net/wellenreiter/daemon/source/sendgui.hh @@ -0,0 +1,20 @@ +/* $Id$ */ + +#ifndef SENDGUI_HH +#define SENDGUI_HH + +#include <sys/types.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <arpa/inet.h> +#include <signal.h> +#include <errno.h> +#include <string.h> +#include <stdio.h> +#include <unistd.h> +#include <stdlib.h> + +int connect_server(int *, unsigned int, int); +int sendgui(const char *string, ...); + +#endif /* SENDGUI_HH */ diff --git a/noncore/net/wellenreiter/daemon/source/sniffer.c b/noncore/net/wellenreiter/daemon/source/sniffer.cc index 31a5d13..c837505 100644 --- a/noncore/net/wellenreiter/daemon/source/sniffer.c +++ b/noncore/net/wellenreiter/daemon/source/sniffer.cc @@ -1,30 +1,26 @@ -/* Its just a simple rfmon mode sniffer - i hope my C is at last a bit better then in my - early days :-). - This works only with cisco wireless cards with an rfmon - able driver and not with wifi stuff. - Btw. did i mention that i hate C? - - To compile use: - gcc sniffer.c -o wlan-sniffer -lpcap - -*/ -#include "sniffer.h" - -int main(int argc, char **argv) -{ - int ret; /* return code */ - ret = card_into_monitormode (SNIFFER_DEVICE, CARD_TYPE_NG); - if (ret == -1) - { - exit(-1); - } +/* + * rfmon mode sniffer + * This works only with cisco wireless cards with an rfmon + * able driver and not with wifi stuff. + * + * $Id$ + */ + +#include "config.hh" +#include "sniffer.hh" +#include "ieee802_11.hh" +#include "extract.hh" + +int sniffer(void) +{ + if(card_into_monitormode (SNIFFER_DEVICE, CARD_TYPE_NG) < 0) + return 0; start_sniffing (SNIFFER_DEVICE); - return 0; + return 1; } -int card_into_monitormode (char * device, int cardtype) +int card_into_monitormode (char *device, int cardtype) { - int ret = -1; + int datalink; /* used for getting the pcap datalink type */ @@ -39,3 +35,3 @@ int card_into_monitormode (char * device, int cardtype) printf ("Fatal error i did not have any interfaces to sniff on\n"); - exit(1); + return 0; } @@ -63,6 +59,6 @@ int card_into_monitormode (char * device, int cardtype) snprintf(wlanngcmd, sizeof(wlanngcmd),"%s %s lnxreq_wlansniff channel=1 enable=true",WLANCTL_PATH,device); - if (ret = (system (wlanngcmd)) != 0) + if (system (wlanngcmd) != 0) { printf ("\n Fatal error could not set %s in raw mode, check cardtype\n",device); - exit(1); + return 0; } @@ -84,4 +80,4 @@ int card_into_monitormode (char * device, int cardtype) printf ("Your successfully listen on %s in 802.11 raw mode\n",device); - pcap_close(handle); - return (0); + pcap_close(handle); + return 0; @@ -91,4 +87,4 @@ int card_into_monitormode (char * device, int cardtype) printf ("Fatal error, cannot continue, your interface %s does not work in the correct 802.11 raw mode, check you driver please\n",device); - pcap_close(handle); - exit(1); + pcap_close(handle); + return 0; } @@ -105,5 +101,5 @@ int card_set_promisc_up (char * device) printf ("\nFatal error, could not execute %s please check your card,binary location and permission\n",ifconfigcmd); - exit(1); + return 0; } - return(0); + return 1; } @@ -112,10 +108,8 @@ int start_sniffing (char * device) { - int ret; /* return code */ + pcap_t *handletopcap; char errbuf[PCAP_ERRBUF_SIZE]; - struct pcap_pkthdr header; /* The header that pcap gives us */ - const u_char *packet; /* The actual packet */ /* opening the pcap for sniffing */ - handletopcap = pcap_open_live(device, BUFSIZ, 1, 1000, errbuf); + handletopcap = pcap_open_live(device, BUFSIZ, 1, 1000, errbuf); @@ -127,6 +121,6 @@ int start_sniffing (char * device) /*start scanning */ - pcap_loop(handletopcap,-1,process_packets,NULL); + pcap_loop(handletopcap,-1,process_packets,NULL); - printf("\nDone processing packets... wheew!\n"); - return 0; + printf("\nDone processing packets... wheew!\n"); + return 1; } @@ -139,5 +133,3 @@ void process_packets(u_char *useless,const struct pcap_pkthdr* pkthdr,const u_ch u_int HEADER_LENGTH; - u_short extracted_ethertype; - int snapend; - int ret; + /* pinfo holds all interresting information for us */ @@ -265,7 +257,5 @@ int decode_80211b_hdr(const u_char *p,struct packetinfo *ppinfo) { - char * ret; - char testme[16]; const struct mgmt_header_t *mgthdr = (const struct mgmt_header_t *) p; ppinfo->fcsubtype = FC_SUBTYPE(mgthdr->fc); - + /* Get the sender, bssid and dest mac address */ @@ -275,3 +265,3 @@ int decode_80211b_hdr(const u_char *p,struct packetinfo *ppinfo) ppinfo->fc_wep = FC_WEP(mgthdr->fc); - return(0); + return 0; } @@ -297,3 +287,2 @@ void etheraddr_string(register const u_char *ep,char * text) strcpy(text,buf); - return; } @@ -330,3 +319,3 @@ int handle_beacon(u_int16_t fc, const u_char *p,struct packetinfo *ppinfo) pbody.ssid.ssid[pbody.ssid.length]='\0'; - if (strcmp(pbody.ssid.ssid,"")==0) + if (strcmp((char *)pbody.ssid.ssid,"")==0) { @@ -336,3 +325,3 @@ int handle_beacon(u_int16_t fc, const u_char *p,struct packetinfo *ppinfo) { - ppinfo->ssid = pbody.ssid.ssid; + ppinfo->ssid = (char *)pbody.ssid.ssid; } @@ -372,5 +361,3 @@ int handle_beacon(u_int16_t fc, const u_char *p,struct packetinfo *ppinfo) default: -#if 0 - printf("(1) unhandled element_id (%d) ", *(p+offset) ); -#endif + offset+= *(p+offset+1) + 2; @@ -379,6 +366,3 @@ int handle_beacon(u_int16_t fc, const u_char *p,struct packetinfo *ppinfo) } /* end of for loop */ - return(0); - - - + return 1; diff --git a/noncore/net/wellenreiter/daemon/source/sniffer.h b/noncore/net/wellenreiter/daemon/source/sniffer.hh index b880b68..7f45be6 100644 --- a/noncore/net/wellenreiter/daemon/source/sniffer.h +++ b/noncore/net/wellenreiter/daemon/source/sniffer.hh @@ -1,2 +1,5 @@ -// Wellenreiter-sniffer-code header file +/* $Id$ */ + +#ifndef SNIFFER_HH +#define SNIFFER_HH @@ -11,4 +14,2 @@ #include <net/bpf.h> -#include "ieee802_11.h" -#include "extract.h" @@ -49,14 +50,10 @@ struct packetinfo /* Prototypes */ -int card_into_monitormode (char * device, int cardtype); +int sniffer(void); +int card_into_monitormode (char * device, int cardtype); int card_set_promisc_up (char * device); - int start_sniffing (char * device); - void process_packets(u_char *useless,const struct pcap_pkthdr* pkthdr,const u_char* packet); - int decode_80211b_hdr(const u_char *p,struct packetinfo *ppinfo); - void etheraddr_string(register const u_char *ep,char * text); - int handle_beacon(u_int16_t fc, const u_char *p,struct packetinfo *ppinfo); @@ -65,20 +62,2 @@ static int GetHeaderLength(u_int16_t fc); -static const char *subtype_text[]={ - "Assoc Request", - "Assoc Response", - "ReAssoc Request", - "ReAssoc Response", - "Probe Request", - "Probe Response", - "RESERVED", - "RESERVED", - "Beacon", - "ATIM", - "Disassociation", - "Authentication", - "DeAuthentication", - "RESERVED", - "RESERVED" -}; - /* @@ -102 +81,3 @@ static const char *subtype_text[]={ #define TCHECK(var) TCHECK2(var, sizeof(var)) + +#endif /* SNIFFER_HH */ |