Bases pour faire un MITM en Python (+MacOS)

Labo

Membre Actif
Inscrit
16 Aout 2013
Messages
799
Reactions
15
#1
Bonsoir à tous !

Tout d'abord, bonne année à tous, plein de bonnes choses ! :D
Je n'étais pas revenu sur Cadernis depuis le mois d'Août, la faute à la prépa...

Après avoir voulu faire un bot socket en C++, j'ai finalement décidé de modérer mes ambitions, et de faire un MITM en python (je trouve ce langage certes moins rapide, mais tellement moins prise de tête, cf les types, les ouvertures de flux etc... En plus python est assez utilisé dans le milieu des réseaux).
Pourquoi un MITM ? Parce que c'est beaucoup plus simple (et je ne parle pas du RSA mais de tous les messages qu'il faut implémenter @BlueDream).
Pour l'instant, il se limiterait à pas grand-chose (un simple bot de trajets sans pathfinding au départ, puis j'essayerai d'implémenter la gestion de l'inventaire, en particulier pour nourrir les familiers, et ensuite la gestion des HDV (et banque mais ça ce sera plus facile que les HDV) avec pourquoi pas une IA d'achat/vente, mais ça je peux m'en occuper tout seul). Je n'aurai donc pas pour l'instant besoin de comprendre le codage des maps (peut-être après si le bot de base est fini, pour ajouter de la récolte).

J'ai lu 80% des posts du forum, mais j'ai besoin de votre aide pour (dans l'ordre) :
- Un désassembleur AS sous Mac autre que JPEXS qui ne marche pas sur mon ordi (ne se lance pas). Sinon, je peux toujours essayer d'utiliser Wine, mais je ne sais pas si ça marchera en utilisant D*fus pour Mac (sûrement que si, vu que c'est un .swf).
- Un tuto pour apprendre les bases de l'AS. Eh oui, je n'ai jamais rien vu de tel sur le forum, bizarrement.
- Savoir précisément comment on implémente un MITM. Je sais parfaitement ce que c'est, j'ai lu des dizaines de posts sur le forum, je vais me taper le cours sur les sockets en Python (mais je connais déjà bien leur fonctionnement en général), mais je n'ai pas compris comment on redirigeait les paquets du client vers le bot (ça a parlé de fichier xml sur le forum... et Toons de fichier HOST sous Wind :twisted: ws) et aussi du serveur/bot vers le client, mais ça devrait fonctionner sur le même flux.
- Savoir où trouver les .swf (et autres, dites-moi quoi) à décompiler, parce quand j'affiche le contenu de l'app, je vais dans les ressources, je trouve une seconde app Dofus, je vais dans les ressources à nouveau et j'ai tout ça :
  • config.meta
    config.xml
    content
    data
    Dofus.exe
    dofus.ici
    DofusInvoker.swf
    DofusMod.exe
    foo
    icon
    Icon.icns
    licences
    log4as.xml
    META-INF
    mimetype
    reg
    Reg.app
    SharedDefinitions.metas
    SharedDefinitions.swf
    ui
    UpLauncher.app
    uplauncher.log
    uplauncher.xml
    uplauncherComponents.xml
(Au passage, je crois avoir trouvé le fameux .xml)
Quelqu'un pourrait-il d'ailleurs m'expliquer pourquoi j'ai des .exe svp ?

Voilà, c'est tout, merci beaucoup pour ce forum sur lequel on apprend plein de choses !

P.S. : Je ne coderai pas mon bot tout de suite, j'ai pas mal de boulot, mais quand je l'aurai fini, je pense que je ferai une sorte de tuto/journal parce que j'aurais bien aimé en trouver un qui raconte tout de A à Z.
 
Dernière édition par un modérateur:

Sorrow

Membre Actif
Inscrit
5 Mai 2012
Messages
376
Reactions
26
#2
Bon retour parmis nous ;)

- JPEXS est codé en Java, il te suffit de lancer le .jar avec Java et la version Mac de Dofus ne change rien ici car c'est un SWF qui est décompiler.
- Pour ce qui est du tuto, a moins que tu souhaite codé en AS, le code est relativement simple a comprendre (du moment que tu connais au moins 1 langage objet).
- Tu doit décompiler DofusInvoker.swf.

