Bonjour Cadernis!
C'est encore moi... Un jour on y arrivera!
Ce que le sniffeur fait (lorsque l'authentification est réussite):
Sniffeur
Cliquez pour révéler
Cliquez pour masquer
Sniffeur
Cliquez pour révéler
Cliquez pour masquer
- Il se connecte au serveur d'auth.
- S >> 1 = ProtocolRequired
- S >> 3 = HelloConnectMessage
- C << 4 = IdentificationMessage
- C << 5607 = ClientKeyMessage
- S >> 10 = LoginQueueStatusMessage
- S >> 6314 = CredentialsAcknowledgementMessage
- S >> 22 = IdentficiationSuccessMEssage
- S >> 6469 = SelectedServerDataExtendedMessage
- Changement de serveur par celui deserializé dans le message précédent.
- C << 110 = AuthenticationTicketMessage
J'ai donc tenté de reproduire ces procédures, le MITM que j'ai actuellement permet d'aller jusqu'au paquet 6469 (SelectedServerDataExtendedMessage), de deserializer les données reçus dedans.
Ainsi, une fois que je reçois le paquet en question, je close la connexion de mon MITM au serveur d'auth, je destroy le socket actuel et le remplace par un nouveau que je connecte immédiatement au serveur reçus dans le paquet:
CodeJS
Cliquez pour révéler
Cliquez pour masquer
// index.js
// lorsque l'on recoit des données
server.on("s-data", (datas) => {
let message = new Message(datas, 65565, true); // on itinit la classe Message
message.execProtocol(); // on le deserialize (ce qui créer la variable message.var avec toutes les vars deserializés)
console.log(colors.fg.Yellow, message.vars, colors.Reset); // debug
if (client.linked){
client.send(datas); // si le client est accessible, on lui envoit
}else {
console.warn("Client not linked yet");
}
if (message.headerId == 6469){ // Si le message est SelectedServerDataExtendedMessage on switch la connection
server.switchConnectionTo(message.vars.address)
}
})
// la méthode switchConnectionTo de la class Server
switchConnectionTo(ip){
this.linked = false; // on rend le serveur inaccessible pour le moment
this.client.destroy(); // on détruit la connexion au serveur
console.debug("destroyed the old connection!");
this.client = new net.Socket(); // on en créer une nouvelle
this.client.connect(5555, ip, () => { // que l'on connecte à l'ip passé en paramètre
console.debug("Changed the connection to ", ip, ".");
this.linked = true; // on le rend accessible
});
this.client.on('data', (data) => { // lorsque l'on reçoit des données, on fait passer
this.launchQueue(data)
});
this.client.on('close', () => {
console.log(colors.bg.Black, colors.fg.Red,"Ank@m@ server closed the connection.", colors.Reset);
this.linked = false;
});
}
Le problème, c'est que quand j’exécute le programme, je reçois tous les paquets jusqu'au 6469, puis on change la connexion au serveur donné dans la paquet en question, et mon client n’envoie jamais le paquet 110 = AuthenticationTicketMessage, j'ai premièrement essayé de le construire, mais avec toutes l'encryption du ticket et tout ça serait bien plus simple que le client le fasse comme il le ferait nativement. Je vous laisse une trace d’exécution du programme.
Trace execution
Cliquez pour révéler
Cliquez pour masquer
Waiting for client!
----------------
API function hooked !
Process: Dofus (PID=196)
"connect" add: 0x778C5EE0
Continue add: 0x05D80000
Hook add: 0x05D90000
----------------
[CLIENT]: 02 d9 00 00 00 01 01 01
{ headerId: 182,
messageLen: 0,
headerMessageLen: 1,
messageName: 'BasicPingMessage',
headerLen: 3 }
message Length = 0
MITM linked to Ank@m@ server.
[SERVEUR]: 00 05 08 00 00 07 57 00 00 07 62
{ headerId: 1,
messageLen: 8,
headerMessageLen: 1,
messageName: 'ProtocolRequired',
headerLen: 3 }
{ requiredVersion: 1879, currentVersion: 1890 }
[SERVEUR]: 00 0e 01 55 00 20 6a 6e 75 6a 38 73 6e 64 73 4d 77 37 35 57 3b 21 39 5e 5f 49 3a 78 5a 79 70 35 3c 50 39 7d 6d 27 b1 02 56 6a c7 d8 d4 64 5b a9 43 95 ca 85 f8 f1 2a 26 72 84 ce 61 c8 05 6f 28 9c 3a 2b 07 7d 11 f2 67 28 a2 3d 8b 1d 54 94 ee 9c e0 8b 43 52 c4 2f 66 93 45 82 b0 32 c8 0a 50 8b 3b 98 ca 35 71 8a 24 15 42 41 76 f9 c4 b8 da f9 60 31 7d cc cf d9 e9 d2 aa 91 cb 02 f3 e4 0c 5a d5 00 7e ea 94 cc 77 37 42 f9 40 e1 2e a9 46 55 f6 a1 a5 58 d5 e1 e2 6d a6 ee d0 4c d6 37 86 45 e9 0a b9 d2 8a 5c 95 d6 cf 37 0f 10 c0 27 c2 f3 ef b8 3b 96 9e 52 32 86 30 36 27 b5 24 5f 0b 44 1e a2 ab e1 7c 69 4f b4 e1 9f 0e eb 8e 96 2a 93 95 0f 2e 61 7f b4 39 bd ab 16 93 81 ab 44 bc 98 bc 75 4d 30 0e c9 3d 47 8d d7 e5 e7 4e 9c cd 6a 51 3a e0 58 25 f0 5f a2 b2 ab 45 db 29 e9 10 29 54 92 1a bc b0 9c f2 c7 28 b9 bc 5a a2 15 c1 68 fe 00 e4 91 7c f6 9a 65 db 94 3a 98 f1 8f 94 4f 92 43 87 ce b6 50 6b 85 24 bb a7 e0 e1 4c 80 8e ae ab e7 0e 20 ff 3d 52 6d 84 c5 f4 47 54 86 9b 7e 8f 21 f1 61 d3 3a 72 2a c9 f0 0d 31 08 29 fc ab bb d1 09 a9 f6 dd 0f
{ headerId: 3,
messageLen: 341,
headerMessageLen: 2,
messageName: 'HelloConnectMessage',
headerLen: 4 }
{ salt: 'jnuj8sndsMw75W;!9^_I:xZyp5<P9}m\'',
keyLength: 305,
key:
[ 86,
106,
-57,
-40,
-44,
100,
91,
-87,
67,
-107,
-54,
-123,
-8,
-15,
42,
38,
114,
-124,
-50,
97,
-56,
5,
111,
40,
-100,
58,
43,
7,
125,
17,
-14,
103,
40,
-94,
61,
-117,
29,
84,
-108,
-18,
-100,
-32,
-117,
67,
82,
-60,
47,
102,
-109,
69,
-126,
-80,
50,
-56,
10,
80,
-117,
59,
-104,
-54,
53,
113,
-118,
36,
21,
66,
65,
118,
-7,
-60,
-72,
-38,
-7,
96,
49,
125,
-52,
-49,
-39,
-23,
-46,
-86,
-111,
-53,
2,
-13,
-28,
12,
90,
-43,
0,
126,
-22,
-108,
-52,
119,
55,
66,
-7,
64,
... 205 more items ] }
[SERVEUR]: 02 dd 01 01
{ headerId: 183,
messageLen: 1,
headerMessageLen: 1,
messageName: 'BasicPongMessage',
headerLen: 3 }
{ quiet: true }
[CLIENT]: 00 12 00 00 00 05 01 17 01 02 30 0f 0f 36 2e 17 01 00 01 01 00 02 66 72 80 02 77 30 f0 d9 e5 c7 e7 2c ee 38 9d bb 50 dd c4 b7 a1 c7 48 15 57 d3 fc f3 11 27 38 01 ff 22 75 85 21 cd 15 9c 94 77 c6 a5 36 78 6f 70 38 4e f0 f1 b4 c2 dc 95 15 41 cb bb 22 69 7b 0a ce 05 70 41 f7 f4 25 6f 2c 24 f5 e6 0c 8c 7b a4 ac 96 6b 7f 31 3a d9 01 1f b8 11 4a ef 52 6a 62 3b 33 36 e8 f0 e7 84 c1 fe 31 4a 9d 66 39 63 c5 3f 8a 02 96 7f 74 a9 ae 9e 24 62 15 87 44 db 5e 98 12 6c 78 31 f3 94 b9 02 ed 64 b4 16 56 e7 13 31 7d 7b a0 e9 12 ce 8c 6c 45 05 e4 53 0f 8d aa f1 05 3e b3 07 eb 0e 98 33 ea 48 ff d9 3e e2 4d df ce d5 7f c0 06 8b 06 b1 52 70 7f 72 76 ae a7 91 38 8c af 70 30 f9 64 c9 2a c1 95 29 73 80 e3 7f 73 9c 66 25 1a e5 73 67 c8 10 45 c7 b1 5c 5d 97 c1 24 8f 8e de 1e e5 8e 2e 1c 40 b0 09 16 9d 9c c8 13 a2 dc 3a 79 43 d2 77 70 99 9c 9b eb 09 fa ee 89 ab 00 00 00 00 00
{ headerId: 4,
messageLen: 0,
headerMessageLen: 2,
messageName: 'IdentificationMessage',
headerLen: 4 }
message Length = 0
[CLIENT]: 57 9d 00 00 00 06 17 00 15 35 37 37 79 51 59 76 37 66 35 6a 57 79 31 70 36 38 37 23 30 31
{ headerId: 5607,
messageLen: 0,
headerMessageLen: 1,
messageName: 'ClientKeyMessage',
headerLen: 3 }
message Length = 0
[SERVEUR]: 00 29 04 00 13 00 13
{ headerId: 10,
messageLen: 4,
headerMessageLen: 1,
messageName: 'LoginQueueStatusMessage',
headerLen: 3 }
{ position: 19, total: 19 }
[SERVEUR]: 62 a8
{ headerId: 6314,
messageLen: 0,
headerMessageLen: 0,
messageName: 'CredentialsAcknowledgementMessage',
headerLen: 2 }
message Length = 0
{}
[SERVEUR]: 00 29 04 00 00 00 10
{ headerId: 10,
messageLen: 4,
headerMessageLen: 1,
messageName: 'LoginQueueStatusMessage',
headerLen: 3 }
{ position: 0, total: 16 }
[SERVEUR]: 00 59 62 00 00 06 69 7a 69 6f 33 38 00 09 49 7a 69 6f 33 38 36 31 30 03 66 f0 ae 00 00 2e 51 75 65 6c 20 65 73 74 20 6d 6f 6e 20 6a 6f 75 65 75 72 20 64 65 20 62 61 73 6b 65 74 62 61 6c 6c 20 70 72 c3 a9 66 c3 a9 72 c3 a9 20 3f 42 73 6f f6 c1 0b 00 00 41 68 cc ad c0 00 00 00 42 76 72 fb 64 a5 80 00 01
{ headerId: 22,
messageLen: 98,
headerMessageLen: 1,
messageName: 'IdentificationSuccessMessage',
headerLen: 3 }
{ hasRights: false,
wasAlreadyConnected: false,
login: '********',
nickname: '******',
accountId: 57077934,
communityId: 0,
secretQuestion: '*******',
accountCreation: 1335725134000,
subscriptionElapsedDuration: 13002094,
subscriptionEndDate: 1542693735000,
havenbagAvailableRoom: 1 }
[SERVEUR]: 65 16 01 4a de 01 00 0c 33 34 2e 32 34 32 2e 34 38 2e 39 37 00 02 00 00 15 b3 00 00 01 bb 00 20 2e 5d 5f c2 c5 ac 90 58 c3 bc 75 77 94 42 f8 6b 1b 34 12 1b 7b f9 4b a3 f0 75 6b f7 e5 42 ba ce 00 11 02 32 04 03 00 00 05 00 00 00 00 00 00 00 00 02 d2 01 00 03 00 00 00 00 00 00 00 00 00 00 00 00 cb 01 00 03 00 00 00 00 00 00 00 00 00 00 00 02 ce 01 00 03 00 03 03 42 76 6a 66 7c 7b 20 00 02 d1 01 00 03 00 00 00 00 00 00 00 00 00 00 00 02 d4 01 00 03 00 00 00 00 00 00 00 00 00 00 00 02 24 00 03 00 00 00 00 00 00 00 00 00 00 00 00 c9 01 00 03 00 00 00 00 00 00 00 00 00 00 00 00 cc 01 00 03 00 00 00 00 00 00 00 00 00 00 00 02 cf 01 00 03 00 00 00 00 00 00 00 00 00 00 00 02 16 01 03 00 02 05 42 73 ee ce eb 80 a0 00 03 de 01 00 03 00 02 02 42 76 6c 0a 57 cc a0 00 00 63 03 03 00 00 05 00 00 00 00 00 00 00 00 00 ca 01 00 03 00 00 00 00 00 00 00 00 00 00 00 02 cd 01 00 03 00 01 01 00 00 00 00 00 00 00 00 02 d0 01 00 03 00 00 00 00 00 00 00 00 00 00 00 02 d3 01 00 03 00 01 01 00 00 00 00 00 00 00 00
{ headerId: 6469,
messageLen: 330,
headerMessageLen: 2,
messageName: 'SelectedServerDataExtendedMessage',
headerLen: 4 }
{ serverId: 222,
address: '34.242.48.97',
portsLength: 2,
ports: [ 5555, 443 ],
canCreateNewCharacter: false,
ticketLength: 32,
ticket:
[ 46,
93,
95,
-62,
-59,
-84,
-112,
88,
-61,
-68,
117,
119,
-108,
66,
-8,
107,
27,
52,
18,
27,
123,
-7,
75,
-93,
-16,
117,
107,
-9,
-27,
66,
-70,
-50 ],
serversLength: 17,
servers:
[ { isMonoAccount: false,
id: 50,
type: 4,
status: 3,
completion: 0,
charactersCount: 0,
charactersSlots: 5,
date: 0 },
{ isMonoAccount: false,
id: 210,
type: 0,
status: 3,
completion: 0,
charactersCount: 0,
charactersSlots: 0,
date: 0 },
{ isMonoAccount: false,
id: 203,
type: 0,
status: 3,
completion: 0,
charactersCount: 0,
charactersSlots: 0,
date: 0 },
{ isMonoAccount: false,
id: 206,
type: 0,
status: 3,
completion: 0,
charactersCount: 3,
charactersSlots: 3,
date: 1540390111154 },
{ isMonoAccount: false,
id: 209,
type: 0,
status: 3,
completion: 0,
charactersCount: 0,
charactersSlots: 0,
date: 0 },
{ isMonoAccount: false,
id: 212,
type: 0,
status: 3,
completion: 0,
charactersCount: 0,
charactersSlots: 0,
date: 0 },
{ isMonoAccount: false,
id: 36,
type: 0,
status: 3,
completion: 0,
charactersCount: 0,
charactersSlots: 0,
date: 0 },
{ isMonoAccount: false,
id: 201,
type: 0,
status: 3,
completion: 0,
charactersCount: 0,
charactersSlots: 0,
date: 0 },
{ isMonoAccount: false,
id: 204,
type: 0,
status: 3,
completion: 0,
charactersCount: 0,
charactersSlots: 0,
date: 0 },
{ isMonoAccount: false,
id: 207,
type: 0,
status: 3,
completion: 0,
charactersCount: 0,
charactersSlots: 0,
date: 0 },
{ isMonoAccount: false,
id: 22,
type: 1,
status: 3,
completion: 0,
charactersCount: 2,
charactersSlots: 5,
date: 1369774667786 },
{ isMonoAccount: true,
id: 222,
type: 0,
status: 3,
completion: 0,
charactersCount: 2,
charactersSlots: 2,
date: 1540830362826 },
{ isMonoAccount: false,
id: 99,
type: 3,
status: 3,
completion: 0,
charactersCount: 0,
charactersSlots: 5,
date: 0 },
{ isMonoAccount: false,
id: 202,
type: 0,
status: 3,
completion: 0,
charactersCount: 0,
charactersSlots: 0,
date: 0 },
{ isMonoAccount: false,
id: 205,
type: 0,
status: 3,
completion: 0,
charactersCount: 1,
charactersSlots: 1,
date: 0 },
{ isMonoAccount: false,
id: 208,
type: 0,
status: 3,
completion: 0,
charactersCount: 0,
charactersSlots: 0,
date: 0 },
{ isMonoAccount: false,
id: 211,
type: 0,
status: 3,
completion: 0,
charactersCount: 1,
charactersSlots: 1,
date: 0 } ] }
destroyed the old connection!
Connection to Ank@ma@ stopped
Changed the connection to 34.242.48.97 .
[SERVEUR]: 00 05 08 00 00 07 62 00 00 07 62
{ headerId: 1,
messageLen: 8,
headerMessageLen: 1,
messageName: 'ProtocolRequired',
headerLen: 3 }
{ requiredVersion: 1890, currentVersion: 1890 }
[SERVEUR]: 01 94
{ headerId: 101,
messageLen: 0,
headerMessageLen: 0,
messageName: 'HelloGameMessage',
headerLen: 2 }
message Length = 0
{}
N'importe quel type aide sera apprécié, si vous avez besoin de plus d'informations, je suis là! :)
Merci d'avance,
Izio