Analyse d'une API chiffrée

BAM

Kevin Raynel - 17/03/2017

Nintendo Switch

iOS 9.3

Quel est le point commun entre...

Tout a démarré par un email...

WHAAAT?

Vérifions...

OK, super.

Mais qu'est c'était que ce truc ?

Avant de creuser, faisons fonctionner le tout...

Ça tourne.

Et maintenant ?

Première étape :

Petit récap à ce niveau

Les échanges sont cryptés chiffrés

 

Comment je déchiffre ça ?

RSA?

  • Système de clé privée/clé publique
  • Ne permet pas de chiffrer de grosses quantités de données
  • clé de 2048 bits = max 245 octets chiffrés

Et ce deuxième message ?

  • Encodé en Base64
  • Pas chiffré en RSA car trop gros

Une seconde...

Je suis bloqué ?

Une idée ?

Le client est disponible

utilisons-le !

OK, j'ai le code

Comment ça marche ce truc ?

Le message contient sa propre description

 

01

Taille de la clé (00 01 00 00 = 256)

256 octetss = la clé

Taille du VI (20 00 00 00 = 32)

32 octets = le VI

La requête de login chiffrée

Un padding

 

 

Protocol d'échange

MITM!

Je sais faire des requêtes...

Où en sommes nous ?

Interception des échanges

Cracker le protocole de sécurité

Déchiffrer l'échange

Créer des requêtes à partir de zéro

Retournons aux sources

À partir d'une requête brute

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
	<s:Header>
		<a:Action s:mustUnderstand="1">http://www.silae.fr/IIWCF/AppelComResponse</a:Action>
		<a:RelatesTo>urn:uuid:f9bcb8a5-24cb-4963-9621-43632d01fa49</a:RelatesTo>
	</s:Header>
	<s:Body>
		<AppelComResponse xmlns="http://www.silae.fr/">
			<AppelComResult xmlns:b="http://schemas.microsoft.com/2003/10/Serialization/Arrays" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
				<b:KeyValueOfanyTypeanyType>
					<b:Key i:type="c:int" xmlns:c="http://www.w3.org/2001/XMLSchema">1</b:Key>
					<b:Value i:type="c:base64Binary" xmlns:c="http://www.w3.org/2001/XMLSchema">
AKzR15lw+4zEApy/4BoiSOBSJ1mIUJBNSpgYu99SDPM80mfxa9pldkka91NqQfz8
/1jMQfeQVes3Edbb82c5CpHD7zEDhe8ZtUQjOFgbHdG599Hr6inSOOaaYOzEeb9q
Q3isSXkPBY9Pxo1IQOMsEY4spiRhSsOmfk2eFdlSIo/ENjWubVNSfG63oLGCL9nY
lsUvpA/xexKLORUGgPSanFlQ5z5uTdklbgWQUp4vJyZqQWv8NXVbREC7Lco8a2Bj
9D6AnEI3Ww4jM2LGR4Yz7Xm7YCCuW+7G7Q7bBNZ3TMt3A01xb/+8dUPrkie5a76V
9se30iwwD4X/yN7ngVkZgIpUpijrSy7xxMAB0/WY+IaOM+bv5d66SST7MJ3ozjVe
W7WFMT0OP7SEDq5EGbhDo5Kuj+b7T3iuSVCwxCwnxC0SFZg4/k5rPU9rrFgoined
0a2ShX8gZEBDQlefV7xIwkfldvEIVYTRgPqk4ff37caWY/k/PEzQJOMp/FpXYE1N
9RxcYSeE371VVwyIGNljjCDVt7adHIdHvV7e5IFYmyF0/vH9zkGC3VR/jF3g6iOC
K/gkzNBlWtrrc76M1W3HPIv0MoytH0uJDENYZimHfXxn8mjSUEEjc3jOMutnwpbo
E3yCUdXWhy60k995DHI3QYEJoBZ0BZphRqG3eJnv+1KPoaprcTLp2j3IyvoO5qPl
loDTHaeaIrZiQ4QVLHzq6kE5U0GOLnjuaS01G+GNwpaj0Le3LsFFIttzRcbAJwee
rersFhfr82+XQymhYef8/UhC/CAiulYP/1j2fPPKTNcxuKvAYPvoMG3yT0IQStuO
mBLjXth1RmaWMe9xanSvan+GL85y08CA/MIUHWLNzOF2LjSE5Im130YrwtkWHjGL
eM668B1iuk3/w7h+EUSuDwf+dc1GduyDhC2Kijx2DNBxg4UHKkGjGtKUU+DVKsAr
nMoNztidcEyxNBLrewX0XQhBa0egeSzCiZIEsItoInB+Dn5fBgc/W1hFf2M5iPir1g==</b:Value>
				</b:KeyValueOfanyTypeanyType>
				<b:KeyValueOfanyTypeanyType>
					<b:Key i:type="c:int" xmlns:c="http://www.w3.org/2001/XMLSchema">0</b:Key>
					<b:Value i:type="c:int" xmlns:c="http://www.w3.org/2001/XMLSchema">2</b:Value>
				</b:KeyValueOfanyTypeanyType>
			</AppelComResult>
		</AppelComResponse>
	</s:Body>
