TRANSPERCE LE FIREWALL
Tu as peut-être déjà pesté devant l'écran de l'ordi de la salle info de
ton lycée ou de ta fac, en voyant pour la n-ième fois le message
"connexion impossible au serveur" de ton logiciel favori, sans savoir
quoi faire pour pouvoir enfin avoir un accès complet à internet. Hé oui, les
admins ont peur comme de la peste qu'on utilise leur réseau pour hacker un site
internet ou mettre du warez en partage sur leurs machines. La crainte des
utilisateurs locaux, que ce soient les élèves d'une école ou les employés
d'une grande entreprise, est carrément plus grande que la peur d'être hackés
par un inconnu venant d'internet ! (Et parfois, il faut bien avouer qu'ils ont
raison, oh les petits vicieux). Pour isoler le réseau local du reste du monde,
ces rusés admins ont donc inventé le firewall (mur de feu en français, of
course). Ce mot déclenche chez le pirate en herbe comme chez le vieux routard
du net un frisson d'adrénaline. Vu sur IRC: "oouuuaaais, j'ai passé deux
firewall avant d'installer mon serveur ftp wareeez..." (style "je me
la pète, je suis 3l33T). Mais j'entends d'ici la foule des lecteurs de HZV
avides de connaissance qui se demandent ce qu'est exactement cette black ice tirée
tout droit de l'univers de W. Gibson, et qui déjà veulent lui faire mordre la
poussière. LE FIREWALL DEMYSTIFIE
Mais comment la machine distante, qui possède plusieurs services (serveur web, mail, telnet...) peut-elle savoir à quel service s'adresse la connexion ? C'est là qu'interviennent les fameux ports utilisés par les protocoles UDP et TCP: il s'agit juste d'un numéro entre 0 et 65535 inséré dans le paquet. Chaque service va traiter les paquets correspondant à un numéro de port spécifique. Comme ça, pas de conflits possible ! Un paquet UDP contient en plus de l'adresse IP de l'émetteur et de celle du destinataire, le port local (de départ) et le port de destination, puis les données. Un paquet TCP contient les mêmes informations, ainsi qu'un numéro de séquence et un numéro de flags (en gros). La connexion TCP est celle qui sert à pratiquement tout sur internet, contrairement à UDP, car elle permet d'être certain que les paquets ne se sont pas perdus, grâce au numéro de séquence. L'établissement d'une connexion TCP se passe comme ceci: la machine 1 envoie un paquet TCP avec le flag SYN, la machine 2 répond par un paquet ayant les flags SYN et ACK (acknowledge), la connexion est alors établie, et un transfert de données bi-directionnel peut commencer avec des paquets ayant le flag ACK. Pour clore la connexion, un paquet ayant le flag RST (reset) suffit. (c'est bourrin, la solution propre est d'utiliser le flag FIN, mais un seul paquet ne suffira alors pas pour clore la connexion...)
Donc le firewall, pour filtrer, choisit de refuser ou d'accepter de laisser passer les paquets en fonction de leurs adresses IP de source et de destination, de leurs ports, leur type, leur taille, etc... C'est tout, simple non ?
Ca va ? Relis trois fois ces explications, prend une bonne binouze, fais bouger tes doigts de pied... C'est bon ? Alors on retourne au charbon ! Un vrai hacker c'est quelqu'un qui recherche la connaissance, pas des recettes toutes faites. Pour approfondir les méandres des protocoles n'hésite pas à consulter la seule vrai bible du hacker, à savoir les RFC, qui sont les descriptions détaillées et officielles de tous les protocoles utilisés sur internet. C'est assez austère mais si riche d'informations pour mieux détourner ces fameux protocoles ! Tu peux les trouver sur www.rfc-editor.org/rfcsearch.html. Par exemple le TCP est décrit dans le RFC 793.
ZE BIG PROBLEM
MANIPULATION DE PAQUETS
Un programme permettant de tester les ports laissés ouvert par un firewall est disponible pour linux sur
www.packetfactory.net/projects/firewalk. Le principe est d'envoyer des paquets ayant un TTL fixé (TTL = time to live = durée de vie du paquet) vers un ordinateur situé de l'autre côté du firewall. A chaque machine par laquelle le paquet passe pour atteindre sa destination, ce numéro est décrémenté. Quand il atteint 0, la machine ou le routeur renvoie le paquet à son destinataire avec un message "TTL expiré" (en fait un paquet "ICMP unreachable"). Ceci est la base du programme traceroute (tracert sous DOS), qui permet en faisant varier le TTL de un en un de recevoir des messages "TTL expiré" de tous les hosts situés entre ta machine et la machine de destination. En fixant le TTL a une valeur égale au TTL du firewall plus un, on peut donc savoir si le paquet qu'on envoie a passé le firewall puisque dans ce cas on recevra une réponse "TTL expiré" de la part d'une machine située de l'autre côté.Pour créer tes propres programmes envoyant des paquets non standard pouvant passer le firewall, tu peux utiliser la librairie libnet sous linux dispo sur
www.packetfactory.net/libnet. Il te faudra quelques notions de programmation en C, mais c'est un investissement indispensable pour tout h4cK3r qui se respecte.Bravo ! Tu as donc réussi à avoir une communication avec l'extérieur, mais d'une manière non standard qui rend impossible dans la plupart des cas la connexion à un serveur quelconque du net. Il te faudra alors disposer d'une machine à l'extérieur du réseau local sur laquelle va tourner un programme capable de gérer ces connexions un peu zarbis, et va éventuellement servir de relais pour retransmettre la connexion vers d'autres serveurs. L'intérêt de ces techniques par rapport à celles que je vais te confier dans un instant, c'est qu'elles ne passent pas par un proxy, donc qu'il y a des chances que le traffic soit moins loggué et donc moins remarqué par l'admin. Elles peuvent en plus fonctionner dans le sens ext -> int, donc ouvrir la voie à une pénétration dans un réseau sécurisé.
TROP FACILE
client IRC -> nom_machine:10000 -> serveur.irc.fr:6667
Leapfrog est un de ces progz faisant office de relai, il tourne sous win* et unix (
www.cotse.com/CotseLabs/leapfrog/leapfrog.htm). Ou encore RelayTCP sur www.dlcsistemas.com/html/relay_tcp.html. Un moyen simple de créer un relai discret si tu ne veux (ou ne peux) pas exécuter ce type de programme sur la machine, est d'utiliser le tunneling ssh. Il faut pour cela que ssh (ou ssf) soit installé. La commande magique sous unix est:ssh -l <ton_login> -g -L 10000:serveur.irc.fr:6667 <nom_machine>
La syntaxe peut différer un peu suivant les versions, faire "ssh --help" ou "man ssh".
Tu peux aussi lancer un proxy socks (qui écoute sur le port 1080, voir RFC 1928), qui permet d'utiliser pas mal de programmes supportant ce type de proxies. Le principe du proxy socks est le même que celui du relai, à ceci près que c'est le programme qui dit lors de la connexion avec le proxy vers quelle machine et quel port il veut que la communication soit établie. Il est donc plus universel que le simple relai, mais aussi plus facilement repérable.
LE TUNNELING, L'ARME FATALE
Netscape sur ta machine -> proxy:8080 -> serveur web:80
Il existe aussi les proxies ftp, et les proxies socks dont j'ai déjà parlé (mais si l'admin a installé un proxy socks il a aussi réduit la liste des machines et des ports autorisés, ou alors c'est un charlot).
Le tunneling est la transmission d'informations à travers un protocole fait pour autre chose. Par exemple on peut créer un tunnel ICMP qui va transmettre des informations en les incluant dans des paquets ICMP, généralement réservés au ping et donc moins bien filtrés ou loggués que les paquets TCP. Pour cela il faut utiliser un programme sur la machine locale qui va écouter sur un port, accepter une connexion TCP, la retransmettre en incluant les données dans des paquets ICMP envoyés à travers le firewall, vers une machine à l'extérieur qui va lire les paquets ICMP et recréer la connexion TCP vers le serveur voulu. A voir sur www.detached.net/icmptunnel. Il existe aussi le tunneling ftp, ou même mail (www.detached.net/mailtunnel: l'arme ultime dans un RZO hyper sécu, mais très lent, les paquets étant envoyés par e-mail !). Mais le plus intéressant pour nous est le tunneling http, puisque pratiquement tous les réseaux permettent une connexion avec la protocole http vers les serveurs web d'internet, en passant par un proxy. Le principe est le même que celui du tunnel ICMP, à part que cette fois-ci les paquets sont aussi de type TCP et doivent impérativement passer par le proxy.
Client IRC sur ta machine -> localhost:10000 -> proxy:8080 -> machine_relai:80 -> serveur.irc.fr:6667
Utilise httptunnel pour linux sur www.nocrew.org/software/httptunnel.html, ou fonce sur www.htthost.com, www.totalrc.net, ou http-tunnel.com qui fournissent tout clé en main, SOUS WIN$, et MEME la machine relai ! (ouf se disent certains !) Avec le programme SocksCap, cela permet d'utiliser à peu près tout prog réseau: cet utilitaire va intercepter les paquets TCP et UDP émis par les programmes, et les faire passer par un proxy socks. Ce proxy socks peut être en fait sur ta propre machine, et rediriger les connexions par le tunneling http... Last but not least, si tu as une machine à toi sous linux de l'autre côté du firewall (j'ai bien dit "à toi"...) tu peux mettre en place par tunneling (avec httptunnel par exemple) un VPN (réseau privé virtuel) utilisant par exemple un tunnel PPP (point-to-point, utilisé pour te connecter par modem à internet). Cela permet d'avoir un accès à tous les ports de toutes les machines d'internet sans restriction et de manière transparente (un peu comme avec SocksCap sous windaube, mais plus puissant), mais il te faudra maîtriser la configuration des règles de routage et de pppd. Un petit manuel très bien fait est disponible sur www.linux.com/howto/mini/Firewall-Piercing.html, ou encore vtun.sourceforge.net.
Prog réseau ---SocksCap--> localhost:1080 -> localhost:10000 ->
proxy:8080 -> machine_relai:80 -> machine_destination:port
Ca fait pas mal de relais tout ça, j'ose pas imaginer la vitesse de la connexion ! ;-)
C'EST NOEL
Enfin, en exclusivité, voilà une technique peu connue et ultra efficace. Peu d'admins se rendent comptent de la portée que peut avoir le fait d'autoriser le http sécurisé via le proxy (RFC 2819). Il permet en effet d'ouvrir des connexions TCP DIRECTES vers l'extérieur avec "CONNECT serveur:port HTTP/1.0" !!! Et ceci avec l'IP du proxy ! Donc plus besoin de tunneling et autres joyeusetés... Tu peux faire un programme qui va écouter sur un port, attendre une connexion, et alors faire un telnet sur le proxy, et demander à se connecter sur la machine et le port voulus. Et comme je suis vraiment de bonne humeur, ce programme, je l'ai fait pour toi:
www.chez.com/fwpass/ProxyPass.zip. C'est en java donc ça marche sur tous les OS, je fournis les sources donc tu peux t'amuser à le modifier pour en faire un scanner de ports. Au fait, si les ports autorisés sont restreints il faudra mettre un relai sur une machine à l'extérieur qui écoutera sur un port https (465 par exemple) et retransmettra vers le serveur et le port voulu. Ceci permet de passer la sécurité de nombreux réseaux de manière simple, puisque le http sécurisé est de plus en plus répandu (sites bancaires, paiement par carte bleue) et que la connexion https est cryptée, le proxy ne peut donc pas analyser le trafic pour différencier un usage normal d'une connexion moins innocente.Exemple: connexion en telnet sur une machine extérieure:
www.rien.com:23 HTTP/1.0[mylogin@myhost HZV]$ telnet myproxy 8080
Trying 208.120.148.25...
Connected to myproxy.
Escape character is '^]'.
CONNECT
Pour les déçus qui voulaient un tutoriel permettant d'aller dans l'autre sens, c'est-à-dire de pénétrer depuis internet dans un réseau protégé par un firewall, qu'ils relisent attentivement depuis le début (dur, dur !): beaucoup de ces techniques sont applicables dans l'autre sens... Par exemple, il faut savoir que certains proxies mal configurés fonctionnent dans les deux sens, il est donc possible de pénétrer dans le réseau interne via le proxy ! Bien sûr il aura fallu auparavant faire un scan pour détecter les proxies (port 8080 ouvert = un proxy http le plus souvent). Si le proxy fait le https, c'est gagné. Sinon, si rien ne marche, il faudra arriver à envoyer un trojan sur une machine interne au réseau. Ce trojan, que tu pourras faire toi-même grâce aux explications de Hackerz Voice n°4 et en fonction de la configuration de ton réseau, aura pour but de se connecter à intervalles réguliers à une machine à toi située sur internet, en appliquant la technique du tunneling http (ou une autre, si tu préfères). A partir de la, une connexion est initialisée entre ta machine à l'extérieur et la machine du réseau soi-disant sécurisé. Tu as alors accès à tout le réseau interne, en utilisant des fonctions que tu auras implémentées dans ton troyen (connexion en telnet sur un port, scan, snif, copie de fichiers...). Pour créer une backdoor permettant le contrôle distant d'un système protégé par un firewall, tu peux t'inspirer de
www.thehackerschoice.com/papers/fw-backd.htm. Le source (rwwwshell-1.6.perl) est disponible via une recherche sur packetstorm.securify.com.Alors, heureux ? Avec ces techniques avancées aucun firewall ne pourra plus te résister, attention cependant de toujours obtenir l'accord de ton administrateur réseau avant de les utiliser. (c'était même pas besoin de le dire n'est-ce pas ?! #;-} )
FozZy