// Simple demo tcpdump http://anntguide.free.fr #include <EtherCard.h> #include <EtherCard_bis.h> // dongle 2xethernet transparent //: faudrait capturer l'aderesse mac du zombie // filtre vostro 1720: ether host 00:24:E8:E6:EE:85 // ethernet interface mac address, must be unique on the LAN // TWO mac address to et as terminals byte VOSTROMAC[] = { 0,0x24,0xE8,0xE6,0xEE,0x85}; byte ACERMAC[6]={00,0x24,0x21,7,0x8E,0x25}; byte IPDUMMY[4]={0,0,0,0}; // for tcp-dump int ICMP=0; int TCP=0; int ARP=0; int UDP=0; #define PRINTLAN 0 #define PRINTZOMBIE 0 #define LENBUFFER 1800 // more than max windows tcp #define PINCSZOMBIE 49 #define PINCSLAN 53 byte ENC28J60::buffer[LENBUFFER]; byte ENC28J60_bis::buffer[LENBUFFER]; byte tampon[LENBUFFER]; static int biglen; int numzombie=0; int numlan=0; int qreceivedfromzombie=-1; int qreceivedfromlan=-1; int success=0; void setup () { Serial.begin(9600); Serial.println("[TCP-Pass-Through]"); digitalWrite(10,HIGH); Serial.print( "Access Ethernet controller... on pin "); Serial.println(PINCSZOMBIE); // if (ether.begin(sizeof ENC28J60::buffer, mymaczombie,PINCSZOMBIE) == 0) { if (ether.begin(sizeof ENC28J60::buffer, ACERMAC,PINCSZOMBIE) == 0) { Serial.println( " Failed!"); return; } Serial.print( "Access Ethernet controller... on pin "); Serial.println(PINCSLAN); if (ether_bis.begin(sizeof ENC28J60_bis::buffer, VOSTROMAC,PINCSLAN) == 0) { Serial.println( "Failed!"); return; } Serial.println( "Succes.!"); // Serial.print("taille du buffer dans enc28J60:");Serial.println(ENC28J60::bufferSize); // zombie memcpy(ether.myip,IPDUMMY,4); memcpy(ether.mymask,IPDUMMY,4); memcpy(ether.gwip,IPDUMMY,4); memcpy(ether.dnsip,IPDUMMY,4); memcpy(ether_bis.myip,IPDUMMY,4); memcpy(ether_bis.mymask,IPDUMMY,4); memcpy(ether_bis.gwip,IPDUMMY,4); memcpy(ether_bis.dnsip,IPDUMMY,4); } void pthexa(char *buf,int base,int nb, char *t){ for (int iii=0;iii<nb;iii=iii+1) { // Serial.print((byte) buf[base+iii]); // Serial.print(">"); h2((uint8_t)buf[base+iii]); Serial.print(" "); } if (nb==2) { Serial.print(" ("); Serial.print((uint8_t)buf[base]*256+(uint8_t)buf[base+1]); Serial.print(") "); } Serial.print("<-- "); Serial.println(t); } void ptdec(char *buf,int base,int nb, char *t){ for (int iii=0;iii<nb;iii=iii+1) { Serial.print((byte) buf[base+iii]); Serial.print(" "); } if (nb==2) { Serial.print(" ("); Serial.print((uint8_t)buf[base]*256+(uint8_t)buf[base+1]); Serial.print(") "); } Serial.print("<-- "); Serial.println(t); } void h2(int n){ char ALPHABET[]="0123456789ABCDEF"; Serial.print(ALPHABET[n/16]); Serial.print(ALPHABET[n%16]); } void dump (int deb, int fin){ // if (!PRINT) return; Serial.print("caracteres buffer a partir de " ); Serial.print(deb); Serial.print(" jusqu'a "); Serial.println(fin); for (int iii=deb;iii<fin;iii=iii+1) Serial.print ((char)tampon[iii]); Serial.println(""); Serial.print("-------Hexadecimal-----------"); for (int iii=deb;iii<fin;iii=iii+1) { if (((iii-deb)%16)==0) Serial.println(); h2(tampon[iii]); Serial.print(" "); } Serial.println("\n------------------"); } void prtpkt(char *buf,char *tt,int tout ){ // if (!PRINT) return; ARP=0; ICMP=0; TCP=0; UDP=0; Serial.println("------------------"); Serial.print("-prtpkt --: "); Serial.print(tt); Serial.print(" lon:"); Serial.print(tout); Serial.print(" numero LAN:"); Serial.print(numlan); Serial.print(" numero Zombie:"); Serial.print(numzombie); Serial.println(""); //Serial.println("------------------"); pthexa(buf,0,6,"to mac "); pthexa(buf,6,6,"from mac "); pthexa(buf,12,1,"ether type - length (08) "); pthexa(buf,13,1,"ether type 00/06 ??? "); if (tampon[13]==6) { Serial.println("ARP"); ARP=1; } if (ARP==0) { pthexa(buf,14,1," version "); pthexa(buf,15,1," service "); pthexa(buf,16,2," big len "); biglen=tampon[16]*256+tampon[17]; Serial.print(" "); Serial.print(biglen);Serial.println(" decimal "); pthexa(buf,18,2," id "); pthexa(buf,20,2," flag "); pthexa(buf,22,1," ttl "); pthexa(buf,23,1," next "); } if (tampon[23]==1){ ICMP=1;Serial.println("ICMP");} if (tampon[23]==6) {TCP=1;Serial.println("TCP");} if (tampon[23]==17) {UDP=1;Serial.println("UDP");} if (ARP==0){ pthexa(buf,24,2," chk "); ptdec(buf,26,4," source ip "); ptdec(buf,30,4," dest ip "); } if (UDP){ pthexa(buf,34,2," Source Udp port"); pthexa(buf,36,2," Dest Udp port"); pthexa(buf,38,2," payload length "); pthexa(buf,40,2," checksum"); } if (ARP){ pthexa(buf,14,2,"hardwware type"); pthexa(buf,16,2,"protocole type"); pthexa(buf,18,1,"hard ad length"); pthexa(buf,19,1,"proto add lngth"); pthexa(buf,20,2,"op code (1 request 2 reply)"); pthexa(buf,22,6,"sender mac"); ptdec(buf,28,4,"sender IP"); pthexa(buf,32,6,"destination mac add"); ptdec(buf,38,4,"destination IP"); // if (arp<=0) closed=true; // todo=5; } if (ICMP) { pthexa(buf,34,1," type 8 "); pthexa(buf,35,1," code 0 "); pthexa(buf,36,2," chk "); pthexa(buf,38,2," id 4019 "); pthexa(buf,40,2," seq num "); dump (42,tout); } if (TCP) { pthexa(buf,34,2," source port "); pthexa(buf,36,2," dest port "); pthexa(buf,38,4," seq num "); pthexa(buf,42,4," ack num "); pthexa(buf,46,2," hdr len "); pthexa(buf,48,2," reserved "); dump (50,tout); } if (!TCP & !ICMP) dump(0,tout); Serial.println(""); Serial.println("------------------"); } //--------------------------------------------------------------- // -------------------------------------------------------------- void loop () { // ------------------------- recevoir sur ZOMBIE qreceivedfromzombie= ether.packetReceive(); if (qreceivedfromzombie>0) { numzombie=numzombie+1; memcpy(tampon,ether.buffer,qreceivedfromzombie); if (PRINTZOMBIE) prtpkt((char*)tampon,"de zombie",qreceivedfromzombie); ether_bis.sendEthernet((char *)tampon,qreceivedfromzombie); return; } // recevoir sur LAN qreceivedfromlan= ether_bis.packetReceive(); if (qreceivedfromlan>0) { numlan=numlan+1; memcpy(tampon,ether_bis.buffer,qreceivedfromlan); // if (tampon[13]==6) Serial.println(" arp from LAN"); if (PRINTLAN ) prtpkt((char*)tampon,"de LAN",qreceivedfromlan); ether.sendEthernet((char *)tampon,qreceivedfromlan); } }