Parcontre, je pense que tu va être bloquer a niveau de la connexion au MITM en vue de la nouvelle protection d'Ankama (chiffrement des IP des logins servers dans la configuration).
Sur Windows il y a ma DLL, sur Linux tu peut utiliser un proxifier, mais sur Mac, aillant aucune expérience dessus je ne sais pas si de proxifier existe (mais je pense que oui).
Car tu doit redirigé le trafic réseau du client vers le MITM que lui le redirige vers les serveur officiel (une sorte de relay).

Et tu possède les .exe car Ankama sont pas foutu de faire proprement le portage multiplate-forme.
Je peut également te donner un conseil : créer un fichier "debug.txt" là où ce trouve le fichier DofusInvoker.swf, et en jeu lorsque tu appuis sur F11 cela te créer un rapport de logs, assez pratique pour debug ;)
 

Labo

Membre Actif
Inscrit
16 Aout 2013
Messages
799
Reactions
15
#3
Super, merci beaucoup !!!

Je sais que JPEXS est en java, mais quand je le lance j'ai une erreur (voir image jointe, je ne sais pas les insérer dans un message).

Après une brève recherche sur wikipedia (http://en.wikipedia.org/wiki/Comparison_of_proxifiers), j'ai trouvé ça : http://www.proxifier.com/ qui m'a l'air satisfaisant. Je suis juste déçu que ce soit un shareware, même si je n'ai pas encore compris où était la limitation. Au pire, je pense que des cracks doivent se trouver, ou sinon je ne mourrai pas pour avoir installé Debian sur mon Mac :p
C'est juste dommage de devoir utiliser cela parce que ça nuit à la portabilité du bot.

Concernant l'ip du serveur, j'ai pourtant bien accès à une ligne de config.xml :
Code:
<entry key="connection.host">213.248.126.39,213.248.126.40</entry>
Quoique je me rappelle avoir lu sans bien comprendre un topic sur la ligne d'après rajoutée à pendant une MaJ, et induisant une "connection.host.signature".

Même si j'ai eu la solution, pourrais-tu m'expliquer plus en détail le fonctionnement de ce cryptage stp ? Ca m'intéresse beaucoup, et je suis là pour apprendre, pas pour gagner des K@m@s ;)
 
A

Anonymous

Invité
#4
La sécurité de la signature des hosts dans le config.xml est détaillée sur un autre topic du forum qui concerne la mise à jour 2.16, utilise le moteur de recherche du forum.

Et pour avoir plus de détails sur l'erreur rencontrée par JPEXS, lance le depuis un shell : "java -jar ffdec.jar".

Si tu veux utiliser un proxifier tu devras implémenter un serveur de proxy socks toi même. Ce n'est pas excessivement difficile mais ça m'a pris plusieurs jours personnellement en C++, la meilleure façon reste l'injection de DLL mais elle n'est dispo que sous win pour le moment. Il y a probablement moyen de la faire sous Linux en regardant les sources de tsocks mais sous Mac je n'ai aucune idée de comment tu pourrais faire autrement.

Installer Linux est une très très bonne idée sinon ;)
 

Labo

Membre Actif
Inscrit
16 Aout 2013
Messages
799
Reactions
15
#5
Pour l'erreur Java, j'obtiens ça :
Code:
Exception in thread "main" java.lang.UnsupportedClassVersionError: com/jpexs/decompiler/flash/gui/Main : Unsupported major.minor version 51.0
	at java.lang.ClassLoader.defineClass1(Native Method)
	at java.lang.ClassLoader.defineClassCond(ClassLoader.java:637)
	at java.lang.ClassLoader.defineClass(ClassLoader.java:621)
	at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
	at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
	at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
