Cтудент Сэм Шеллинг (Sam Shelling) поступил на курс информационной безопасности университета Оклахомы в 2013 году. Двумя годами спустя он определился, какой проект хочет сделать для выпускного экзамена. Вместе с однокурсниками они нашли несколько уязвимостей в студенческих картах ID. Это привело их к мысли эксплуатировать найденные баги.
По внешнему виду студенческие ID напоминают банковские карточки: они такого же размера, здесь есть магнитная полоса и 16-значный идентификационный номер. По карточке осуществляется доступ в разные помещения общежития, к онлайновым службам и т.д.
Студенты изучили примерно 100 карт. Выяснилось, что все номера начинаются с одних и тех же восьми цифр. Анализ также показал, что есть всего три варианта следующих двух цифр: 05, 06 или 11. Таким образом, максимальное количество уникальных номеров составляет 3 миллиона.
На оборотной стороне каждой карты отпечатан URL для справочного сайта. Там в форме можно ввести номер карты — и получить ответ, валидная она или нет, и кому принадлежит (сотрудник, студент), есть ли специальные отметки для этой карты. Сайт не ограничивает пользователей в числе отправляемых запросов и справляется с 3-5 запросами в секунду.
Увлечённые исследованием, студенты купили устройство для считывания и записи данных на магнитную полосу. Они декодировали информацию оттуда и выяснили ещё несколько фактов. У всех карт один и тот же срок действия. На полосе закодировано имя пользователя, и с помощью устройства удалось записать копию ID с изменённым именем владельца на магнитной полосе.
Запись на оригинальной магнитной карте
%B6038380006514029^SNELLING/SAMUEL R ^491212000000000 000 ?;6038380006514029=49121200000000000000?
Дубликат с изменённым именем
%B6038380006514029^PETE/PISTOL ^491212000000000 000 ?;6038380006514029=49121200000000000000?
Эксперимент показал, что с помощью такой карты можно совершать покупки в студенческом магазине.
На последнем этапе эксперимента студенты написали js-скрапер, чтобы скачать всю информацию из онлайновой базы данных по картам. Скрипт заполняет форму номерами карт в случайной последовательности и сохраняет результат. Проверка трёх миллионов карт заняла около двух суток.
Скрипт
var cheerio = require('cheerio'),
request = require('request'),
fs = require('fs'),
headnumber = '06';
for (var i=1; i <= 100; i += 1){
var tailnumber = '';
while (tailnumber.length < 6)
tailnumber = tailnumber + '' + [0,1,2,3,4,5,6,7,8,9][Math.floor(Math.random()*9)];
request.post('https://app.it.okstate.edu/idcard/index.php/module/Default/action/IDCardEntry', {form:{card_id:'60383800'+headnumber+tailnumber}}, function (error, response, html) {
if (!error && response.statusCode == 200) {
var $ = ch3eerio.load(html);
$('td.formText').each(function() {
var text = $(this).next().text();
fs.appendFile('osu_ids.txt', text+';', function(err){});
});
fs.appendFile('osu_ids.txt', '\r\n', function(err){});
}
});
}
Студенты показали, что полученную с сервера информацию можно использовать для изготовления дубликатов карт и совершения покупок за чужой счёт.