</s:Envelope>

...nous l'avons déchiffrée

00000000  0b 00 08 24 4d 45 54 48  4f 44 45 0c 14 41 63 71  |...$METHODE..Acq|
00000010  75 69 73 69 74 69 6f 6e  42 75 6c 6c 65 74 69 6e  |uisitionBulletin|
00000020  73 02 50 34 05 00 00 00  00 04 24 41 50 50 0c 0f  |s.P4......$APP..|
00000030  53 69 6c 61 65 43 6c 69  65 6e 74 2e 65 78 65 02  |SilaeClient.exe.|
00000040  50 32 05 d1 95 01 00 04  24 44 4f 4d 0c 00 02 50  |P2......$DOM...P|
00000050  35 63 01 00 02 42 41 62  6b 00 00 00 04 00 1f 4f  |5c...BAbk......O|
00000060  70 74 69 6f 6e 5f 4c 69  73 74 65 52 65 63 75 72  |ption_ListeRecur|
00000070  73 69 76 65 53 75 70 65  72 76 69 73 65 73 02 01  |siveSupervises..|
00000080  1e 4f 6e 67 6c 65 74 4e  61 74 75 72 65 55 74 69  |.OngletNatureUti|
00000090  6c 69 73 61 74 65 75 72  53 61 6c 61 72 69 65 02  |lisateurSalarie.|
000000a0  01 08 49 44 5f 44 52 4f  49 54 05 d1 95 01 00 12  |..ID_DROIT......|
000000b0  49 44 5f 53 55 50 45 52  56 49 53 45 55 52 5f 53  |ID_SUPERVISEUR_S|
000000c0  56 4e 05 5e 00 00 00 02  54 35 0c 29 53 49 4c 41  |VN.^....T5.)SILA|
000000d0  45 2e 43 4d 5f 53 55 50  45 52 56 49 53 49 4f 4e  |E.CM_SUPERVISION|
000000e0  2b 43 53 75 70 65 72 76  69 73 69 6f 6e 43 6f 6e  |+CSupervisionCon|
000000f0  74 65 78 74 65 02 50 33  05 88 40 00 00 07 24 43  |texte.P3..@...$C|
00000100  4c 41 53 53 45 0c 0f 43  4d 5f 50 41 49 50 4f 52  |LASSE..CM_PAIPOR|
00000110  54 41 49 4c 43 50 04 24  55 53 52 0c 05 33 30 36  |TAILCP.$USR..306|
00000120  37 37 02 50 31 05 b4 04  00 00 16 16 16 16 16 16  |77.P1...........|
00000130  16 16 16 16 16 16 16 16  16 16 16 16 16 16 16 16  |................|
00000140

...puis désérialisée

{
      '$METHODE': { type: 12, value: 'AcquisitionBulletins' },
      P4: { type: 5, value: 0 },
      '$APP': { type: 12, value: 'SilaeClient.exe' },
      P2: { type: 5, value: idDroit },
      '$DOM': { type: 12, value: '' },
      P5:
        { type: 99,
          value:
           { BA:
              { type: 0x62,
                value: cSupervisionContexte } }},
       T5: { type: 12, value: 'SILAE.CM_SUPERVISION+CSupervisionContexte' },
       P3: { type: 5, value: idPaiSalarie },
       '$CLASSE': { type: 12, value: 'CM_PAIPORTAILCP' },
       '$USR': { type: 12, value: $usr },
       P1: { type: 5, value: idClient }
  }

Nous avons toutes les infos pour écrire un client

Conclusion

 

Pas de fuites de données non autorisées...

mais j'ai une partie du code serveur

 

Ne recodez pas des fonctionnalités de sécu

Privilégiez des standards pour l'interconnexion

Quelqu'un utilisera peut-être votre code d'une manière non prévue

Merci !