07.07.2017

Внедрение клавиатурного шпиона в KVM-свитч Belkin E Series OmniView 2-Port

image

В этой статье будет продемонстрирована  возможность модификации стандартного KVM-свитча с целью  добавления функции перехвата нажатых клавиш на базе платформы Arduino.

Автор: Ian Payton, Security Advisory EMEAR

Введение

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

Один из методов связан с физической модификацией систем, например, с целью добавления вредоносной функциональности для извлечения нужной информации без эксплуатации брешей в программном обеспечении.
В этой статье будет продемонстрирована возможность модификации стандартного KVM-свитча (Keyboard, Video monitor, Mouse; устройство для управления несколькими системами из одного места) с целью добавления функции перехвата нажатых клавиш на базе платформы Arduino. Мы покажем, что подобное можно сделать при помощи стандартных инструментов и компонентов с минимальными знаниями в области электроники и программирования.
KVM-свитчи представляют собой устройства, часто используемые в таких случаях, когда необходимо управлять множеством компьютеров при помощи одной клавиатуры, мыши и монитора.

Эти свитчи подразделяются на несколько категорий:

  • KVM-свитчи начального уровня для домашнего применения и небольших офисов. Управляются при помощи физической кнопки и не представляют особого интереса для злоумышленника.
  • KVM-свитчи, позволяющие переключаться между подсоединенными компьютерами при помощи комбинации клавиш. Поскольку в определении нажатых клавиш участвует микроконтроллер, эти устройства пригодны для установки клавиатурного шпиона.
  • KVM-свитчи, используемые на предприятиях, которые позволяют более плотную интеграцию в различные системы. Эти устройства намного сложнее и даже могут работать на базе небольших операционных систем. Здесь у злоумышленника самое большое пространство для маневра.

В этой статье мы будем рассматривать KVM-свитч из второй категории. Ситуация возникла во время одного из проектов, когда клиент обратил внимание на порт RJ45 и попросил провести оценку безопасности устройства.
KVM-свитч Belkin E Series OmniView 2-Port предназначен для домашнего пользования или небольших офисов и позволяет переключаться между управляемыми компьютерами при помощи комбинации горячих клавиш. Эта модель была выбрана в качестве наглядного образца среди устройств данной категории. Соответственно, результаты анализа применимы к схожим моделям от других производителей. На аукционе eBay можно найти экземпляры стоимостью менее 10 фунтов.

Рисунок 1: KVM-свитчBelkin E Series OmniView 2-Port
Внутреннее устройство свитча
Внутри корпуса обнаружились следующие компоненты:

  • Микроконтроллер PIC16C57C

PIC-микроконтроллер (однократного программирования) выпускаемый компанией Microchip Technology. Большая микросхема, распложенная в правой стороне задней части печатной платы рядом с цилиндрическим черным устройством, издающим звуковые сигналы. Как видно на рисунке ниже, микроконтроллер вставлен в двухрядный корпус, что сильно облегчает извлечение с целью последующего реверс-инжиниринга.

  • 5 x 74HC4053D

Тройные аналоговые сдвоенные мультиплексоры, выпускаемые компанией NXP. Двойной мультиплексор может переключить одиночный вход на один из двух выходов. Эти пять устройств, вероятно, формируют основную логику для переключения клавиатуры и мыши PS/2 между одним из четырех выходных портов.

Рисунок 2: Внутреннее устройство KVM-свитча Belkin E Series OmniView 2-Port

Микроконтроллер PIC16C57C

Модель PIC16C57C принадлежит семейству популярных микроконтроллеров, выпускаемых компанией Microchip Technology, которые также популярны среди радиолюбителей. В сети находится большое количество доступной документации. Даташит на модель PIC16C57C можно найти среди документации на микроконтроллеры того же семейства:

Документация содержит сведения о программировании и протоколе проверки подлинности, что упрощает реверс-инжиниринг.

Анализ прошивки