Merci beaucoup, j'ai retrouvé le fameux sujet en question, et je me suis tapé les 11 pages (https://cadernis.fr/index.php?threads/mise-à-jour-d.973/). Ce que tu me proposes est la solution de Geraff (https://cadernis.fr/index.php?threads/mise-à-jour-d.973/).
Ce que je ne comprends pas du tout, c'est ce que tu écris 3 messages après (et sur ce topic aussi) :
"Cependant elle implique de développer un proxy Socks maison modifié pour procéder à des connexions aux ips qui l'intéresse."
Pourquoi il faut développer un proxy ? Je veux dire : en plus du MITM ?

Ah oui, je sais, j'ai déjà ma clé USB bootable avec kali dessus :p
 

Kyu

Staff
Membre du personnel
Inscrit
4 Octobre 2009
Messages
327
Reactions
8
#6
Met à jour ta version de java, ça devrais résoudre ton problème.

Ton jar est compilé pour être lancé par le jdk 1.7 minimum, et ta version courante doit certainement être la 1.6.
Code:
java -version
dans un invite de commande pour connaitre la version de java utilisé.
 

Sorrow

Membre Actif
Inscrit
5 Mai 2012
Messages
376
Reactions
26
#7
Oui, tu na pas besoin de proxy, tu redirige le trafic directement vers le MITM ;)
 
A

Anonymous

Invité
#8
Sorrow a dit:
Oui, tu na pas besoin de proxy, tu redirige le trafic directement vers le MITM ;)
Nop, si il utilise un soft comme proxifier, il aura besoin d'une implémentation d'un serveur socks pour que le logiciel utiliser puisse établir correctement une connection avec le bot.

Il ne faut pas confondre un proxifier avec une simple injection DLL. Un proxifier va effectivement effectuer une injection de DLL pour forcer l'appel de la connection socket a se faire avec lui, et il va de son côté demander à un serveur socks que l'utilisateur aura renseigné de se connecter au serveur initialement demandé par la requête qui a été redirigée. Le but étant biensûr de contourner la censure de certains ports sur certains réseaux d'entreprise ou publics.

Si il est en mesure de développer sa propre injection qui va rediriger l'appel socket vers le bot en local, à ce moment là un simple MITM suffit mais dans le cas contraire il a besoin d'une implémentation de socks.

Si tu t'aventures dans cette voie, en utilisant la RFC socks tu devrais y arriver assez facilement, ça n'est vraiment pas très dur.

Sinon tu arrives à développer ton propre moyen d'hooker les appels sockets comme Sorrow l'a fait sous Windows, mais cette fois sous Mac et Linux.
 

Labo

Membre Actif
Inscrit
16 Aout 2013
Messages
799
Reactions
15
#9
Merci beaucoup Jones !
Maintenant ça marche au poil :D
J'y avais pensé, mais OSX installait toutes les maj java automatiquement avant, sauf depuis Mavericks (voir http://www.macg.co/2013/08/mavericks-n’aime-pas-java-70557).

Munrek, si j'ai bien compris, le proxifier ne fait pas que rediriger, il modifie aussi les paquets et ceux-là ressortent comme les originaux seulement après un serveur socks ?
Je sens que je vais dire une grosse connerie, mais quel rapport entre l'injection de dll (bases de données je crois) et les connections socket ?

J'arrive enfin à décompiler, mais je ne regarde que dans l'Invoker ? Et quoi ? Parce que je me doute que ce ne sont pas les polices ou les images qui nous intéressent :p
Je suppose que ce sont les scripts et les binaryData qui nous intéressent, mais je n'arrive pas à lire ces dernières... (D'ailleurs, pourquoi je vois marqué lua partout ? Une partie est codée en lua ?)
De plus, quelqu'un pourrait-il m'expliquer la structure du dossier scripts svp ?
Même si j'ai déjà programmé en C++, je n'avais jamais compilé de "gros" projet ou même moyen... Juste quelques algos isolés :cry:
Ah et aussi : c'est quoi un "trait" ? Quelle différence entre le code de l'onglet de gauche et celui de celui de droite ?
Finalement, peut-être que je devrais quand même lire un cours d'AS...

En tous cas, merci encore de répondre à toutes mes questions avec autant de gentillesse :D
 

Kyu

