Kontaktlose Bankkartenangriffe



Gepostet von: cuamckuu

Das Abrufen von Karteninhalten und die Arbeit mit EMV-Teams kann nicht nur für Forschungszwecke interessant sein. Es gibt verschiedene Arten von Angriffen auf kontaktlose Bankkarten, deren Umsetzung im Rahmen der Kürzung erörtert wird.

Einführung


Dieses Jahr habe ich im Summer of Hack 2019 ein Praktikum bei Digital Security absolviert und mich mit dem Thema Forschung zu kontaktlosen EMV-Karten befasst. Während des Praktikums stellte sich heraus, dass es besser war, die Funktionsweise von Bankkarten zu lernen und ein neues Dienstprogramm für die Arbeit mit kontaktlosen Karten zu erstellen. Eine Demonstration des Datenlesemodus finden Sie hier .

Arten von Angriffen


Die Karte und das Terminal kommunizieren mit dem EMV-Standard (Europay + MasterCard + VISA), der entwickelt wurde, um die Zahlungssicherheit zu erhöhen. In dieser Hinsicht gibt es nicht viele Angriffsmethoden auf kontaktlosen Karten. Der Artikel konzentriert sich auf Folgendes:

  • Verknüpfen Sie die Karte eines anderen im Online-Shop
  • Hilfsschritt im Social Engineering
  • Kontaktloses DoS, das eine Karte in einen Stein verwandelt

Solche Angriffe sind möglich, wenn mit der Karte gemäß dem EMV-Standard interagiert wird. Mit vielen Karten können Sie die privaten Informationen des Benutzers, insbesondere PAN, Ablaufdatum und Name des Inhabers, leicht lesen. Die gelesenen Daten reichen aus, um die Karte in einigen Online-Shops, z. B. Amazon, zuzuordnen. Die empfangenen privaten Daten können für personalisierteres Phishing oder beim Versenden von Spam verwendet werden.

In ähnlicher Weise wird ein DoS-Angriff implementiert. Durch Aufrufen der erforderlichen EMV-Befehle können Sie den internen Transaktionszähler überlaufen lassen oder eine falsche PIN-Code-Eingabe simulieren, was zur Kartenblockierung führt.

Warum das Rad neu erfinden?


Vor Beginn der Entwicklung wurde beschlossen, die vorhandenen Lösungen zu untersuchen. Insbesondere berücksichtigten sie: RFIDIOt / ChAP.py , Jaccal , nfcmillionaire , Konferenz-PoC , „Ruby“ -Skript , Android-Apps / libs .

Die meisten der getesteten Programme versuchen, den Betrieb eines POS-Terminals zu simulieren und Wörterbücher mit Kennungen der unterstützten Karten zu verwenden. Daher funktionieren solche Lösungen häufig nur mit Visa und MasterCard.

Ein weiteres Problem besteht darin, einen kleinen Teil der Daten zu lesen, anstatt einen vollständigen Speicherauszug zu sichern. Fast alle Programme versuchen, so viele EMV wie möglich im laufenden Betrieb zu analysieren und Analysefehler zu machen.

Wenn eines der Probleme fehlt oder nicht so ausgeprägt ist, handelt es sich höchstwahrscheinlich um eine Anwendung / Bibliothek für Android, und Sie benötigen ein Telefon mit einem NFC-Lesegerät, über das nicht jeder verfügt.

Die beschriebenen Probleme können gelöst werden, dafür ist es notwendig:

  • Erkennen Sie den Kartentyp dynamisch, anstatt Wörterbücher zu verwenden
  • Fügen Sie mehrere Betriebsmodi für das vollständige Lesen von Dateien hinzu
  • Versuchen Sie nicht, den EMV-Standard im laufenden Betrieb zu zerlegen
  • Verwenden Sie einen billigen Leser PN532 (~ 5 $)

Daten von der Karte abrufen


Es gibt bereits Artikel über Habré, in denen der Prozess der Interaktion zwischen Karte und Terminal ( eins , zwei , drei ) ausführlich beschrieben wird. Daher werde ich versuchen, mich nicht zu wiederholen und mich auf den praktischen Teil zu konzentrieren.

Für die Kommunikation mit der Karte verwenden wir den PN532-Reader aufgrund des günstigen Preises und der libnfc-Bibliothek. Machen Sie sich nahtlos an die Arbeit. Die Daten auf der Karte sind wie folgt organisiert:
Umgebung -> Anwendungen -> Dateien -> Datensätze.

Der Zweck des Lesens besteht darin, Daten aus allen Datensätzen abzurufen. Dazu müssen Sie eine vollständige Kette durchlaufen, und die Auswahl der Umgebung und Anwendung erfolgt nur einmal zu Beginn der Kommunikation.
Der gleiche Vorgang in Bezug auf EMV-Befehle:

  • SELECT PPSE // Wählen Sie eine berührungslose Umgebung
  • ANWENDUNG AUSWÄHLEN // Wählen Sie eine Anwendung per AID aus
  • READ RECORD // Geben Sie die Datei und die Datensatznummer an

