2 апреля 2012 в 04:30

Что записано внутри бесконтактных карт Киевского метрополитена?

Бесконтактные карты в киевском метро начали вводить в 2007 году (информация на сайте метро, укр), но широкое распространение и внедрение они получили только к концу 2008 года. На сегодняшний день существуют два основных типа проездных билетов: проездные со сроком действия, и проездные на количеств поездок. В проездных используются бесконтактные карты MIFARE Classic 1K.


Фото — Metromuseum.net

Об уязвимостях чипов MIFARE Classic стало известно в 2007 году. Подробную историю открытия уязвимостей можно почитать в статье. Статья хоть и 2008 года, но до сих пор актуальна, и в ней перечислены основные этапы нахождения уязвимостей. Совместив эти знания можно посмотреть, что же записывается в карты киевского метро на примере проездного на количество поездок.

Дисклаймер: Все действия и информация, описанные ниже, приведены исключительно для расширения личного кругозора, и не преследуют цели личной выгоды.


Настраиваем рабочее место


Для считывания бесконтактных карт, мы будем использовать:
  • ридер — SCL3711;
  • открытую библиотеку для работы с бесконтактными картами — libnfc;
  • утилиту для получения ключей — mfoc из комплекта nfc-tools.

Ридер



Так, как мы будем использовать libnfc, ридер необходимо выбирать из тех, с которыми библиотека лучше всего совместима. Выбираем на странице совместимости подходящий и покупаем. Я остановился на ридере SCL3711 с чипом PN533 v2.7 (на фото, покупал на eBay за 35$).

Библиотека libnfc

Я буду описывать процедуру сборки libnfc для Ubuntu 12.04, для других платформ подробная инструкция по установке есть на сайте .

Устанавливаем зависимости необходимые для сборки пакетов и работы с SVN (для тех, у кого не установлены):
sudo apt-get install subversion dpkg-dev debhelper dh-autoreconf libtool

Устанавливаем пакеты, которые необходимы для сборки libnfc:
sudo apt-get install libuсsb-dev libpcsclite-dev

Скачиваем и распаковываем последнюю версию библиотеки (1.6.0-rc1), из репозитория загружаем файлы, необходимые для сборки deb пакета:
wget http://libnfc.googlecode.com/files/libnfc-1.6.0-rc1.tar.gz
tar -xvzf libnfc-1.6.0-rc1.tar.gz
cd libnfc-1.6.0-rc1/
svn checkout http://libnfc.googlecode.com/svn/tags/libnfc-1.6.0-rc1/debian

Я рекомендую убрать вывод отладочных сообщений. Для этого в файле debian/rules надо убрать ключ --enable-debug в строке dh_auto_configure.

Собираем пакеты:
dpkg-buildpackage -b -us -uc

Устанавливаем зависимости и пакеты:
sudo apt-get install libusb-0.1-4 libpcsclite1 libccid pcscd
sudo dpkg -i ../libnfc*.deb

Для проверки ридер должен быть подключен и рядом с ним (в радиусе его действия) лежать карточка. Проверяем работоспособность командой nfc-list, которая выводит список ридеров и карт, в поле ридера:
$ nfc-list
nfc-list uses libnfc 1.6.0-rc1 (rexported)
NFC device: SCM Micro / SCL3711-NFC&RW — PN533 v2.7 (0x07) opened
    ATQA (SENS_RES): 00 04
       UID (NFCID1): 5b b8 5f 28
      SAK (SEL_RES): 08

Если вы увидели что-то подобное — значит все работатет. У меня сначала выдавало ошибку "libnfc.driver.pn53x_usb Unable to set USB configuration (Device or resource busy)". Дело в том, что В Ubuntu 12.04 по-умолчанию установлены какие-то драйвера для чипа PN533, и libnfc не может получить доступ к устройству. Лечится отключением встроенного драйвера "sudo modprobe -r pn533".

Утилита mfoc

Будем использовать утилиту mfoc из последней версии nfc-tools из репозитория. Проблем возникнуть не должно:
svn checkout http://nfc-tools.googlecode.com/svn/trunk/mfoc/ mfoc
cd mfoc
dpkg-buildpackage -b -us -uc
sudo dpkg -i mfoc_0.10.2pre3.1-0_amd64.deb


Заглядываем внутрь


Теоретическая часть

