Sortie de force_bind version 0.4

Posté par  . Modéré par Jaimé Ragnagna.
Étiquettes : aucune
6
1
nov.
2010
Linux
force_bind est un outil écrit par Catali(ux) M. BOIE (catab at embedromix dot ro) sous licence GPLv3, qui permet de forcer un binaire qui ne dispose pas cette fonction, à écouter une adresse IP et un port particulier. Lorsque le binaire essaie d'écouter sur un couple adresse/port via l'appel à bind(), force_bind remplace les paramètres passés à bind(). force_bind fonctionne via la variable d'environnement LD_PRELOAD du chargeur dynamique de bibliothèques, et n'est donc efficace que sur les binaires dynamiques.

force_bind fonctionne avec IPv4 et IPv6. La syntaxe de force_bind est très simple comme le montre les exemples suivants :

1. FORCE_BIND_ADDRESS=127.0.0.1 FORCE_BIND_PORT=33 LD_PRELOAD=${LD_PRELOAD}:/usr/lib/force_bind.so un_binaire # force le bind() sur 127.0.0.1/33.

2. FORCE_BIND_ADDRESS=127.0.0.2 LD_PRELOAD=${LD_PRELOAD}:/usr/lib/force_bind.so un_binaire # force le bind() sur 127.0.0.2

NdM : un « petit » outil comprenant une soixantaine de ligne de C, avec tout le packaging pour avoir le configure/make/make install, qui peut néanmoins être bien pratique lorsque l'on tombe sur un binaire dynamique n'offrant pas d'options paramétrables pour le réseau ou écoutant trop largement sur toutes les interfaces réseau plutôt que sur une seule. À noter que cela ne marchera pas (dans la version actuelle 0.4 en tout cas) si le binaire veut écouter sur plusieurs couples adresse/port, puisqu'un seul couple FORCE_BIND_ADDRESS/FORCE_BIND_PORT est prévu.

