15.07.2013

Тестирование входных векторов NFC

image

Можем ли мы утверждать, что NFC – серьезная технология, имеющая большие перспективы в будущем? Представьте, сколько платформ поддерживает ее, включая обычные телефоны, которые используются уже очень давно. Что ж, пожалуй, перейдем сразу к делу: рассмотрим использование входных векторов NFC для пен-тестирования.

Автор: mmanning

Можем ли мы утверждать, что NFC – серьезная технология, имеющая большие перспективы в будущем? Представьте, сколько платформ поддерживает ее, включая обычные телефоны, которые используются уже очень давно. Что ж, пожалуй, перейдем сразу к делу: рассмотрим использование входных векторов NFC для пен-тестирования. Площадкой для действий здесь становится приложение, в той или иной мере поддерживающее NFC. Этим приложением может быть tag reader для Windows Phone 8 или Android Beam, не важно. Важной деталью здесь является то, что мобильное устройство принимает входящий поток из внешнего источника (NFC метка), и мы хотим убедиться, что этот поток проходит надлежащую проверку. В особенности, когда приложение читает содержимое NFC-метки в NDEF формате. Как оно использует эти данные? Что случится, если мы поменяем данное значение на что-нибудь некорректное. В идеале будет вызвано исключение и чтение данных из метки прекратится, но что, если этого не случится?

Необходимые программы

Для начала работы нам необходимо приложение, которое может читать и записывать NFC метки. Прошу прощения у пользователей iPhone’ов, но, на мой взгляд, самым простым вариантом здесь будет использование Android-устройств и нескольких приложений:

NXP NFC TagInfo

Функционал полностью соответствует названию – программа предоставляет вам информацию о NFC метке, включая любые ASCII символы, содержащиеся в NDEF, или шестнадцатеричное представление хранимого значения. Это первый шаг, касающийся определения содержимого метки NFC. Ссылка на Google Play (https://play.google.com/store/apps/details?id=com.nxp.taginfolite&hl=en).

NXP NFC TagWriter

Данная программа позволяет читать, записывать и копировать метки. Когда я говорю о копировании, я подразумеваю, что она копирует NDEF. Он и является содержимым метки. Жестко заданные значения, как, например, UID, не могут быть изменены (если, конечно, вы не знаете, где найти неполные метки, а если и знаете, то у вас есть средство на базе libNFC для взаимодействия с ними). Ссылка на Google Play (https://play.google.com/store/apps/details?id=com.nxp.nfc.tagwriter&hl=en).

NFC Developer

Здесь начинается веселье. Данное приложение позволяет вам создавать любые NFC метки NDEF формата (обычного содержимого метки). Если есть приложение, реализующее не стандартный формат, его можно воссоздать, и это хорошо для нас. NFC Developer разработан Томасом Скольбергом – автором статей, с помощью которых вы можете начать работать с NFC на Android.

Совместно с ndefendor.com приложение дает вам возможность сгенерировать, а после чего записать любую NFC-метку. Также вы можете использовать плагин для Eclipse, реализующий тот же функционал в самой среде программирования, что тоже очень полезно.

Создайте новую метку с помощью Eclipse. Для этого зайдите в New > Other > NDEF File

Заполните файл любым содержимым, которое вы можете придумать или которое может обработать приложение. Этим содержимым может быть MIME-тип, как показано в следующем примере, или Android Application Resource (AAR), или что угодно другое.

После создания приложение сгенерирует QR-код, который вы можете просканировать с помощью NFC Developer’а, установленного на вашем устройстве.

Теперь вы способны загрузить свое NDEF сообщение в метку NFC.

https://play.google.com/store/apps/details?id=com.antares.nfc&hl=en

Метки

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

Конечно же, вы хотите поработать с большим количеством типов меток. Главным различием, о котором стоит знать, здесь будет объем памяти. Mifare (4К) располагает большим объемом для хранения данных и, тем не менее, может предоставлять данные таким же образом, как и Mifare Classic (1K). Возможно, встретится ситуация, когда вам понадобится специфичный тип метки, но я еще ни разу не сталкивался с этим. Так или иначе, вот ссылка на некоторые метки (http://rapidnfc.com/cat/15/nfc_starter_packs).

Некорректный код:

Давайте рассмотрим некоторые примеры кода для Android, который мы пытаемся взломать. Далее будет представлена часть кода, считывающая информацию из NFC метки и записывающая данные в файл, имя которого берется из считанной информации. Как вы видите, значение переменной strfile1 является первой записью NDEF, какой бы она ни была. Что же будет, если значением будет, например, “../databases/superimportantcontent.db”. Или еще хуже, приложение попытается поместить данные во вторую запись NDEF.

Parcelable[] rawMsgs = intent.getParcelableArrayExtra(
        NfcAdapter.EXTRA_NDEF_MESSAGES);
NdefMessage msg = (NdefMessage) rawMsgs[0];
String payload = new String(msg.getRecords()[0].getPayload());

String strfile1 = getApplicationContext().getFilesDir().getAbsolutePath() + payload ; //is this bad? :)
File f1 = new File(strfile1);
FileWriter filewriter = new FileWriter(f1);
BufferedWriter out = new BufferedWriter(filewriter);
out.write(msg.getRecords()[1].getPayload());
out.close();

Давайте представим, что приложение хранит текстовый файл со списком SSH хостов, к которым оно подключается. В этом случае мы создадим NFC метку, первой записью которой будет путь к файлу, к которому мы хотим получить доступ (“SSH.txt”). Второе значение будет содержать данные, которые необходимо записать в этот файл (ваш SSH MiTM прокси-сервер). После прочтения вашей метки пользовательское подключение будет перенаправлено на вас.

Удачного хака!

или введите имя

CAPTCHA