Карты MIFARE Classic 1K имеют 1 Кбайт памяти, которая разбита на 16 секторов. Каждый сектор состоит из 4 блоков по 16 байт. Каждый сектор защищен двумя 48-битными ключами A и B (которые хранятся в 4 блоке).



Для операции с конкретным сектором ридер должен авторизоваться с помощью одного из ключей (A или B) для этого сектора. Каждому ключу могут быть присвоены независимые права на чтение и записи. Уязвимость которую использует mfoc состоит в том, что если известен ключ хотя-бы к одному сектору, то после авторизации для этого сектора, mfoc пытается аутентифицироваться для другого сектора, и эта попытка раскрывает 32 бита ключа для нового сектора. Более подробно и корректно можно прочитать в статье Wirelessly Pickpocketing a Mifare Classic Card.

Практическая часть

Получаем ключи к карте с помощью утилиты mfoc:
mfoc -O keys.mfd

Где-то через минуту, вы получите ответ "Auth with all sectors succeeded, dumping keys to a file!". После этого в файл keys.mfd лежат ключи к карте. Ключи для всех карт одинаковы, и к слову довольно давно выложены в интернет (очевидно, одним из сотрудников) .

Для анализа сливаем дамп карты:
nfc-mfclassic r a new00-04-11.mfd keys.mfd

Повторяем процедуру после каждой поездки на метро или пополнения счета, и получаем достаточный набор дампов для анализа.

Анализ

Не буду приводить длинные размышления, остановлюсь на выводах. После каждой операции меняются два участка памяти заголовок и история операция.

Заголовок карточки — два идентичных блока по адресам 0x2D0 и 0x2E0. Каждый блок содержит информацию о порядковом номере операции с карточкой, оставшемся количестве поездок и дате и времени последней операции. Дата и время записаны странно: побитово, и секунды зачем-то разделены на 2 (см. коде ниже).

Блоки, содержащие историю последних шести операций, находятся по адресам 0xC0, 0xD0, 0xE0, 0x100, 0x110, 0x120. Каждая запись содержит:
  • дату и время операции,
  • номер терминала, который производил запись,
  • номер записи в журнале терминала,
  • количество поездок.

Номер терминала должен зависеть от станции метро, но я не до конца уверен. Дата и время записаны в другом, но таком же чудном формате, как и в заголовке.

Пример


Программа на питоне, которая читает данные из дампа полученного с помощью nfc-mfclassic:
#!/usr/bin/env python
import sys
from struct import unpack 
from datetime import datetime
 
def get_crc(block):
    """XOR all bytes in block"""
    return reduce(lambda x, y: x ^ ord(y), block, 0)
 
def get_bits(i, s, l):
    """ Get l bits starting at s"""
    mask = (1 << (l)) - 1 
    return int((>> s) & mask)
 
def print_info(data):
    # card number
    number = unpack('<4H', data[0x46:0x4E])
    print "Card #:tt{3:04X} {2:04X} {1:04X} {0:04X}".format(*number)
 
    # card header blocks
    header_block = data[0x2D0:0x2E0]
    crc_2d = get_crc(header_block)
    crc_2e = get_crc(data[0x2E0:0x2F0])
    print "nHeader: t" + ("ok" if crc_2d == crc_2e else "err")
    print "Block 0x2D CRC:t{:#x}".format(crc_2d)
    print "Block 0x2E CRC:t{:#x}".format(crc_2e)
 
    # last activity
    activity_number, activity2, activity1 = unpack('>HLH', data[0x2E2:0x2EA])
    activity = activity1 + (activity2 << 16)
    activity_count = get_bits(activity, 3810)
    y = get_bits(activity, 65) + 2000
    M = get_bits(activity, 114)
    d = get_bits(activity, 155)
    h = get_bits(activity, 205)
    m = get_bits(activity, 256)
    s = get_bits(activity, 315) * 2
    activity_date = datetime(y, M, d, h, m, s)
    activity_position, = unpack('>H', data[0x147:0x149])
    activity_index = (activity_position / 0x40) - 32
    print  "nLast activity #t{}".format(activity_number)
    print  "Positiont{:#x} ({})".format(activity_position, activity_index)
    print  "Date:tt" + activity_date.isoformat()
    print  "Counter:t{}".format(activity_count)
 
    # last activities positions
    positions = [0xC0, 0xD0, 0xE0, 0x100, 0x110, 0x120]
    print "n{:^20}{:^5}{:^20}{:^12}".format("Date""unk""Terminal""Operation")
    print "{:>31}{:>5}{:>4}{:>10}{:>7}".format("ID""Type""Cnt""Type""Cnt")
 
    # get correct order
    i = 5 if activity_index > 5 else activity_index
    positions_ordered = positions[(i+1):] + positions[:(i+1)]
    for pos in positions_ordered:
        block = data[pos:pos+0x10]
        # if undefined or empty block
        if (get_crc(block) <> 0) or (ord(block[0]) == 0):
            continue
        date_i, unk = unpack('>LH', block[1:7])
        term_id, term_type, term_cnt = unpack('>BBH', block[7:11])
        op_type, op_cnt_i  = unpack('>HH', block[11:15])
        op_cnt = op_cnt_i / 0x40
        h = get_bits(date_i, 25)
        m = get_bits(date_i, 76)
        s = get_bits(date_i, 135) * 2
        y = 2000 + get_bits(date_i, 185)
        M = get_bits(date_i, 234)
        d = get_bits(date_i, 275)
        date = datetime(y, M, d, h, m, s)
        print "{}{:>#5x}{:>#7x}{:>#5x}{:>#7x}{:>#9x}{:>4}
        "