Aller plus loin

  • # Remplacement de port

    Posté par  . Évalué à 5.

    Pour le port, ce qui serait cool plutôt ça serait de faire un remplacement, par exemple remplacer le port "80" par "8080" et "443" par "8443".
    Des conditions ça serait cool aussi, et des opérations +/- par rapport au port original:
    !(port > 1024): port+8000

    Pour l'adresse il faudrait:
    - pouvoir mapper (y compris INADDR_ANY) dans une autre IP (ou INADDR_ANY pourquoi pas)(à voir pour l'IPv6 quand même).
    - pouvoir ignorer certaines

    Mettre tout ça dans un fichier de conf qu'on choisit dans une variable d'environnement.

    (Bon après il faut voir l'utilité d'avoir un truc compliqué aussi, la quantité de programmes qui ont besoin de ça est du genre faible, mais ça peut être un outil utile quand même)
    • [^] # Re: Remplacement de port

      Posté par  . Évalué à 2.


      (Bon après il faut voir l'utilité d'avoir un truc compliqué aussi, la quantité de programmes qui ont besoin de ça est du genre faible, mais ça peut être un outil utile quand même)


      Au hasard, ntpd, boa et je doute que ce soit les seuls.
  • # Mots-clef C++ dans du code C

    Posté par  (Mastodon) . Évalué à 1.

    Dans le code (en C), une des variables est nommée "new", ce qui est totalement valide en C mais pas en C++. Du coup, un code comme celui-ci est non-compilable avec un compilateur C++. Je fais bien attention à ne jamais faire ce genre d'erreur (car pour moi, ce sont des erreurs).
    • [^] # Re: Mots-clef C++ dans du code C

      Posté par  . Évalué à 5.

      Tu sais le C et le C++ diverge sur d'autre point que les mots clef du langage.
      Donc soit du code en C soit en C++, mais pour les 2 (donc je ne voie pas pourquoi utiliser new est une erreur).
      D'ailleurs je te conseil de regarder le code du noyau linux include/linux/list.h . C'est plein de new, les dev kernel sont vraiment des incapables !!!

      Les gens qui veule compiler du code C avec un compilo C++ ne devrait s'orienter vers un autre langage ...
      • [^] # Re: Mots-clef C++ dans du code C

        Posté par  . Évalué à 2.

        Les gens qui veule compiler du code C avec un compilo C++ ne devrait s'orienter vers un autre langage ...

        Tu veux dire que les dev de gcc sont des incapables? http://gcc.gnu.org/wiki/gcc-in-cxx

        « Rappelez-vous toujours que si la Gestapo avait les moyens de vous faire parler, les politiciens ont, eux, les moyens de vous faire taire. » Coluche

        • [^] # Re: Mots-clef C++ dans du code C

          Posté par  . Évalué à 3.

          « il dit qu'il ne voit pas le rapport ! » Ce sous projet de gcc est une migration explicite du C vers le C++. En quelque sorte, ça confirme même la position de Matthieu, étant donner que les gars créent une branche spécifique pour arriver à leur fin et que le code initial ne passe pas en c++. Et si ils avaient décidé de migrer vers le C#, ça ne permettrait pas pour autant de compiler du C avec un compilo C#.

          D'ailleurs il existe des constructions en C99 intrinsèquement incompatibles avec le C++, comme les structures se terminant par un tableau de taille variable, qu'il serait impossible de dériver.
      • [^] # Re: Mots-clef C++ dans du code C

        Posté par  (Mastodon) . Évalué à 1.

        C'est vrai que les headers C ne sont jamais utilisés en C++... Ha si, il y a même des #define __cplusplus dans tout header C qui se respecte. Et mettre un champs nommé "new" dans une structure provoquera une erreur en C++. Donc je maintiens ce que je dis.
      • [^] # Re: Mots-clef C++ dans du code C

        Posté par  (site web personnel) . Évalué à 1.

        Ça ne t'es jamais arrivé d'avoir à lier une librairie C avec du C++ ?
        Ou simplement à reprendre des sources existants C pour les intégrer dans un projet plus large en C++, sans avoir le temps de tout rewrapper ?

        Et je connais beaucoup de gens qui utilisent les compilos C++ pour leur qualité sur le contrôle de type, parfois qq possibilités du C++ (ex. passage par référence), et qui ont toute mon estime pour le boulot qu'ils font.

        Bon code.
        A+

        PS. Bon, les experts de Java vont nous départager en sortant Eclipse et le refactoring de code...

        Python 3 - Apprendre à programmer dans l'écosystème Python → https://www.dunod.com/EAN/9782100809141

  • # quelques détails

    Posté par  . Évalué à 2.

    Ca ne fonctionnera pas sur un binaire setuid, pour d'évidentes raisons de sécurité.
    LD_PRELOAD permet de remplacer les appels aux bibliothèques, (pas les appels systèmes, mais comme la plupart des appels systèmes ont des wrappers...), ce qui est utile non seulement à un attaquant, mais aussi pour tracer, introduire des erreurs aléatoires (par exemple lors d'un appel à malloc), tracer l'occupation mémoire, et ce genre de choses.
  • # Et iptable

    Posté par  . Évalué à 5.

    Je signale une solution que l'on utilise fréquemment, et qui est bien plus simple a mettre en œuvre:

    iptable

    On peut altérer les paquets entrants et sortants pour modifier de nombreux paramètres; en particulier le port, l'adresse IP, l'interface utilisées... Cela permet de faire des "redirections".

    Attention, elle ne couvre pas tout à fait les mêmes cas d'usage.
  • # Existe déjà ailleurs

    Posté par  . Évalué à 4.

    Un utilitaire qui fait la même chose (chbind) existe déjà au sein d'util-vserver qui contient les binaires userland utilisés par linux-vserver. Par contre celui ci dépend du patch vserver, mais l'isolation fournie est sans doute plus "solide".

    (Pour la petite histoire, vserver, c'est principalement un chroot++ construit en enchainnés quelques petits utilitaires comme ça, typiquement pour supprimer des caps posix, reduire les ulimit etc)

    Il doit aussi y avoir des choses du même genre de disponible si on regarde du coté des demontools, de runit etc vu qu'il y a plein de petits utilitaires qui gravitent autour.
  • # 127.0.0.1/33.

    Posté par  . Évalué à 4.

    127.0.0.1/33 ça fait bizarre comme écriture, on dirait CIDR, qui du coup serait invalide :)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.