Staff
Membre du personnel
Inscrit
4 Octobre 2009
Messages
327
Reactions
8
#10
Apple a utilisé son propre jdk jusque java 6 si je me souviens bien, ce qui avait posé problème notamment au niveau des applets et de lwjgl, depuis ils utilisent le jdk d'oracle.
 
A

Anonymous

Invité
#11
Labo a dit:
Munrek, si j'ai bien compris, le proxifier ne fait pas que rediriger, il modifie aussi les paquets et ceux-là ressortent comme les originaux seulement après un serveur socks ?
Je sens que je vais dire une grosse connerie, mais quel rapport entre l'injection de dll (bases de données je crois) et les connections socket ?
Aucun rapport entre l'injection de DLL et les bases de données.
L'injection de DLL dans le programme cible ( ici Dofus ) c'est une technique qui est exploitée par les proxifiers mais que tu peux aussi utiliser toi même si tu y parvient.

Via un proxifier les paquets ne sont absolument pas modifiés. Le protocol socks est un protocol de négocation de connection proxy. En gros quand le proxifier va rerouter une requête de connection d'un programme ciblé, il va demander au serveur proxy auquel il est configuré de lui ouvrir une connexion vers l'ip d'origine du programme, et si le serveur proxy accepte, il lui notifie et ouvre la connexion. Dès lors, les données réseau sont strictement les mêmes, elles transitent juste via un intermédiaire, ton serveur socks, donc ici ton bot.

dofus <-> proxifier <-> serveur proxy ( bot ) <-> serveurs dofus

Un MITM brut se passe de cette contrainte, mais en revanche tu dois réussir à développer ta propre injection de DLL, et aucune disposition particulière pour la négociation de la connexion n'est à prendre au niveau du bot.

Labo a dit:
Je suppose que ce sont les scripts et les binaryData qui nous intéressent, mais je n'arrive pas à lire ces dernières... (D'ailleurs, pourquoi je vois marqué lua partout ? Une partie est codée en lua ?)
Les binary data contiennent pour certains des scripts chiffrés avec un XOR mais ils ne sont aucunement importants. Si tu t'attaques un jour au RSA tu t'apercevras que certaines binary data contiennent des clef RSA et un mot de passe.

Le code du jeu est stocké dans les scripts.

Il y a des parties concernant LUA puisque depuis les dernières mises à jour récentes de Dofus, ils essayent de se rapprocher du modèle de Wakfu en scripant le client avec des scripts LUA. Mais ça n'est pour le moment que un projet en chantier pour Ankama ... qui alourdit énormément la masse de scripts pour nous, mais bon. Ne t'en préoccupe pas.
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#12
Bonjour , c'est ca en fait : http://www.pommehappy.fr/2012/04/01/edi ... -mac-os-x/ , il dit que ca bloque les sites mais en realité non , ca redirige juste http://www.facebook.com , http://www.twitter.com , http://www.youporn.com vers l'ip 127.0.0.1 (donc local et comme il a pas de serveur local alors ca bloque) ce qui est exactement ce qu'il faut faire (avec l'ip qui va bien a la place d'un http://www.xxxxxxxx.yyy) car ca va la rediriger vers http://127.0.0.1 donc vers le server du MITM.
bon apres je sais pas comment le client du MITM arrivera a acceder a l'ip qui va bien comme elle sera redirigée :lol: (elle aussi vers le serveur MITM ...) mais c'est ca le principe , sauf que faut le faire avec les ports : regler le jeu pour qu'il utilise le port 443 , rediriger tout ce qui passe par le port 443 vers du local donc vers le serveur MITM qui va faire passer au client MITM qui lui est reglé sur le port 5555 et va balancer ca sur l'ip qui va bien et comme 5555 est pas redirigé en local alors ca va partir vers l'exterieur (sauf qu'avec le passge dans le MITM en fais ce qu'on veut , ou ce qu'on peut , avec ce qui passe par la)

