//ver [Tue Mar 13 16:12:51 CET 2001] -- 363 #include #include #define LMAX 200 #define PINGFLOOD 20 #define SMURF 20 #define SCAN 20 /*================================================================ ************************* ****** ***** *** ** * ++[X3ni0n]++ xenion@libero.it ~ http://www.tba.tsx.org 13/3/2k+1 ************************* ****** ***** *** ** * SEELOG - utility che processa all'infinito il file di log di ipchains (/var/log/messages nel mio caso) in cerca di *possibili* pingflood, smurf o scan verso il nostro HOST. Per processare altri tipi di log, basta modificare la funzione vis() * per farlo funzionare, occorre aggiungere alcuni filtri (se non gia' presenti) : # blocca e logga tutte le richieste echo-request (ping) ipchains -I input 1 -p icmp --icmp-type echo-request -l # logga tutte le risposte di tipo echo-reply (smurf sux..) ipchains -I input 1 -p icmp --icmp-type echo-reply -l # logga tutte le richieste di connessione tcp ipchains -I input 1 -p tcp -y -l ================================================================*/ int i,scan[2]={0,0},smurf[2]={0,0},flood[2]={0,0}; FILE *f2; size_t flen(char *filename[]) { FILE *f1; size_t dimenz=0; if ((f1=fopen(*filename,"r"))==NULL) return -1; while(fgetc(f1)!=-1) dimenz++; return dimenz-1; /* torna il numero di caratteri del file puntato da f1. Se il file non esiste, torna -1 (funzione lenta e poco ottimizzata..) */ } int findstr(char s1[], char s2[]) { unsigned n,m,i; if(strlen(s1)<2)return -1; for (m=0;m<=(strlen(s1)-strlen(s2));m++) { i=1; for (n=m;n<(strlen(s2)+m);n++) if (s1[n]!=s2[n-m]) i=0; if (i==1) return(n-strlen(s2)+1); } return(-1); /* torna la posizione in s1 del primo carattere della stringa uguale a s2. Se la stringa non'e' presente o di 1 solo carattere torna -1 */ } int vis(char riga[LMAX]) { char c,cerca[][LMAX]={ "PROTO=1", // *dovrebbero* essere giusti.. "(#3)", // echo request in input "(#2)", // echo reply in input "PROTO=6", "(#1)" // richiesta di connessione tcp in input }; //printf("%s",riga); /* rileva ping flood */ if( findstr(riga,cerca[0])!=-1 && findstr(riga,cerca[1])!=-1 ) { flood[0]++; for(i=0;i<16;i++)fprintf(f2,"%c",riga[i]); fprintf(f2,"[%d] echo request from [",flood[0]); for(i=findstr(riga,cerca[0])+7;riga[i]!=':';i++) fprintf(f2,"%c",riga[i]); fprintf(f2,"]\n"); if(flood[0]==PINGFLOOD) { flood[0]=0; flood[1]++; fprintf(f2,"[!] [%d] Rilevato _ping_ flood \n",flood[1]); } fflush(f2); } /* rileva possibili smurf o comunque _echo_reply_ flood */ if( findstr(riga,cerca[0])!=-1 && findstr(riga,cerca[2])!=-1 ) { smurf[0]++; for(i=0;i<16;i++)fprintf(f2,"%c",riga[i]); fprintf(f2,"[%d] echo reply from [",smurf[0]); for(i=findstr(riga,cerca[0])+7;riga[i]!=':';i++) fprintf(f2,"%c",riga[i]); fprintf(f2,"]\n"); if(smurf[0]==SMURF) { smurf[0]=0; smurf[1]++; fprintf(f2,"[!] [%d] Rilevato _echo_reply_ flood\n",smurf[1]); } fflush(f2); } /* rileva scan o comunque richieste di connessione tcp */ if( findstr(riga,cerca[3])!=-1 && findstr(riga,cerca[4])!=-1 ) { scan[0]++; for(i=0;i<16;i++)fprintf(f2,"%c",riga[i]); fprintf(f2,"[%d]\n[",scan[0]); for(i=findstr(riga,cerca[3])+7;riga[i]!=32;i++) fprintf(f2,"%c",riga[i]); fprintf(f2,"] tried to connect to ["); for(i++;riga[i]!=32;i++) fprintf(f2,"%c",riga[i]); fprintf(f2,"]\n"); if(scan[0]==SCAN) { scan[0]=0; scan[1]++; fprintf(f2,"[!] [%d] Rilevato _scan_\n",scan[1]); } fflush(f2); } } int main(int argc, char *argv[]) { FILE *f1; char riga[LMAX]; long offset; printf("seeLog(rev.2) by xenion@libero.it ~ http://www.tba.tsx.org\n"); if(argc<3){ printf("Usage : ./seelog [file input] [log file]\n"); return 2; } if((f1=fopen(argv[1],"r"))==NULL) { printf("%s: %s: File non valido\n\n",argv[0],argv[1]); return 2; } if((f2=fopen(argv[2],"a+"))==NULL) { printf("%s: %s: Impossibile aprire o creare il file\n\n",argv[0],argv[2]); return 2; } printf("[-] starting seeLog..\n"); printf("logfile : %s\n",argv[2]); printf("PINGFLOOD on : %d pings\n",PINGFLOOD); printf("SMURF on : %d _echo_reply_\n",SMURF); printf("SCAN on : %d tried connections\n",SCAN); offset=flen(&argv[1]); printf("[-] lisening for ping * _echo_reply_ * scan\n\n"); while(1){ fseek(f1,offset,SEEK_SET); while(fgets(riga,LMAX,f1)){ vis(riga); offset=offset+strlen(riga); } } fclose(f1); fclose(f2); } //EOF