2 - IRC, les échanges de données et comment devenir OP
Les servers IRC utilisent le protocole TCP avec un système assez sécurisé.
La seule faille dans IRC(internet relay chat) est le split qui permet notamment de faire des Take-over(prise de channels).
Pour ceux qui ne connaissent par le système d'IRC: IRC est un système de discussion qui permet de parler
à plusieurs sur des channels ou à 2 en privée. Les channels sont administrés par les opérateurs qui ont un @
devant leur nick. Ils peuvent kicker(faire quitter du channel), banner(interdire l'accès au channel),
oper (faire un simple user opérateur), déoper (faire un opérateur simple user), changer les modes du channel,
le topic(titre du channel), voicer(donner la parole à des personnes si le channel est en modérate
(seul les opérateurs et les voicé peuvent parler)),...Vous pouvez quitter des channels, joindre un channel
si vous y êtes authorisé(channel non plein, non en invite only, clé correcte(s'il faut en fournir une),
vous n'êtes pas banné).
Pour changer les modes du channel ou encore changer l'attribut d'un user, votre client(programme que
vous utilisez pour vous connecter à un server IRC) doit envoyer des datas spécifiques.
Pour joindre un channel, votre client envoi la data: "JOIN :" + channel ex: "JOIN :#HackerStorm"
Le server renvoye à toutes les personnes qui sont sur le channel ainsi qu'à celui qui veut le quitter la Data:
":" + ident + " JOIN :" + channel ex: ":hacker!storm@127.0.0.1 JOIN :#HackerStorm"
Tableau des différentes commandes envoyées par le client et par le server :
--------------------------------------------------------------------------------------------------------------------------------------------------------
- Action - Client -Le server renvoye(C=channel,U=user)-
--------------------------------------------------------------------------------------------------------------------------------------------------------
- Joindre un channel - "JOIN :"+channel - ":"+ident+" JOIN :"+channel (C)-
--------------------------------------------------------------------------------------------------------------------------------------------------------
- Quitter un channel - "PART :"+channel - ":"+ident+" PART :"+channel (C)-
--------------------------------------------------------------------------------------------------------------------------------------------------------
- Changer de nick - "NICK :"+nouveau nick - ":"+ident+" NICK :"+new nick (C)-
- - - Ou si votre le nick est déjà utilisé : -
- - - ":"+msg d'erreur de nick(U) -
--------------------------------------------------------------------------------------------------------------------------------------------------------
- Kicker une personne - "KICK "+channel+" :"+nick - ":"+ident+" KICK "+channel+" :" -
- - - +nick (C)-
--------------------------------------------------------------------------------------------------------------------------------------------------------
- Changer un mode sur un channel - "MODE "+channel+" "+mode+" " - ":"+ident+" MODE "+channel+" " -
- - +divers(en fonction du mode) - +mode+" "+divers (C)-
--------------------------------------------------------------------------------------------------------------------------------------------------------
- Changer le topic - "TOPIC "+channel+" "+topic - ":"+ident+" TOPIC "+channel+" " -
- - - +nouveau topic (C) -
--------------------------------------------------------------------------------------------------------------------------------------------------------
- Test si le client est toujours online - "PING :"+server ou nick - "PONG :"+server ou nick (U)-
- Est envoyé par le server si le client - "PONG :"+server ou nick - "PING :"+server ou nick (U)-
- n'envoi pas de données durant - - -
- un temps défini. Les autres clients - Ping est la requète - Et pong est la réponse -
- peuvent aussi faire un CTCP ping - - -
--------------------------------------------------------------------------------------------------------------------------------------------------------
- Parler sur un channel ou en query - "PRIVMSG "+channel ou nick+ " :" -":"+ident+" PRIVMSG "+chan/nick -
- - +message texte -+ " :"+message (U(nick),C(channel))-
--------------------------------------------------------------------------------------------------------------------------------------------------------
Il y a d'autres commandes comme celle-ci qui existent mais qui sont moins utilisées ou moins
importantes pour le bon fonctionnement du server(comme WHOIS,...). Certains servers ont
leurs propre commandes. Les commandes doivent dabord être reconnu par le server et une
fois reconnu, elles sont renvoyé vers toutes les personnes d'un channel ou un user
(en fonction du type de commande) avec (pour un soucis d'identification) ":"+ident+" "
devant la même commande (sauf pour le PING - PONG). Après connaitre les données échangées
entre le client et le server, il faut comprendre comment le server gère tous les utilisateurs et
recherche une éventuelle erreur.
Voici un schéma qui montre les différentes étapes que fait le server dès la connection d'un client :
--------------------------------------------------------------------------------------------------------------------------------
- "User " + nom + " \""+ident(IP ou DNS)+"\" \"" +le nom de l'host(nom du server)+ "\" :"+mail -
- "NICK " + nick -
- Il test si vous avez plus de 3 connections avec cette IP ou DNS. -
- Si oui, il vous déconnecte avec un message d'erreur. -
- Il créé ensuite deux variable texte avec les données fournies et vos données de connections: -
- 1-Votre ident IRC -> nick+"!"+nom+"@"+ident(si non valide,il prend votre IP ou votre mask) -
- 2-Votre mail pour les whois -> mail -
- Deux variables listes associées à votre ident IRC sont aussi créées : -
- 1-La liste des channels ou vous êtes(ex: liste[1]="HackerStorm", liste[2]="France",..) -
- 2-Les modes que vous avez sur les différents channels(User=0,Voice=1,Op=2,Op+Voice=3,..) -
- Ces deux listes sont mise à 0 lors de votre connection. -
- -
--------------------------------------------------------------------------------------------------------------------------------
- Il vous envoye les informations du server(infos pour vous->les admins,nouveautées,...) -
--------------------------------------------------------------------------------------------------------------------------------
- Il fait une boucle qui attend vos commandes. -
- Si vous joignez un chanel ou il n'y a personne, vous devez opérateur du channel. -
- Si vous restez inactif pendant un moment prévu par l'admin du server, -
- il vous envoye un PING. Si vous ne répondez pas, -
- il fait un ping timeout et vous déconnecte. -
--------------------------------------------------------------------------------------------------------------------------------
Le server passe à l'étape suivante que si celle qu'il vient de faire est valide.
Sinon il retourne un message d'erreur et reste en attente d'infos ou vous déconnecte.
Voilà, j'espère que vous avez compris se qu'il se passe au niveau des transferts et
des identifications clients/servers. Je vais maintenant vous expliquer se qu'il se passe
au niveau des servers/servers.
Voici un schéma exemple illustrant les connections servers/servers :
-------------------- --------------------
- Sous-server - - Sous-server - Sous-servers secondaires
-------------------- --------------------
\ /
-------------------- --------------------
- Sous-server - - Sous-server - Sous-servers primaires
-------------------- --------------------
| |
------------ ------------ ------------
- Server - <----> - Server - <----> - Server -
------------ ------------ ------------
|\ / |\ / |
| \ / | \ / |
| \ / | \ / | Servers principaux interconnectés
| /\ | /\ |
| / \ | / \ |
| / \ | / \ |
------------ ------------ ------------
- Server - <----> - Server - <----> - Server -
------------ ------------ ------------
| |
-------------------- --------------------
- Sous-server - - Sous-server - Sous-servers primaires
-------------------- --------------------
/ \
-------------------- -------------------- --------------------
- Sous-server - <----> - Sous-server - - Sous-server - Sous-servers secondaires
-------------------- -------------------- --------------------
Vous pouvez voir dans ce schéma, qu'il y a une hyèrarchie dans les servers.
Si un servers ou un sous-server déconnecte, tous ses sous-servers déconnecte
aussi de leur server parent. Le même principe s'opère pour les servers principaux
sauf que eux déconnectent du réseau principale. C'est ce que nous appellons un split.
Durant un split, seul les personnes étant sur le server qui split ou un de ses
sous-servers sont visibles dans la liste des users connectés. De nombreuses
personnes utilisent ce moyen pour prendre l'op sur des channels.
C'est ce que nous appellons des Take-Over(prise de pouvoir).
Après ces explications, il vous est facile de comprendre comment. Prenons un exemple.
Vous voulez TO(abréviation de Take-Over) #channel. Tous les users qui sont sur
ce channel sont sur des servers différents du votre(sur une branche différente).
Vous attendez que votre server ou un de ses servers parent split pour que vous
soyez seul sur #channel. Dès que vous êtes seul, vous quittez #channel et revenez.
Vous êtes donc OP. Lorsque le server qui a splité se reconnecte, vous serez OP
sur le channel car le server vous OP. Mais attention, sur les gros servers, il y a
une variable liste dans laquelle sont mis les channels qui sont temporairement
non libre("Channel "+channel+" temporary unavailable") qui permet une meilleur
protection contre les TO. En effet, lorsque des users quittent un channel à cause
d'un server qui split, le nom du channel est automatiquement ajouté à cette liste.
Lorsque le dernier user quitte le channel, plus personne ne peut le joindre.
Le server vous envoi le message "Channel #channel temporary unavailable".
Vous devrez attendre la fin du split pour pouvoir retourner sur le channel.
Cette technique est très connue et il n'y a pas besoin d'avoir de grosses
connaissances en piratage pour la faire.
Nous allons maintenant étudier comment toutes ces sécurités peuvent être
contournées par un moyen très simple. Vous savez que le server regarde
l'IP source de l'user qui exécute la commande. Lorsque la synthaxe de la
commande est correcte et que l'user qui a l' IP source a les droits appropriés
pour exécuter cette commande, le server exécute la commande.
Le seul moyen est donc de changer son IP source.
Ceci peut se faire avec n'importe quel OS dans lequel l'entête des paquets
n'est pas bloqué (ex: aucun accès entête avec winsock mais vous avez
l'accès à l'entête des paquets sous Linux grâce à la programmation RAW socket).
Le seul problème est que les servers IRC fonctionnent en TCP et que donc,
vous devez vous procurer les clés ISN et ACK pour que le server vous
authentifie comme étant la personne qui devrait être l'auteur de ce paquet.
Pour cela vous pouvez soit sniffer la vrai personne, la bloquer , calculer
les nouvelle clés et les renvoyer(Hunt ou Circ font toute la manipe)
soit envoyer des paquets qui ont une clé ISN et ACK calculé et incrémenté
à chaque packet. Vous devez mettre comme data la fonction que vous
voulez faire exécuter par la personne.
Voilà, je pense que ce cours sur IRC est assez complet.
Si toutefois vous avez des questions, n'hésitez pas -> HackerStorm@HotMail.Com