В спецификации по программированию/верификации микроконтроллера PIC16C57C говорится о том, как выполнить процедуру «быстрой верификации». Требуется следующая последовательность действий:

    • Включить питание (5В - пин Vdd, Земля – пин Vss).
    • На пине T0CKI удерживать высокий уровень.
    • На пине OSC1 удерживать низкий уровень.
    • На пине Vpp подать напряжение 13В (в этом случае микроконтроллер перейдет в режим программирования и обнулится программный счетчик).
    • Значение текущего программного счетчика можно считать с пинов RA0-RA3, RB0-RB7 (в PIC16C57C используется 12-битное слово).
    • На пине OSC1 установить высокий уровень. Программный счетчик увеличится.
    • На пине OSC1 установить низкий уровень и повторить шаг 5.
    • Продолжать до тех пор, пока все участки памяти не будут считаны.


Рисунок 3: Схема пинов микроконтроллера PIC16C57C

При помощи этой процедуры вначале будет считан специальный конфигурационный регистр, содержащий псевдо-адрес 0xFFF. Как только на пине OSC1 начнут подаваться тактовые импульсы (шаги 6 и 7), будет считывается адрес 0x000, затем 0x001 и т. д.

Создание верификатора

Во время промышленного программирования для чтения содержимого памяти PIC-контроллеров можно использовать процедуру, описанную выше. Есть и другой путь: относительно простой протокол-верификатор на базе Arduino, системы разработки небольших микроконтроллеров (или любой другой похожей системы с достаточным набором входных/выходных пинов общего назначения, например, Raspberry Pi). 13В нужно подводить из внешнего источника, поскольку в системах разработки наподобие Arduino и Raspberry Pi, предусмотрены напряжения размером 5В и ниже.

На рисунке ниже показана плата Arduino Uno, подключенная к ZIF-сокету (Zero insertion force; с нулевым усилием сочленения) с подключенным микроконтроллером PIC16C57C, извлеченным из KVM-свитча. Источник питания для подачи напряжения 13В с целью активации режима программирования также показан. В следствие ограничений платы Arduino Uno, возможно чтение лишь 4 битов с микроконтроллера. Однако можно переконфигурировать устройство так, чтобы считать остальные биты и содержимое PIC16C57C в несколько подходов. Другие платы (например, Arduino Mega) имеют достаточно количество входных/выходных пинов для одновременного считывания всех 12 битов.


Рисунок 4: Верификация микроконтроллера PIC16C57C при помощи Arduino

Защита кода

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

Анализ логики работы микросхемы

После анализа прошивки в предыдущем разделе стало понятно, что считать память микроконтроллера PIC16C57 невозможно. Таким образом, использование KVM-свитча в качестве клавиатурного шпиона можно добиться двумя способами:

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

Исследование назначения пинов

В микроконтроллере PIC16C57C есть 20 входных/выходных выводов общего назначения. Назначение этих пинов можно исследовать при помощи мультиметра, осциллографа или логического анализатора, подсоединенных к нужным выводам. Во время подключения к пину KVM-свитч выполняет определенные функции и одновременно отслеживается сигнал на выводе с целью сопоставления выполняемой функции и измеряемого сигнала. Перепады напряжений на пинах могут быть медленными (например, когда включается/выключается LED-подсветка) или быстрыми (например, на информационной шине или шине, связанной с таковыми сигналами). Быстрые перепады можно отследить лишь при помощи осциллографа или логического анализатора.

Каждый пин должен быть исследован во время выполнения различных функций в KVM-свитче:

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

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

Рисунок 5: Схема подключения осциллографа для исследования функциональности пинов

Последующий анализ печатной платы можно сделать при помощи мультиметра в режиме измерения сопротивления, чтобы определить, какие из пинов подсоединены к остальным компонентам. В случае с KVM-свитчем модели Belkin исследование значительно облегчается, поскольку микроконтроллер PIC16C57C вставлен в разъем, и мы можем просто извлечь микросхему и измерить сопротивление между пинами и остальными компонентами. 

Некоторые пины микроконтроллера PIC16C57C имеют неизменную функциональность (см. диаграмму выходного сигнала выше). Для нас особый интерес представляют входные/выходные пины под номерами 6-25. Исследование при помощи осциллографа и мультиметра выявило следующее:

Пины 6-14:

  • Пин 6 – RA0 – Обычно имеет высокий уровень. Уровень снижается при нажатии на кнопочный переключатель. Скорее всего, это входной пин для кнопочного переключателя, используемый с целью изменения выходного порта.
  • Пин 7 - RA1 – Имеет низкий уровень, когда выбран Порт 1, и высокий – когда выбран Порт 2. Исследование дорожек на печатной плате выявило, что по смыслу этот пин сопрягается с выводами, связанными с выбором входного сигнала, мультиплексоров 74HC4053D. Во время использования мультиметра в режиме измерения сопротивления выяснилось, что этот пин соединен с выводами S1, S2, S3, связанными с выбором входного сигнала, в мультиплексорах 74HC4053D (микросхемы U7, U8, U9, U10). Таким образом, скорее всего, это выходной пин, выбирающий выходные Порты 1 и 2 в KVM-свитче.
  • Пин 8 – RA2 – Как и в случае с Пином 7, при низком уровне выбран Порт 1, при высоком – Порт 2. При использовании мультиметра в режиме измерения сопротивления выяснилось, что этот пин подсоединен к выводам S1, S2 и S3 в микросхеме U2, и к выводу OE1 микросхемы U3 (функциональность схожая с мультиплексором). Таким образом, это еще один выходной пин, который выбирает между выходными Портами 1 / 2 свитча. Пока до конца не понятно, почему Пины 7 и 8 имеют схожую функциональность. Одна из версий: Пин 7 отвечает за управление и переключение клавиатуры и мыши (разъемы PS/2), а Пин 8 – за переключение видео. В целом требуется более детальное расследование.
  • Пин 9 – RA 3 – Обычно имеет высокий уровень, но при переключении между портами KVM-свитча наблюдаются изменения. Во время переключения портов сигнал на этом пине на осциллографе отображается в виде волны со структурой примерно 3 периода на сантиметр при масштабе 1мс/см. То есть у нас получается волна с частотой 3кГц. Скорее всего, этот пин напрямую управляет звуковым устройством. При определенных обстоятельствах (например, при переключении между выходными портами) KVM-свитч издает короткий пронзительный звук (частотой около 3 кГц).
  • Пин 10 – RB0 – Высокий уровень, если к выходному Порту 1 свитча подключено устройство. Скорее всего, это разрешение на работу с устройством, подключенным к Порту 1. Во время переключения между портами, на этом пине появляется низкий уровень в течение значительного периода (в течение примерно 1 секунды), а затем вновь появляется высокий уровень. В период низкого уровня на этом пине, на Порте 1 отсутствуют сигналы, хотя есть активность на пинах 20-23 (мышь/клавиатура). Примечателен еще и тот факт, что LED-подсветка, сигнализирующая о том, что порт выбран, также не меняется во время низкого уровня (в течение примерно одной секунды).
  • Пин 11 – RB1 – Высокий уровень, если к выходному Порту 2 свитча подключено устройство. Скорее всего, это разрешение на работу с устройством, подключенным к Порту 2. Во время переключения между портами, на этом пине появляется низкий уровень в течение значительного периода (в течение примерно 1 секунды), а затем вновь появляется высокий уровень. В период низкого уровня на этом пине, на Порте 2 отсутствуют сигналы, хотя есть активность на пинах 20-23 (мышь/клавиатура). Примечателен еще и тот факт, что LED-подсветка, сигнализирующая о том, что порт выбран, также не меняется во время низкого уровня (в течение примерно одной секунды).
  • 12 - RB2 – Высокий уровень – Активность отсутствует – отсутствуют соединения на печатной плате.
  • 13 – RB3 – Низкий уровень – Активность отсутствует – отсутствуют соединения на печатной плате.
  • 14 – RB4 – Высокий уровень – Активность отсутствует. На печатной плате присутствует дорожка, которая предположительно ведет к Пину 14 микросхемы U9. Гипотеза подтверждена мультиметром в режиме измерения сопротивления. Это входной пин 'Input 1' в мультиплексоре 74HC4053, который будет в качестве переключателя между пином Порта 1 и Порта 2 средствами мультиплексора. Этот пин может быть входным или выходным, и, таким образом, KVM-свитч будет либо отсылать сигнал коннектору PS/2, соединенному с выходным портом, либо получать сигнал обратно. Однако активности на этом пине обнаружено не было при реализации различных сценариев.