.format(date.isoformat(), unk, term_id, term_type, term_cnt, op_type, op_cnt)
 
def main(filename):
    with open(filename, "rb") as f:
        data = f.read(1024)
        print_info(data)
 
if __name__ == "__main__":
    main(sys.argv[1])

Пример работы программы:



Как можно использовать


Запись о последних 6 поездках можно использовать для просмотра перемещений. Даже, если не видно станцию, то видно точную дату и время поездки.

С другой стороны, можно собирать статистику по метрополитену. Так, как каждый турникет записывает свой номер транзакции на карточку, можно смотреть, сколько прошло людей через турникет. Например, на дампе сверху видно, что через турникет на Политехническом институте (Номер терминала 0x14) за сутки прошло приблизительно 1000 человек.
+117
16109
221
PatapSmile 150,7 G+

Комментарии (84)

+62
pro100tak, #
А записывать-то, записывать как?
НЛО прилетело и опубликовало эту надпись здесь
+11
pro100tak, #
Ну конечно, Вы абсолютно правы! :)
+27
Antelle, #
0
sns, #
Уже 2-е апреля =)
+1
Kroligoff, #
Логично предположить что Копия о количествах поездки хранится на сервере?
скорее всего сделано для того чтобы если пропала связь с сервером человек всё равно мог пройти по информации на карте.
или я ошибаюсь?
+3
karech, #
Если предположить, что информация о каждой карте хранится на сервере и если есть связь, то проверять валидность по базе, то получается мало того, что скорость соединения практически нулевая (в плане задержки), так и доступ к базе осуществляется почти мгновенно (если судить по тому, как быстро турникет пропускает после поднесения карточки). А база то должна быть ооочень большой…
А если я не прав, то очень хотелось бы узнать, как можно достичь такой бешеной скорости ответа от удаленной базы данных!
+5
manny, #
очевидно же. Каждый турникет должен регулярно (раз в 20 минут, например) сливать себе на жесткий диск дамп базы по актуальным карточкам с центрального сервера
:)))
+10
karech, #
хм… допустим в базе хранится 1 миллион карточек, размер памяти карты 1кб (но всю карту хранить скорее всего не надо, допустим только 128б храним), получается дамп базы размером 122мб. Вроде цифра и не большая, но трудно представить, что метрополитен будет раскошеливаться на поддержание такой инфраструктуры (как минимум в разы увеличивается стоимость самого турникета, сервера с базой данных, канал до каждого турникета). Все-таки проще хранить инфу только на самой карте, учитывая ее «надежность»:)
В то же время, у меня однажды накрылся проездной (инфа перестала с него считываться) — в итоге мне его восстановили (выдали новый за 30руб.) с предыдущей информацией. Видимо, все-таки существует некая база данных с учетом всех поездок.
Эх, написал бы кто статью, о инфраструктуре метро:) Особенно интересует их система видео-наблюдения (огромное количество камер везде понаставлено, причем часть из них IP камеры, часть PTZ (видимо ведется какое то постоянное наблюдение), как организовано хранение информации).
+1
pr0tect0r, #
>>>Особенно интересует их система видео-наблюдения
За вами уже выехали…
+12
SLIDERWEB, #
Не знаю как в Киеве, а у нас, в Новосибирске, на сколько я знаю, на каждой станции есть кэш-сервер для турникетов, котоырй периодически обновляется. Турникеты на станциях «онлайн» только с ним.
Так же есть защита от пополнения карт, так как сервер знает, сколько поездок и когда было приобетено, и если по данным базы поездок было куплено вчера 10, использовано вчера 5 и сегодня осталось еще 60 — карта блокируется, а у тетеньки на КПП срабатывает сигнализация.
Студенты из НГТУ пару лет назад получили доступ к единой транспортной карте и накинули на нее немного денег. На скольок мне известно, воспользоваться они не смогли.

