Articles
Source : NoFutur, Noway, NoRoute, Jokers, Hacker2020, Phrack, libertad, lotfree, Wikipédia, etc..
Retour à la liste des articles

Transperce le firewall de ton réseau

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
Un firewall est basiquement un système installé à l'interface entre un réseau local et internet qui va empêcher certaines connexions entre les deux, en suivant des règles établies par l'admin. Par exemple, cas le plus courant, il peut empêcher toutes les connexions directes dans le sens extérieur (internet) -> intérieur (réseau local), mais autoriser certaines connexions intérieur -> extérieur pour permettre l'accès au web ou à d'autres services. Un firewall peut être une machine dédiée, par qui passe le trafic et qui fait du filtrage de paquets, ou un routeur configuré pour ne pas transmettre certains types de paquets. Il est facile de trouver des firewalls "personnels" tournant sous windows ou linux. Leur fonction de filtrage permet en particulier de stopper les paquets mal formatés visant à nuker ou flooder une machine, j'en parlerai plus en détail dans un autre numéro. Mais qu'est-ce qu'un paquet et comment le firewall peut-il savoir quoi stopper et quoi laisser passer ? Facile: toutes les données transportées sur internet le sont par le protocole IP (Internet Protocol) qui va les diviser en paquets plus petits qui pourront être acheminés indépendamment vers la machine de destination, identifiée par son adresse IP. Celle-ci réassemble les paquets pour reconstituer le message initial. Il y a différents types de paquets, correspondant à des protocoles de transmission différents, par exemple les paquets ICMP (envoyés par la commende ping ou tracert/traceroute, pour savoir si un ordi est allumé), IPX (très utilisé pour les jeux en réseau), mais surtout UDP et TCP qui permettent une communication évoluée entre deux machines.

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
Là où ça coince c'est que très souvent les admins ont peur des abus et n'ouvrent que les ports correspondant au web ou au mail, impossible donc d'utiliser Napster, telnet ou IRC qui correspondent à d'autres ports ! (port 6667 pour IRC, 23 pour telnet) L'utilisateur moyen est donc floué sans raison valable, et le hacker aussi puisque s'il ne peut pas se connecter en telnet sur des machines d'internet son champ d'action sera très limité. Heureusement, à partir du moment où tu as un accès à internet, quelque soit son degré de restriction, il reste possible d'accéder à tout internet, oui j'ai bien dit TOUT ! Voici enfin dévoilées les techniques utilisées par les initiés de par le net.

