Інформаційна безпека

Уразливість в Telegram дозволяє скомпрометувати секретні чати

Присвячується до ювілею Telegram

У секретних чатах Telegram використовується «наскрізне шифрування», і що? End to end encryption Telegram слабо захищає листування користувачів. Простий приклад: зловмисник дістав приватний ключ gpg Аліси, природно, щоб розшифрувати повідомлення, зашифроване для Аліси необхідний пароль від цього ключа, який неможливо сбрутить, дотримуючись сучасної доктрини парольного захисту. У Telegram end to end encryption на Android — це стає можливо з ймовірністю 100%. Обхід двофакторної аутентифікації, відновлення пін-коду та викрадення секретних чатів в Telegram про цю уразливість і буде стаття.

У своїй роботі я постараюся описати докладний мануал по уразливості в Telegram на Android-девайси, наведу приклади з відновлення local code Telegram на Android, Desktop Linux/Windows. Скомпрометирую секретний чат Telegram. У цьому протистоянні з командою Дурова мені допоможе моя компанія: Я; Android 7.0; Android 6.0 (root); Android 4.4.2 (root); ПК, OS Linux/Windows. На перший погляд здається сили не рівні, подивимося…

 З чого все почалося

В моєму випадку всю міць PR-компанії навколо платформи Telegram відчув і я. На величезних колесах «Воза» хайп котився від місяця до місяця, не маючи ні центру, ні кордонів. Вплив Е. Сноудена на популяризацію повсюдного користувача шифрування листування. Згадайте культовий месенджер ICQ з його програмою QIP 2005 на Desktop-е, там вся переписка зберігалася на ПК у відкритому доступі в файлах .txt. Telegram з приводу шифрування листування «хто перший почав масово шифрувати приватне листування» не відразу, але пізніше заявив, що піонер – це він. Історія Telegram нічим особливо не виділялася: конкурс на безпеку протоколу MTProto від durov; калымы для художників і художниць (малювання стікерів); API по створенню роботів/додатків; ICO TON, принесла господарям Telegram чималі гроші; блокування месенджера в Ірані, РФ і знову в Ірані; а також надходження в мережу рідкісних онлайн-вкидань таємниці Telegram. У липні 2018г. «Промчала підвода і по мені». Коли на масовому ринку месенджерів з’явився «черговий Telegram» зі слоганом і невеликим застереженням (це супер швидко, просто і безкоштовно). «Telegram — це додаток для обміну повідомленнями з акцентом на швидкість і безпеку». На рахунок останнього в такому крутому слогані, durov і його команда (за рахунок Миколи Дурова технічна сторона команди сильна) відкрито взаємодіють з фахівцями з ІБ/багхантерами, які знаходять/намагаються знайти уразливості в протоколі MTProto або баги на платформі Telegram. Фахівці надсилають свій матеріал на пошту security@telegram.org — це офіційний метод такої взаємодії «мисливцями за головами» та розробниками Telegram, так само про це згадується і тут
Насправді ми вітаємо експертів з безпеки для аудиту нашої системи і будемо вдячні за будь-які відгуки ( security@telegram.org )
Неофіційний формат спілкування, коли листи ігноруються з боку розробників Telegram, і тоді специ зазвичай постять свої твіти в мікроблозі, де деякі з них коментує durov.

До послуг Чорного принца користувача конфіденційність на мобільній платформі Telegram представлена, як неприступна, грізна, новомодна розробка MTProto від Миколи Дурова. Секретні чати в Telegram (далі СЧ) – це чати, які присутні лише на мобільній платформі Telegram і захищені наскрізним шифруванням, ключі зберігаються тільки на пристроях на яких були згенеровані, а ще це гордість Telegram-Dubai (так їх назву). СЧ Telegram вважаються дуже захищеними чатами у всьому світі, в Telegram-Dubai світі, кілька разів durov стрясав повітря, порівнюючи свій продукт з конкурентами в публічній войовничої формі і завжди перемагав.