Пины 15-25

  • Пин 15 – RB5 – Высокий уровень - Активность отсутствует – отсутствуют соединения на печатной плате.
  • Пин 16 – RB6 – Высокий уровень - Активность отсутствует – отсутствуют соединения на печатной плате.
  • Пин 17 – RB7 – Высокий уровень - Активность отсутствует – отсутствуют соединения на печатной плате.
  • Пин 18 – RC0 – Низкий уровень - Активность отсутствует – отсутствуют соединения на печатной плате.
  • Пин 19 – RC1 – Высокий уровень - Активность отсутствует – отсутствуют соединения на печатной плате.
  • Пин 20 – RC2 – Мышь PS/2 – Тактовые импульсы. Осциллограф показывает стабильную серию импульсов во время перемещения мыши. Регулярность импульсов намекает на то, что этот генератор предназначен для мыши. Некоторая активность на этом пине была обнаружена во время переключения между выходными портами, но когда мышь не двигалась. См. комментарии ниже, касающиеся назначения пинов 10-11.
  • 21 - RC3 – Мышь PS/2 – Данные. Осциллограф показывает нерегулярные импульсы во время движения мыши. Нерегулярность импульсов намекает на то, что это информационный пин, предназначенный для мыши. Некоторая активность на этом пине была обнаружена во время переключения между выходными портами, но когда мышь не двигалась. См. комментарии ниже, касающиеся назначения пинов 10-11.
  • 22 – RC4 – Клавиатура PS/2 – Тактовые импульсы. Осциллограф показывает стабильную серию импульсов на этом пине при нажатии или отпускании клавиши. Регулярность импульсов намекает, что этот генератор предназначен для клавиатуры.
  • 23 - RC3 – Клавиатура PS/2 – Данные. Осциллограф показывает нерегулярные импульсы во время нажатия или отпускания клавиши. Нерегулярность импульсов намекает на то, что это информационный пин, предназначенный для клавиатуры.
  • 24 - RC6 - LED1. Этот пин напрямую связан с состоянием LED для Порта 1. Скорее всего, выходной пин для управления подсветкой.
  • 25 - RC7 - LED2. Этот пин напрямую связан с состояние LED для Порта 2. Скорее всего, выходной пин для управления подсветкой.

Назначение пинов 10-11: Изоляция выходов

Как было отмечено выше, на пинах 10-11 во время переключения появляется низкий уровень. Кроме того, во время переключения была замечена активность на информационных и тактовых пинах, связанных с разъемами PS/2 (20-23). Скорее всего, KVM-свитч временно отключает выходы разъема PS/2 и посылает сигналы сброса для мыши и клавиатуры, которые участвуют в процессе переключения. Протокол, используемый разъемами PS/2, является двунаправленным, позволяя хосту управлять функциями подключенного устройства. Например, можно устанавливать индикаторы состояния клавиш Caps lock, Num lock и т. д. KVM-свитчу нужно следить за этими настройками для каждого устройства (клавиатуры и мыши) в разрезе по хосту/порту. При переключении между портами необходимо восстанавливать последнее сохраненное состояние для каждого хоста. Чтобы решить эту задачу во время переключения, KVM-свитч выставляет на пине 10 или 11 низкий уровень для отключения соответствующего выходного порта. Затем происходит отсылка сигналов по шине PS/2 к подключенной мыши или клавиатуры для обнуления состояния. Выставление низкого уровня на пине 10 или 11 необходимо для того, чтобы хост, подключенный к выходному порту, не мог отслеживать сигнал между KVM-свитчем и мышью/клавиатурой.
Кроме того, KVM-свитч поддерживает переключение при помощи горячих клавиш. Вход в этот режим осуществляется после двойного нажатия клавиши «Scroll Lock». Затем появляется звуковой сигнал, сигнализирующий, что устройство перешло в состояние для считывания горячих клавиш, и свитч ожидает нажатия дополнительных клавиш в течение 1 секунды. Любое нажатие в течение этого времени интерпретируется KVM-свитчем и не отсылается подсоединенному компьютеру. Этот функционал требует, чтобы выходные порты, подключенные к шине PS/2, были отключены в то время, пока свитч ожидает нажатия горячих клавиш, что достигается посредством выставления на пине 10 или 11 низкого уровня.

Неполный анализ

