Как открыть сейф с помощью ручки

Специальный корреспондент
Собака

Собака

Пресс-служба
Команда форума
Private Club
Регистрация
13/10/15
Сообщения
50.772
Репутация
61.675
Реакции
269.807
RUB
0
Я обнаружил уязвимость, которая позволяет открывать электронные сейфы компании Sentry Safe и Master Lock без пин-кода. Производителя я уведомил, но ответа от них так и не получил.

Я создал альтернативную плату и прошивку для решения этой проблемы, они

[H3]Предыстория[/H3]
Однажды по случаю я прикупил логический анализатор и задумался, что же с ним делать?

5c277f5485eeeb75f09dbbb2071d4ba2.jpeg

Посмотрел вокруг... Телевизор... принтер...

... электронный сейф!

418c47b1f5bdb604ad8acd8fcb79e1b7.jpeg

[H4]Разборка[/H4]
Попробуем понять, как это работает. Для начала разберём дверь и заглянем внутрь.

Там всего две платы:

  • 1 плата снаружи с батареями, клавиатурой, светодиодами и зуммером.
  • 1 плата внутри с памятью и соленоидом (который механически отпирает болты).
7dcff244073bda753c230256f058ba6e.png
5559c416e2a7f0c433566141495f067d.png

[H4]Захват[/H4]
Между этими двумя платами есть 4 провода (чёрный, жёлтый, зелёный и красный). Поскольку цвета проводов не всегда соответствуют назначению, не будем безоговорочно им доверять. Мы можем осмотреть дорожки на плате, чтобы найти схему проводки, но поскольку мой новый логический анализатор может обрабатывать 8 каналов, давайте просто подключим каждый провод.

Такому электронному сейфу нужен 5-значный код, поэтому для первого захвата я просто нажму клавишу «1» 5 раз.

f8a962763016a923e903dea9db5b8fe8.png

Результат: только сигнал зелёного провода начал меняться. Чёрный всегда низкий, жёлтый и красный всегда высокие (значит, цветам можно доверять).

На захваченном сигнале мы видим 5 повторений одной и той же фигуры подряд, поэтому можно сделать вывод, что эта фигура соответствует нажатию клавиши «1» (так как именно её мы и нажимали 5 раз). Чтобы декодировать полный сигнал, мы должны найти используемый протокол.

Этот сейф не относится к открытому аппаратному или программному обеспечению, поэтому мы не знаем, как он работает. Нужно копаться.

Давайте рассмотрим чипы на платах. На каждой из них только один микроконтроллер.

99f321732a076cbc053d388b00b0fd55.jpeg

Согласно техническому описанию, основными протоколами связи, используемыми с этим микроконтроллером, являются SPI и I²C. Но не в этот раз, потому что им обоим нужен тактовый сигнал, а на других проводах нет никакого движения. Так что это скорее всего наиболее часто используемый протокол асинхронной шины: UART.

Хорошие новости: ПО с открытым исходным кодом для просмотра импульсов содержит множество декодеров, включая UART.

Но какая частота используется?

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

17fca92577d924ebce7007909923a676.png

Для передачи всего ключа потребовалось 2,1 мс, а самый короткий пик занял примерно 0,2 мс. Обычно UART использует 1 стартовый бит, 8 бит данных и 1 стоповый бит. Итого 10 бит.

2,1 мс / 10 = 0,21 мс

Это значение соответствует нашему самому короткому пику.

10 бит за 2,1 мс. Таким образом (1000 мс / 2,1 мс) * 10 = количество бит, которое можно передать за секунду, примерно равно 4762.

Частота UART должна соответствовать 9600 делениям. Значение 4762 очень близко к 4800, что соответствует 9600/2, обычной скорости для UART.

Поэтому мы пытаемся установить эту частоту в нашем декодере.

4f06147cd44f3fd9a9cb0916f7d9e9c7.png

Работает! Мы можем прочитать наши 5x "1" ключей.