Обійшовши end to end encryption Telegram месенджера на Android, баг-репорт відправив листом на вищезгаданий e-mail. Відповіді не отримав, через кілька днів написав в технічну підтримку волонтерам Telegram. Волонтери мені відповіли, що донесуть мою думку до керівництва Telegram, запросивши з мене уточнення: звідки і коли я відправив свого листа. Через два тижні тиші я ще раз нагадав про своєму листі волонтерам, на цей раз і добровольці месенджера повністю проігнорували моє нагадування. Через тиждень я знову повторив відправку листа на офіційну пошту Telegram — немає відповіді. Що ж залишається, чим же зайнятися? докучати з своїм баг-репортів за Telegram через мікроблог?, осаджувати неофіційні джерела спілкування команди durov-а? Або написати і викласти статтю для ЗМІ? Прямо якась кибербюрократия сформувалася в рядах Telegram. Не можу не відзначити w9w з habr.com, який, на мою думку, знайшов кращу уразливість на платформі Telegram: уразливість в telegra.ph. Суть – будь-який юзер міг відредагувати чужу статтю на telegra.ph. Зі своїм звітом про уразливості w9w (він знайшов їх кілька) так само не зміг достукатися на security@telegram.org. Після проходження бюрократичного квесту, w9w отримав за знайдені вразливості маленьке фінансову винагороду. Цікаво, це жадібність Telegram? чи якась інша причина? Повернемося до Telegram, трохи відгуків про нього.

У багатьох людей є свій сімейний фотоальбом, у багхантеров — свій послужний список «знайдених багів/помилок/вразливостей». У своєму ПС, по закінченню роботи над статтею, я байдуже закрашу клітинку B30 в червоний колір, тим самим, залишивши своє запитання до команди Telegram відкритим.

Частина 1. Відновлення local code Telegram на Android OS Linux/Windows Desktop. Засновано на реальних подіях

У липні влітку 2018г. на Github-е один з розробників неформальній угруповання версії John The Ripper (далі JTR) виклав написаний на Python-е вихідний код парсинг-модуля «telegram2john.py». З назви стає ясно для чого і кому служить даний модуль. Кому не зрозумілий сенс подібних модулів, це модулі, що розширюють функціонал JTR. Офіційний JTR вміє потрошити 8 форматів, а JTR jumbo-1-bleeding – 263 форматів, і один з таких форматів — Telegram local code. Випробувавши «telegram2john.py» я виявив помилку в ньому: одна з трьох функцій парсингу local code Telegram працювала некоректно, про що я й повідомив на Github-е розробникам JTR. Виправлення для «telegram2john.py» вийшло оперативно. Це не перше звернення за знайденим багам до розробників JTR, і кожен раз швидкий відповідь і не менш швидке виправлення помилок — просто приємно, коли є такі буденні налагоджені канали зв’язку. Через пару днів на таємному віче модуль «telegram2john.py» затвердили і відправили в репозиторій JTR.

Схема відновлення local code Telegram — багатоетапний процес:
Read the salt (32 bytes), encrypted data and sha1 of decrypted data from a file.
Compute a PKCS5_PBKDF2_HMAC_SHA1 on the UTF8 (passcode), using the salt, 4000 iterations, keysize of 256 bytes
Use a Telegram-specific KDF to get the AesKey and AesIV (Relatively cheap - bunch of memcpy and 4x sha1)
Perform an AES-IGE-DECRYPT on the encrypted data using the derived key and IV from step 3.
Compare sha1 of decrypted data with the sha1 read in step 1. If they match - passcode is correct.

Для користувача JTR операція «кровотечі» спрощується до двоетапного процесу: з допомогою модуля «telegram2john.py» «витягування хеша» для Джоновского процесора з файлу userconfing.xml, належить додатком Telegram (моментальна за часом операція), та brute force цього «хеш» з допомогою JTR. При такій операції ймовірність відновлення local code на Android-е становить 100% успіху, час очікування кілька секунд. Ймовірність відновлення local code Desktop-е Linux/Windows становить X% успіху, час очікування невизначений. Чому? Тому що, по-перше, local code — звичайний цифровий pin код на Telegram з чотирьох цифр (10^4 всіляких комбінацій pin-а) ні більше ні менше, по-друге, алгоритм шифрування local code Telegram на Android-е не криптостійкий, звідси висока швидкість перебору паролів. По-іншому йдуть справи з Desktop-додатками Telegram, де немає секретних чатів: у додатку на Desktop-е, шифрування local code криптостійкості (швидкість перебору на CPU хеш-Desktop/Telegram в 100 разів повільніше швидкості перебору хеша Anroid/Telegram), а головне local code Desktope/Telegram можна задавати «будь-який» довжини і використовувати будь-які символи.