Вопроса в инфраструктуре и скоростях связи нет, так как Новосибирский метрополитен является одним из двух игроков «рынка городской магистральной канализации», именно по метрополитену проложена бОльшая часть магистральных линий связи Новосибирска, один метро-мост через Обь чего стоит, в качестве «кабельканала». Второй игрок — РЖД, но ему «внутригород» мало интересен.
+3
Richard_Ferlow, #
А если сделать копию карты и одновременно ей на двух станциях воспользоваться — что будет? :)
+33
curlydevil, #
Пятнадцать суток будет.
+1
tangro, #
А собственно говоря — почему?
Во-первых, мы выяснили, что турникеты подключены только к «своему» серверу на станции, а уже только эти сервера иногда синхронятся с центральным.
Во-вторых, «одновременно» тут нафиг надо — по «одновременности» как раз можно легко вычислить хак. Лучше так: 2 идентичных карты у разных людей срабатывают в разное время. В итоге сервер №1 снимает с карты №1 поездку и сервер №2 снимает с карты №2 поездку. Было, к примеру, по 15, а стало по 14. Потом оба сервера синхронятся друг с другом (или с центром), сообщая, что мол вот карта, на ней 14 поездок. Информация не противоречива — откуда 15 суток?
0
Richard_Ferlow, #
Это нужно хитро попадать в промежуток синхронизации, что нереально, иначе все тяряет смысл.
это при условии, что такая схема сработает.
0
Elsedar, #
А если они записывают, как действие, например, уменьшить количество поездок на 1, и потом отсылают эти данные на главный сервер. С двух локальных серверов придут данные, что мол два раза минус одна поездка. Выйдет осталось 13 поездок. Выгода такой ситуации лишь в том, если поездок осталось мало, и тогда есть возможность уйти в минус.
0
lisang, #
А вдруг там переполнение будет :)
0
Alex_MIPT, #
можно получить UINT_MAX поездок. Хватит надолго.
+1
aml, #
Знаю, как это в Москве происходит. Купил у спекулянта карточку, чтобы в очереди не стоять. Потом оказалось, что это не спекулянт, а жулик. Он предупредил, что карточка на 10 поездок, но потратить их надо быстро. Прошли мы втроём по этой карточке без проблем. А на следующий день, уже на другой станции, турникет запищал, и на карточке отпечаталось «СТОП-ЛИСТ». Уже потом разглядывал карточку внимательно, и оказалось, что она тоньше и на просвет видны её кишки (оригинальные карточки делаются из довольно толстого картона).
По видимому, мошенники купили карточку и скопировали её на дешёвые болванки, а может и просто сгенерировали. Система в реальном времени ничего не проверяет, она просто записывает серийные номера карточек и остаток их баланса. С небольшим лагом эти данные агрегируются, находятся левые карты, и их номера помещаются в стоп-лист, который рассылается по всем станциям. Доступ к локальному стоп-листу в реальном времени имеют все турникеты.
0
lopatoid, #
Не очень понятно, как на карточке могло что-то отпечататься. Сейчас бесконтактные карты, их никуда не суют, только подносят. Или надпись «СТОП-ЛИСТ» появилась на самом турникете?
0
aml, #
Слушайте, и правда. Я соврал немного, прошу простить. Турникет запищал, и я пошёл к жёлтому терминалу на стене, чтобы проверить, что с картой. И вот уже на нём написалось «Стоп-лист».
+2
pr0tect0r, #
Для того, чтобы обслуживать турникеты в реалтайме необходимы быстрые надежные каналы связи между ними и сервером статистики, что дорого в нашем-вашем государстве ))

Наверняка турникеты пропускают посетителя, считая на лету считая записи в карточке. Таким образом логично предположить, что сняв дамп с карты после ее пополнения и записав его вновь можно… (додумайте сами).