После некоторых попыток с разными кодами можно сделать следующие наблюдения о разных частях сигнала:

  • сигнал всегда начинается с формы пробуждения с низким состоянием 2,7 мс, затем высоким 0,25 мс (не является частью протокола UART);
  • после пробуждения сигнал всегда отправляет 0x0 байт;
  • после этого отправляется фиксированное значение 0x71, похоже это командный байт (0x71 = попытка разблокировать);
  • затем отправляются 5 цифр введённого кода;
  • наконец, последний байт меняется в зависимости от кода, похоже, это кастомная контрольная сумма (Checksum, строка чисел и букв, используемая для уникальной идентификации).
Вот данные:

Байт команды
Пробный код
Контрольная сумма
0x71​
11111​
0x76​
0x71​
22222​
0x7B​
0x71​
12345​
0x80​
Мы видим, что контрольная сумма равна байту команды, к которому добавили каждый байт кода.

Теперь у нас есть вся информация, необходимая для автоматизации этого процесса с помощью короткой функции Arduino.

Код:
 void send_command(int command, int a, int b, int c, int d, int e) {  int checksum = (command + a + b + c + d + e);    // Wake-up signal shape  pinMode(pin, OUTPUT);  digitalWrite(pin, LOW);  delayMicroseconds(2750);  digitalWrite(pin, HIGH);  delayMicroseconds(200);  // Data  Serial.begin(4800);  Serial.write(0x0);  Serial.write(command);  Serial.write(a);  Serial.write(b);  Serial.write(c);  Serial.write(d);  Serial.write(e);  Serial.write(checksum);  Serial.end();  pinMode(pin, OUTPUT);  digitalWrite(pin, HIGH); }
Но даже если каждый вариант кода можно попробовать очень быстро, в сейфе есть защита от брутфорса. Поэтому я пытаюсь зафиксировать сигнал во время изменения кода, чтобы увидеть, что добавляется.

Чтобы изменить код:

  • Нажмите кнопку «P».
  • Введите заводской код.
  • Введите новый код.
bedbff0ec0d230c2092f62ddaee3860c.png

Когда мы смотрим на сигнал:

  • Некоторые странные кастомные формы отправляются во время нажатия «P».
  • Плата клавиатуры отправляет заводской код с командным байтом 0x74.
  • Чип внутри отвечает, действителен заводской код или нет (заводской код печатается в руководстве, генерируется случайным образом и не может быть изменен)
  • Клавиатура отправляет новый код с командным байтом 0x75
Я также фиксирую обмен сигналами во время загрузки, так что теперь мы можем сопоставить некоторые функции:

Байт команды
Функция
Предоставленный код
0x71​
Попытка разблокировки​
Код, чтобы попробовать​
0x74​
Попытка инициировать изменение кода​
Заводской код​
0x75​
Завершить процесс изменения кода​
Новый код​
0x78​
Загрузка​
00000 (ноль)​
Но что произойдёт, если вы напрямую пошлёте новый кодовый сигнал, пропустив шаг заводского кода?

...код перезаписывается!!! Таким образом, мы можем сбросить код, не зная об этом.

Теперь мы можем открыть любой электронный сейф Sentry Safe & Master lock за секунду.

[H4]Доказательство[/H4]
В качестве доказательства концепции я создам карманный инструмент.

Возьму микроконтроллер Atmega328, 8бит AVR на 8МГц (без кварца). Залив программу на свою флешку, припаиваю две батарейки CR2032, кнопку и два пина.

Программа просто отправит сигнал сброса, чтобы установить фиктивный код, а затем отправит сигнал разблокировки, чтобы открыть сейф.

И всё это устройство я поместил в ручку! В итоге у меня получился настоящий инструмент для пентеста! (здесь у нас непереводимая игра слов, потому что ручка "pen" стала инструментом для пентеста "pen-test'')

ea53f9527528c31e984a7241555f7d2d.png
2d3a8006155159b8c7e2299555da1443.png

Как это использовать:

  • Снимите крошечный винт у сейфа.
  • Прикоснитесь к черному и зеленому проводам двумя кончиками ручки.
  • Нажмите кнопку.
  • Сейф открыт!
[H4]Демонстрация[/H4]
b70a75d3c512faf75aa3d85c8c412675.gif









 
Не самый дешевый сейф кстати . На amazon продается за 400 фунтов , на chipdip вообще за 80т.р. :(
 
Сверху Снизу