Scanner TCP Syn [C]

/*Headers libpcap*/
#include <net/if.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>
#include <pcap.h>
#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>
/*Headers libnet*/
#include <libnet.h>
/*Headers Thread*/
#include <pthread.h>
/*Headers Signal*/
#include <signal.h>
/*Protocoles réseau*/
#define ETH_IPv4 0x0800
#define ETH_IPv6 0x86DD
#define ETH_ARP 0x0806
#define ETH_RARP 0x8035
/*Constantes*/
#define ETH_MAC_ADDR 6 //Taille de l'adresse mac : 6 bits
#define ETHERNET_SIZE 14 //Taille de l'entête ethernet : 14 bits
/*Configuration*/
#define PORT_SOURCE 50000

/*Structures */
struct eth{
    /*Ethernet*/
    u_char mac_src[ETH_MAC_ADDR];
    u_char mac_dst[ETH_MAC_ADDR];
    u_short type_proto;
};
struct tcp_header{
    /*TCP*/
      u_short tcp_port_src; /* port source */
      u_short tcp_port_dst; /* port de destination */
      u_long tcp_seqnum; /* numero de sequence */
      u_long tcp_aqunum; /* numero d'aquittement */
      u_char tcp_res; /* decalage, reserve, hlen, ecn ? */
      u_char tcp_flags; /* Flags : URG, ACK, PSH, RST, SYN, FIN */

#define TCP_FIN 0x01
#define TCP_SYN 0x02
#define TCP_RST 0x04
#define TCP_PSH 0x08
#define TCP_ACK 0x10
#define TCP_URG 0x20
#define TCP_ECE 0x40
#define TCP_CWR 0x80

      #define TCP_FLAGS (TH_FIN|TH_SYN|TH_RST|TH_ACK|TH_URG|TH_ECE|TH_CWR)
      u_short tcp_win; /* taille fenetre demandee */
      u_short tcp_crc; /* Checksum */
      u_short tcp_purg; /* pointeur donnees urgentes */
};

/*Reception des paquets*/
void recept_paquet (u_char *args,const struct pcap_pkthdr* pkthdr,const u_char* packet){
    /*On convertit l'ip de la cible en in_addr_t [en prenant soin de la transformer en const char*]*/
    in_addr_t target = inet_addr((const char*)args);
    struct eth* ether_hdr;
    struct ip* ip_hdr;
    struct tcp_header* tcp_hdr;
    /*On récupere l'entête ethernet*/
    ether_hdr = (struct eth*)packet;
    if(ntohs(ether_hdr->type_proto) == ETH_IPv4){
        /*Si le protocole est IPv4, on récupere l'entête*/
        ip_hdr = (struct ip*)(packet + ETHERNET_SIZE);
        /*Si le paquet provient de la cible*/
        if((ip_hdr->ip_src.s_addr) == target){
            /*Si le protocole suivant est TCP*/
            /*on récupere l'entête*/
            tcp_hdr = (struct tcp_header*)(packet + ETHERNET_SIZE + 4*(ip_hdr->ip_hl));
            if(tcp_hdr->tcp_flags == (TH_SYN|TH_ACK)){
                printf("\033[31m%d\033[00m [Open]\n",ntohs(tcp_hdr->tcp_port_src));


            }
        }

    }
}

/*Sniffer à lancer en thread*/
void sniffer(char *device, char* cible){
    pcap_t *desc = NULL;
    char errbuf[PCAP_ERRBUF_SIZE];
    desc = pcap_open_live(device,1514,1,1000,errbuf);
    if (desc == NULL){
        printf("Erreur\n");
        }
    /*Pour la comparaison future, on envoie l'argument cible au callback*/
    if(pcap_loop(desc,-1,recept_paquet,(u_char*)cible) > 0){
        printf("Erreur \n");
    }
}


/*Fonction gérant l'envoi d'un paquet armé SYN
  dans l'optique de la premiere phase du scan
  à savoir l'envoi de tels paquets sur tous les
  ports à scanner*/

int scanTCP(char* device,char* ip_dest, int port_dst,pid_t pid){
    int port_src = PORT_SOURCE;
    /*On construit le descripteur libnet*/
    libnet_t *l = NULL;
    char errbuf[LIBNET_ERRBUF_SIZE];
    l = libnet_init(LIBNET_RAW4,(char*)device,errbuf);
    if (l == NULL){
        libnet_destroy(l);
        kill(pid, SIGKILL);
        return -1;}
    /*On construit le déscripteur entête*/
    libnet_ptag_t ip = 0;
    libnet_ptag_t tcp = 0;
    /*On convertit l'IP cible*/
    u_int32_t dst_ip;
    dst_ip = libnet_name2addr4(l,ip_dest,LIBNET_DONT_RESOLVE);
    if (dst_ip == -1){
        printf("Erreur lors de la conversion SOURCE\n");
        libnet_destroy(l);
        return -1;}

    /*On commence l'entête tcp*/
    tcp = libnet_build_tcp(
        port_src,
        port_dst,
        0,0, //numSeq/numAck
        TH_SYN, // flags
        4096,//Windows size
        0,0, //checksum auto, urg = 0
        LIBNET_TCP_H,//Taille entête
        0,0,//longueur, payload
        l,0);//Descripteur, nouvelle entête
    if (tcp == -1){
        printf("Erreur TCP\n");
        libnet_destroy(l);
        return -1;}
    /*On commence l'entête IP*/
    ip = libnet_autobuild_ipv4(
        LIBNET_IPV4_H + LIBNET_TCP_H,
        IPPROTO_TCP,
        dst_ip,
        l);
    if (ip == -1){
        printf("Erreur IP\n");
        libnet_destroy(l);
        return -1;}
    /*On envoie le paquet */
    libnet_write(l);
    /*On détruit le descripteur*/
    libnet_destroy(l);

    return 0;

}

int main(int ac , char **argv){
    if (ac < 3){
        printf("Syntaxe : ./iScan <device> <ipCible>\n");
        exit(0);
    }
    char ip[] = "192.168.1.1";
    char device[] = "wlan0";
    /*On crée un thread */
    pid_t pid;
    /*On crée l'interation */
    int i = 0;
    /*On crée le fork*/
    pid = fork();
    /*On sépare les processus */
    if (pid == 0){
        sniffer(argv[1],argv[2]);
    }
    else{
        sleep(1);
        printf("\033[01m-*-*-*-*-Starting iPsilon Scanner-*-*-*-*-\033[00m\n[dream.of.a.nolife.overblog.net]\nScan de la machine \033[01m%s\033[00m à travers l'interface \033[01m%s\033[00m\n",argv[2],argv[1]);
        while (i < 10000){
            scanTCP(argv[1],argv[2],i,pid);
            i++;
            }
        printf("%d paquets ont été envoyés.\n",i);
    }
    kill(pid,SIGKILL);
    return 0;
    }

Pour être informé des derniers articles, inscrivez vous :