ethrnet sniiffing(이더넷 추척)은 무엇인가?
페이지 정보

본문
Ethernet sniffing 이란,자신이 찾고자 하는 정보를 발견하기 위해서 전송상태를 감시하는 것을
<br/>의미한다. 즉 어떤 조건에 맞는 자료르 프로그램이 발견하게 되면, 그 내용은 프로그램에 의해
<br/>파일로 저장이 된다. 정보를 알아내기 위하여 일반적으로 가장많이 쓰이는 조건은 'login',또는
<br/>'password'와 같은 단어들이다.
<br/>많은 Ethernet sniffers 가 있으며,다음은 그 예들이다.
<br/>시스템에 따른 스니터와 스니퍼가 있는 FTP
<br/>
<br/>OS Sniffer
<br/>~~ ~~~~~~~
<br/>HP/UX nettl (monitor) & netfmt (display)
<br/> nfswatch /* Available via anonymous ftp */
<br/>Irix nfswatch /* Available via anonymous ftp */
<br/> Etherman
<br/>SunOS etherfind
<br/> nfswatch /* Available via anonymous ftp */
<br/>Solaris snoop
<br/>DOS ETHLOAD /* Available via anonymous ftp as */
<br/> /* ethld104.zip */
<br/> The Gobbler /* Available via anonymous ftp */
<br/> LanPatrol
<br/> LanWatch
<br/> Netmon
<br/> Netwatch
<br/> Netzhack /* Available via anonymous ftp at */
<br/> /* mistress.informatik.unibw-muenchen.de */
<br/> /* /pub/netzhack.mac */
<br/>Macintosh Etherpeek
<br/>
<br/>Here is source code for an ethernet sniffer:
<br/>
<br/>/* Esniff.c */
<br/>
<br/>#include <stdio.h>
<br/>#include <ctype.h>
<br/>#include <string.h>
<br/>
<br/>#include <sys/time.h>
<br/>#include <sys/file.h>
<br/>#include <sys/stropts.h>
<br/>#include <sys/signal.h>
<br/>#include <sys/types.h>
<br/>#include <sys/socket.h>
<br/>#include <sys/ioctl.h>
<br/>
<br/>#include <net/if.h>
<br/>#include <net/nit_if.h>
<br/>#include <net/nit_buf.h>
<br/>#include <net/if_arp.h>
<br/>
<br/>#include <netinet/in.h>
<br/>#include <netinet/if_ether.h>
<br/>#include <netinet/in_systm.h>
<br/>#include <netinet/ip.h>
<br/>#include <netinet/udp.h>
<br/>#include <netinet/ip_var.h>
<br/>#include <netinet/udp_var.h>
<br/>#include <netinet/in_systm.h>
<br/>#include <netinet/tcp.h>
<br/>#include <netinet/ip_icmp.h>
<br/>
<br/>#include <netdb.h>
<br/>#include <arpa/inet.h>
<br/>
<br/>#define ERR stderr
<br/>
<br/>char *malloc();
<br/>char *device,
<br/> *ProgName,
<br/> *LogName;
<br/>FILE *LOG;
<br/>int debug=0;
<br/>
<br/>#define NIT_DEV "/dev/nit"
<br/>#define CHUNKSIZE 4096 /* device buffer size */
<br/>int if_fd = -1;
<br/>int Packet[CHUNKSIZE+32];
<br/>
<br/>void Pexit(err,msg)
<br/>int err; char *msg;
<br/>{ perror(msg);
<br/> exit(err); }
<br/>
<br/>void Zexit(err,msg)
<br/>int err; char *msg;
<br/>{ fprintf(ERR,msg);
<br/> exit(err); }
<br/>
<br/>#define IP ((struct ip *)Packet)
<br/>#define IP_OFFSET (0x1FFF)
<br/>#define SZETH (sizeof(struct ether_header))
<br/>#define IPLEN (ntohs(ip->ip_len))
<br/>#define IPHLEN (ip->ip_hl)
<br/>#define TCPOFF (tcph->th_off)
<br/>#define IPS (ip->ip_src)
<br/>#define IPD (ip->ip_dst)
<br/>#define TCPS (tcph->th_sport)
<br/>#define TCPD (tcph->th_dport)
<br/>#define IPeq(s,t) ((s).s_addr == (t).s_addr)
<br/>
<br/>#define TCPFL(FLAGS) (tcph->th_flags & (FLAGS))
<br/>
<br/>#define MAXBUFLEN (128)
<br/>time_t LastTIME = 0;
<br/>
<br/>struct CREC {
<br/> struct CREC *Next,
<br/> *Last;
<br/> time_t Time; /* start time */
<br/> struct in_addr SRCip,
<br/> DSTip;
<br/> u_int SRCport, /* src/dst ports */
<br/> DSTport;
<br/> u_char Data[MAXBUFLEN+2]; /* important stuff :-) */
<br/> u_int Length; /* current data length */
<br/> u_int PKcnt; /* # pkts */
<br/> u_long LASTseq;
<br/>};
<br/>
<br/>struct CREC *CLroot = NULL;
<br/>
<br/>char *Symaddr(ip)
<br/>register struct in_addr ip;
<br/>{ register struct hostent *he =
<br/> gethostbyaddr((char *)&ip.s_addr, sizeof(struct in_addr),AF_INET);
<br/>
<br/> return( (he)?(he->h_name):(inet_ntoa(ip)) );
<br/>}
<br/>
<br/>char *TCPflags(flgs)
<br/>register u_char flgs;
<br/>{ static char iobuf[8];
<br/>#define SFL(P,THF,C) iobuf[P]=((flgs & THF)?C:'-')
<br/>
<br/> SFL(0,TH_FIN, 'F');
<br/> SFL(1,TH_SYN, 'S');
<br/> SFL(2,TH_RST, 'R');
<br/> SFL(3,TH_PUSH,'P');
<br/> SFL(4,TH_ACK, 'A');
<br/> SFL(5,TH_URG, 'U');
<br/> iobuf[6]=0;
<br/> return(iobuf);
<br/>}
<br/>
<br/>char *SERVp(port)
<br/>register u_int port;
<br/>{ static char buf[10];
<br/> register char *p;
<br/>
<br/> switch(port) {
<br/> case IPPORT_LOGINSERVER: p="rlogin"; break;
<br/> case IPPORT_TELNET: p="telnet"; break;
<br/> case IPPORT_SMTP: p="smtp"; break;
<br/> case IPPORT_FTP: p="ftp"; break;
<br/> default: sprintf(buf,"%u",port); p=buf; break;
<br/> }
<br/> return(p);
<br/>}
<br/>
<br/>char *Ptm(t)
<br/>register time_t *t;
<br/>{ register char *p = ctime(t);
<br/> p[strlen(p)-6]=0; /* strip " YYYY\\n" */
<br/> return(p);
<br/>}
<br/>
<br/>char *NOWtm()
<br/>{ time_t tm;
<br/> time(&tm);
<br/> return( Ptm(&tm) );
<br/>}
<br/>
<br/>#define MAX(a,b) (((a)>(b))?(a):(b))
<br/>#define MIN(a,b) (((a)<(b))?(a):(b))
<br/>
<br/>/* add an item */
<br/>#define ADD_NODE(SIP,DIP,SPORT,DPORT,DATA,LEN) { \\
<br/> register struct CREC *CLtmp = \\
<br/> (struct CREC *)malloc(sizeof(struct CREC)); \\
<br/> time( &(CLtmp->Time) ); \\
<br/> CLtmp->SRCip.s_addr = SIP.s_addr; \\
<br/> CLtmp->DSTip.s_addr = DIP.s_addr; \\
<br/> CLtmp->SRCport = SPORT; \\
<br/> CLtmp->DSTport = DPORT; \\
<br/> CLtmp->Length = MIN(LEN,MAXBUFLEN); \\
<br/> bcopy( (u_char *)DATA, (u_char *)CLtmp->Data, CLtmp->Length); \\
<br/> CLtmp->PKcnt = 1; \\
<br/> CLtmp->Next = CLroot; \\
<br/> CLtmp->Last = NULL; \\
<br/> CLroot = CLtmp; \\
<br/>}
<br/>
<br/>register struct CREC *GET_NODE(Sip,SP,Dip,DP)
<br/>register struct in_addr Sip,Dip;
<br/>register u_int SP,DP;
<br/>{ register struct CREC *CLr = CLroot;
<br/>
<br/> while(CLr != NULL) {
<br/> if( (CLr->SRCport == SP) && (CLr->DSTport == DP) &&
<br/> IPeq(CLr->SRCip,Sip) && IPeq(CLr->DSTip,Dip) )
<br/> break;
<br/> CLr = CLr->Next;
<br/> }
<br/> return(CLr);
<br/>}
<br/>
<br/>#define ADDDATA_NODE(CL,DATA,LEN) { \\
<br/>bcopy((u_char *)DATA, (u_char *)&CL->Data[CL->Length],LEN); \\
<br/>CL->Length += LEN; \\
<br/>}
<br/>
<br/>#define PR_DATA(dp,ln) { \\
<br/> register u_char lastc=0; \\
<br/> while(ln-- >0) { \\
<br/> if(*dp < 32) { \\
<br/> switch(*dp) { \\
<br/> case '\\0': if((lastc=='\\r') || (lastc=='\\n') || lastc=='\\0') \\
<br/> break; \\
<br/> case '\\r': \\
<br/> case '\\n': fprintf(LOG,"\\n : "); \\
<br/> break; \\
<br/> default : fprintf(LOG,"^%c", (*dp + 64)); \\
<br/> break; \\
<br/> } \\
<br/> } else { \\
<br/> if(isprint(*dp)) fputc(*dp,LOG); \\
<br/> else fprintf(LOG,"(%d)",*dp); \\
<br/> } \\
<br/> lastc = *dp++; \\
<br/> } \\
<br/> fflush(LOG); \\
<br/>}
<br/>
<br/>void END_NODE(CLe,d,dl,msg)
<br/>register struct CREC *CLe;
<br/>register u_char *d;
<br/>register int dl;
<br/>register char *msg;
<br/>{
<br/> fprintf(LOG,"\\n-- TCP/IP LOG -- TM: %s --\\n", Ptm(&CLe->Time));
<br/> fprintf(LOG," PATH: %s(%s) =>", Symaddr(CLe->SRCip),SERVp(CLe->SRCport));
<br/> fprintf(LOG," %s(%s)\\n", Symaddr(CLe->DSTip),SERVp(CLe->DSTport));
<br/> fprintf(LOG," STAT: %s, %d pkts, %d bytes [%s]\\n",
<br/> NOWtm(),CLe->PKcnt,(CLe->Length+dl),msg);
<br/> fprintf(LOG," DATA: ");
<br/> { register u_int i = CLe->Length;
<br/> register u_char *p = CLe->Data;
<br/> PR_DATA(p,i);
<br/> PR_DATA(d,dl);
<br/> }
<br/>
<br/> fprintf(LOG,"\\n-- \\n");
<br/> fflush(LOG);
<br/>
<br/> if(CLe->Next != NULL)
<br/> CLe->Next->Last = CLe->Last;
<br/> if(CLe->Last != NULL)
<br/> CLe->Last->Next = CLe->Next;
<br/> else
<br/> CLroot = CLe->Next;
<br/> free(CLe);
<br/>}
<br/>
<br/>/* 30 mins (x 60 seconds) */
<br/>#define IDLE_TIMEOUT 1800
<br/>#define IDLE_NODE() { \\
<br/> time_t tm; \\
<br/> time(&tm); \\
<br/> if(LastTIME<tm) { \\
<br/> register struct CREC *CLe,*CLt = CLroot; \\
<br/> LastTIME=(tm+IDLE_TIMEOUT); tm-=IDLE_TIMEOUT; \\
<br/> while(CLe=CLt) { \\
<br/> CLt=CLe->Next; \\
<br/> if(CLe->Time <tm) \\
<br/> END_NODE(CLe,(u_char *)NULL,0,"IDLE TIMEOUT"); \\
<br/> } \\
<br/> } \\
<br/>}
<br/>
<br/>void filter(cp, pktlen)
<br/>register char *cp;
<br/>register u_int pktlen;
<br/>{
<br/>register struct ip *ip;
<br/>register struct tcphdr *tcph;
<br/>
<br/>{ register u_short EtherType=ntohs(((struct ether_header *)cp)->ether_type);
<br/>
<br/> if(EtherType < 0x600) {
<br/> EtherType = *(u_short *)(cp + SZETH + 6);
<br/> cp+=8; pktlen-=8;
<br/> }
<br/>
<br/> if(EtherType != ETHERTYPE_IP) /* chuk it if its not IP */
<br/> return;
<br/>}
<br/>
<br/> /* ugh, gotta do an alignment :-( */
<br/>bcopy(cp + SZETH, (char *)Packet,(int)(pktlen - SZETH));
<br/>
<br/>ip = (struct ip *)Packet;
<br/>if( ip->ip_p != IPPROTO_TCP) /* chuk non tcp pkts */
<br/> return;
<br/>tcph = (struct tcphdr *)(Packet + IPHLEN);
<br/>
<br/>if(!( (TCPD == IPPORT_TELNET) ||
<br/> (TCPD == IPPORT_LOGINSERVER) ||
<br/> (TCPD == IPPORT_FTP)
<br/> )) return;
<br/>
<br/>{ register struct CREC *CLm;
<br/> register int length = ((IPLEN - (IPHLEN * 4)) - (TCPOFF * 4));
<br/> register u_char *p = (u_char *)Packet;
<br/>
<br/> p += ((IPHLEN * 4) + (TCPOFF * 4));
<br/>
<br/>if(debug) {
<br/> fprintf(LOG,"PKT: (%s %04X) ", TCPflags(tcph->th_flags),length);
<br/> fprintf(LOG,"%s[%s] => ", inet_ntoa(IPS),SERVp(TCPS));
<br/> fprintf(LOG,"%s[%s]\\n", inet_ntoa(IPD),SERVp(TCPD));
<br/>}
<br/>
<br/> if( CLm = GET_NODE(IPS, TCPS, IPD, TCPD) ) {
<br/>
<br/> CLm->PKcnt++;
<br/>
<br/> if(length>0)
<br/> if( (CLm->Length + length) < MAXBUFLEN ) {
<br/> ADDDATA_NODE( CLm, p,length);
<br/> } else {
<br/> END_NODE( CLm, p,length, "DATA LIMIT");
<br/> }
<br/>
<br/> if(TCPFL(TH_FIN|TH_RST)) {
<br/> END_NODE( CLm, (u_char *)NULL,0,TCPFL(TH_FIN)?"TH_FIN":"TH_RST" );
<br/> }
<br/>
<br/> } else {
<br/>
<br/> if(TCPFL(TH_SYN)) {
<br/> ADD_NODE(IPS,IPD,TCPS,TCPD,p,length);
<br/> }
<br/>
<br/> }
<br/>
<br/> IDLE_NODE();
<br/>
<br/>}
<br/>
<br/>}
<br/>
<br/>/* signal handler
<br/>*/
<br/>void death()
<br/>{ register struct CREC *CLe;
<br/>
<br/> while(CLe=CLroot)
<br/> END_NODE( CLe, (u_char *)NULL,0, "SIGNAL");
<br/>
<br/> fprintf(LOG,"\\nLog ended at => %s\\n",NOWtm());
<br/> fflush(LOG);
<br/> if(LOG != stdout)
<br/> fclose(LOG);
<br/> exit(1);
<br/>}
<br/>
<br/>/* opens network interface, performs ioctls and reads from it,
<br/>* passing data to filter function
<br/>*/
<br/>void do_it()
<br/>{
<br/> int cc;
<br/> char *buf;
<br/> u_short sp_ts_len;
<br/>
<br/> if(!(buf=malloc(CHUNKSIZE)))
<br/> Pexit(1,"Eth: malloc");
<br/>
<br/>/* this /dev/nit initialization code pinched from etherfind */
<br/> {
<br/> struct strioctl si;
<br/> struct ifreq ifr;
<br/> struct timeval timeout;
<br/> u_int chunksize = CHUNKSIZE;
<br/> u_long if_flags = NI_PROMISC;
<br/>
<br/> if((if_fd = open(NIT_DEV, O_RDONLY)) < 0)
<br/> Pexit(1,"Eth: nit open");
<br/>
<br/> if(ioctl(if_fd, I_SRDOPT, (char *)RMSGD) < 0)
<br/> Pexit(1,"Eth: ioctl (I_SRDOPT)");
<br/>
<br/> si.ic_timout = INFTIM;
<br/>
<br/> if(ioctl(if_fd, I_PUSH, "nbuf") < 0)
<br/> Pexit(1,"Eth: ioctl (I_PUSH \\nbuf\\")"");
<br/>의미한다. 즉 어떤 조건에 맞는 자료르 프로그램이 발견하게 되면, 그 내용은 프로그램에 의해
<br/>파일로 저장이 된다. 정보를 알아내기 위하여 일반적으로 가장많이 쓰이는 조건은 'login',또는
<br/>'password'와 같은 단어들이다.
<br/>많은 Ethernet sniffers 가 있으며,다음은 그 예들이다.
<br/>시스템에 따른 스니터와 스니퍼가 있는 FTP
<br/>
<br/>OS Sniffer
<br/>~~ ~~~~~~~
<br/>HP/UX nettl (monitor) & netfmt (display)
<br/> nfswatch /* Available via anonymous ftp */
<br/>Irix nfswatch /* Available via anonymous ftp */
<br/> Etherman
<br/>SunOS etherfind
<br/> nfswatch /* Available via anonymous ftp */
<br/>Solaris snoop
<br/>DOS ETHLOAD /* Available via anonymous ftp as */
<br/> /* ethld104.zip */
<br/> The Gobbler /* Available via anonymous ftp */
<br/> LanPatrol
<br/> LanWatch
<br/> Netmon
<br/> Netwatch
<br/> Netzhack /* Available via anonymous ftp at */
<br/> /* mistress.informatik.unibw-muenchen.de */
<br/> /* /pub/netzhack.mac */
<br/>Macintosh Etherpeek
<br/>
<br/>Here is source code for an ethernet sniffer:
<br/>
<br/>/* Esniff.c */
<br/>
<br/>#include <stdio.h>
<br/>#include <ctype.h>
<br/>#include <string.h>
<br/>
<br/>#include <sys/time.h>
<br/>#include <sys/file.h>
<br/>#include <sys/stropts.h>
<br/>#include <sys/signal.h>
<br/>#include <sys/types.h>
<br/>#include <sys/socket.h>
<br/>#include <sys/ioctl.h>
<br/>
<br/>#include <net/if.h>
<br/>#include <net/nit_if.h>
<br/>#include <net/nit_buf.h>
<br/>#include <net/if_arp.h>
<br/>
<br/>#include <netinet/in.h>
<br/>#include <netinet/if_ether.h>
<br/>#include <netinet/in_systm.h>
<br/>#include <netinet/ip.h>
<br/>#include <netinet/udp.h>
<br/>#include <netinet/ip_var.h>
<br/>#include <netinet/udp_var.h>
<br/>#include <netinet/in_systm.h>
<br/>#include <netinet/tcp.h>
<br/>#include <netinet/ip_icmp.h>
<br/>
<br/>#include <netdb.h>
<br/>#include <arpa/inet.h>
<br/>
<br/>#define ERR stderr
<br/>
<br/>char *malloc();
<br/>char *device,
<br/> *ProgName,
<br/> *LogName;
<br/>FILE *LOG;
<br/>int debug=0;
<br/>
<br/>#define NIT_DEV "/dev/nit"
<br/>#define CHUNKSIZE 4096 /* device buffer size */
<br/>int if_fd = -1;
<br/>int Packet[CHUNKSIZE+32];
<br/>
<br/>void Pexit(err,msg)
<br/>int err; char *msg;
<br/>{ perror(msg);
<br/> exit(err); }
<br/>
<br/>void Zexit(err,msg)
<br/>int err; char *msg;
<br/>{ fprintf(ERR,msg);
<br/> exit(err); }
<br/>
<br/>#define IP ((struct ip *)Packet)
<br/>#define IP_OFFSET (0x1FFF)
<br/>#define SZETH (sizeof(struct ether_header))
<br/>#define IPLEN (ntohs(ip->ip_len))
<br/>#define IPHLEN (ip->ip_hl)
<br/>#define TCPOFF (tcph->th_off)
<br/>#define IPS (ip->ip_src)
<br/>#define IPD (ip->ip_dst)
<br/>#define TCPS (tcph->th_sport)
<br/>#define TCPD (tcph->th_dport)
<br/>#define IPeq(s,t) ((s).s_addr == (t).s_addr)
<br/>
<br/>#define TCPFL(FLAGS) (tcph->th_flags & (FLAGS))
<br/>
<br/>#define MAXBUFLEN (128)
<br/>time_t LastTIME = 0;
<br/>
<br/>struct CREC {
<br/> struct CREC *Next,
<br/> *Last;
<br/> time_t Time; /* start time */
<br/> struct in_addr SRCip,
<br/> DSTip;
<br/> u_int SRCport, /* src/dst ports */
<br/> DSTport;
<br/> u_char Data[MAXBUFLEN+2]; /* important stuff :-) */
<br/> u_int Length; /* current data length */
<br/> u_int PKcnt; /* # pkts */
<br/> u_long LASTseq;
<br/>};
<br/>
<br/>struct CREC *CLroot = NULL;
<br/>
<br/>char *Symaddr(ip)
<br/>register struct in_addr ip;
<br/>{ register struct hostent *he =
<br/> gethostbyaddr((char *)&ip.s_addr, sizeof(struct in_addr),AF_INET);
<br/>
<br/> return( (he)?(he->h_name):(inet_ntoa(ip)) );
<br/>}
<br/>
<br/>char *TCPflags(flgs)
<br/>register u_char flgs;
<br/>{ static char iobuf[8];
<br/>#define SFL(P,THF,C) iobuf[P]=((flgs & THF)?C:'-')
<br/>
<br/> SFL(0,TH_FIN, 'F');
<br/> SFL(1,TH_SYN, 'S');
<br/> SFL(2,TH_RST, 'R');
<br/> SFL(3,TH_PUSH,'P');
<br/> SFL(4,TH_ACK, 'A');
<br/> SFL(5,TH_URG, 'U');
<br/> iobuf[6]=0;
<br/> return(iobuf);
<br/>}
<br/>
<br/>char *SERVp(port)
<br/>register u_int port;
<br/>{ static char buf[10];
<br/> register char *p;
<br/>
<br/> switch(port) {
<br/> case IPPORT_LOGINSERVER: p="rlogin"; break;
<br/> case IPPORT_TELNET: p="telnet"; break;
<br/> case IPPORT_SMTP: p="smtp"; break;
<br/> case IPPORT_FTP: p="ftp"; break;
<br/> default: sprintf(buf,"%u",port); p=buf; break;
<br/> }
<br/> return(p);
<br/>}
<br/>
<br/>char *Ptm(t)
<br/>register time_t *t;
<br/>{ register char *p = ctime(t);
<br/> p[strlen(p)-6]=0; /* strip " YYYY\\n" */
<br/> return(p);
<br/>}
<br/>
<br/>char *NOWtm()
<br/>{ time_t tm;
<br/> time(&tm);
<br/> return( Ptm(&tm) );
<br/>}
<br/>
<br/>#define MAX(a,b) (((a)>(b))?(a):(b))
<br/>#define MIN(a,b) (((a)<(b))?(a):(b))
<br/>
<br/>/* add an item */
<br/>#define ADD_NODE(SIP,DIP,SPORT,DPORT,DATA,LEN) { \\
<br/> register struct CREC *CLtmp = \\
<br/> (struct CREC *)malloc(sizeof(struct CREC)); \\
<br/> time( &(CLtmp->Time) ); \\
<br/> CLtmp->SRCip.s_addr = SIP.s_addr; \\
<br/> CLtmp->DSTip.s_addr = DIP.s_addr; \\
<br/> CLtmp->SRCport = SPORT; \\
<br/> CLtmp->DSTport = DPORT; \\
<br/> CLtmp->Length = MIN(LEN,MAXBUFLEN); \\
<br/> bcopy( (u_char *)DATA, (u_char *)CLtmp->Data, CLtmp->Length); \\
<br/> CLtmp->PKcnt = 1; \\
<br/> CLtmp->Next = CLroot; \\
<br/> CLtmp->Last = NULL; \\
<br/> CLroot = CLtmp; \\
<br/>}
<br/>
<br/>register struct CREC *GET_NODE(Sip,SP,Dip,DP)
<br/>register struct in_addr Sip,Dip;
<br/>register u_int SP,DP;
<br/>{ register struct CREC *CLr = CLroot;
<br/>
<br/> while(CLr != NULL) {
<br/> if( (CLr->SRCport == SP) && (CLr->DSTport == DP) &&
<br/> IPeq(CLr->SRCip,Sip) && IPeq(CLr->DSTip,Dip) )
<br/> break;
<br/> CLr = CLr->Next;
<br/> }
<br/> return(CLr);
<br/>}
<br/>
<br/>#define ADDDATA_NODE(CL,DATA,LEN) { \\
<br/>bcopy((u_char *)DATA, (u_char *)&CL->Data[CL->Length],LEN); \\
<br/>CL->Length += LEN; \\
<br/>}
<br/>
<br/>#define PR_DATA(dp,ln) { \\
<br/> register u_char lastc=0; \\
<br/> while(ln-- >0) { \\
<br/> if(*dp < 32) { \\
<br/> switch(*dp) { \\
<br/> case '\\0': if((lastc=='\\r') || (lastc=='\\n') || lastc=='\\0') \\
<br/> break; \\
<br/> case '\\r': \\
<br/> case '\\n': fprintf(LOG,"\\n : "); \\
<br/> break; \\
<br/> default : fprintf(LOG,"^%c", (*dp + 64)); \\
<br/> break; \\
<br/> } \\
<br/> } else { \\
<br/> if(isprint(*dp)) fputc(*dp,LOG); \\
<br/> else fprintf(LOG,"(%d)",*dp); \\
<br/> } \\
<br/> lastc = *dp++; \\
<br/> } \\
<br/> fflush(LOG); \\
<br/>}
<br/>
<br/>void END_NODE(CLe,d,dl,msg)
<br/>register struct CREC *CLe;
<br/>register u_char *d;
<br/>register int dl;
<br/>register char *msg;
<br/>{
<br/> fprintf(LOG,"\\n-- TCP/IP LOG -- TM: %s --\\n", Ptm(&CLe->Time));
<br/> fprintf(LOG," PATH: %s(%s) =>", Symaddr(CLe->SRCip),SERVp(CLe->SRCport));
<br/> fprintf(LOG," %s(%s)\\n", Symaddr(CLe->DSTip),SERVp(CLe->DSTport));
<br/> fprintf(LOG," STAT: %s, %d pkts, %d bytes [%s]\\n",
<br/> NOWtm(),CLe->PKcnt,(CLe->Length+dl),msg);
<br/> fprintf(LOG," DATA: ");
<br/> { register u_int i = CLe->Length;
<br/> register u_char *p = CLe->Data;
<br/> PR_DATA(p,i);
<br/> PR_DATA(d,dl);
<br/> }
<br/>
<br/> fprintf(LOG,"\\n-- \\n");
<br/> fflush(LOG);
<br/>
<br/> if(CLe->Next != NULL)
<br/> CLe->Next->Last = CLe->Last;
<br/> if(CLe->Last != NULL)
<br/> CLe->Last->Next = CLe->Next;
<br/> else
<br/> CLroot = CLe->Next;
<br/> free(CLe);
<br/>}
<br/>
<br/>/* 30 mins (x 60 seconds) */
<br/>#define IDLE_TIMEOUT 1800
<br/>#define IDLE_NODE() { \\
<br/> time_t tm; \\
<br/> time(&tm); \\
<br/> if(LastTIME<tm) { \\
<br/> register struct CREC *CLe,*CLt = CLroot; \\
<br/> LastTIME=(tm+IDLE_TIMEOUT); tm-=IDLE_TIMEOUT; \\
<br/> while(CLe=CLt) { \\
<br/> CLt=CLe->Next; \\
<br/> if(CLe->Time <tm) \\
<br/> END_NODE(CLe,(u_char *)NULL,0,"IDLE TIMEOUT"); \\
<br/> } \\
<br/> } \\
<br/>}
<br/>
<br/>void filter(cp, pktlen)
<br/>register char *cp;
<br/>register u_int pktlen;
<br/>{
<br/>register struct ip *ip;
<br/>register struct tcphdr *tcph;
<br/>
<br/>{ register u_short EtherType=ntohs(((struct ether_header *)cp)->ether_type);
<br/>
<br/> if(EtherType < 0x600) {
<br/> EtherType = *(u_short *)(cp + SZETH + 6);
<br/> cp+=8; pktlen-=8;
<br/> }
<br/>
<br/> if(EtherType != ETHERTYPE_IP) /* chuk it if its not IP */
<br/> return;
<br/>}
<br/>
<br/> /* ugh, gotta do an alignment :-( */
<br/>bcopy(cp + SZETH, (char *)Packet,(int)(pktlen - SZETH));
<br/>
<br/>ip = (struct ip *)Packet;
<br/>if( ip->ip_p != IPPROTO_TCP) /* chuk non tcp pkts */
<br/> return;
<br/>tcph = (struct tcphdr *)(Packet + IPHLEN);
<br/>
<br/>if(!( (TCPD == IPPORT_TELNET) ||
<br/> (TCPD == IPPORT_LOGINSERVER) ||
<br/> (TCPD == IPPORT_FTP)
<br/> )) return;
<br/>
<br/>{ register struct CREC *CLm;
<br/> register int length = ((IPLEN - (IPHLEN * 4)) - (TCPOFF * 4));
<br/> register u_char *p = (u_char *)Packet;
<br/>
<br/> p += ((IPHLEN * 4) + (TCPOFF * 4));
<br/>
<br/>if(debug) {
<br/> fprintf(LOG,"PKT: (%s %04X) ", TCPflags(tcph->th_flags),length);
<br/> fprintf(LOG,"%s[%s] => ", inet_ntoa(IPS),SERVp(TCPS));
<br/> fprintf(LOG,"%s[%s]\\n", inet_ntoa(IPD),SERVp(TCPD));
<br/>}
<br/>
<br/> if( CLm = GET_NODE(IPS, TCPS, IPD, TCPD) ) {
<br/>
<br/> CLm->PKcnt++;
<br/>
<br/> if(length>0)
<br/> if( (CLm->Length + length) < MAXBUFLEN ) {
<br/> ADDDATA_NODE( CLm, p,length);
<br/> } else {
<br/> END_NODE( CLm, p,length, "DATA LIMIT");
<br/> }
<br/>
<br/> if(TCPFL(TH_FIN|TH_RST)) {
<br/> END_NODE( CLm, (u_char *)NULL,0,TCPFL(TH_FIN)?"TH_FIN":"TH_RST" );
<br/> }
<br/>
<br/> } else {
<br/>
<br/> if(TCPFL(TH_SYN)) {
<br/> ADD_NODE(IPS,IPD,TCPS,TCPD,p,length);
<br/> }
<br/>
<br/> }
<br/>
<br/> IDLE_NODE();
<br/>
<br/>}
<br/>
<br/>}
<br/>
<br/>/* signal handler
<br/>*/
<br/>void death()
<br/>{ register struct CREC *CLe;
<br/>
<br/> while(CLe=CLroot)
<br/> END_NODE( CLe, (u_char *)NULL,0, "SIGNAL");
<br/>
<br/> fprintf(LOG,"\\nLog ended at => %s\\n",NOWtm());
<br/> fflush(LOG);
<br/> if(LOG != stdout)
<br/> fclose(LOG);
<br/> exit(1);
<br/>}
<br/>
<br/>/* opens network interface, performs ioctls and reads from it,
<br/>* passing data to filter function
<br/>*/
<br/>void do_it()
<br/>{
<br/> int cc;
<br/> char *buf;
<br/> u_short sp_ts_len;
<br/>
<br/> if(!(buf=malloc(CHUNKSIZE)))
<br/> Pexit(1,"Eth: malloc");
<br/>
<br/>/* this /dev/nit initialization code pinched from etherfind */
<br/> {
<br/> struct strioctl si;
<br/> struct ifreq ifr;
<br/> struct timeval timeout;
<br/> u_int chunksize = CHUNKSIZE;
<br/> u_long if_flags = NI_PROMISC;
<br/>
<br/> if((if_fd = open(NIT_DEV, O_RDONLY)) < 0)
<br/> Pexit(1,"Eth: nit open");
<br/>
<br/> if(ioctl(if_fd, I_SRDOPT, (char *)RMSGD) < 0)
<br/> Pexit(1,"Eth: ioctl (I_SRDOPT)");
<br/>
<br/> si.ic_timout = INFTIM;
<br/>
<br/> if(ioctl(if_fd, I_PUSH, "nbuf") < 0)
<br/> Pexit(1,"Eth: ioctl (I_PUSH \\nbuf\\")"");
- 다음글[ajax] 인터넷 사용자를 위한 유닉스 기본 23.06.16
댓글목록
등록된 댓글이 없습니다.