Code Monkey home page Code Monkey logo

scsniff's Introduction

scsniff - Smartcard sniffer for Linux, by Erik Ekman <[email protected]>

Records communication between smartcard and reader, captured with
a smartcard data logger (also known as "season interface"),
and splits the traffic stream into packets.


Features:

- Basic parsing of ISO 7816-3
  * 'Answer to Reset' (ATR)
  * 'Protocol and parameters selection' (PPS)
  * Data exchange (using T=0 or T=1 protocol)
  to identify packets and their data direction.

- Follows baud rate and protocol changes seen in ATR & PPS messages.

- Expects new reset being sent after a few seconds of no communication,
  and detects unexpected resets (warm reset or deactivate).

- Identifies transfer direction for most T=0 data fields.

- Handles direct and inverse convention.


How to build:

Run `make`.


How to run tests:

With the check library (https://libcheck.github.io/check) installed,
run `make check`.


How to use:

You need a data logger which captures the smartcard communication and converts
it to RS-232 serial. The smartcard reset pin is expected to be connected to
Carrier Detect or Ring. If your logger has it connected to another pin, update
the RESET_PIN define in serial.c. See the ioctl_tty(2) manpage for details.

You need to know the starting baud rate being used. This depends on the clock
frequency used by the reader. If you can measure it while the reader is active,
the baudrate should be the frequency divided by 372. Nonstandard baudrates are
common, so your port (or USB adapter) needs to handle custom baudrates.

If you know what a specific card sends as ATR (Answer to reset, shown by
pcsc_scan tool) you can test different baud rates until scsniff can see the
same reply. It is normally around 9600 baud - try going up or down by
increments of 500 until you get the same result. In my testing I use 10500 for
the reader in my laptop and 5600 for a bank authentication device.

Once you have found the correct baudrate scsniff will output any communication
between the reader and the card. It will show the direction of the traffic when
it can be inferred (missing for some T=0 payloads).  With a data log similar to
the examples below, use the ISO 7816-3 (for transport layer) and 7816-4 (for
application data) specifications to decode the traffic.


Not yet supported:

- Saving data as pcap. There is not yet a datalink format that is suitable for
  intercepted ISO 7816-3 smartcard communication. Wireshark also does not yet
  have a dissector for ISO 7816-3 traffic.

- Detecting in ATR if CRC 16 error checking is enabled for T=1 protocol.

- Fully inferring data transfer direction for T=0 based on command parameters.


Sample session:

$ ./scsniff /dev/ttyUSB0 5600
== Opened /dev/ttyUSB0
== Speed: 5600 baud
== Waiting for reset..  Done
+0.023680s | CARD>>> | 3B 7F 18 00 00 43 55 32 69 AA 20 00 32 20 20 20 20 20 20 00
+0.072785s | CARD<<< | FF 10 13 FC
+0.083557s | CARD>>> | FF 10 13 FC
== Switching to 93 ticks per ETU (22400 baud) after PPS
+0.106063s | CARD<<< | 00 CA 01 00 00
+0.109960s | CARD>>> | 6C 16
+0.111310s | CARD<<< | 00 CA 01 00 16
+0.115236s | CARD>>> | CA
+0.115794s | CARD>>> | 43 6F 6D 62 4F 53 20 55 42 53 20 41 63 63 65 73 73 20 43 61 72 64
+0.128261s | CARD>>> | 90 00
^C


$ ./scsniff /dev/ttyUSB0 10500
== Opened /dev/ttyUSB0
== Speed: 10500 baud
== Waiting for reset..  Done
+0.017285s | CARD>>> | 3B FF 13 00 00 81 31 FE 45 43 44 32 69 A9 41 00 00 20 20 20 20 20 20 00 53
== Switching to protocol T=1 after ATR
+1.267620s | CARD<<< | 00 C1 01 FE 3E
+1.277641s | CARD>>> | 00 E1 01 FE 1E
+1.284177s | CARD<<< | 00 00 0C 00 A4 04 00 07 62 76 01 FF 00 00 00 41
+1.307725s | CARD>>> | 00 00 02 67 00 65
+1.324823s | CARD<<< | 00 40 0B 00 A4 04 00 06 A0 00 00 00 01 01 4D
+1.347225s | CARD>>> | 00 40 02 67 00 25
+1.362452s | CARD<<< | 00 00 11 00 A4 04 00 0B E8 2B 06 01 04 01 81 C3 1F 02 01 00 25
+1.398115s | CARD>>> | 00 00 02 6A 82 EA
+1.413817s | CARD<<< | 00 40 14 00 A4 04 0C 0F D2 33 00 00 00 45 73 74 45 49 44 20 76 33 35 4C
+1.446093s | CARD>>> | 00 40 02 6A 86 AE
^C

scsniff's People

Contributors

yarrick avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.