2.0 Déconnexion par le client MITM

Inscrit
22 Juillet 2022
Messages
2
Reactions
1
#1
Bonjour tout le monde.
Premier post sur un forum, je ne suis pas vraiment dans mon élément, je compte sur votre bienveillance ! Depuis plusieurs semaines j'essaie de développer un bot MITM en python sur mon temps libre. Mais là je bloque.

Pour l'instant Mon objectif est d'échanger des données avec le serveur jusqu'à la réception du SelectedServerDataMessage.

Je suis plutôt au fait sur le protocole de communication utilisé par le jeu, la lecture des ID et des paquets ne me pose pas trop de problèmes.

Voila ce que j'ai fait jusqu'à maintenant :
- Utilisation de proxifier sur windows pour rediriger la connexion du D sur mon IP locale
-Création d'un thread socket vers le serveur et d'un thread socket vers le client, forward des données de l'un vers l'autre et vice versa

Le problème est le suivant : Lorsque le client reçoit des données (en l’occurrence "PorocolRequired" et "HelloConnectMessage") il coupe directement la connexion avec mon proxy.

Error:
[proxy(5555)] setting up
[proxy(5555)] connection established
Serveur à reçu :  050100
Client à reçu :  8ae50f000d312e302e332d64643630383137720e015500206c357770646a79774f60335644396b454579562e5176623c43345d782e67635db102760801a7c5a1e75eb6b892e5d2166946894ff00279cd5be386cb326b2058b6bb0d0ad58b89d2793b0d7666292140eaf1587c515bbdac086b2b8f95dd867250e7b8916f2419485d40b5133bf99812a499804b72470d25b9503d29eb9f0981171bab5bcf24f41827302536482fd1148b7fce05f519079fdc634bcf3b2af1480703e56c0da9a833579d08d6ce8952a5163da2854a8b6f44b0fec027d168a7c5ff0e22bde15bc11fe6aee7b3c3a2e566d2cc43a5a87ea38447b8157453be3b4caa784eef94ca1b0b104d740f81d24356ee0a68d494fe7357c38c628a3d0c07c341a89c2a28f97facc970745a136d2a94be03bc886bb5fca2c673d4ade201b4ae2d6fb6c974a3e262a0b83f1693365ecfdfc8f486ce85e061427280050c7dcc5adbf5da81f0c52199eaeca1e2b21c896f0e2d23
Exception in thread Thread-2:
Traceback (most recent call last):
  File "C:\..\Programs\Python\Python39\lib\threading.py", line 973, in _bootstrap_inner
    self.run()
  File "c:\..\Mon_fichier.py", line 55, in run
    data = self.game.recv(4096)
ConnectionResetError: [WinError 10054] Une connexion existante a dû être fermée par l’hôte distant

Cette erreur ressemble fortement à ce sujet : https://cadernis.com/index.php?threads/probleme-serveur-mitm.2511/#post-25282
Grandi des conseils de BlueDream j'ai pensé que le soucis était dû au fait que j'utilisais du "little endian" j'ai alors codé le passage au "Big endian" mais cela n'a pas fonctionné non plus. (Peut être l'ais-je mal programmé ?).

Mon code :
Proxy:
import socket
import os
from threading import Thread
import Reader as r
import struct

flag = 0
class Proxy2Server(Thread):

    def __init__(self, host, port):
        super(Proxy2Server, self).__init__()
        self.game = None # game client socket not known yet
        self.port = port
        self.host = host
        self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.server.connect((host, port))

    # run in thread
    def run(self):
        while True:
            data = self.server.recv(4096)
            if data:
                # data2 = int.from_bytes(data, "little")
                # data = data2.to_bytes((data2.bit_length() + 7) // 8, 'big')
                self.game.sendall(data)
                print("Client à reçu : ", data.hex())

class Game2Proxy(Thread):

    def __init__(self, host, port):
        super(Game2Proxy, self).__init__()
        self.server = None # real server socket not known yet
        self.port = port
        self.host = host
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        sock.bind((host, port))
        sock.listen(1)
        # waiting for a connection
        self.game, addr = sock.accept()

    def run(self):
        while True:
            data = self.game.recv(4096)
            if data:
                # data2 = int.from_bytes(data, "little")
                # data = data2.to_bytes((data2.bit_length() + 7) // 8, 'big')
                self.server.sendall(data)
                print("Serveur à reçu : ", data.hex())

class Proxy(Thread):

    def __init__(self, from_host, to_host, port):
        super(Proxy, self).__init__()
        self.from_host = from_host
        self.to_host = to_host
        self.port = port

    def run(self):
        
        print ("[proxy({})] setting up".format(self.port))
        self.g2p = Game2Proxy(self.from_host, self.port) # waiting for a client
        self.p2s = Proxy2Server(self.to_host, self.port)
        print ("[proxy({})] connection established".format(self.port))
        self.g2p.server = self.p2s.server
        self.p2s.game = self.g2p.game

        self.g2p.start()
        self.p2s.start()


master_server = Proxy('127.0.0.1', '34.249.202.222', 5555)
master_server.start()

Voila pour la présentation de mon "avancement". J'aurais quelque questions :
- Pourquoi le jeu envoie-t-il 050100 ?
- Pourquoi le client se déconnecte-t-il et que pourrais-je faire pour le corriger ?
- J'entends beaucoup parler du HelloConnectMessage et du chiffrement AES. Sont ils automatiquement gérés par le client lors d'une connexion en MITM ? (Je suppose oui mais j'aimerais bien avoir une confirmation)

Merci de m'avoir lu jusqu'au bout. En espérant que vous saurez m'aider
 
Inscrit
3 Avril 2011
Messages
32
Reactions
17
#2
Le client se deconnecte pour se connecter au serveur de jeu, c'est normal. En python pas besoin de Big/Little endian.
 
Inscrit
22 Juillet 2022
Messages
2
Reactions
1
#3
Merci de ta réponse, après avoir essayé un petit bout de temps j'ai l'impression que le problème est ailleurs. Depuis le launcher j'ai sélectionné l'option pour arriver à l'écran de sélections des serveurs il ne devrait donc pas y avoir de changement d'ip.
Et je ne vois pas non plus de changement d'ip sur Wireshark, je continue de me connecter au même serveur d'authentification jusqu'a ce que je choisisse mon serveur de jeu.
Pourtant la communication coupe bien systématiquement lorsque j'envoie le HelloConnectMessage au client :/ Je suis un peu perdu
Y a-t-il quelque chose que je ne comprends pas bien ?
 
Haut Bas