>>>А записывать-то, записывать как?
Обычно карты можно записать тем же, чем и читал.
+6
DmZ, #
Необязательно делать глобальную быструю сеть.
Харьковский метрополитен, например, имеет по одному «серверу» на станцию. Сервера синхронизируют свое состояние раз в день (ночью) между центральным сервером. Если были какие-то проблемы или несоответствия по карточке — то она блокируется, в момент синхронизации, на всех станциях.

Также каждый тип карты (обычная, пенсионная, студенческая, с нулем на балансе и т.п.) заставляет пищать автомат по-особенному (а в новых — и RGB диоды разным цветом) — на что очень живо реагируют менты, которые дежурят возле автоматов.
Да и сам автомат по-умолчанию «не пропустит» карту если будет какой-то сбой. У меня так много раз списывало денег, а не пускало — тогда работники метрополитена забирают карту, проверяют транзакции, извиняются и пропускают мимо турникетов :)

Так что с «исправленной» картой в харьковском метрополитене ходить, в лучшем случае, один день получится.
В Киеве карты появились раньше — сомневаюсь что Харьков с нуля разрабатывал систему. Поэтому в Киеве должно быть что-то подобное.
0
pixxxel, #
Ок, а если скопировать месячный проездной?
0
DmZ, #
В Харькове нет месячных проездных, но даже если его скопировать — думаете сложно вычислить если один проездной засветится в течении 20 минут в другом конце города?
Нужно тогда контролировать, чтобы один номер не светился одновременно (около 20 минут например) на нескольких станциях. Если с одной копией и разными «маршрутами на работу» это можно сделать и объяснить при необходимости (курьерская работа например), то при большЕм кол-ве копий аномалия выявится быстро.
0
pixxxel, #
Понятно, что выявить аномалию не проблема, но я сомневаюсь что сервер занимается таким анализом. Уверен, что если я ради эксперимента быстро-быстро объеду несколько станций метро на своей машине, и с перерывом в пару минут буду проводить проездным на разных станциях, то ничего с ним не случится.
0
Milfgard, #
7 минут лимита.
0
pixxxel, #
Но это лимит в рамках одной станции, наверное?
0
alexeysilver, #
Я знаю ребят которые разрабатывали харьковские карты и насколько я знаю они там появился раньше чем в Киеве + (тут на 100% не уверен) по моему они всё же сами всю систему писали…
0
GraD_Kh, #
Ага, так вот почему, когда у кого-то рядом турникет более высоким звуком пропищал — то у меня живо интересовались типом карточки, дотошно проверяя нет ли у меня другой кроме той, которую я им показал.
+1
PatapSmile, #
Мне кажется, что не хранятся, а если и хранятся, то никак не влияют на работу карт.

Если предположить, что сервер собирает данные раз в сутки, а после этого ищет нестыковки, и заносит в список блокировки, то алгоритм должен учитывать много параметров: от всех ли терминалов получены данные, за какой период по каждому терминалу есть данные.

Тестовая карточка, с искусственно пополненными поездками, работала корректно.
+1
zhovner, #
В Киеве есть студенческие карты которые действуют месяц и не пополняемые. В одном рядому турникетов такую карту можно использовать раз в пять минут, но если оббежать станцию и зайти с другой стороны, карта будет валидна. Так же если быстро доехать до другой станции (у меня получалось менее двух минут), карта тоже будет валидна. Из чего можно сделать вывод что никакого севера хранящего информацию о каждом проходе нет.

Еще есть карты пополняемые, которые можно пополнить через терминал, при этом саму карту нужно засунуть в этот момент в терминал. Бывают случаи, когда терминал деньги берет, но карту не пополняет. В таком случае нужно подойти с чеком об оплате к кассирше и она самостоятельно прошьет карту. Из чего опять же можно предположить что вся информация о карте хранится на самой карте без сервера. Непонятно только как отсчитывается в таких картах количество поездок. Вероятно турникет не только читает карту но и записывает в нее каждый раз при проходе.
0
zhovner, #
После каждой операции меняются два участка памяти заголовок и история операция.

статью не читай @ сразу отвечай
0
Lungo, #
>В таком случае нужно подойти с чеком об оплате к кассирше и она самостоятельно прошьет карту