Криптостійкість local code Desktop Telegram висока, швидкість brute force в сто разів повільніше brute force local code Android Telegram.

Особисто у мене складається враження, що розробники Telegram працювали над створенням унікального і захищеного свого протоколу MTProto, а не над всебічною конфіденційністю користувача, наприклад, відкритий кеш програми, що зберігається в не під кореневим каталогом Android або не криптостійкий local code Android, який, як виявляється відновлюється з ймовірністю 100%.

На момент написання статті, JTR-и, з коробки в свіжих Kali Linux і Parrot Security OS мають баги, які не дозволяють парсити local code Telegram (JTR jumbo-1-bleeding завжди має якісь баги, але його функціонал розвивається крутіше ніж ви думаєте, якщо ви думаєте про Hashcat). Отже, досвідчений користувач Kali/Parrot зламати відновити Local code Telegram не зможе, Windows JTR усічений по функціоналу — теж не годиться. Тому необхідно встановлювати на свою OS JTR c Github (для Linux-систем). Щоб компіляція З JTR пройшла успішно, до компіляції програми доставляєте пакет у вашу OS «libssl-dev», далі

• git clone git://github.com/magnumripper/JohnTheRipper -b bleeding-jumbo john && cd john/src
• ./configure && make -s clean && make -sj4
• john/run/telegram2john.py userconfing.xml > хеш (якщо модуль telegram2john.py доставляєте наприклад у Kali Linux окремо, тоді запускаєте так: python telegram2john.py userconfing.xml > хеш)
• JohnTheRipper/run/john хеш - -mask=?d?d?d?d

Результат останніх двох команд – отримання local code Android Telegram за дві секунди.


Відновлений local code Android Telegram. Pin 5369.

Аналогічно і з брутом local code Telegram додатків Desktop Linux/Windows замість файлу «userconfing.xml» вказується шлях до каталогу Telegram:

(Linux): ~/telegram2john.py ~/.local/share/TelegramDesktop;
(Windows): ~/telegram2john.py «C:/Users/Name/AppData/Roaming/Telegram Desktop» (для застарілого додатки Telegram на Windows);
(Windows): ~/telegram2john.py “Telegram Desktop” (для оновленого додатка Telegram на Windows).

Зверніть увагу, якщо ви повторно захочете розпарсити local code Telegram, JTR видасть «No password». Причина — пароль вже був знайдений раніше, Джонні – ніколи не відновлює пароль другого і наступного разу, для цього використовуйте опцію «- -show хеш», але іноді можуть траплятися помилки, і опція — -show не відпрацює як треба (з іншими хэшированиями такі баги зустрічав, але все вже поправили розробники JTR). У такому разі загляньте в файл ~/run/john/pot, всі знайдені паролі зберігаються в ньому, якщо очистити його, то можна повторно брут хеші з знайденими паролями.


John The Ripper не збирається повторно «бруднити руки в крові» про local code Android Telegram

файл userconfing.xml, який є мішенню JTR розташований у кореневому каталозі Android:

/data/data/org.telegram.messenger/shared_prefs/userconfing.xml

а значить дістатися до файлу можна маючи root права, або через TWRP або з допомогою digital forensics.

Докладний відео-мануал по відновленню local code Telegram на Android/Linux/Windows посилання в кінці статті.

Частина 2. Білі починають і програють. Викрадення секретних чатів в Telegram. Засновано також на реальних подіях

Як базується захист в Telegram:

  1. введення номер телефону;
  2. отримання смс, або коду в додатку на іншому пристрої – за бажанням, введення смс-коду або коду отриманого в додатку на іншому пристрої.
  3. Тимчасове блокування акаунту при частому (у тому числі успішному) залогиннировании користувача.

При перехопленні такий смс можна увірватися в учетку користувача, але доступ до секретних чатах терориста не отримати, так як вони існують і живуть тільки на пристроях поплічника ИГИЛ де були згенеровані, а значить особливо не розгулятися тим, хто тримає в узді мобільних операторів зв’язку.