Betrachten Sie das Beispiel der Bildung eines der Teams. Der erste Befehl zum Auswählen einer kontaktlosen Umgebung ist immer der gleiche und sieht folgendermaßen aus:

byte_t const command[] = { 0x40, 0x01, // Pn532 InDataExchange 0x00, 0xA4, // SELECT ppse 0x04, 0x00, // P1:By name, P2:_ 0x0e, // Lc: Data length 0x32, 0x50, 0x41, 0x59, 0x2e, 0x53, 0x59, // Data string: 0x53, 0x2e, 0x44, 0x44, 0x46, 0x30, 0x31, // 2PAY.SYS.DDF01 (PPSE) 0x00 // Le }; 

Beispielantwort: 6F 23 84 0E 32 50 41 59 2E 53 59 53 2E 44 44 46 30 31 A5 11 BF 0C 0E 61 0C 4F 07 A0 00 00 00 03 10 10 87 01 01 90 00

Um den nächsten Befehl aufzurufen, müssen wir die Antwort des vorherigen Befehls analysieren.



Wir interessieren uns für die Anwendungskennung AID. Wir merken es uns und bilden eine neue SELECT-Abfrage, aber dieses Mal übergeben wir die empfangene AID an den SELECT-Befehl und nicht wie im ersten Befehl an PPSE.

Beispiel: 00 A4 04 00 07 A0 00 00 00 03 10 10 00

Wie bereits erwähnt, ist es wichtig, AID dynamisch abzurufen, anstatt ein vorbereitetes Wörterbuch zu verwenden. Dann kann Ihre Anwendung wahrscheinlich verschiedene Kartentypen lesen, z. B. MIR-Karten.

Nachdem die Anwendung ausgewählt wurde, können wir die erforderlichen Datensätze mit dem Befehl READ RECORD lesen und die Dateinummer und die Datensatznummer als Parameter übergeben.

Ein Beispiel für die Teambildung: (Weitere Informationen hierzu finden Sie im Standard. EMV Book1. 11.2 READ RECORD)

  byte_t const sfi_param = (sfi << 3) | (1 << 2); byte_t const command[] = { 0x40, 0x01, // Pn532 InDataExchange 0x00, 0xB2, // READ RECORD record_number, sfi_param, // P1:record_number and P2:SFI 0x00 // Le }; 

Beispiel aufrufen : 00 B2 02 14 00

Beachten Sie, dass der Dateinummer kein vollständiges Byte zugewiesen ist. Es können insgesamt 31 (2 ^ 5 - 1) Dateien und 255 Einträge vorhanden sein. Dateien vom 1. bis zum 10. werden für die Speicherung interner Daten zugewiesen, und die verbleibenden Dateien werden für die Speicherung zugewiesen Transaktionsprotokoll, wenn die Karte die Protokollierung unterstützt.

Mit zwei verschachtelten Schleifen können wir die Daten aller Kartendatensätze abrufen, indem wir den Befehl READ RECORD für jedes Paar aufrufen. Der Suchvorgang kann erheblich beschleunigt werden, wenn Sie auf das von der Karte zurückgegebene Statuswort achten (die letzten zwei Bytes der Antwort). Der Status kann uns mitteilen, dass die Datei nicht vorhanden ist (SW = 0x6A82) oder dass diese Datei keine weiteren Einträge enthält (SW = 0x6A83).

In der Praxis stellte sich heraus, dass es sinnvoll ist, nur den Fall einer nicht vorhandenen Datei zu berücksichtigen, da es manchmal Karten gibt, die den Statuscode für fehlende Einträge falsch verwenden. Nachdem Sie die Daten gelesen haben, können Sie sie an einen der Online-Parser senden. Dieser hat mir gefallen.

Fragment von Daten, die aus Kartendatensätzen extrahiert wurden:



Die gelesenen Daten reichen aus, um die Karte in einigen Online-Shops (hauptsächlich in ausländischen) zuzuordnen, und die erhaltenen Informationen können mithilfe von Social Engineering für einen persönlicheren Angriff verwendet werden.

Wir organisieren kontaktlose DoS


Wir fahren mit der nächsten Angriffsart fort. Es gibt mindestens 2 Implementierungsmethoden für DoS-a.

Langsamer Weg


Um die langsame Methode zu implementieren (der Angriff dauert ca. 4 Minuten), muss der interne Kartentransaktionszähler (ATC) überfüllt werden. Rufen Sie dazu an:

  • SELECT PPSE // Wählen Sie eine berührungslose Umgebung
  • ANWENDUNG AUSWÄHLEN // Eine Anwendung auswählen
  • DATEN ERHALTEN // Finden Sie heraus, wie viel noch vor dem ATC-Überlauf übrig ist (optional)
  • VERARBEITUNGSOPTIONEN ERHALTEN // Transaktion starten
  • ...
  • VERARBEITUNGSOPTIONEN ERHALTEN // Transaktionen bis zum Überlauf wiederholen

Betrachten Sie die Schritte genauer. Die Auswahl der kontaktlosen Umgebung und Anwendung ist ähnlich wie bei der Datenextraktion. Der einzige Unterschied besteht darin, dass wir diesmal die Antwort des Befehls SELECT APPLICATION verarbeiten müssen.



Wir interessieren uns für das PDOL-Feld, da es für den nachfolgenden Aufruf des Befehls GET PROCESSING OPTIONS benötigt wird, wodurch der Transaktionszähler für jeden Aufruf erhöht wird.
In PDOL fordert die Karte Informationen über das Terminal und die Zahlung von uns an.

Im obigen Beispiel fragt uns die Karte:

  • 9F66 04 // Qualifikationsmerkmal für Terminaltransaktionen (4 Byte)
  • 9F02 06 // Menge (6 Bytes)
  • 9F37 04 // Unvorhersehbare Anzahl (4 Bytes)
  • 5F2A 02 // Transaktionswährungscode (2 Bytes)

Da wir DoS implementieren, keine echte Zahlung, können wir uns nicht um die Richtigkeit der Werte kümmern und verwenden nur die vorbereiteten Werte, die die Karte akzeptiert. Lesen Sie mehr über die erforderlichen Werte im Standard. (EMV-Buch 3. Anhang A Datenelementwörterbuch).

Zur Vereinfachung der praktischen Anwendung zitiere ich die Tabelle:
Tag (Hex)BeschreibungGültiger Wert (Hex)
9F59Terminal-TransaktionsinformationenC8 80 00
9F5ATerminal-Transaktionstyp00
9F58Händlertypanzeige01
9F66Terminal Transaction Qualifiers79 00 40 80
9F02Betrag (autorisiert)00 00 00 10 00 00
9F03Betrag (Sonstiges)00 00 00 00 00 00 00
9F1ATerminal-Ländercode01 24
5F2ATransaktionswährungscode01 24
95Ergebnisse der Terminalüberprüfung00 00 00 00 00
9ATransaktionsdatum19 01 01
9CTransaktionstyp00
9F37Unvorhersehbare Anzahl82 3D DE 7A

Nachdem wir die von der Karte angeforderten Daten gebildet haben, können wir das Gruppenrichtlinienobjekt aufrufen.

Beispiel: 80 A8 00 00 12 83 10 79 00 40 80 00 00 00 10 00 00 82 3D DE 7A 01 24 00

Antwort: 77 4F 82 02 20 00 94 0C 10 02 03 00 18 01 01 00 10 04 04 00 57 13 42 76 55 00 66 83 25 13 D2 00 52 01 14 89 36 20 00 00 1F 5F 20 02 20 2F 9F 10 07 06 01 11 03 80 20 00 9F 6C 02 30 00 9F 26 08 33 33 89 D5 70 A3 DF 37 9F 27 01 00 9F 36 02 02 48 90 00

Wiederholen Sie den GPO-Aufruf 65 536 Mal, und die Karte ist blockiert. Sie können die Anzahl der erforderlichen Anrufe reduzieren, indem Sie zuerst den aktuellen ATC-Wert mit GET DATA lesen.

Schneller Weg


Der schnelle Weg ist viel bequemer (und gefährlicher), da das Sperren der Karte etwa 2 Sekunden dauert, sodass eine detaillierte Analyse der Implementierungsdetails hinter den Kulissen verbleibt.

Die Methode ähnelt der vorherigen, diesmal muss jedoch der Zähler für Versuche zur Eingabe des PIN-Codes gesenkt werden, anstatt den Transaktionszähler zu erhöhen. Der PIN-Wert von Try Counter kann auch über GET DATA abgerufen werden. In diesem Fall wird die Geschwindigkeit jedoch nicht wesentlich erhöht.

Erforderliche Operationen:

  • SELECT PPSE // Wählen Sie eine berührungslose Umgebung
  • ANWENDUNG AUSWÄHLEN // Eine Anwendung auswählen
  • GET DATA // Finden Sie heraus, wie viele Versuche Sie unternehmen, eine PIN einzugeben
  • VERARBEITUNGSOPTIONEN ERHALTEN // Transaktion starten
  • ÜBERPRÜFEN // Und geben Sie die falsche PIN ein
  • ...
  • ÜBERPRÜFEN // Bis die Karte gesperrt ist

Zusammenfassung


Während des Praktikums war es möglich, ein neues Tool für die Arbeit mit kontaktlosen Bankkarten zu erstellen und verschiedene Probleme zu lösen, die in bestehenden Lösungen vorhanden sind. Die Verwendung eines billigen Lesegeräts senkt die Kosten eines Forschungskits erheblich und kann dazu beitragen, neue Leute für die Erforschung der Sicherheit kontaktloser Bankkarten zu gewinnen. Der Quellcode für das Programm ist auf Github verfügbar .

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


All Articles