Post original

Voici le post qui a tout lancé. Même s’il n’est plus totalement à jour, il est repris ici dans sa forme originelle.

Disclaimer

J’aimerais prévenir d’avance que ce post ne va certainement pas faire plaisir à tout le monde. Je précise à l’attention des néophytes que je ne suis en rien un guru de l’info, et que toutes les techniques décrites ici sont à la portée de n’importe quel programmeur.

Le logiciel fourni plus bas nécessite une recompilation pour chaque modification de paramètre (nom de la Miniville à traiter par exemple), ce qui présuppose tout de même une connaissance de l’environnement de programmation Eclipse. Libre à ceux qui le souhaitent de modifier le programme pour le rendre utilisable par n’importe quel utilisateur lamba (rajout d’un front-end ou d’un fichier de paramétrage par exemple). Pour ma part, je m’en tiendrai à cette version élitiste. Je manque de temps pour aller plus loin. Désolé pour les autres… (Finalement, j’ai eu le temps de le rendre un peu plus accessible…)

Tout a commencé la semaine dernière, lorsque qu’un de mes potes m’a montré Miniville. J’ai assez aimé le principe pour décider de monter ma propre ville. Mais je me suis vite rendu compte que certaines villes (eurobarville, Georgio’s, koreus, Mortecouille, etc.) ne jouaient pas avec les mêmes armes que moi, et qu’il me serait difficile voir impossible de rivaliser avec elles. Je me suis donc mis en tête de creuser le problème pour voir si je ne pouvais pas améliorer grandement la progression de mon petit village…

Alors que certains construisaient leurs villes depuis plusieurs semaines, il m’a suffit de deux jours pour faire de ma ville la capitale de ma région. De même, j’ai réussi à envoyer plusieurs gros missiles en quelques heures seulement ! Certains vont crier à la triche, et ils auront raison. Mais où commence la triche ?

Peut-on considérer que les plus grosses villes de Miniville ne trichent pas ? Elles usent de techniques qui ne sont pas à la portée du plus grand nombre. Donc l’équilibre des forces est fortement biaisé, et la balance penche largement à leur avantage.

De même, l’utilisation de ce forum pour améliorer de manière artificielle (car basée sur l’échange de clicks) sa ville pourrait être considérée par certains comme de la triche.

Tout le problème réside dans le fait que Miniville ne possède aucun règlement. Et tout jeu sans règle ne peut, par définition, être violé.

Fort de ce constat, je pars donc du principe que la technique que je propose est juste une technique parmi tant d’autres, et qu’elle doit être considérée comme telle.

Si certains ne sont pas content, et comme le dirait certainement mon grand-père : go fuck yourself ! ^^

Maintenant que les choses sont claires, poursuivons…

Comment fonctionne Miniville.fr et Antiville.fr ?

Très simplement :
- Ces sites comptent les hits en provenance d’IP différentes.
- Le compteur est réinitialisé tous les jours à minuit.
- Une IP ne peut visiter qu’une seule URL par jour (habitant OU transport OU securité OU etc.).

De ce fait, le site interdit à un utilisateur unique d’améliorer indéfiniment sa Miniville.

IP Spoofing

Comment dans ce cas simuler des hits en provenance d’IP différentes ?

Si l’on veut spoofer un site Internet, il est presque indispensable de disposer d’un sniffer sur le réseau interne du site en question. Pourquoi ? Car l’établissement d’une connexion TCP s’effectue en 3 étapes :

1. Le client envoie une requête SYN au serveur en précisant son IP

Client ---SYN--> Server

2. Le serveur renvoie une requête SYN/ACK en indiquant un numéro de séquence

Client < --SYN/ACK--- Server

Or, si le client modifie son IP à l’étape 1 pour faire croire qu’une autre IP essaye de visiter le site, le serveur, à l’étape 2, va renvoyer un numéro de séquence à l’IP indiquée en 1. Le client ne recevra donc jamais le numéro de séquence et ne pourra finaliser l’établissement de la connexion.