Опціональна, базова + посилений захист Telegram:

1. введення номер телефону;
2. отримання смс, або коду в додатку на іншому пристрої – за бажанням, введення смс-коду або коду програми;
3. Введення cloud code Telegram (зберігається на сервері Telegram і у вас в голові, скидається/прив’язується через e-mail);
4. установка local code (на Android-е, налаштування — конфіденційність і безпека – код пароль);
5. перевірка поточної/останніх сесій входу в месенджер;
6. Вихід з усіх сесій крім поточної;
7. очищення вмісту СЧ по таймеру;
8. заборона на скрін/запис екрану СЧ;
9. Тимчасове блокування акаунту при частому (у тому числі успішному) залогиннировании користувача;
10. Як з’ясувалося при викраденні СЧ (вхід в чужу учетку з іншого ip) тимчасовий бан реального/скомпрометованого аккаунта ~ через 5 хвилин і скасування СЧ в Telegram. В одній мережі реальної/скомпрометованої закладки, Telegram забуває банити за викрадення облікового запису.

Нижче я покажу, що СЧ вразливі, один з таких СЧ я угоню (свій тестовий акаунт у Telegram) і буду видавати себе за користувача «Господар»

Після успішного відновлення local code Telegram я вирішив помацати файли поряд з файлом userconfing.xml на Android-е. Створив секретний чат, подивився які файли і в яких підкаталогах оновлюються по часу. Спробував скопіювати ці файли з OS Android 4.4.2 на інший гаджет з Android OS 6.0 (перенесення файлів між гаджетами здійснював через архіви rar; zip). Встановив з GP останню версію Telegram на Android 6.0. Переніс c Android 4.4.2 > Android 6.0 оновлені файли в аналогічні каталоги

/android/android/org.telegram.messenger/shared_prefs
/android/android/org.telegram.messenger/files
/android/android/org.telegram.messenger/no_backup

Згідно з краденою своєї тестової учеткі Telegram відновив права (які були на 4.4.2) для кожного файлу і папки персонально, операція не швидка (у різних файлів найрізноманітніші права), призначив UID GID «Telegram».

Запустив додаток? Тут же всі крадені файли оновилися за часом, а мене вітав екран «нового користувача». Telegram вів себе так, як ніби я новий юзер і пропонував зарегаться або увійти через телефон (стандартна процедура при початковій установці Telegram на Android). Тобто я не зміг увірватися в чужу учетку. Підкрався ще і ще кілька разів з різних сторін, але в кінцевому підсумку – фэйл.

Спробував інший спосіб – бекап тестовій учеткі Telegram через Titanium backup.
Зробив бекап програми на Android 4.4.2, розгорнув бекап 4.4.2. на Android 6.0.

Права на «крадене» додаток, зміна UID/GID не потрібно – все зробить Titanium Васкир. Запускаю Telegram скомпрометованої учеткі на Android 6.0 і магія! Отримую запит на введення local code користувача «Господар». Такий спосіб з Бекапом надав обхід двофакторної аутентифікації без танців з бубном. Telegram зі свого боку запросив лише local code від викраденої учеткі. Відправляю вкрадений файл

/android/android/org.telegram.messenger/shared_prefs/userconfing.xml

на віддалену свою VDS Kali Linux, ставлю завдання брут pin-коду і тут же отримую результат

Червоним виділив (зверху вниз) отримані:
* хеш для JTR з допомогою модуля telegram2john.py;
* відновлений local code Android Telegram;
* Джонні full time job (непристойно-висока швидкість brute force пароля, опцію — -mask=?d?d?d?d, повідомляє Джонні щоб він підбирав 4х значний цифровий код не включив, щоб JTR розігнався і показав свою лють швидкість);
* запит до JTR відновленого local code.

Крутий Джонні! неправда?