Не знаю о каких терминалах говорите вы, но те терминалы, в которых я пополняю свою карту, чеков об оплате не печатают
0
zhovner, #
Может и без чека. Но суть та же, мне кассир объясняла что в случае если терминал не сработал, она делает это вручную.
+3
Zanoza, #
Помню в 2000-м году считывал данные с таксофонных карт (с чипами которые были, выглядят как сим карты). Там после программирования карты подавалось напряжение и перегорала дорожка, и обновить карту было нельзя в нее вписывались только нули по мере израсходования баланса карты, когда все превращалось в нуль карта становилась непригодной к дальнейшему использованию. На базе pic16f84 (исключительно в ознакомительных целях) был собирался эмулятор в который записывался дамп карты (например номиналом 50 единиц), при приближении к нулю автоматом сбрасывался в 50 единиц. Важно что если снять дамп израсходованной карты и записать на место единиц времени какое-либо значение то карта не работала (очевидно, что она отправляет запрос на блокировку только в момент полного обнуления)

1. Вот карта на 1000 единиц. Осталось 998. Номер 1000013039. Годна до 31.12.99
E9, 30, FF, 01, F7, 3F, 59, DC
00, 01, 7F, 0F, 3F, FF, 68, 6B
2. Потом по этой карте позвонили. Осталось 6 единиц.
E9, 30, FF, 01, F7, 3F, 59, DC
00, 00, 00, 00, 3F, FF, 68, 6B
3. Наконец, она закончилась.
E9, 30, FF, 01, F7, 3F, 59, DC
00, 00, 00, 00, 00, FF, 68, 6B
+3
solovjeff, #
В 2000-м году, для того, чтобы позвонить на местном телеграфе по такому аппарату мы поступали просто.
Заходили за будку с аппаратом и перекидывали висящие от него сопли к соседней будке, где стоял обычный телефонный аппарат с дисковым набором.
Вся защита ломалась за 1 минуту :)
0
DOLARiON, #
Случаем, нету информации о Московском метро?
Там используется MIFARE 1 S50. Честно говоря, не знаю разницы, но погуглив — информации по ним очень мало.
+6
svfoster, #
Есть некоторая информация по билетам, пишите, если интересно
+3
ilyak, #
Вот интересная статья по поводу исследования билетиков московского метрополитена www.xakep.ru/post/47074/default.asp
+1
PatapSmile, #
В этом блоге есть информация, и автор вроде должен быть на Хабре.
0
Iv8, #
Мы делали совй считыватель под разные RFID карты, MIFARE в частности.
На картах метро тренировались.
Читается без проблем. Подробнее что там и куда пишется не было повода разбираться.
+3
DOLARiON, #
Кстати, если кому-то интересно, на xda-developers есть тема по активации на Nexus S эмулятора подобных карт (NFC Card Emulation enabled).
+2
pewpew, #
Эх… Когда-то, когда учился ещё в школе читал таксофонные карточки ISO-7816-2.
Было интересно исследовать дампы и выяснять принципы кодирования серийных номеров карт, количество оставшихся кредитов. Заморочки с записью на них (ограничение на запись только меньшего значения, но вроде была лазейка записать единицу на пустой карте).
–22
dmitriid, #
Как все скучно сейчас стало — ридер, библиотека для считывания… Никакого фана, все уже преподнесено на тарелочке с голубой каемочкой, азжевано и в рот положено…
+8
Cryptochild, #
Никто не мешает вам сесть и повторить все исследования защиты этих карт самому. Just for fun
0
dmitriid, #
Не, опять же нет того, особенного фана, когда знаешь, что никто тебе в этом не поможет. А тут — всегда есть «подушка безопасности». Если не получится, можно подсмотреть :)

В общем, «когда я был маленьким, ходил в школу 30 километров пешком в мороз» ©

:)
0
Pixelbeat, #
Может стоит с себя начать? Вы свои посты читали? Там есть, что-то кроме новостных копипаст?
–6
dmitriid, #
Правильно. Если нет аргументов, надо попытаться обосрать оппонента.

В 2002-2003-м мы исследовали iButton при помощи ноутбука, двух проводов и паскалевсокй программы, слушающей LPT-порт. Безо всяких спецификаций и ридеров. В какой-то момент там даже плеер и soundforge участвовали.

А сейчас — ридеры, библиотеки… Скучно…

+4
Pixelbeat, #
В 2002-2003-м мы исследовали...

Можно линк на пост?
+1
dmitriid, #
Тогда Хабра не было :)

ЗЫ. Поражают люди, которые невинное замечание превращают в личную обиду и вендетту.
+3
Pixelbeat, #
Тогда Хабра не было :)