apperement sous mac os c'est cette commande (terminal) pour rediriger un combo adresse/port :
ssh -L [<local addr>:]<local port>:<remote addr>:<remote port> -N 127.0.0.1
donc :
ssh -L 2xx.xxx.xxx.xxx:443:127.0.0.1:443 -N 127.0.0.1
dsl pour les xxx , j'ai pas l'ip qui va bien en tete , elle est dans config.xml

si c'est pas cette commande alors recherche "port map" ou "port forwarding" ou paye moi un mac histoire de voir comment ca marche (et que je le revende apres :mrgreen:)

d'ailleur si des vilains qui utilisent windows et veulent pas utiliser de l'injection DLL pour pas se faire crier dessous d'utiliser une DLL fournie ici la commande c'est ca :
netsh interface portproxy add v4tov4 listenport=443 listenaddress=2xx.xxx.xxx.xxx connectport=443 connectaddress=127.0.0.1
et pour revenir a la normale :
netsh interface portproxy delete v4tov4 listenport=443 listenaddress=2xx.xxx.xxx.xxx
(todo : remplacer 2xx.xxx.xxx.xxx par l'ip qui va bien)
 

Labo

Membre Actif
Inscrit
16 Aout 2013
Messages
799
Reactions
15
#13
@Jones, en fait, Apple s'est arrêté à la 6, ils n'utilisent pas la 7...

Bon, Munrek, je crois que c'est un peu trop compliqué pour moi.
Heureusement que ToOns a trouvé une solution plus accessible :p
(en plus j'y avais pas pensé, alors que je connaissais le fichier host :D)
Ou sinon, pas besoin des ports, on utilise une adresse X de transit (un peu comme quand on échange 2 variables) :
L'ordi redirige 2xx.xxx.xxx.xxx:5555 vers localhost:5555 puis le MITM utilise une adresse X qui est redirigée vers 2xx.xxx.xxx.xxx...
Après je ne sais pas si 2xx.xxx.xxx.xxx n'est pas redirigée vers localhost, mais je ne crois pas... La solution des ports est mieux je crois !
 
A

Anonymous

Invité
#14
SSH peut en effet créer des redirections proxy ... mais cela sert pour créer un tunnel proxy entre ta machine et une machine distance via Internet. C'est le but de SSH, accéder au shell d'une machine distance ....
Edit : j'avais mas lu, donc avec l'option -N 127.0.0.1 c'est correct puisque cette machine distante devient la tienne

La commande netsh protproxy sous windows c'est la même chose à peu de choses près, ça sert à établir une redirection de port sur ta machine.

En aucun cas SSH ou netsh ne vont rediriger le traffic du client Dofus. Comment veux tu que ton système d'exploitation bind une adresse réseau en écoute (213.248.126.39) qui ne lui appartient pas ?

As tu testé ces informations ?

Sous Linux, sans surprise :
Code:
bind: Cannot assign requested address
channel_setup_fwd_listener: cannot listen to port: 443
Could not request local forwarding.
Et ça va être la même chose sous Windows.

Le fichier hosts est en revanche une façon de rediriger la connection vers ton MITM mais en revanche cela t'obligera à le modifier à chaque fois que tu veux jouer à Dofus sans bot ... et ça n'est de plus pas indétéctable.
Mais c'est en effet la façon la plus simple de procéder, même si je ne l'aime pas trop.
 

Kyu

Staff
Membre du personnel
Inscrit
4 Octobre 2009
Messages
327
Reactions
8
#15
Pour préciser :
Quelle est la configuration minimale requise pour utiliser Java 7 sur mon Mac ?
Exigences liées au système d'exploitation : pour Java 7, vous devez disposer d'un ordinateur Mac Intel exécutant Mac OS X version 10.7.3 (Lion) ou supérieure. L'installation de Java sur un Mac est réalisée à l'échelle du système pour tous les utilisateurs. Des privilèges d'administration sont donc requis. Vous ne pouvez pas installer Java 7 pour chaque utilisateur.
Navigateur requis : Un navigateur 64 bits (Safari ou Firefox par exemple) est requis pour exécuter Java 7 sur Mac OS X. Les navigateurs 32 bits tels que Chrome ne prennent pas en charge Java 7 sur les plates-formes Mac.
Source : http://www.java.com/fr/download/faq/java_mac.xml#sysreq
 

Labo

Membre Actif
Inscrit
16 Aout 2013
Messages
799
Reactions
15
#16
J'ai bien peur que la solution du fichier Host ne marche pas.
Il ne peut qu'associer un nom de domaine à une IP en passant avant le DNS, mais ça ne marche pas pour 2 ips.
Par exemple, je peux très facilement rediriger google.fr vers facebook en tapant :
173.252.110.27 google.fr
Mais pas si je remplace google.fr par leur IP.

Pour le ssh, je n'ai pas compris pourquoi on tapait quelque chose après le -N.

Voici ce que dit la bible :
-L [bind_address:]port:host:hostport
Specifies that the given port on the local (client) host is to be
forwarded to the given host and port on the remote side. This
works by allocating a socket to listen to port on the local side,
optionally bound to the specified bind_address. Whenever a con-
nection is made to this port, the connection is forwarded over
the secure channel, and a connection is made to host port
hostport from the remote machine. Port forwardings can also be
specified in the configuration file. IPv6 addresses can be spec-
ified by enclosing the address in square brackets. Only the
superuser can forward privileged ports. By default, the local
port is bound in accordance with the GatewayPorts setting. How-
ever, an explicit bind_address may be used to bind the connection
to a specific address. The bind_address of ``localhost'' indi-
cates that the listening port be bound for local use only, while
an empty address or `*' indicates that the port should be avail-
able from all interfaces.

-N Do not execute a remote command. This is useful for just for-
warding ports (protocol version 2 only).

Je suis d'accord avec Munrek, d'autant que bind_address ne sert que si on a plus d'une adresse.

En définitive, on n'a toujours pas de solution :lol:

@jones oui, oui, mais je voulais dire qu'Apple ne distribuait pas la 7, que la 6. La 7 n'est pas fournie d'office mais distribuée par Oracle. Enfin bon, ça n'a pas trop d'importance, l'important c'est que maintenant ça fonctionne :p
 
A

Anonymous

Invité
#17
Le -N ne prend pas de paramètres, c'est juste pour spécifier qu'on ne veut pas ouvrir de shell. L'adresse juste après c'est l'host auquel tu te connecte, ici ta machine locale.

Et oui tu as une solution : l'injection de DLL, qu'elle soit par toi ou par un proxifier.

Pour le host je n'avais jamais testé, donc désolé si j'ai pu t'induire en erreur, ça me semblait une méthode raisonnable.
 

Sorrow

Membre Actif
Inscrit
5 Mai 2012
Messages
376
Reactions
26
#18
Je ne pense pas que le fichier host vous soit d'une grande utilité.
Le système le consulte avant de demander a un serveur DNS pour résoudre un nom de domaine en IP.
Hors ici, Dofus ne passe pas par un nom de domaine mais directement par une IP donc le host n'est pas consulté.
 

Labo

Membre Actif
Inscrit
16 Aout 2013
Messages
799
Reactions
15
#19
@Sorrow, oui, en effet, c'est ce que j'ai dit.

Mais Munrek, qu'est-ce qu'un MITM brut ? Un MITM stand-alone ?
Et au final, quand tu parles d'un serveur SOCKS, c'est exactement comme si cela recevait directement les données du jeu, non ?
Du point de vue du bot, cela revient à la même chose que s'il captait directement les données du client ou pas ?
 
A

Anonymous

Invité
#20
MITM "brut" : un logiciel route pour Dofus ses paquets réseaux vers les serveurs, et les interprète au passage

MITM Proxy Socks : un serveur proxy socks route pour Dofus toutes ses connexions avec Internet, et s'occupe particulièrement d'intercepter les paquets réseau transitant vers les serveurs de jeu/login. Cette configuration implique qu'un logiciel tiers s'occupe de faire passer par un proxy (ton bot) le trafic réseau de Dofus.

Du point de vue du bot : on récupère les messages réseau de Dofus en se mettant au milieu de la connexion. Techniquement la mise en place n'est pas la même.
 
Haut Bas