Відновивши з допомогою JTR Android local code Telegram, увійшов c іншого ip в чужій свій тестовий запис, який спочатку розташовувався на Android 4.4.2., а тепер скомпонований на Android 6.0. При цьому бачу всі секретні чати жертви і всю переписку в них. Спробував написати, створеному раніше СЧ, користувачеві Android 7.0 і повідомлення успішно вирушило, юзер Android 7.0 відправив відповідь, відповідне повідомлення було не просто отримано, а отримано на двох гаджетах: на Android 6.0 і на Android 4.4.2. Перевірив, останні сесії входу, у реального користувача відображався його ip і його гаджет Teclast Android 4.4.2 (налаштування – конфіденційність і безпека-активні сеанси). У зловмисника Android 6.0 в «активних сеансах» відображався девайс Teclast Android 4.4.2, ip Вірджинія. Тобто реальний користувач не отримує інформацію через «Активні сеанси», що його учетка була скомпрометована, а отримує «брехливу» інформацію, що він знаходиться в мережі з одного свого пристрою і з одного свого ip.

Реальний користувач через активні сесії не бачить, що він скомпрометований. В історії останніх сеансів не фіксуються точки входу зловмисника. Більш того, в реальному акаунті «Господаря» я клацнув «вийти з усіх сеансів крім поточного». Зловмисника при цьому не викинуло з сеансу, незалежно від онлайн/оффлайн статусу атакуючого.

Спробував тугіше операцію щодо скомпрометованої учеткі – результат аналогічний: «Господаря» не викинуло з Telegram, сеансові ключі колишні.

Може графічні ключі СЧ індикатор безпеки? Ключі секретних чатів не індикатор безпеки, в даному експерименті вони всі три б’ються між собою.


Всі ключі однакові в тому числі і у скомпрометованої учеткі.

Telegram заявляє, якщо ключі б’ються на 2х пристроях, ви в безпеці — це не так. (Відступ. Звіряти ключі все ж потрібно, після установки Telegram на Android і при створенні самого першого РАХ, у користувачів РАХ були відсутні зліпки ключів, а графічне зображення ключа відрізнялося на пристроях. СЧ працював як зазвичай, що сталося я так і не розібрався, і це був одиничний випадок, коли ключі не билися між собою).

Повернувся до першого методу «copy-paste», який у мене спочатку не вийшов.

Повторив свої попередні кроки, додавши проміжне 3-е дію.

1) Встановив з GP останню версію Telegram.

2) Переніс каталоги з OS 4.4.2 на інший гаджет з OS 6.0

/android/android/org.telegram.messenger/shared_prefs 
/android/android/org.telegram.messenger/files 
/android/android/org.telegram.messenger/no_backup 

3) Видалив папку на Android 6.0, шах

/android/android/org.telegram.messenger/code_cache

4) Права не відновлював персонально, замість цього роздав усім вищеописаним каталогами «рекурсивно» права 777 (повний доступ). Призначив тим же каталогів власника і власника групи (UID/GID) «Telegram» (насправді «рекурсивно» в каталозі root погано працює в TC, тому довелося перевіряти призначення прав).

5) Вперед! Запускаю Telegram в інший мережі з іншим ip – невдача, знову це привітання нового користувача англійською мовою.

6) Вперед! Перезавантажується Telegram, шах і мат! Telegram видав попередження на введення local code користувача, який був на Androide 6.0 (і який відновлюється з імовірністю 100%), при цьому запити з боку Telegram cloud code або смс відсутні і досі відсутнє. Обхід двофакторної аутентифікації, ні! обхід End to end encryption Telegram виконаний успішно.

Результат: повідомлення зловмисника в СЧ так само успішно відправлялися від імені реального користувача, і так само була доступна вся переписка РАХ. Через ~400 ударів мого тривожного серця, побоювання підтвердилися: викрадена учетка була заблокована Telegram-му у зловмисника і реального користувача; СЧ – скасовано.


Тимчасове блокування учеткі Telegram.

Авторизувавшись повторно Telegram (іноді бан буває на добу, але мені пощастило, чомусь в цей день всі бани лунали на секунди), у реального користувача було все як зазвичай, а зловмисник вже не міг снифить скомпрометовану учетку (сеансові ключі оновилися).

Кілька офіційних тверджень Telegram мені вдалося спростувати