Il y a bien longtemps, les numéros de séquence étaient séquentiels, il était donc assez simple de deviner le numéro de séquence suivant, et de réussir à établir une connexion en spoofant le site. Mais les éditeurs d’OS ont réagi assez vite à ce problème, et les numéros de séquence ne se suivent plus. Deviner le numéro généré à l’étape 2 est devenu quasi mission impossible sur les OS récents. C’est pourquoi, pour pouvoir intercepter la trame de la seconde étape, il est nécessaire de sniffer le réseau local du serveur…

Bref ! C’était pour la petite histoire, mais ça n’intéressera personne ici (pour les furieux, plus d’infos ici : http://www.cert.org/advisories/CA-1996-21.html). Passons à la seconde solution, l’utilisation de proxies !

Proxy, ma vie pour toi

C’est une solution très simple à mettre en œuvre. Beaucoup de sites proposent des listes de proxies mises à jour continuellement, et tous les langages de programmation récents disposent de toutes les fonctions permettant leur exploitation.

Nous (mon pote et moi) avons donc codé un truc rapide en PHP pour tester le principe (notre Proof Of Concept :p). Voici ce à quoi ressemblait le programme :

<php>setOptions(array('proxyhost' => $host, 'proxyport' => $port));

try {
$r->send();
fwrite($d, print_r($r->getResponseHeader(), TRUE));

} catch (HttpException $ex) {
fwrite($d, $ex . "\n");
}
}

?>

Nous nous sommes vite aperçus que notre programme ne fonctionnait pas très bien. Les trames émises ne devaient pas être très correctes. Alors on a décomposé avec Ethereal les trames sortantes lors d’une visite standard avec un browser.

En fait, la première requête du browser :

GET http://maville.miniville.fr/ind HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*
Accept-Language: en-us
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705; .NET CLR 1.1.4322)
Host: maville.miniville.fr

renvoie toujours la même page :

HTTP/1.1 200 OK
Transfer-Encoding: chunked
Date: Tue, 10 Jul 2007 09:28:02 GMT
Content-Type: text/html; Charset=UTF-8
Expires: Tue, 10 Jul 2007 09:28:02 GMT
Cache-Control: no-store, no-cache, must-revalidate
Server: Apache/1.3.37 (Unix) PHP/5.0.4
X-Real-Server: patate2.motion-twin.com
Pragma: no-cache
P3P: CP="ALL DSP COR NID CURa OUR STP PUR"

232

<html>
<head>
<title>Miniville</title>
</head>
<body>
.<noscript>
..Ce site n..cessite JavaScript pour fonctionner.
.</noscript>

.<script type="text/javascript">
.//<CDATA cookie="X-MV-Referer=" cookie="X-Ref-Ok=1;expires=">
.</script>
.<p><em>Veuillez patienter quelques instants...</em></p>

</body>
</html>

Le but de cette page est de vérifier que le browser supporte le scripting et les cookies. Si le browser (ou le proxy) ne les supporte pas, on bloque à ce niveau, et aucun compteur n’est mis à jour. Par contre, en cas de succès, le browser interroge de nouveau le serveur avec cette requête :

GET http://maville.miniville.fr/ind HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*
Accept-Language: en-us
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705; .NET CLR 1.1.4322)
Host: maville.miniville.fr
Cookie: X-MV-Referer=; X-Ref-Ok=1

Mis à part le cookie rajouté, aucune différence. Et c’est là que tout se joue… Car quand le proxy ou le browser se bloque sur le premier échange, le site n’est pas mis à jour. Par contre, dès que cette deuxième étape est complétée, le site enregistre la visite. Le serveur renvoie ensuite un code 302, qui a juste pour but de redirigier vers la racine du site :

HTTP/1.1 302 Found
Date: Tue, 10 Jul 2007 09:28:02 GMT
Content-Type: text/html
Proxy-Connection: close
Server: Apache/1.3.37 (Unix) PHP/5.0.4
X-Real-Server: patate2.motion-twin.com
Location: /

Et lors du troisième échange (get / + retour site), le browser récupère les infos du site mises à jour.

