AntiGuide: ArduinoEnc28J60StereoManInTheMiddleTcpDump



PagePrincipale :: DerniersChangements :: ParametresUtilisateur :: Vous êtes ec2-18-188-252-23.us-east-2.compute.amazonaws.com :: Signaler un abus :: le: 20240419 05:35:46
ArduinoEnc28J60StereoMegaTwoWired

variante de frame

promise cuitée:
la notice dit: "The device can enter Promiscuous mode and receive
all packets by clearing the ERXFCON register. The
proper setting of the register will depend on the
application requirements
"

dans ces conditions, le gadget n'ajoute aucun paquet sur le réseau, on invente le ZERO-intrusif!

L'affichage du trafic est commandé par un fil entre les pin 12 et la masse.

le "gadget" peut être utilisé de deux manières:

pour plus tard:

// "Man in the middle" tcpdump 
// http://antiguide.free.fr/wiki/wakka.php?wiki=ArduinoEnc28J60StereoManInTheMiddleTcpDump
#include <EtherCard.h>
#include <EtherCard_bis.h>

// pins assignment
// print controled by switch on pin 12
#define PINDUMP 12 // to be grounded for dump
// two enc28j60 CS
#define PINCSZOMBIE 49
#define PINCSLAN 53
// buffer size for ethernet packets
#define LENBUFFER 1800  // more than max windows tcp

byte IPDUMMY[4]={0,0,0,0};
byte  LANMAC[6]={0,0,0,0,0,0};
byte  ZOMBIEMAC[6]={0,0,0,0,0,0};

byte ENC28J60::buffer[LENBUFFER];
byte ENC28J60_bis::buffer[LENBUFFER];


int numzombie=0;
int numlan=0;

int success=0;  // will be 1 if setup OK.

void setup () {
  Serial.begin(9600);
  Serial.println("\n[TCP-Pass-Through] 20140212 by flavigny");
  digitalWrite(10,HIGH);
    Serial.print( "Access Ethernet controller... on pin ");
    
        
     
   Serial.println(PINCSZOMBIE);
  if (ether.begin(sizeof ENC28J60::buffer, ZOMBIEMAC,PINCSZOMBIE) == 0) {
    Serial.println( " Failed!");
    return;
  }
    Serial.print( "Access Ethernet controller... on pin ");
    Serial.println(PINCSLAN);
  if (ether_bis.begin(sizeof ENC28J60_bis::buffer, LANMAC,PINCSLAN) == 0) {
    Serial.println( "Failed!");
    return;
  }

   ether.enablePromiscuous();
   ether_bis.enablePromiscuous();
 
     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);

    Serial.println( "Succes.!");
    
    pinMode(PINDUMP,INPUT_PULLUP);

  success=1 ;
 }


void pthexa(char *buf,int base,int nb, char *t){
  for (int iii=0;iii<nb;iii=iii+1) {
     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 (char *tampon,int deb, int fin){
  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 ){
// for tcp-dump
int biglen;
int ICMP=0;
int TCP=0;
int ARP=0;
int 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 (buf[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=(uint8_t)buf[16]*256+(uint8_t)buf[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 (buf[23]==1){ ICMP=1;Serial.println("ICMP");}
  if (buf[23]==6) {TCP=1;Serial.println("TCP");}
  if (buf[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," Sourc port");
    pthexa(buf,36,2," Dest 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 addr length");
    pthexa(buf,19,1,"proto addr 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 (buf,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 (buf, 50,tout);
  }
  if (!TCP & !ICMP) dump(buf,0,tout);
  Serial.println("");
Serial.println("------------------");

}


//---------------------------------------------------------------
// --------------------------------------------------------------
void loop () {
   if (!success) return;
   // ---------------get from ZOMBIE
   int qreceivedfromzombie=  ether.packetReceive();

   if (qreceivedfromzombie>0) {
      numzombie=numzombie+1;
      if (0==digitalRead(PINDUMP)) prtpkt((char*)ether.buffer,"de zombie",qreceivedfromzombie);
      ether_bis.sendEthernet((char *)ether.buffer,qreceivedfromzombie);
      return;
   }
 
  // get from LAN
  int qreceivedfromlan=  ether_bis.packetReceive();
  
  if (qreceivedfromlan>0) {
     numlan=numlan+1;
     if (0==digitalRead(PINDUMP)) prtpkt((char*)ether_bis.buffer,"de LAN",qreceivedfromlan);
     ether.sendEthernet((char *)ether_bis.buffer,qreceivedfromlan);
     return;
  }
   
}