Анализ, проведенный выше, выявил много нового относительно функциональности KVM-свитча. Однако остались некоторые невыясненные моменты. На нескольких пинах (12-19) не было замечено никакой активности во время работы с KVM-свитчем. Если бы на этих пинах всегда был высокий уровень, означающий обычно стандартное или неактивное состояние, можно было бы сделать предположение, что эти выводы не используются. Однако тот факт, что на некоторых пинах был низкий уровень, намекает на то, что возможно данные выводы используются. Исследование дорожек на печатной плате показало, что подсоединен только Пин 14, но пока с непонятным предназначением.
Поскольку анализ является неполным, восстановление рабочей прошивки с нуля, может стать непростой задачей. Значит, для внедрения клавиатурного шпиона у нас остается второй вариант, связанный с подключением второго микроконтроллера.

Интерфейс PS/2

Чтобы получить доступ к информации, вводимой с клавиатуры, в интерфейсах PS/2, используемых на KVM-свитче, необходимо понимать, как устроен этот протокол. С описанием протокола PS/2 можно ознакомиться по следующей ссылке:

Интерфейс PS/2 может управлять либо хостом, либо устройством, подключенным к выходному порту. Электрические характеристики этого интерфейса подразумевают, что возможно внедрить данные в шину PS/2 даже, когда к ней подключены одновременно и хост и устройство. Этот факт полезно принять во внимание при внедрении дополнительного контроллера в KVM-свитч.

Реализация клавиатурного шпиона

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

Съем собранной информации следует реализовывать на базе уже существующих интерфейсов KVM-свитча. Впоследствии злоумышленнику понадобится лишь физический доступ к KVM-свитчу для извлечения собранной информации. На втором микроконтроллере нужно реализовать дополнительную последовательность нажатых клавиш, при активации которой будет происходить выгрузка записанных нажатий в систему, подключенную к KVM-свитчу. Затем злоумышленник может открыть текстовый редактор на целевой системе и нажать комбинацию горячих клавиш для выгрузки записанной информации в текстовый файл.

Ограничения по электрическим характеристикам

Существует серьезное ограничение при подключении второго микроконтроллера к PIC16C57C, которое заключается в том, что сигнал любого пина, сконфигурированного как выходного в PIC16C57C, не может быть переключен в другое состояние дополнительным микроконтроллером. Выдержка из даташита на микроконтроллер PIC16C57C (раздел 7.6.1):

«Пин, выдающий высокий или низкий уровень не должен одновременно управляться внешним устройством для изменения уровня сигнала на этом выводе (при помощи элементов «Логическое Или», «Логическое И»). Результирующие выходные токи могут испортить чип».

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

Совместное использование шины PS/2

Один из вариантов для извлечения информации из клавиатурного шпиона – отправка данных как серии нажатых клавиш на подсоединенный хост. Чтобы решить эту задачу, KVM-свитч должен взять на себя роль периферического устройства (клавиатуры) на шине PS/2 и наладить коммуникацию с хостом от имени «поддельной» клавиатуры. Однако в то же время шина PS/2 будет подсоединена к настоящей клавиатуре. Здесь возникает закономерный вопрос, возможно ли извлечение информации в при таких обстоятельствах.

Шина PS/2 спроектирована для прямого соединения между хостом и периферическим устройством. Это простой двухканальный протокол (тактовые импульсы и информационная шина), который поддерживает двухстороннюю коммуникацию. Этот функционал основан на интерфейсе с открытым коллектором для тактового и информационного пинов (см. раздел "The Electrical Interface"), позволяя либо хосту, либо периферическому устройству устанавливать низкий уровень на любом из пинов.

Таким образом, чисто с позиции электрических характеристик второе периферическое устройство (KVM-свитч) может управлять тактовым и информационным пинами интерфейса PS/2. С точки зрения хоста, периферические устройства (настоящая клавиатура или KVM-свитч, работающий в качестве «поддельной» клавиатуры) будут неразличимы. Однако здесь возникает вопрос, будет ли провоцировать активность «поддельной» клавиатуры неожиданное поведение настоящей клавиатуры.

В протоколе PS/2 большая часть коммуникаций происходит между периферическим устройством и хостом. Тактовые импульсы и информацию большую часть времени генерирует периферическое устройство. Если хосту нужно отправить информацию периферическому устройству, например, установить состояние LED-индикации для клавиши Caps Lock), то вначале хост оповещает периферическое устройство о том, что планируется пересылка информации, посредством удерживания низкого уровня более 100 мкс как части сигнала для «запроса на отправку». Таким образом, сложность заключается в том, что активность на шине PS/2 со стороны KVM-свитча, функционирующего в качестве «поддельной» клавиатуры, может быть интерпретировано настоящей клавиатуры как «запрос на отправку» от хоста.