telegram.org/faq – «СЧ можуть бути тільки на пристроях походження СЧ». Я – «як бачите СЧ можуть бути не тільки на пристроях походження РАХ, але і на пристроях, де є Root і ключ СЧ, незалежно від версії OS Android».
telegram.org/faq – «Ви можете порівняти це зображення (примітка: зображення СЧ ключа) з тим, яке має ваш друг — якщо обидва зображення однакові, ви можете бути впевнені, що секретний чат безпечний» Я – «не можна бути впевненим, що чат безпечний».
telegram.org/faq – «Ми також рекомендуємо включити двоетапну перевірку та встановити сильний код доступу для блокування вашого додатки, ви знайдете обидві опції в налаштуваннях — Конфіденційність і безпека». Я — «Сильний код доступу можна встановити тільки в додатку Telegram Desktop Linux/Windows, але не на Android»
telegram.org/faq – «Користувач з кореневим доступом може легко обійти функції безпеки, вбудовані в операційну систему, прочитати пам’ять процесу або отримати доступ до обмежених областях, таких як внутрішнє сховище. Як тільки у зловмисника є доступ до кореня, будь-які зусилля щодо пом’якшення загроз стають марними. Ніяка програма не може бути названо безпечним в цих обставинах, незалежно від того, наскільки сильно шифрується». Я – «Або відновити local code Android і отримати/клонувати учетку. З кожною новою невірної спробою введення pin, Telegram збільшує час очікування між спробами введення pin. Мабуть, таким алгоритмом Telegram задоволений захисту користувача від ручного brute force 10^4 всіляких комбінацій pin-ів, але задоволений користувач, коли його легко так скомпрометувати? Якщо розробники Telegram хотіли б пом’якшити загрози в цих обставинах, вони могли б це реалізувати не як тимчасову блокування на кілька секунд на невірний ввод local code, а замінити на Telegram Android-е функцію pin на password, з шифруванням PBKDF2 — це сильно сповільнить атаку brute force. Як приклад хорошої захисту – пароль на вхід в зашифровану БД паролів Keepass2Android.
telegram.org/faq «Ви можете отримувати доступ до повідомлень в секретному чаті зі свого пристрою походження. Вони безпечні до тих пір, поки ваш пристрій безпечно у вашій кишені».Я – «Ось де, виявляється правда!»

Висновки

 

  • Local code Telegram на Android-е відновлюється в JTR миттєво і з ймовірністю 100%, це веде до наслідків: викрадення секретних чатів, розкриття листування СЧ, видавання зловмисника за реального користувача. Захист від цього «трюку» — тимчасовий бан від Telegram і нові сеансові ключі для реального користувача.
  • Операція з викрадення СЧ схожа з крадіжками cookie + злом pin + «заморочка з правами» якщо використовувати метод «copy-paste».
  • Для відновлення pin-а Telegram, необхідно працювати з файлом програми месенджера розташованим в
    /android/android/org.telegram.messenger/shared_prefs/userconfing.xml

    Дістатися до чутливих файлів можна, маючи root права, або через TWRP або з допомогою digital forensics.

  • Часто користувачі ставлять local code Telegram Desktop-e такою ж, як pin на Android-e — це пастка, 4х значний local code Telegram на Windows/Linux перебирається <1минуты, а доступ до ПК отримати простіше, ніж доступ до гаджету.
  • Розробники Telegram повинні замінити «pin» на Android-е на «password», з криптостійким шифруванням (як реалізоване на Telegram Desktop-e або в інших мобільних додатках, наприклад Keepass…) використовуючи PBKDF2, таким чином проблема буде фактично вирішена.
  • security@telegram.org та й у цілому техпідтримка в Telegram, як сервіс реагування та взаємодії користувач-розробник не на висоті.
  • За період «мовчання» Telegram випустив оновлення GP, але оновлення планове і було пов’язане з Passport telegram, також виходило ще оновлення, але уразливість, яку я продемонстрував у цій статті все ще діє і будь-який бажаючий може скористатися їй.
  • На баг-репорт (виявлену уразливість) Telegram ні як не відреагував.

Демонстрація відновлення local code Telegram на Android/Linux/Windows.

Демонстрація уразливості секретних чатів Telegram.

P. S.: дата/час на окремих скронях або скрін-відео можуть не збігатися, так як експерименти в Telegram і скріни робив по ходу написання статті, а через роздачі банів Telegram-му стаття писалася кілька днів.

Related Articles

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

Close