Що можна зробити з системою за допомогою прав root в SqLite?

  1. Зміст статті SQLite - дуже популярне рішення зберігання даних, і операційна система Android не виняток....
  2. accounts.db
  3. mmssms.db
  4. Продовження доступно тільки учасникам
  5. Варіант 2. Відкрий один матеріал

Зміст статті

SQLite - дуже популярне рішення зберігання даних, і операційна система Android не виняток. Сама система і багато програм використовують для зберігання інформації бази даних - файли з розширенням db. Які саме дані містяться в базах, як їх подивитися, що з ними можна зробити і чим це загрожує пристрою з правами суперкористувача - про все це я розповім в статті.

Робота з базами

Для роботи з базами існує чимало різного софта як для компа, так і для Android-пристроїв. Бази додатків зазвичай знаходяться по шляху / data / data / НАЗВА ПАКЕТУ ДОДАТКИ / databases. Дізнатися назву пакета цікавить додатки можна зайшовши в «Налаштування -> Додатки -> Все» і вибравши потрібний (відкриється вкладка «Про програму»), або в адресному рядку браузера на сторінці додатка в Play Market.

Щоб потрапити в сам каталог / data / data, необхідні права суперкористувача, а з переглядом вмісту відмінно впорається Root Explorer. Для більш зручної роботи, а також для редагування баз на пристрої можна використовувати, наприклад, SQLite Debugger , А на компі - DB Browser for SQLite . Для роботи з базами також необхідний встановлений BusyBox з апплетом sqlite3. Всі маніпуляції в статті проводяться на Nexus 5 з прошивкою 5.1. Доступні для перегляду і редагування бази, розбиті за відповідними програмами, на пристрої можна подивитися в тій же програмі SQLite Debugger, натиснувши на головному екрані меню App. Так чому ж можуть бути корисні бази в першу чергу тобі і що може вкрасти зловмисник? Спробуємо розібратися.

accounts.db

Знаходиться в / data / system / або / data / system / users / 0 в залежності від версії прошивки і містить дані про всі облікові записи, зареєстрованих на пристрої. Як видно на скріншоті «Структура accounts.db» в таблиці accounts, до мого пристрою прив'язане п'ятнадцять акаунтів різних програм. Майже для всіх вказані логіни, для частини є паролі (на малюнку частина видалена) в зашифрованому вигляді.

Майже для всіх вказані логіни, для частини є паролі (на малюнку частина видалена) в зашифрованому вигляді

структура accounts.db

У таблиці authtokens містяться токени авторизації від додатків, всіх сервісів Google, GMS і інших додатків. На вкладці extras - додаткові ключі і значення, такі як GoogleUserId і список підключених додатків / сервісів. У мене їх близько п'ятдесяти, включаючи Talk, YouTube, URL shortener, Wallet і інші.

Токени авторизації в accounts.db

Не скажу, чи може зловмисник розшифрувати паролі з бази, але отримати доступ до сервісів можна, просто підкинув базу на інший пристрій. Спробуємо провести такий експеримент. Візьмемо базу зі смартфона Nexus 5 і планшет Nexus 7 з чистою системою (свіжовстановленому 5.1 через flash-all.bat з ключем -w, потім root). Після завантаження чистої системи натискаємо «Пропустити» при запиті додавання облікового запису, далі встановлюємо весь софт, прописаний в accounts.db (WhatsApp офіційно не підтримує роботу на планшетах, тому качаємо APK з виразника або 1mobile.com). Далі скидаємо базу зі смартфона, поміщаємо в каталог / data / system / users / 0 на планшеті і перезавантажуємося.

Після завантаження бачимо, що на вкладці «Налаштування -> Облікові записи» з'явився наш аккаунт Google і дав нам повний доступ до всіх пов'язаних програмами. Пошта, за допомогою якої можна поміняти пароль від аккаунта, всі контакти з номерами телефонів, Google+, фотографії, файли Google Drive, замітки, збережені авторизації в мобільному хром і так далі. Єдиний неприємний момент - неробочий Play Market, який видає: «Помилка при отриманні даних з сервера rpc: s-7: aec-7». Погуглити текст помилки, можна легко його реанімувати.

Решта програми вели себе по-різному:

  • Viber - бази йому недостатньо, відкривається на сторінці введення телефону;
  • Facebook - показав логін на екрані авторизації, але пароль виявився порожнім;
  • WhatsApp - також пропонує ввести номер телефону;
  • ICQ - підставляє номер телефону, після чого відсилає код на телефон;
  • LinkedIn і ВКонтакте - відкривають стартову сторінку із запитом на авторизацію;
  • Pebble - після конекту з годинником автоматом зачепив аккаунт і додав в локер всі встановлені програми;
  • Dropbox - нормально запрацював і показав всі файли;
  • Яндекс.Почта - завантажилася і показала всі листи. До слова, це був корпоративний ящик, хостящійся у Яндекса.

Висновок: до останніх трьох програмах легко отримати доступ, якщо відвести дані з accounts.db або саму базу.

mmssms.db

А ось і вся наша СМС-листування. Знаходиться вона по шляху /data/data/com.android.providers.telephony/databases/. Спробуємо що-небудь змінити. Для прикладу візьмемо СМС з номера 900 - це інформатор Ощадбанку. На скріншоті «СМС від Ощадбанку до і після втручання в mmssms.db» зліва, останні повідомлення: «ECMC6844 02.05.15 12:49 покупка 450р 210009 KARI Баланс: 3281.16р». Поміняємо його на більш цікаве повідомлення, показане праворуч. Для цього відкриваємо базу на пристрої в SQLite Debugger. Нас цікавить таблиця sms. Виділимо необхідні поля запитом:

> SELECT _id, thread_id, address, date, body FROM sms WHERE address = 900

Програма має тач-орієнтований інтерфейс, і самі команди можна не писати вручну. Вони підставляються автоматично після виклику меню довгим тапом на значенні або після натискання на відповідну слово у верхньому рядку. Команди показані для зручності використання в подальшому (наприклад, при роботі з консоллю або виклику скриптів Таскер).

Команди показані для зручності використання в подальшому (наприклад, при роботі з консоллю або виклику скриптів Таскер)

Змінюємо значення в базі mmssms.db

Отже, натиснувши на SELECT і відзначивши галочками потрібні поля, отримаємо таблицю, яка містить номер запису, номер гілки розмови, номер відправника, дату в UNIX time і власне текст СМС (див. Скріншот «Змінюємо значення в базі mmssms.db»). Довгий тап на останньому записі. Програма пропонує на вибір дії. Вибираємо Update value. Вводимо необхідний нам текст. За аналогією з попередніми СМС зробимо собі зарахування грошей через банкомат. Змінимо текст на «ECMC6844 05.05.15 10:18 зарахування 1000000р ATM 367700 Баланс: 1003731.16р». Сам запит буде виглядати так:

> UPDATE sms SET body = 'ECMC6844 05.05.15 10:18 зарахування 1000000р ATM 367700 Баланс: 1003731.16р' WHERE _id = 196

Натиснувши на трикутник у правому верхньому кутку, внесемо зміни в рядок. Підгонимо час з тексту СМС (05.05.15 10:18) в поле date. Можна використовувати будь-який UNIX time конвертер, наприклад Онлайн калькулятор unix time stamp . Відповідна дата буде 1430810300. Додамо в кінець три довільних цифри для мілісекунд і вставимо отримане значення в поле date.

> UPDATE sms SET date = 1430810300000 WHERE _id = 196

Дві команди можна об'єднати в одну, вписавши редаговані поля з даними через кому. Натискаємо в правому нижньому кутку кнопку Commit і вносимо зміни в базу. Дивимося, що вийшло. На тому ж скріншоті «СМС від Ощадбанку до і після втручання в mmssms.db» праворуч видно, що тепер ми багаті люди і на рахунку у нас більше мільйона. Іноді потрібно очистити дані додатка, який займається обробкою СМС, щоб зміни вступили в силу.

СМС від Ощадбанку до і після втручання в mmssms.db

Спробуємо додати в базу нову СМС. Для цього нам знадобляться дві таблиці в базі: threads, яка зберігає порядковий номер і заголовок (останні повідомлення) розмови / нитки, і sms, яка зберігає все інформацію. Варіантів подій тут два.

Варіант 1: додаємо СМС в існуючий розмову. Для цього шукаємо в таблиці sms номер гілки розмови - thread_id, що відповідає номеру відправника. Як видно на скріншоті «Змінюємо значення в базі mmssms.db», для інформатора Ощадбанку це цифра 7. Додамо новий рядок в розмову, показаний на попередньому скріншоті. Заповнюємо наступні поля: thread_id - гілка / нитку розмови; address - номер відправника; person - якщо відправник є в списку контактів; date - час приходу СМС; read - 1 для прочитаного повідомлення, 0 для непрочитаного; type - 1 входить, 2 виходить (є ще 0 - відправляється і 4 - чернетка); body - текст повідомлення. Для додавання нового рядка в таблицю необхідно виконати наступну команду:

INSERT INTO sms (threadid, address, date, read, type, body) VALUES (7, 900, strftime ( '% s', 'now') * 1000, 1, 1, "Текст повідомлення")

Значення strftime ( '% s', 'now') * 1000 використовується для вставки поточного часу. Для вставки конкретної дати і часу необхідно використовувати UNIX time з тринадцятьма цифрами. Результат можна побачити на скріншоті «Додаємо нову СМС в існуючий розмова».

Результат можна побачити на скріншоті «Додаємо нову СМС в існуючий розмова»

Додаємо нову СМС в існуючий розмову

Варіант 2: додаємо нову СМС і створюємо нову гілку розмови. Якщо за аналогією додати рядок з новим номером +7123456789, якого немає в записній книжці і з яким раніше не було листування, то в відправників буде значитися «Невідомий відправник» без вказівки номера (див. Скріншот «Додаємо нову СМС і створюємо нову гілку» зліва ). Щоб цього уникнути, необхідно пов'язати ще таблиці threads і canonical_addresses. Спочатку додаємо рядок з номером в canonical_addresses, попутно перевіряючи наявність цього номера в таблиці:

Продовження доступно тільки учасникам

Варіант 1. Приєднайся до товариства «Xakep.ru», щоб читати всі матеріали на сайті

Членство в співтоваристві протягом зазначеного терміну відкриє тобі доступ до ВСІХ матеріалами «Хакера», збільшить особисту накопичувальну знижку і дозволить накопичувати професійний рейтинг Xakep Score! Детальніше

Варіант 2. Відкрий один матеріал

Зацікавила стаття, але немає можливості стати членом клубу «Xakep.ru»? Тоді цей варіант для тебе! Зверни увагу: цей спосіб підходить тільки для статей, опублікованих більше двох місяців тому.


Так чому ж можуть бути корисні бази в першу чергу тобі і що може вкрасти зловмисник?
Ru»?