Bonjour,
Dans un précèdent sujet, j'avais mis en oeuvre un moyen de contournement de pare-feu par injection de processus. Dans cet exemple, il s'agissait de mettre en écoute un serveur UDP en se faisant passer pour Firefox de sorte que Windows n'émette aucun avertissement. Parmi les problèmes soulevés par une telle technique "d'infiltration", il y avait évidemment le fait qu'ouvrir un port sur un PC ne permet pas de l'atteindre depuis internet. Il faut encore passer le routeur ou la box, c'est-à-dire rediriger le port qui va bien vers la machine en question.
J'avais écrit à ce propos que ce n'est pas impossible. Je pensais bien évidemment à l'Universal Plug and Play (UPnP), car c'est justement ce qu'il permet, entre autres choses. Un programme quelconque peut en effet, sans droit particulier, y-compris sous système UN*X, ouvrir un port TCP ou UDP sur la passerelle et le rediriger vers la machine hôte. Ce n'est pas un cauchemar, c'est juste la réalité. Toutes les box du marché ont l'UPnP activé par défaut.
J'y suis donc allé de mon propre code, le but étant de comprendre le mieux possible comment tout cela fonctionne (car il existe quelques utilitaires très efficaces dans ce domaine comme nous verrons plus loin, mon programme n'apporte rien de nouveau). Commençons par voir les fonctionnalités essentielles d'un tel logiciel :
Pour le moment nous allons voir les commandes add, del et list.
Avec add, on peut, par exemple, rediriger le port TCP 8000 vers TCP 8000 de la machine hôte (192.168.1.9)
Avec list, on peut vérifier que la redirection a bien été enregistrée :
Avec urpu del tcp 8000, on efface cette redirection.
Règles d'utilisation d'UPnP pour la redirection de port
UPnP intègre des règles d'utilisation dont certaines sont qualifiées de "règles de sécurité" :
Dans un précèdent sujet, j'avais mis en oeuvre un moyen de contournement de pare-feu par injection de processus. Dans cet exemple, il s'agissait de mettre en écoute un serveur UDP en se faisant passer pour Firefox de sorte que Windows n'émette aucun avertissement. Parmi les problèmes soulevés par une telle technique "d'infiltration", il y avait évidemment le fait qu'ouvrir un port sur un PC ne permet pas de l'atteindre depuis internet. Il faut encore passer le routeur ou la box, c'est-à-dire rediriger le port qui va bien vers la machine en question.
J'avais écrit à ce propos que ce n'est pas impossible. Je pensais bien évidemment à l'Universal Plug and Play (UPnP), car c'est justement ce qu'il permet, entre autres choses. Un programme quelconque peut en effet, sans droit particulier, y-compris sous système UN*X, ouvrir un port TCP ou UDP sur la passerelle et le rediriger vers la machine hôte. Ce n'est pas un cauchemar, c'est juste la réalité. Toutes les box du marché ont l'UPnP activé par défaut.
J'y suis donc allé de mon propre code, le but étant de comprendre le mieux possible comment tout cela fonctionne (car il existe quelques utilitaires très efficaces dans ce domaine comme nous verrons plus loin, mon programme n'apporte rien de nouveau). Commençons par voir les fonctionnalités essentielles d'un tel logiciel :
Code:
E:\Prog\Upnp>urpu Usage : urpu [-s] add {TCP ou UDP} port_externe port_interne [IP_ext] [IP_int] -> Ajoute une règle de redirection UPnP. urpu [-s] del {TCP ou UDP} port_externe [IP_ext] -> Supprime une règle de redirection UPnP. urpu [-s] list -> Liste les règles de redirection UPnP existantes. urpu [-s] show [Type] -> Montre les dispositifs détectés. Type est l'urn sans le préfixe 'urn:schemas-upnp-org:device:'. Si pas de Type : liste tous les dispositifs racines. urpu [-s] dump Fichier [Type] urpu [-s] dumpx Fichier TypeExact -> Ecrit le document XML du/des dispositif(s) dans 'Fichier'. dump : Si pas de Type, sélectionne la passerelle. dumpx : nécessite l'urn exacte, avec préfixe. -s : mode silence, aucune sortie sur la console (sauf list et show). Note : . est valide comme paramètre IP ; signifie IP laissée vide.
Avec add, on peut, par exemple, rediriger le port TCP 8000 vers TCP 8000 de la machine hôte (192.168.1.9)
Code:
E:\Prog\Upnp>urpu add tcp 8000 8000 Utilitaire de Redirection de Ports par UPnP - Initialisation de la bibliothèque COM... Ok. - Création d'un objet DeviceFinder... Ok. - Recherche d'une passerelle (demande quelques secondes)... Ok. - Obtention de l'adresse IP locale : 192.168.1.9 - Recherche du serviceId : WANIPConn1... Ok. - Exécution de AddPortMapping()... Ok.
Code:
E:\Prog\Upnp>urpu list Utilitaire de Redirection de Ports par UPnP - Initialisation de la bibliothèque COM... Ok. - Création d'un objet DeviceFinder... Ok. - Recherche d'une passerelle (demande quelques secondes)... Ok. - Recherche du serviceId : WANIPConn1... Ok. - Exécution(s) de GetGenericPortMappingEntry()... Ok. Description Proto PortExt PortInt IP interne IP externe Active ------------------------------------------------------------------------------ TCP 8000 8000 192.168.1.9 True ------------------------------------------------------------------------------
Avec urpu del tcp 8000, on efface cette redirection.
Règles d'utilisation d'UPnP pour la redirection de port
UPnP intègre des règles d'utilisation dont certaines sont qualifiées de "règles de sécurité" :
- La liste de redirection UPnP est différente de celle offerte par NAT (port forwarding). Cette dernière étant celle où il faut se connecter sur la box (en général par http ou https) et écrire manuellement la redirection de port. En conséquence, il n'est pas possible d'affecter la table NAT par UPnP ; en particulier, on ne peut pas effacer une redirection de port NAT.
- Rediriger un numéro de port inférieur à 1024 n'est pas autorisé. Ces ports sont réservés à l'utilisation de protocoles connus (well-known ports).
- Il n'est pas possible de rediriger un port sur une autre machine que celle d'où provient la commande UPnP. C'est pourquoi urpu s'efforce de déterminer l'adresse IP locale et de la mettre en place par défaut dans la redirection. Par exemple, l'IP de mon PC étant 192.168.1.9, si j'essaie de placer une redirection sur 192.168.1.10, voici la réponse de la passerelle :
Code:
E:\Prog\Upnp>;urpu add tcp 8000 8000 . 192.168.1.10 (...) - Exécution de AddPortMapping()... Erreur : 0x25E -> Action not authorized
- Toujours dans la même idée, si une redirection est créée depuis une machine donnée, seule celle-ci a le droit de l'effacer (la discrimination se fait sur la base de l'adresse IP du demandeur par rapport à l'adresse IP de redirection de la règle).
- Il est possible de rediriger un port pour une seule IP externe. Mais pour effacer cette règle, il faudra préciser cette IP externe. Par exemple, si je fais urpu add udp 7522 7522 163.172.59.161 et qu’ensuite je souhaite l’enlever :
Code:
E:\Prog\Upnp>urpu del udp 7522 (...) - Exécution de DeletePortMapping()... Erreur : 0x2CA -> NoSuchEntryInArray E:\Prog\Upnp>urpu del udp 7522 163.172.59.161 (...) - Exécution de DeletePortMapping()... Ok.
Commentaire