Oct 14 2009

Headers d'un mail.

Category: Réseau, sécuritéFaltad @ 11:32 pm

Bonjour !

Ça commence à faire un bout de temps que je n’ai rien écrit. Je vais essayer de changer un peu ça, notamment avec ce que j’ai découvert aujourd’hui.

En bref, je me suis rendu compte qu’il faut toujours vérifier les en-têtes des messages importants/bizarres que l’on reçoit.

Et ceci parce qu’il est très facile d’envoyer un message dont l’adresse de provenance est falsifié. Démonstration

Il suffit de se connecter par le biais de telnet sur un serveur smtp : (port 25 par défaut)

.-(~)-------------------------------------------------(faltad@Lily)-
`--> telnet smtp.free.fr 25
Trying 212.27.48.4...
Connected to smtp.free.fr.
Escape character is '^]'.
220 smtp2-g21.free.fr ESMTP Postfix

Une fois le lien établi, normalement, sur la plupart des smtp, il faut s’authentifier.

auth plain
503 5.5.1 Error: authentication not enabled

Mais ici, on s’aperçoit que l’authentification n’est pas activé !
Essayons alors d’envoyer un mail :

mail from: hadopi@assemblee-nationale.fr
250 2.1.0 Ok
rcpt to: mon_mail@hote.fr
250 2.1.5 Ok
data
354 End data with .
On tappe notre super message ici. Et pour finir, on
utilise un \n suivi d'un point suivi d'un autre \n.
.
250 2.0.0 Ok: queued as D492A4B1C64

Et hop, magie, le message a été envoyé !

Et maintenant, citation d’un client de messagerie normal :

From: hadopi@assemblee-nationale.fr
Sent: Wed 14/10/09 23:07
—-

On tappe notre super message ici. Et pour finir, on
utilise un \n suivi d’un point suivi d’un autre \n.

On peut par contre voir la provenance d’un tel message en regardant les headers, notamment cette ligne :
(Ou l’adresse IP de l’envoyeur ainsi que l’identité du serveur smtp utilisé sont affichés)

Received: from lgp44-4-88-160-58-65.fbx.proxad.net (lgp44-4-88-160-58-65.fbx.proxad.net [88.160.58.65])

	by smtp2-g21.free.fr (Postfix) with SMTP id 1E0C04B1E25

Mais, un novice en informatique, se fera prendre au piège, surtout s’il ne sait pas ce que sont les headers d’un mail.
C’est la porte ouverte au phishing !

Je ne parlerais pas des moyens de camouflage des “pirates” utilisables, car n’y connaissant que très peu de choses, j’aurais peur de dire des stupidités :)

En conclusion, il faut toujours vérifier les headers d’un message important/bizarre, et si cela s’avère nécessaire, se renseigner auprès de l’expéditeur si possible.

Tags: , , ,


Aug 12 2009

Botirc, mon copain

Category: C, RéseauFaltad @ 12:56 am

Cette dernière semaine m’est venu l’envie de coder un bot, pour irc, comme ça, sur un coup de tête.

Pour être honnête, je ne savais pas du tout par où commencer, mais j’avais jeté mon dévolu sur le langage C.
Puis, je suis tombé sur cette merveilleuse chose qu’est la RFC.

Donc, si on abrège cette divine documentation, pour se connecter à un serveur, il faut, outre se connecter au serveur lui même, envoyer dans un certain ordre des commandes pour s’identifier.
On se connecte :

/*
** On se connecte d'abord au serveur. Ici, c'est se.quakenet.org
*/

sock = xsocket(AF_INET, SOCK_STREAM, 0);
sin.sin_addr.s_addr = inet_addr(host);
sin.sin_family = AF_INET;
sin.sin_port = htons(6667);
if (connect(sock, (struct sockaddr *) sin, sizeof(struct sockaddr)) == -1)
{
        perror("connect()");
        exit(errno);
}

Ensuite, la RFC nous dit qu’il faut envoyer une commande NICK, suivi d’un USER.

/*
** Envoi des identifiants au serveur.
** Le NICK est de la forme suivante : "NICK :pseudo\n"
** Et le USER, lui, est : "USER nom hôte nom de serveur :pseudo\n"
** un snprintf dans un buffer alloué suffisament peut-être intéressant.
*/

snprintf(nick, SIZE_BUFFER, "NICK :%s\n", nickname);
snprintf(user, SIZE_BUFFER, "USER %s %s %s :%s\n", name, hostname, server_name, nickname);
xsend(sock, nick, strlen(nick), 0);
xsend(sock, user, strlen(user), 0);

Attention, n’oubliez pas de mettre un caractère ‘:’ avant votre pseudo, sinon le serveur ne prendra que le dernier mot.
Maintenant que nous sommes identifié, il faut juste rejoindre le channel voulu.

/*
** Un simple message du style : "JOIN CHANNEL" suffira amplement
*/

snprintf(join, SIZE_BUFFER, "JOIN %s", channel);
xsend(sock, join, strlen(join), 0);

Bon, reste plus qu’à compiler, et à tester. En surveillant le chan avec l’aide d’un client normal, on devrait pouvoir voir le bot se connecter.
Mais non, il ne se passe rien ! C’est quoi ce binz ?

Allons voir ça de plus près avec telnet : (on rentre les commandes par l’entrée standard, telnet se charge de les envoyer au serveur)

telnet irc.quakenet.org 6667
Trying 66.225.225.66...
Connected to irc.quakenet.org.
Escape character is '^]'.
NOTICE AUTH :*** Looking up your hostname
NOTICE AUTH :*** Checking Ident
NOTICE AUTH :*** Found your hostname
NOTICE AUTH :*** No ident response
NICK Faltad
PING :4085172480
USER Faltad test test faltad
JOIN #epinantes
:servercentral.il.us.quakenet.org 451 Faltad Faltad :Register first.

On voit donc, que le serveur nous demande de nous enregistrer ! Mais comment ?
Et bien en fait, il a aussi envoyé un message de ping (ici PING :4085172480).
Il faut donc lui répondre par un PONG :4085172480.
Et hop, ca marche beaucoup mieux !

Un petit dernier truc, pour envoyer un message à une personne ou à un channel, il faut utiliser la commande suivante :
Et les messages que nous envoient les autres utilisateurs arrivent sous cette forme aussi.
:4085172480

/*
** Syntaxe : "PRIVMSG CHANNEL :message\n"
** Ne pas oublier le ':'
*/

snprintf(message, SIZE_BUFFER, "PRIVMSG %s :%s\n", channel, msg);
xsend(sock, message, strlen(message), 0);

Le bot est maintenant prêt à régner sur l’IRC, il va falloir lui trouver une occupation, et ça, c’est plus dur :)
N’hésitez pas a fouiller la RFC, pour utiliser des commandes plus ciblés (du genre KICK).

Voilà, j’espère que mon premier article n’est pas trop confus, ni moche..
Merci de m’avoir lu ! À bientôt.

PS : Le chan #epinantes sur quakenet vous attends ;)