2 -
Programmation des sockets en C sous Linux par Sboub
Dans ce
Hackerstorm MAG n°2 (yeah !) nous allons parler de la programmation
des sockets
en C sous LINUX (meme principe que sous WINDOWS vu que nous n'utiliserons pas
encore de
RAW SOCKET, mais le boss de WINDOWS c'est TIPIAX...salut à lui!).
Cet article
a été fait un petit peu vite vu que je manque de temps... mais promis la
prochaine
fois ce
sera mieux :)
----
N.B =>
Tous ceux qui ne pigent que dalle ou qui ont des questions particulères (ou
bien qui
peuvent m'instruire !) sont les bienvenus sur #hackerstorm en UNDERNET ou sur
SBOUB666@hotmail.com
----
A - Les sockets,qu'est ce que c'est ?
Un socket
(un/une ?, bon on s'en fou) c'est en fait un canal de communication que vous
ouvrez ou
que vous
écoutez pour voir si d'autres personnes vous envoies des données.
Il existe
différents type de sockets:
SOCK_STREAM
Très utilisée,
communiction dans les deux sens. Plusieurs connexions possibles en meme temps.
SOCK_DGRAM
Ici, il n'y
a pas de moyen de controler si tous les paquets sont arrivés mais c'est un
protocole
très peu
utilisé donc aucun problème.
SOCK_RAW
C'est le
plus interressant : avec ce protocole vous faites CE QUE VOUS VOULEZ !! Vous
pouvez envoyer
un paquet
IP avec la source désiréé etc... très utilisé pour le SPOOFING.
SOCK_RDM
Pas encore
supporté ?
SOCK_SEQPACKET
Ressemble
au DGRAM...
J'ai été un
peu court dans cette partie car ce n'est pas très utile... et je manque de
temps ! :)
B - Ouvrir une connection
Il existe
différents type d'adresse :
AF_UNIX
(Unix internal protocols)
AF_INET (ARPA Internet protocols)
AF_ISO (ISO protocols)
AF_NS (Xerox Network
Systems protocols)
AF_IMPLINK (IMP "host at
IMP" link layer)
Et protocoles....:
ip 0 IP
# internet protocol, pseudo protocol number
icmp 1 ICMP
# internet control message protocol
igmp 2 IGMP
# internet group multicast protocol
ggp 3 GGP
# gateway-gateway protocol
tcp 6 TCP
# transmission control protocol
pup 12 PUP
# PARC universal packet protocol
udp 17 UDP
# user datagram protocol
idp 22 IDP
# WhatsThis?
raw 255 RAW # RAW IP interface
Les bibliothèque
importantes sont <sys/types.h> et <sys/socket.h>.
Donc voici
comment ouvrir une connection:
int sockfd;
// le numéro du socket (utile car on peut en ouvrir plusieurs)
struct
hostent *he; // la structure qui recevra nos infos
struct
sockaddr_in serveur_addr; // la structure qui recevra les infos du serveur par
exemple
// On
résoud le nom...
if ((he=gethostbyname(server)) == NULL)
{herror("gethostbyname");exit(1); }
if ((sockfd = socket(AF_INET,
SOCK_STREAM, 0)) == -1) {perror("socket"); exit(1); }
// On rempli les
structures...
serveur_addr.sin_family = AF_INET;
serveur_addr.sin_port =
htons(port);
serveur_addr.sin_addr = *((struct in_addr
*)he->h_addr);
// On se connecte avec le
serveur...
if (connect(sockfd, (struct sockaddr
*)&serveur_addr,sizeof(struct sockaddr)) == -1)
{perror("connect"); exit(1);}
Ca y est vous êtes connecté
! En cas de problème la fonction renvoie -1 et le type d'erreur.
C - Envoyer et recevoir des données.
Voici les
définitions des fonctions le permettant...
int
recv(int s, void *buf, int len, unsigned int flags);
int send(int s, const void *msg, int len, unsigned int flags);
int recvfrom(int s, void *buf, int len, unsigned int flags, struct
sockaddr*from, int *fromlen);
int sendto(int s, const void *msg, int len, unsigned int flags, const
struct sockaddr *to, int tolen);
EXEMPLE:
~~~~~~~~
char *envoi
= "Test...";
send(sock,envoi,strlen(envoi),0);
sock=notre
socket
envoi=notre
chaine
strlen(envoi)=la
longeur de la chaine envoyée
0=le flag
(MSG_OOB, NORMAL...)
Nous
pouvons aussi utiliser les fonctions READ et WRITE pour recevoir et envoyer des
données.
Comme ceci:
write(s,
envoi, strlen(envoi));
read(s, recu, 69000);
D - Fermer une connection
C'est
très simple, utilisez la commande "close(socket)". Ici socket est le
nom de votre socket.
E - Un peu plus loin...
Vous pouvez
déjà vous amuser à étudier l'exemple BONUXX.
J'ai cité
les RAW SOCKET tout à l'heure, nous parlerons dans le prochain mag comment
l'utiliser
et pourquoi
faire... sachez juste que tout bon hacker doit savoir l'utiliser !
Si vous
voulez des exemples de sources SOCKET allez sur le site du groupe :
HACKERSTORM.COM
F - L'exemple BONUXXXX !!!
Un petit
scanner TCP/IP à connexion complète qui illustre très bien
les
possibilitées de base des sockets... Etudiez le bien il pourra vous
être très
utile et en le modifiant un peu on peut faire beacoup de choses.
COPIER/COLLER
-------------------------------------------------------------------------------------------
/*SCANNER
TCP à connexion complète
By
SBOUB.
*/
#include
<stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <netdb.h>
#include <arpa/inet.h>
struct in_addr resolve (char
*name)
{
static struct in_addr in;
unsigned long l;
struct hostent *ent;
if ((l = inet_addr(name)) != INADDR_NONE) { in.s_addr = l;
return in; }
if (!(ent = gethostbyname(name))) { in.s_addr =
INADDR_NONE; return in; }
return *(struct in_addr *)ent->h_addr;
}
main(int argc, char **argv)
{
struct sockaddr_in addr;
int soc, rc, addr_len;
unsigned long port, endp = 65334;
char *victim;
if (argc < 2) {
fprintf(stderr,"Scanner TCP à connexion complète par SBOUB.\nUSAGE : %s
<host> [endport]\n\n", argv[0]); exit(1); }
victim = argv[1];
if (argc > 2) { endp = atol(argv[2]); }
printf("Scanner TCP à connexion complète par
SBOUB.\nScan TCP sur %s (port 0 -> %d)...\n\n", victim,endp);
addr.sin_addr = resolve(victim);
if (addr.sin_addr.s_addr == INADDR_NONE) { fprintf(stderr,
"Host [%s] non trouvé\n", victim); exit(1); }
addr.sin_family = AF_INET;
addr_len = sizeof(addr);
for (port = 1; port <= endp; port++)
{
soc = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
addr.sin_port = htons(port);
rc = connect(soc, (struct sockaddr*) &addr, addr_len);
close(soc);
if (rc < 0)continue;
// A vous de
rajouter vos propres ports (ceux des trojans par exemple...)
if (port==21) { printf("Port 21
(FTP)\n"); }
else if (port==22) { printf("Port 22
(SSH Remote Login Protoco)\n"); }
else if (port==23) { printf("Port 23 (TELNET)\n"); }
else if (port==25) { printf("Port 25 (SMTP)\n"); }
else if (port==37) { printf("Port 37 (TIMESERVER)\n");
}
else if (port==67) { printf("Port 67 (BOOTP
SERVER)\n"); }
else if (port==68) { printf("Port 68 (BOOTP
CLIENT)\n"); }
else if (port==70) { printf("Port 70 (GOPHER)\n"); }
else if (port==79) { printf("Port 79 (FINGER)\n"); }
else if (port==80) { printf("Port 80 (HTTP)\n"); }
else if (port==98) { printf("Port 98 (LINUXCONF)\n"); }
else if (port==107) { printf("Port 107 (RTELNET)\n"); }
else if (port==109) { printf("Port 109 (POP2)\n"); }
else if (port==110) { printf("Port 110 (POP3)\n"); }
else if (port==111) { printf("Port 111 (RPC 4.0
PortMapper)\n"); }
else if (port==113) { printf("Port 113 (AUTH authentication
tap ident)\n"); }
else if (port==123) { printf("Port 123 (TIME)\n"); }
else if (port==137) { printf("Port 137 (NETBIOS Name
Service)\n"); }
else if (port==138) { printf("Port 138 (NETBIOS Datagram
Service)\n"); }
else if (port==139) { printf("Port 139 (NETBIOS Session
Service)\n"); }
else if (port==213) { printf("Port 213 (IPX)\n"); }
else if (port==443) { printf("Port 443 (HTTPS)\n"); }
else if (port==512) { printf("Port 512 (EXEC)\n"); }
else if (port==513) { printf("Port 513 (LOGIN)\n"); }
else if (port==514) { printf("Port 514 (SHELL)\n"); }
else if (port==515) { printf("Port 515 (PRINTER)\n"); }
else if (port==530) { printf("Port 530 (RPC)\n"); }
else if (port==543) { printf("Port 543
(KLOGIN)\n"); }
else if (port==544) { printf("Port 544 (KSHELL)\n"); }
else if (port==1080) { printf("Port 1080 (SOCKS)\n"); }
else if (port==6000) { printf("Port 6000 (XWINDOW)\n");
}
else if (port==6660) { printf("Port 6660 (IRCD)\n"); }
else if (port==6661) { printf("Port 6661 (IRCD)\n"); }
else if (port==6662) { printf("Port 6662 (IRCD)\n"); }
else if (port==6663) { printf("Port 6663 (IRCD)\n"); }
else if (port==6664) { printf("Port 6664 (IRCD)\n"); }
else if (port==6665) { printf("Port 6665 (IRCD)\n"); }
else if (port==6666) { printf("Port 6666 (IRCD)\n"); }
else if (port==6667) { printf("Port 6667 (IRCD)\n"); }
else if (port==6668) { printf("Port 6668 (IRCD)\n"); }
else if (port==6669) { printf("Port 6669 (IRCD)\n"); }
else printf("Port %d (????)\n", port);
}
printf("\nOki boss... ;)\n");
exit(0);
}
--------------------------------------------------------------------------------------------------
Pour tout
commentaires : #hackerstorm en UNDERNET ou sur SBOUB666@hotmail.com
Dans
le prochain mag, un bot complet en C. Un programme de chat. Et peut-etre les
RAW SOCKET.........