При отсылке сигналов по шине PS/2 периферическое устройство генерирует тактовые импульсы в диапазоне 10-16.7 КГц, и длительность импульса 100 мкс будет соответствовать самой низкой тактовой частоте (10 кГц). Таким образом, чтобы активность поддельной клавиатурой не интерпретировалась как «запрос на отправку», нужно понижать уровень максимум на 50 мкс. В этом случае общее использование шины PS/2 становится возможным.

Детектирования нажатия последовательности горячих клавиш

Выгрузка снятой информации будет активироваться при помощи дополнительного нажатия последовательности горячих клавиш. Вначале нужно дважды нажать клавишу «Scroll Lock» в течение определенного времени. Затем PIC16C57C выставляет низкий уровень на соответствующем пине (10 или 11), связанным с подключением выходных портов, в течение около 1 секунды для предотвращения отсылки нажатых клавиш хосту. В течение этого времени ожидается нажатие последовательности нажатых клавиш. Например, нажатие клавиши «1» или «2» приведет к переключению на выходной порт 1 или 2 соответственно.

Существует два пути для реализации нажатия клавиш с целью извлечения сохраненной информации:

  • Независимо детектировать двойное нажатие клавиши «Scroll Lock» вторым микроконтроллером.
  • Детектировать низкий сигнал на пинах, связанным с подключением выходных портов, что сигнализирует о нажатии последовательности горящих клавиш.

При независимом детектировании двойного нажатия «Scroll Lock» есть риск, что PIC16C57C и второй микроконтроллер не смогут обнаружить этот факт в одно и то же время. Соответственно, нужно использоваться второй способ, связанный с состоянием пинов, подключающих выходные порты, поскольку этот метод более надежен для определения того, что KVM-свитч ожидает нажатия горячих клавиш.

Экспериментальное оборудование

При изготовлении экспериментальной версии клавиатурного шпиона использовалась плата Arduino Uno. На этой плате есть входные/выходные пины и среда программирования на базе языка С, при помощи которой можно получать доступ к выводам с целью установки прототипов.
 
Рисунок 6: Экспериментальная версия клавиатурного шпиона на базе платы Arduino Uno

На рисунке выше показана плата, подключенная к микроконтроллеру PIC16C57C, используемого KVM-свитчем.

  • Черный щуп: Пин 4 в микроконтроллере PIC16C57C (земля). Соответственно, земля и на плате Arduino.
  • Синий щуп: Пин 22 в микроконтроллере PIC16C57C (пин с тактовыми импульсами клавиатуры PS/2). Цифровой I/O Пин 2 на плате Arduino.
  • Зеленый щуп: Пин 23 в микроконтроллере PIC16C57C (информационный пин клавиатуры PS/2). Цифровой I/O Пин 8 на плате Arduino.
  • Красный щуп: Пин 11 в микроконтроллере PIC16C57C (разрешающий сигнал для выходного порта 2 в KVM-свитче). Цифровой I/O Пин 9 на плате Arduino.

В экспериментальных целях используется только шина, включающая Порт 2.

Программное обеспечение для клавиатурного шпиона

Алгоритм работы

В целом программа на платформе Arduino будет находиться в трех состояниях:

  • Когда сигнал, связанный с подключением выходного порта, высокого уровня (порт разрешен), записываются все нажатые клавиши.
  • Когда сигнал, связанный с подключением выходного порта, низкого уровня (порт отключен из-за ожидания ввода горячих клавиш), детектируется последовательность горячих клавиш для выгрузки собранной информации.
  • Если опознана последовательность горячих клавиш на съем собранных сведений, и сигнал, связанный с подключением выходного порта, меняется с низкого на высокий (порт снова разрешен), выгружается информация обо всех нажатых клавишах.

Если опознана последовательность горячих клавиш, необходимо дождаться, когда сигнал, связанный с подключение выходного порта, вновь станет высокого уровня. Иначе любые данные, связанные с нажатием и добавляемые в шину PS/2 не увидит хост. В экспериментальной версии используется последовательность нажатых клавиш QQ (от слова «Query»). Два наатия сделано для того, чтобы настоящий пользователь KVM-свитча случайно не ввел эту комбинацию.

