Попалась мне тут совершенно замечательная ссылка, которой не имею сил не поделиться - https://github.com/krizzsk/HackersCave4StaticAndroidSec.
Там куча ссылок на туториалы, утилиты и исследования по уязвимостями в Android. Звучит скучно да? Верно. Это был бы еще один всратый "awesome list" если бы не одно "но" - там много ссылок на нативные китайские блоги и статьи. И там действительно полезная инфа, которую просто так не загулишь, если не ищешь специально на китайском. Я давно хотел найти что-то подобное и вот оно пришло. Из полезного лично для себя, я нашел там разбор форматов различных файлов (
Там куча ссылок на туториалы, утилиты и исследования по уязвимостями в Android. Звучит скучно да? Верно. Это был бы еще один всратый "awesome list" если бы не одно "но" - там много ссылок на нативные китайские блоги и статьи. И там действительно полезная инфа, которую просто так не загулишь, если не ищешь специально на китайском. Я давно хотел найти что-то подобное и вот оно пришло. Из полезного лично для себя, я нашел там разбор форматов различных файлов (
AndroidManifest.xml, resources.arsc и т.п.) и материалы по статическому анализу. Всем 你好 ;)GitHub
GitHub - krizzsk/HackersCave4StaticAndroidSec: A comprehensive resource for Android static analysis and vulnerability assessment.…
A comprehensive resource for Android static analysis and vulnerability assessment. Tutorials, tools, and resources for identifying and mitigating security vulnerabilities in Android applications. -...
🔥27💯1
Перепаковка приложения может быть довольно болезненной процедурой. Чтобы избежать возможных глюков после пересборки, можно воспользоваться специальными флагами apktool:
#aht
-s распакует приложение, но не будет декомпилировать код, а -r распакует без декодирования ресурсов. Если нужно только убрать ssl pinning через network_security_config.xml, то нет нужды декомпилировать код. А если требуется убрать проверку на root, то ресурсы можно не декодировать.#aht
👍13🤔7
Большие компании часто выпускают разные приложения, но используют в них какие-то общие библиотеки, архитектуру и подходы. Поэтому, для разбора алгоритмов смысл которых непонятен из-за обфускации, можно попробовать разобрать другие приложения этой компании. Их могли писать другие команды с низкой социальной ответственностью, а значит там может вообще не быть обфускации или она будет не такая злая.
#aht
#aht
👍6
PHDAYS12 близко (19-20 мая)🌞 И чтобы он получился действительно крутым - нужны крутые доклады. Моя личная установка в этом плане не изменилась - хороших докладов про мобильный инфобез должно быть больше. Особенно хотелось бы послушать что-то междисциплинарное а-ля "Угон аккаунта из Google Calendar через подключенную по BT умную колонку" ;) Тема, кстати, не под копирайтом - забирайте =) К чему я это все? 25 марта заканчивается прием заявок на доклады и у вас есть шанс запрыгнуть с вашим исследованием в этот поезд!
Если угон акканта вы нарисечить еще не успели, то другие темы тоже вполне себе приветствуются:
👨🔬 новые техники и векторы атак, эксплуатация уязвимостей;
👨🔧 разработка и защита приложений;
🤖 технологии и безопасность ML в ИБ.
Хватит смотреть трансляции, пора их создавать 🚀
Если угон акканта вы нарисечить еще не успели, то другие темы тоже вполне себе приветствуются:
👨🔬 новые техники и векторы атак, эксплуатация уязвимостей;
👨🔧 разработка и защита приложений;
🤖 технологии и безопасность ML в ИБ.
Хватит смотреть трансляции, пора их создавать 🚀
🔥7
Даже если на устройстве есть root доступ, команды
#aht
adb push/pull все равно будут работать в пользовательском режиме. Это значит, что не выйдет скачать или отправить файлы в директории доступные только суперпользователю. Но выход есть. Вместо adb push будет cat file.txt | adb shell su -c "dd of=/data/file.txt", а для замены adb pull - adb shell su -c "dd if=/data/file.txt" >> file.txt. В целом, так можно выполнить любую команду с правами root - adb shell su -c "<command>".#aht
👍15👎1
Обфусцированный код, при более пристальном рассмотрении, порой оказывается не таким уж и обфусцированным. Например по методу
#aht
toString() часто можно восстановить оригинальное имя класса и имена полей. Для этого можно поискать по коду все объявления этого метода с помощью ключевого слова toString() { и найти что-то вроде этого:public final String toString() {
StringBuilder m20399b = C0002b.m20399b("Insets(left=");
m20399b.append(this.f39a);
m20399b.append(", top=");
m20399b.append(this.f40b);
m20399b.append(", right=");
m20399b.append(this.f41c);
m20399b.append(", bottom=");
return C0047d.m19892c(m20399b, this.f42d, ')');
}
Теперь можно переименовывать класс и поля, что сильно упростит дальнейшие исследования.#aht
👍18🔥8
Тут недавно в чате искали работу реверсером. Я вам принес =) В соседнюю команду ребята ищут толкового реверс инженера. Основная задача: изучение механизмов защиты мобильных приложений от статического и динамического анализа. И конечно же поиск возможностей обхода этих механизмов. Все как вы любите ;)
Помимо умения нажимать F5 в IDAPro, горячо приветствуется навык чтения пейперов, и перекладывания полученных из них знаний в PoC-и. Также нужно понимать основы криптографии и модели безопасности мобильных ОС. В общем, если вы когда-нибудь заглядывали под капот очередному
В качестве бонусов: красивая аниме аватарка (если у вас еще нет) и возможность удаленной работы. Ну и IDAPro дадут, наверное...
Помимо умения нажимать F5 в IDAPro, горячо приветствуется навык чтения пейперов, и перекладывания полученных из них знаний в PoC-и. Также нужно понимать основы криптографии и модели безопасности мобильных ОС. В общем, если вы когда-нибудь заглядывали под капот очередному
Dex<placeholder>, то и сами знаете что требуется для такой работы. Остальные подробности найдете здесь.В качестве бонусов: красивая аниме аватарка (если у вас еще нет) и возможность удаленной работы. Ну и IDAPro дадут, наверное...
👍9🔥6👏2
Если приложение закрыто пин-кодом и он реализован локально, то есть несколько типичных ошибок, которые допускают разработчики.
1. Приложение никак не ограничивает количество попыток ввода;
2. После перезпуска приложения - счетчик попыток сбрасывается;
3. Приложение некорректно проверяет метку времени и можно сбросить счетчик путем перевода времени в системе;
4. Окно с пин-кодом не является блокирующим и можно запустить основной экран напрямую через Intent.
Подбирать пин-код в автоматическом режиме можно например с помощью ui-automator. Для него также есть вполне рабочая библиотека на python.
#aht
1. Приложение никак не ограничивает количество попыток ввода;
2. После перезпуска приложения - счетчик попыток сбрасывается;
3. Приложение некорректно проверяет метку времени и можно сбросить счетчик путем перевода времени в системе;
4. Окно с пин-кодом не является блокирующим и можно запустить основной экран напрямую через Intent.
Подбирать пин-код в автоматическом режиме можно например с помощью ui-automator. Для него также есть вполне рабочая библиотека на python.
#aht
👍25❤3
Толковый доклад об особенностях реализации шифрования данных на android смартфонах (FDE) и способах расшифровки этих данных. В докладе рассматриваются Huawei P9 и Samsung A5 2016. Устройства довольно старые, но дело даже не в них, а в тех приемах работы, которые применяются. Думаю, что каждый посмотревший этот доклад найдет для себя что-то новое.
https://youtu.be/-OAc4UOuPEo
https://youtu.be/-OAc4UOuPEo
YouTube
Mobile (Fail)rensics
В докладе рассматривается задача получения доступа к защищенным данным, хранящимся на мобильных устройствах, в контексте криминалистической экспертизы в случае отсутствия пароля.
В общем случае она представляется крайне сложной, тем не менее для ряда устройств…
В общем случае она представляется крайне сложной, тем не менее для ряда устройств…
🔥9⚡1
Иногда полезно понимать с какими флагами запускается
#aht
Intent внутри приложения или какие флаги были установлены для PendingIntent. В декомпилированном коде это, как правило, выглядит так intent.setFlags(268435456) или так PendingIntent.getActivity(context, f11650a.incrementAndGet(), intent, 1073741824). Конечно же есть способ восстановления значений флагов. Базовый код для проверки значения флага выглядит так:if ((flagsValue & Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
addToSet("Intent.FLAG_ACTIVITY_NEW_TASK")
}
Но встречаются также комбинации флагов, и для восстановления полной картины придется повторить эту операцию для каждого из возможных значений флагов. Но если вы пользуетесь AndroidStudio, то она умеет делать это сама. Для этого нужно поставить курсор на значение флага и нажать Alt/Option+Enter. Будут предложены возможные значения для замены. Или Alt/Option+Shift+Enter чтобы выполнить замену сразу. Но это не всегда работает как нужно.#aht
👍12❤2
⚡️Ребята из Standoff365 ищут спикеров на Standoff Talks.
Судя по имеющемуся у меня опыту "мобильного" багбаунти в RU-сегменте - этому направлению еще сильно есть куда расти. Если у вас имеется классный опыт именно мобильного багхантинга, то ребята будут рады пригласить вас с докладом. Опыт может быть как положительный, так и отрицательный =) Главное чтобы он был.
Заявку можно подать до 23 апреля. Трансляция докладов тоже будет.
Судя по имеющемуся у меня опыту "мобильного" багбаунти в RU-сегменте - этому направлению еще сильно есть куда расти. Если у вас имеется классный опыт именно мобильного багхантинга, то ребята будут рады пригласить вас с докладом. Опыт может быть как положительный, так и отрицательный =) Главное чтобы он был.
Заявку можно подать до 23 апреля. Трансляция докладов тоже будет.
🔥5💩2
Приложения, которые написаны на Kotlin, часто содержат мета-данные, которые позволяют восстановить настоящие имена классов, пакетов, полей и методов. Инструменты вроде jadx, частично умеют восстанавливать эту информацию. Но если хочется выжать из мета-данных все, что там есть, то можно воспользоваться утилитой kotlin-metadata-printer. Ее единственный недостаток - она опирается на необфусцированную аннотацию
#aht
@Metadata и не умеет работать с ее обфусцированным вариантом. Про это есть issue, и может быть когда-нибудь эту возможность тоже добавят. Также она не понимает вложенные классы содержащие мета-данные. Но все равно - это гораздо лучше чем выхлоп того же Jadx.#aht
👍12🤡1
AHT-10.pdf
96.2 MB
В рубрике #aht вышло уже 12 советов и я решил собрать первые 10 в виде PDF-ки. Зачем? Ну во-первых это красиво 😋. Так что если еще кому-то кроме меня нравится эта идея, то забирайте файлик в аттаче. Если PDF по каким-то причинам не ок, то есть репозиторий, где картинки лежат отдельно.
❤21🔥8👍2👎1🤡1
Оказавшись без любимого набора инструментов - можно и приуныть. Но не нужно. Используя только стандартные утилиты из Android SDK можно сделать многое. Рассмотрим на примере aapt2, adb и apkanalyzer:
-
-
-
-
-
-
-
И все это работает без декомпиляции apk файла. При чем, работает очень быстро. Узнать больше о стандартных cli утилитах можно здесь.
#aht
-
aapt2 dump strings target.apk | grep -E '[a-fA-F0-9]{32}' - найти все md5 хэши в приложении-
aapt2 dump xmltree target.apk --file AndroidManifest.xml - получить содержимое манифеста-
adb shell screenrecord /sdcard/demo.mp4 - записать видео с экрана-
adb shell dumpsys package my.target.app - получить много полезной информации о приложении. Например - какие диплинки оно обрабатывает-
adb shell input text <string> - ввести текст в выбранное поле ввода-
apkanalyzer manifest print target.apk - получить содержимое манифеста в xml формате-
apkanalyzer dex code --class com.google.crypto.tink.proto.JwtRsaSsaPkcs1PrivateKey target.apk показать smali-код класса из apkИ все это работает без декомпиляции apk файла. При чем, работает очень быстро. Узнать больше о стандартных cli утилитах можно здесь.
#aht
👍27🔥5🤡1
В приложениях можно встретить относительно новомодную библиотеку DataStore. Она умеет хранить данные либо в key-value формате, либо в формате protobuf-моделей. Понять, что вы столкнулись именно с этой библиотекой - довольно просто. Если есть каталог
<app-sandbox>/files/datastore с файлами *.preferences_pb или *.pb, то это оно. Получить из них данные в более-менее адекватном формате можно командой protoc --decode_raw < settings.preferences_pb (аналогично для .pb). Но для preferences_pb есть способ лучше - воспользоваться той же самой библиотекой. Поскольку это key-value хранилище, то его структура очень простая и библиотека выводит все нужные типы сама. Для .pb так красиво и просто сделать не выйдет. Нужно или смириться с raw выводом или реверсить приложение, искать там модели и писать по ним .proto файлы для просмотра через protoc
#aht👍16🤡1
Эволюция bugbounty в России продолжается. Новым витком этой эволюции стал запуск Standoff Hacks на BB платформе Standoff365. Эта штука планируется как серия priv8 😎 ивентов, в рамках которых группа заранее отобранных хакеров будет ломать прежде не исследованный скоуп или уже известный, но с повышенными выплатами, а на финальном дне получают разом все вознаграждения за найденные уязвимости.
Попасть на эту движуху можно только по инвайтам. Получить инвайт можночерез постель прокачивая рейтинг на платформе. Мне удалось получить такой инвайт 😉 Первое мероприятие состоится 13 мая в Москве, где будут объявлены результаты двухнедельного набега на инфраструктуру выбранной компании. Следующий Standoff Hacks будет уже в другом городе и там обещают еще более широкий скоуп и ништяки. Поделюсь с вами всем, что разрешат по итогу рассказать. Не переключайтесь!
Попасть на эту движуху можно только по инвайтам. Получить инвайт можно
🔥17🤔1🤡1
Иногда можно в приложении можно встретить файлы с сертификатами в формате BKS. Посмотреть такой файл с помощью
#aht
keytool без BKS провайдера не получится. Поэтому для начала его нужно скачать wget https://repo1.maven.org/maven2/org/bouncycastle/bcprov-jdk18on/1.72/bcprov-jdk18on-1.72.jar и передать в параметрах: keytool -list -v -keystore certs.bks -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath bcprov-jdk18on-1.72.jar -storetype BKS -storepass "secret". Обычно, в таких файлах нет ничего интересного. Но кто знает, что попадется на пути исследователя безопасности.#aht
👍6🤡1
В Android есть много интересных системных настроек, которые можно посмотреть командой
Пример управления глобальным proxy:
adb shell settings list <namespace>. Значение <namespace> может быть: system, secure, global. Правда большинство полезных настроек сейчас переехали из system/secure в global. Некоторые настройки в этих неймспейсах вообще специфичны для конкретного устройства. С их помощью можно например включить глобальный прокси, установку из недоверенных источников или отключить верификацию подписи.Пример управления глобальным proxy:
adb shell settings put global http_proxy 192.168.14.33:8081#aht
adb shell settings put global http_proxy :0
👍15❤1🔥1🤡1
Иногда приходится иметь дело с whitebox проектами, когда исходный код полностью доступен. И все же это не повод не декомпилировать уже собранное приложение. Секрет прост - приложение состоит не только из того, кода, который написал разработчик, но также из внешних зависимостей, которые подключаются из бинарного репозитория типа maven. И смотреть итоговый алгоритм может быть сильно удобнее уже в собранном виде. Тем более компилятор часто делает оптимизации и вычисляет выражения, что тоже делает какие-то куски сильно понятнее чем они выглядят в исходном коде. Да и порой, эти зависимости добавляют новые экспортированные компоненты в итоговый манифест.
Хороший реверсер, как известно, все делает наоборот, поэтому начинать анализ whitebox-а лучше все же с декомпилированного кода.
#aht
Хороший реверсер, как известно, все делает наоборот, поэтому начинать анализ whitebox-а лучше все же с декомпилированного кода.
#aht
👍13🤡1
Я вам уже рассказывал, что меня пригласили на Standoff Hacks, и вот наконец-то он закончился 🤪 Статья с моей версией происходящего, как и обещал, будет немного позже, а пока посмотрите финальный ролик и поищите меня в нем 😎
😁12🔥2👍1🤡1
Сегодня будет пара активностей на PHD к которым я имею отношение. Про одну из которых расскажу сейчас. Все кто хочет поучаствовать в конкурсе и поломать мобильное приложение банка - забегайте https://bugbounty.standoff365.com/vendors/gdb
Standoff365
Global Digital Bank
Standoff 365 Bug Bounty — платформа для поиска уязвимостей за вознаграждение и самый быстрый способ убедиться в надежности своей IT-инфраструктуры с помощью тысяч сильнейших хакеров.
🔥3😁1🤡1