Я не просил линк на хабр, а вообще какой-либо источник где вы этими исследованиями поделились. Пока это лишь ваши слова.

ЗЫ. Поражают люди, которые невинное замечание превращают в личную обиду и вендетту.

Нет. Я лишь вам указал на то, что если что-то не устраивает сделайте лучше. Обосрать каждый может. Автор провел на самом деле не маленькую работу для подготовки этого поста, при этом у вас ни одного поста схожего по сложности нет.
0
dmitriid, #
> вообще какой-либо источник где вы этими исследованиями поделились. Пока это лишь ваши слова.

Выше и ниже есть еще люди, которые говорят о том, как они тоже таким занимались безо всяких ссылок. И? Этим обычно занимаются студенты, у которых много времени и мало денег (ну или мало на все, кроме пива). На каждое такое «исследование» писать по статье?

> Нет. Я лишь вам указал на то, что если что-то не устраивает сделайте лучше. Обосрать каждый может.

«Обосрать» появилось только в вашем воспаленном мозгу. Или на забре каждое сообщение надо обязательно сопровождать тэгами «сарказм», «шутка» и т.п., чтобы всякая школота с атрофированным чувством юмора и завышенным ЧСВ могла понять, где можно смеяться, а где нельзя? *смайлик, недоуменно пожимающий плечами*
0
dmitriid, #
> при этом у вас ни одного поста схожего по сложности нет.

ага, ага.

1. критерии сложности приведете?
2. Решил все же зайти к вам в профиль. А ну да, критик. Сам ничего не сделал, но других критикует. На каком основании?
+1
vk2, #
Но зачем? Уже тогда были выложены все SDK и спецификации к iButton, если мне не изменяет память.
–3
dmitriid, #
Тогда у нас не было интернета, чтобы их скачать :) В какой-то момент до спецификаций уже добрались, но тогда они нам понадобились только чтобы какие-то хитрые биты распознать. ПОтому что к тому моменту уже все знали :)

Эх, ту бы энергию, да в мирное русло…
+4
Cupper, #
а номер карты находится в перезаписываемой памяти?
+2
PatapSmile, #
В карте два номера: заводской и внутренний метрополитеновский (который напечатан на карте):
— внутренний метрополитеновский лежит в обычной перезаписываемой памяти [0x46:0x4E]
— заводской нельзя перезаписать, но в китайских клонах карты и этот блок перезаписываемый
0
tunelix, #
Как бы клона сделать и в телефон затолкать, чтоб с карточкой не морочиться
0
Lungo, #
А как вы потом ее пополнять будете? Ведь в терминале пополнения слот именно для карточки, телефон туда не запихнуть =)
0
Richard_Ferlow, #
деньги не на карте я так понимаю хранятся, а на серверах, поэтому пополнять можно оригинальную карту тогда…
+1
Lungo, #
Из топика следует, что деньги (а точнее, количество поездок) хранятся как раз на памяти карты в зашифрованном виде.
0
menraen, #
А как вы потом ее пополнять будете? Ведь в терминале пополнения слот именно для карточки, телефон туда не запихнуть =)