Il fallait donc très certainement rajouter ce petit cookie (et tant qu’à faire tous les autres éléments) dans la requête pour incrémenter le compteur, ce qu’on a fait en PHP avec :

$r->setHeaders(array('Accept' => 'image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*'));
$r->setHeaders(array('Host' => 'maville.miniville.fr'));
$r->setHeaders(array('Cookie' => 'X-MV-Referer=; X-Ref-Ok=1'));
$r->setOptions(array('timeout' => '20'));

Et là… magie ! Le compteur s’est incrémenté.

ultim8solution

Il ne manquait plus qu’une application un peu plus conséquente, que l’on a codé en Java sous Eclipse.

Que fait le programme ?

Tout d’abord, il va chercher sa liste de proxies dans un fichier (par défaut sous proxies.txt), qui contient des proxies sous la forme :
IP1:port1
IP2:port2
IP3:port3

Il crée ensuite plusieurs processus qui sont chargés de requêter les URLs de Miniville. En parallèle, il va interroger le serveur de Miniville pour connaitre quels sont les besoins spécifiques de la ville, et adapter les requêtes en conséquence. Ce mode de fonctionnement permet d’optimiser les requêtes et améliore grandement l’usage des proxies.

Petite notice d’utilisation :

1. Installer, si elle n’est pas déjà présente, la JRE (Java Runtime Environment) sur votre PC, que vous pouvez directement télécharger sur le site de Sun (cherchez ‘JRE’ dans la page).
2. Décompresser mon archive. Vous devriez obtenir un répertoire
3. Dans ce répertoire, plusieurs exemples de configuration ini sont présents (chacun est associé à un cmd). Editez-les avec Notepad (ou vi, c’est plus sérieux ! :p) et modifiez les paramètres.
4. Récupérez une liste de proxy sur le net et constituez-vous un fichier proxies.txt. Une simple recherche sous google vous renvoie vers plusieurs sites en proposant, mais je conseille fortement l’utilisation de la MEGA Proxy List. Ces gars font un super boulot d’agrégation, alors autant en profiter !
5. Lancez le cmd correspondant. Une fenêtre DOS devrait s’ouvrir, et normalement, les proxies devraient commencer à être interrogés.
6. Regardez l’évolution de votre Miniville. Si tout se passe bien… enjoy :D

Pour faire fonctionner le bordel sous Eclipse, il faut juste importer les projets et lancer le Main. J’ai essayé de commenter le programme au mieux, donc la compréhension ne devrait pas être trop difficile.

Les choses qui ne marchent pas tout à fait, ou à améliorer :
- L’identification d’un “bon proxy” ne se fait pas correctement. Cela est dû aux différents types de proxy utilisés (anonymous, high anonymous (Elite proxy), etc.). Nous recherchons actuellement une solution.

Greetings

Un grand merci à mon ami de 15 ans (mangez des pommes !), Cyberjeff (ouais je sais, son pseudo est pourri, mais le mec qui se cache derrière est fin cool !), pour avoir codé le proof of concept, et pour avoir réagi au quart de tour à l’idée de monter la plus grosse ville de Lorraine. You’re the man! Charlemagne represents!

Et un second merci à Ga3l, qui a finalement bien réagi suite à notre petite altercation. Je t’ai piqué l’idée qui consiste à récupérer le fichier XML pour optimiser les requêtes en fonction des besoins de la Miniville. J’espère que tu ne m’en voudras pas. Charlemagne represents too!

Outro

Voilà, j’arrive à la fin de ce post. En espérant que ces informations puissent servir à quelques personnes… Je répondrai avec plaisir à toutes les questions que vous vous posez encore (si j’en ai les moyens bien sûr, car sur des questions du type “Mais qu’est-ce que l’Univers ?”, ma réponse risque de vous décevoir :D ).

2 Responses to “Post original”

  1. S73ph4n says:

    Mais ou est donc cette archive ? :$

  2. dotpanic says:

    C’est le post original qui se trouve sur Miniville ;)

Leave a Reply