MANIPULATION DE PAQUETS
Le point important est que l'on peut forger ses propres paquets soi-même, avec un programme adapté. Il est ainsi possible de tromper le firewall en lui faisant croire que le paquet vient d'une autre adresse IP, située de l'autre côté du firewall. Ou bien, pour se connecter de l'extérieur vers l'intérieur, n'utiliser que des paquets de flag ACK, ce qui fait croire au firewall que ce paquet provient d'une connexion déjà initiée et donc autorisée. Prog dispo sur www.ntsecurity.nu/toolbox/ackcmd. Tu peux aussi pour cela changer le port source des paquets: ainsi si celui-ci est le port 80 (port du web), le firewall pensera que ce paquet est une réponse à une connexion déjà initiée avec un serveur web et laisser entrer le paquet dans le réseau local. De plus, certains firewall (très) mal configurés laissent passer tous les ports supérieurs à une certaine valeur (1024 ou plus). Certains types de paquets (autres que TCP) pourront aussi passer, ce qui permet du tunneling (tunneling ICMP: voir plus loin). Si le firewall laisse passer les connexions TCP mais pas UDP, cela empêche d'utiliser les jeux réseaux et ICQ par ex, tu peux alors utiliser le programme TUT fourni sur http://home.ctc.shadowlan.net/~vinny/projects/proxy/ qui va faire passer les paquets UDP à travers une connexion TCP (tunneling). Enfin, si rien de tout cela ne marche, il faut se renseigner sur le type de firewall et chercher ses failles spécifiques, par exemple certains peuvent laisser passer des paquets d'une taille très petite (8 octets).

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
Parfois, cas rare mais qui peut se produire (petit chanceux !), tu as un accès par telnet à une machine du réseau local ayant un accès direct et complet à internet. Elle peut être le firewall lui-même. Alors tu vas pouvoir lancer un programme sur cette machine qui va attendre une connexion sur le port 10000 par ex, et la rediriger vers la machine sur internet à laquelle tu veux te connecter. Il s'agit donc d'un relai. Par exmple pour utiliser IRC, configure ton client IRC pour qu'il se connecte sur cette machine sur le port 10000, et configure ton relai pour qu'il transmette vers le serveur IRC sur le port 6667.

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
Je vais vous exposer la méthode ultime pour accéder à tout internet quand aucun paquet ne peut entrer ni sortir du réseau local. Dans ce cas l'accès à internet est hyper restreint, et très contrôlé, puisque les seuls programmes utilisables sont ceux qui vont pouvoir passer par des machines spécifiques appelées proxies, servant de relai entre le réseau local et internet. Par exemple les proxies http qui écoutent sur le port 8080 le plus souvent, et permettent uniquement l'accès aux serveurs web sur le port 80, avec le protocole http. Impossible d'initier une connexion TCP directe ! Pour avoir une page web il faut passer au proxy la commande "GET http://le.serveur.fr HTTP/1.0". Pour tester ces commandes (données dans le RFC 2616) , fais "telnet nom_du_proxy 8080" puis tapes tes commandes suivies de deux retours chariot.

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
Si le proxy accepte d'initier des connexions http vers d'autres ports, la machine relai peut écouter sur autre chose que 80 (utile si elle possède deja un serveur web ou que tu n'as pas le root, donc que tu ne peux pas lancer des programmes qui écoutent sur un port inférieur à 1024). Pour les mecs courageux qui ont suivi jusqu'ici, voici un petit cadeau bonus: tu peux ainsi scanner des machines à travers un proxy, donc anonymement avec l'IP du proxy ! La commande est "GET http://machine.a.scanner:port HTTP/1.0" + 2 entrées. Tu sauras ainsi si la machine à scanner possède un service écoutant sur le port demandé, et quel est ce service ! Utile pour les crackers pour avoir des infos sur une machine et pouvoir tenter de la pirater en exploitant les failles de certaines versions des services (on appelle justement cela un "exploit"), sans être repérés...

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:

[mylogin@myhost HZV]$ telnet myproxy 8080
Trying 208.120.148.25...
Connected to myproxy.
Escape character is '^]'.
CONNECT
www.rien.com:23 HTTP/1.0
HTTP/1.0 200 Connection established
Virtual FreeBSD (rien.com) (ttyp5)
login:

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 

Livre:

WatchFire


Vidéo:
Cours Sécurité:
  • Définitions Niveau : Débutant (Français)
    tout les mots que vous voulez savoir mais que vous n'osez demander.
  • Histoire Niveau : Débutant (Français)
    un peu d'histoire pour ceux qui aiment
  • Cours Metasploit Niveau : Intermediaire (Français)
    Le Framework Metasploit est un environnement complet pour écrire, tester et utiliser des exploits. Cet environnement fournit une plateforme solide pour les tests d'intrusion, le développement de shellcodes, et la recherche de vulnérabilités. La majorité du Framework est composée de code orienté objet Perl, avec des composants optionnels écrits en C, assembleur, et Python.
  • hackers_guide Niveau : Avancé (Anglais)
    Se placer du point de vue de l'attaquant pour améliorer sa propre sécurité. - Telecharger le rar: hackers_guide.rar
  • Reseaux de neuronnes Niveau : Avancé (Français)
    Les objectifs, l'histoire, les applications. Le modèle d'un neurone, fonction de transfert, architecture de réseau. Les outils mathématiques : algère linéaire, espace vectoriel, produit scalair, norme, orthogonalité, transformation linéaire. Les apprentissages : supervisé, non-supervisé et autres. Le perceptron multicouches, les nuées dynamiques (K-means, fuzzy k-means...). Les réseaux de Kohonen. Reseaux GNG, Architecture ART. ACP et apprentissage hebbien. - Telecharger le zip: RNF
  • Crackage et durcissement de mots de passesNiveau : Débutant (Français)
  • Securiser un forum PhpBBNiveau : intermediaire (Français)
Tutoriaux
Tutoriaux Failles Web
Divers