А пополнять будем, клонируя к себе на телефон карточки соседей по вагону. Такой себе проездной-вампир получится :)
0
Crash13, #
Наклей наклейку mifare и пропиши всю необходимую инфу :)
+10
valashko, #
Интересно, работает ли такой хак: записываем на карточку несколько «бесплатных» поездок, после чего не используем их, а пополняемся за деньги, тем самым занося информацию о количестве поездок («бесплатные» + купленные) на сервер.
+1
rpetrov, #
Наиболее безопасный способ заработать с бесконтактной карточкой (проверено — работает!) — провожать через турникеты всех страждущих из очереди к кассе в час пик не за две, а за три гривны.
0
nuboi, #
Речь, я так понимаю, идёт о карточке «с количеством поездок». С ней, выходит, нет блокировки на 15 минут после использования на этой станции?
+2
Lungo, #
Нет, конечно
+2
rpetrov, #
Нет блокировки. Можно всю семью пропустить по одной карточке. Я вообще не понимаю смысла жетонов для тех, кто не гость в городе.
0
Lungo, #
Это объясняется обыкновенной скупостью. Некоторые лучше будут постоянно стоять в очереди за жетонами, чем один раз заплатят 7 грн за бесконтактную карточку.
0
Colobock, #
Если честно, я не покупаю карточку только потому, что редко езжу на метро. А так же — потому, что для оформления карты требуют очень много непонятной информации, идентифицирующей личность. К приватности я отношусь не параноидально, но представить, что где-то еще, помимо метро, могут считывать эту карту как раз могу — моя вторая работа связана с системами контроля доступа и видеонаблюдения. Дальнобойных считывателей, работающих с пассивными картами, в продаже хватает. А их радиус действия достигает метров.
+3
Lungo, #
В Киеве для оформления карты нужно только 7 грн и больше ничего. К тому же, если вам карта больше не нужна, вы можете ее вернуть и вам вернут 7 грн, если карточка в рабочем состоянии. То есть, вы ее фактически берете бесплатно под залог.
0
Colobock, #
В Питере, если с тех пор ничего не поменялось, помимо залога за карту, просили еще и паспорт.
0
Dyr, #
Недавно ввели ещё и трёхмесячный «срок годности» для карт, в течении которых её можно обменять…
0
Kurmunke, #
Я вот на метро езжу только на учебу, которая у меня 3 раза в году (учусь заочно), бывает по делам иногда, но это буквально 1-2 поездки в месяц. Мне проще купить жетоны в автомате, на лесной и петровке очередей к 10грн автоматам я не видел, максимум это 1-2 человека утром, которые за 1-2 минуты покупают жетоны и уходят. Так что не понимаю при чем здесь скупость вообще? Я, например, потеряв жетон, нисколько не огорчусь, да и имея в кармане несколько жетонов всегда смогу доехать домой, а вот если потеряю карточку, или еще хуже, у меня украдут ее вместе с портмоне и деньгами, уже домой будет проблематично добраться, а жетон такая вещь, что на крайняк и в обычном транспорте проконает, ну или продать на станции метрополитена можно. А при потере карточки это дополнительный геморрой и неудобства.
0
Antelle, #
Смысл есть. У меня до бессрочного «подорожника» всегда валялась парочка жетонов: во-первых, там, где с багажом, можно пройти только приложив карточку и опустив жетон; во-вторых, они выручают, когда карточка внезапно кончается, а в очереди утром стоять не хочется.
0
rpetrov, #
Нет смысла.
Багаж — гасишь карточку два раза подряд.
Карточка внезапно кончается… Еще скажите, что бензин внезапно кончился в машине :-) И даже если кончается, то вот — стоят роботы для пополнения. Очереди там нет.
0
xanep, #
В киевском метро есть 2 типа карточек — пополняемые на количество поездок и пополняемые проездные на месяц/пол месяца. Копирование вторых сулит бОльшие перспективы.
НЛО прилетело и опубликовало эту надпись здесь
0
menraen, #
У СБ, «метелящей в подсобке» таки да — будут проблемы с законом.
НЛО прилетело и опубликовало эту надпись здесь
+1
ni4, #
Такой формат даты используется в ДОС (или, скорее в FAT) для даты/времени создания/модификация файла.
+1
menraen, #
Очередной замечательный пример того, что Security through obscurity — зло. То Филипс/NXP изобретают «страшно стойкий», и от того страшно секретный алгоритм CRYPTO1 для своих Mifare, то Visa и MC для своих EMV-карт вместо нормальной асимметричной криптографии придумывают какое-то «чОрное колдунство» с симметричными шифрами.

Наступит ли день, когда все «спецы» поймут, что единственным секретом в криптосистеме должны быть только КЛЮЧИ?! А алгоритм и реализация должны быть открыты! Пускай даже защищены патентами/лицензиями, но ОТ-КРЫ-ТЫ!

Возвращаясь к теме Киевского Метро: если у вас есть другие (не киевские) карточки MifareClassic — можете проверить, используют ли по-прежнему в Киеве дешёвые (и еще более дырявые) китайские клоны Mifare, как обнаружил в своем исследовании карт Mifare Николя Куртуа еще в 2009-м

We have found that for certain MiFareClassic 1K cards, for example those used in the mass transit system in Kiev, Ukraine the card replays NACK with probability 1 instead of about 1/256.


It appears, that, following (Roel, 2009), these weaker cards are unlicensed clones of MiFare Classic. For example we have ordered some Fudan Microelectronics FM11RF08 cards from China and verified that these cards also reply with probability 1.


0
vaultboy, #
Бесконтактные карты в киевском метро начали вводить в 2007 году

Надеюсь не забыли купить лицензию у Гаева?

Только зарегистрированные пользователи могут оставлять комментарии.
Войдите, пожалуйста.