
Analyse d'une API chiffrée
Best of Web
Kevin Raynel - 09/06/2017


Nintendo Switch
iOS 9.3
Quel est le point commun entre...


Webkit vulnerability
CVE-2016-4657
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 - J'envoie une clé AES
Taille de la clé (00 01 00 00 = 256)
256 octets = 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
D'autres types d'attaques possibles : ARP spoofing
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 !
Best of Web - Analyse d'une API chiffrée
By Kevin Raynel
Best of Web - Analyse d'une API chiffrée
- 2,086