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;
}
#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;
}
Publicité