Запись нажатых клавиш

Преимущество разработки на базе Arduino заключается в том, что имеется большое количество библиотек. Для нашего случая использовалась библиотека «PS2Keyboard», доступная под лицензией LGPL. В этой библиотеке реализовано чтение нажатых клавиш с клавиатуры PS/2, управляемой прерываниями, а также автоматическая конвертация скан-кодов в ASCII символы с учетом состоянии регистра. В итоге в приложение попадает информация в формате ASCII.
Из-за того каким способом плата Arduino подсоединена к микроконтроллеру PIC16C57C, необходимо использовать те же самые пины для чтения данных с клавиатуры во время считывания нажатий и записи информации от имени клавиатуры. PS2Keyboard поддерживает только чтение данных, а для отсылки нужна отдельная библиотека. Чтобы добавить эту возможность, необходимы небольшие изменения в дополнении к методу end(), связанные с разблокировкой прерывания, используемого при чтении информации. Без этого дополнения библиотека PS2Keyboard будет считывать информацию и во время нажатия.

Во время записи нажатий, информация, получаемая из библиотеки, хранится в кольцевом буфере и готова к выгрузке. Кроме того, не следует забывать, что эти данные в формате ASCII, а не скан-коды протокола PS/2. Этот факт следует учитывать во время передачи информации.

Выгрузка собранной информации

Чтобы выгрузить собранную информацию о нажатии клавиш через интерфейс клавиатуры PS/2 необходима другая библиотека. Поскольку среди уже существующих бесплатных нужная отсутствует, необходимо писать решение с нуля.
Протокол PS/2 использует тактовую частоту в диапазоне 10-16.7 кГц и отсылает последовательные данные со следующими характеристиками:

  • Один начальный бит (на шине данных низкий уровень).
  • 8 информационных битов (вначале идет младший значащий бит).
  • Один бит для контроля четности (проверка на нечетность).
  • Один стоповый бит (на информационной шине высокий уровень).

Информация считывается хостом на спадающем фронте тактового импульса (во время перепада от высокого уровня к низкому). Подобный формат передачи данных не соответствует ни одному встроенному протоколу, используемому в Arduino. Соответственно, нужно писать новый драйвер. Чтобы реализовать протокол PS/2, можно использовать драйвер, генерирующий программные прерывания на частоте, которая в два раза больше диапазона 10-16.7 кГц (чтобы генерировать и нарастающие и спадающие фронты тактового импульса). Плата Arduino Uno поддерживает 3 аппаратных таймера, способных генерировать программные прерывания. В нашей экспериментальной версии был выбран Timer 2 (Timer 1 используется некоторыми стандартными библиотеками Arduino и является непригодным).

Был написан драйвер, который вручную устанавливает тактовые импульсы протокола PS/2, а также информационные пины с использованием таймера Timer 2 на плате Arduino, генерирующего прерывания на частоте 25 кГц. При каждом прерывании на тактовом пине постепенно устанавливается низкий/высокий уровень и на информационном пине – стартовый бит, биты данных, бит четности и стоповый бит, как того требует спецификация.

Когда стартует процесс выемки записанной информации при помощи последовательности клавиш, необходимо передать данные из кольцевого буфера. Поскольку в буфере находятся шестнадцатеричные ASCII символы перед отправкой требуется обратное преобразование в скан-коды, которые допустимы для передачи по протоколу PS/2. Чтобы облегчить конвертацию информация извлекалась в формате, совместимом с утилитой 'xxd', которая используется в Linux и других схожих системах, подобно тому, как показано ниже:

7373682074617267657473797374656d
0a726f6f740a50617373773072643132
330a

Для каждого выходного шестнадцатеричного символа драйвер протокола PS/2 генерирует скан-код нажатой клавиши, соответствующий шестнадцатеричному символу, а затем скан-код той же самой отпущенной клавиши. Весь процесс продолжается до тех пор, пока не будет обработано содержимое всего буфера.

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

Исходный код

Исходный текст экспериментального клавиатурного шпиона можно найти здесь:

Заключение

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

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


comments powered by Disqus