• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Мобильный Пентест не для Программистов [ Часть 1 ]

grozdniyandy

White-Hat
Premium
Регистрация
11.08.2023
Сообщения
522
Реакции
677
Гарант сделки
2

<?xml version="1.0" encoding="utf-8"?>​

Это первая статья нашего курса eMAPT, я проверил отзывы об экзамене, пока я не вижу никаких больших проблем. Мы подготовимся к экзамену и получим сертификат. Почему "не для программистов"? Потому что я далеко не программист, я живу за счет знаний русского и английского. То что я не знаю программирование не означает что так нужно, если по продолжению какие то навыки понадобястя, мы их получим.

Цель: Иметь какие то знания в мобильном пентесте приложений
Знания: +- Линукс, веб, программирование - я сам не знаю

Содержание​

  1. Что такое eMAPT?
  2. Процесс Пентестирования Мобильных Приложений (Разведка)
  3. Архитектура Android
  4. Создаем Лабораторию
  5. Предлаборатория
  6. ЛАБ
Что я вам советую прочитать:
https://habr.com/ru/articles/16770/

Если я написал что-то неправильно, пожалуйста, прокомментируйте и дайте мне знать!

Что такое eMAPT?​

eMAPT - eLearnSecurity Mobile Application Penetration Tester - это сертификация безопасности мобильных приложений, разработанная INE. На этом экзамене у нас будет 2 APK, мы должны обнаружить уязвимости в этих приложениях, а затем написать наше собственное приложение, которое позволит нам использовать эти уязвимости.

Каковы предварительные требования?
Я не видел никаких предварительных требований на веб-сайте INE, но есть некоторые вещи, которые упоминались в обзорах. Согласно отзывам, предпочтительнее обладать знаниями Java.

Согласно одной из статей:
Джоас, как разработать apk-файл, который использует другие уязвимости? Это примерно тот же apk, он будет взаимодействовать с другими уязвимыми apk, то есть заходить в ваши папки и т.д., и вы запрограммируете, apk, который открывает Google Chrome или собирает информацию из другого apk и так далее. - https://www.linkedin.com/pulse/emaptv2-exam-elearnsecurity-overview-joas-antonio/

Что такое тестирование на проникновение мобильных приложений?
Тестирование мобильных приложений на проникновение - это процесс тестирования безопасности мобильных приложений, целью которого является выявление уязвимостей. В принципе, это то же самое, что и веб-пентест, но на этот раз мы делаем это для мобильных приложений.
Я прочитал несколько статей, одна из них - /threads/99358/ - которую я перевел, но я думаю, что начинать непосредственно с объяснения инструментов - не самый лучший "101". Я постараюсь объяснить все с самых азов.

Процесс Пентестирования Мобильных Приложений​

Разведка
Разведка (в нашем случаи) это процесс нахождения информации о приложении/приложениях какой либо компании. Начинаем с посещения веб-сайта, чтобы собрать информацию о доступных мобильных приложениях. После этого найдём эти мобильные приложения в App Store или Play Market. При этом изучим другие приложения, разработанные тем же разработчиком. Кроме того, ознакомимся с отзывами пользователей, поскольку они могут непреднамеренно указать на потенциальные уязвимости.

Статический анализ
На этом этапе мы углубляемся в исходный код приложения, используя ручные или автоматизированные инструменты. Вместо того чтобы запускать приложение, мы тщательно проверяем его исходный код на наличие неправильных настроек безопасности, открытых ключей API, конфиденциальных данных, таких как электронные письма, имена пользователей и пароли.

Динамический анализ
Этот шаг включает в себя активный запуск приложения и манипулирование им. Мы перехватываем трафик приложения, проверяем доступ к памяти, просматриваем хранилище памяти, пытаемся обойти закрепление SSL (SSL Pinning) и обходим механизмы обнаружения root (Root Detection).

Отчет
Процесс составления отчетов для мобильного пентестинга, похож на процесс создания отчетов для веб-приложений, но в данном случае мы объединяем результаты как веб-, так и мобильного OWASP TOP 10, чтобы обеспечить всестороннюю оценку.

Разведка​

Для понимания этой части, давайте воспользуемся практическим примером - приложения компании "Bolt". Я начал с проверки приложения "Bolt" в магазине Google Play. В приложении вы увидите раздел "App Support", который выполняет ту же функцию, что и страница "Свяжитесь с нами" на веб-сайтах. Здесь вы найдете электронную почту и контактные данные компании. Ниже этого раздела находится раздел "More by Bolt Technology", в котором представлены приложения, разработанные компанией "Bolt". Это хорошая идея провести тестирование на безопасность на менее популярных приложениях, так как вероятно будет легче обнаружить в них уязвимости. Далее, вы увидите раздел "Similar Apps", который можно рассматривать как список конкурентов приложения "Bolt". В разделе "About this app" вы найдете информацию о дате последнего обновления, которая показывает, когда приложение было последний раз изменено. Это может дать представление о версиях, которые, возможно, все еще имеют некоторые проблемы. Обычно компании здесь не предоставляют много информации. Раздел "Ratings and Reviews" позволяет клиентам оставить свой отзыв о приложении. В этом разделе может содержаться информация о возможных уязвимостях в приложении или, по крайней мере, он может предоставить информацию о проблематичных функциях.

Bolt 1.png

Изображение [1]: Bolt​

Когда мы переходим в раздел "More by Bolt Technology", мы снова увидим список приложений, разработанных компанией "Bolt".

bolt 2.png

Изображение [2]: Bolt​

Я проверил отзывы о приложении, чтобы узнать, есть ли какие-либо ошибки с которыми пользователи столкнулись при использовании приложухи. В одном отзыве описывается ситуация, когда пользователь указал неправильное местоположение (вход в торговом центре), и водитель изменил его на правильное. Несколько отзывов показывают, что водители могут отменять заказы без какого-либо подтверждения со стороны пользователя. Также была проблема в котором пользователь не мог оставить чаевые для водителя через приложение.

Исходя из этих отзывов, части приложения, которые следует проверить, включают возможность оставления чаевых в программе, отменa заказов и изменение местоположения в программе для водителя.

customer 1.png

Изображение [3]: Отзывы


customer 2.png

Изображение [4]: Отзывы​

Сейчас пришло время проверить App Store, он в основном аналогичен Play Market, с небольшими различиями.

Мы видим название корпорации, и если нажать на него, мы увидим список приложений, принадлежащих "BOLT TECHNOLOGY OU". Также мы видим "Путешествия: № 29 в этой категории", что также дает нам информацию о конкурентах Bolt. Есть раздел "Что нового", который показывает список обновлений, внесенных в приложение. Также обратите внимание, что компания не предоставляет описания исправлений ошибок. Ниже находится "Оценки и отзывы", но вернемся к этому позже.

bolt ios 1.png

Изображение [5]: Bolt

bolt fixes.png

Изображение [6]: Bolt​

Также мы видим "Конфиденциальность приложения", который показывает, какие данные приложение собирает с устройства и какую информацию от пользователя. Остальное вы можете посмотреть сами, мне нет смысла повторять.

bolt ios 2.png

Изображение [7]: Bolt​

Что касается отзывов, русскоязычные отзывы касаются в основном денег, а не самого приложения, а именно платежей. Что я могу сказать, похоже, "Яндекс" победил в этом аспекте, наверное.

customer ios 1.png

Изображение [8]: Отзывы​

Архитектура Android​

architecture.jpg

Изображение [9]: Архитектура Android​

Linux Kernel / Ядро Linux​

Ядро Linux - это самый низкоуровневый компонент операционной системы Android.

Так что же оно делает?
Оно напрямую взаимодействует с аппаратной частью устройства. Android может работать на разных смартфонах, планшетах и других устройствах, при условии наличия совместимого/подходящего (compatible) ядра Linux для этой аппаратуры. Ядро управляет процессами и обеспечивает возможность одновременного выполнения нескольких приложений. Android-приложения требуют памяти для работы, и за эффективное управление системной памятью отвечает ядро Linux. Ядро Linux предоставляет функции безопасности, такие как права пользователей и групп, контроль доступа и изоляцию процессов; мы будем с ними работать при добавлении сертификата BurpSuite. Android также использует файловую систему, предоставляемую ядром Linux, для хранения и управления файлами; разрешения для файлов такие же, как в Linux. Android-приложения взаимодействуют с аппаратной частью и ядром через системные вызовы; эти системные вызовы позволяют приложениям выполнять задачи, такие как работа с файлами, сетевое взаимодействие, управление процессами и другие.

Platform Libraries and Android Runtime / Библиотеки платформы и среда выполнения Android​

Платформенные библиотеки предоставляют разработчикам предварительно скомпилированный (pre-compiled) код и интерфейсы прикладного программирования (API - Application Programming Interface), упрощая разработку приложений для Android. Эти библиотеки исключают необходимость для разработчиков писать сложный код низкого уровня, позволяя им более легко получать доступ к системным функциям и службам.

Media / Mедиа
Эта библиотека предоставляет поддержку различных операций с аудио и видео, таких как воспроизведение, запись и кодирование. Она позволяет разработчикам интегрировать мультимедийные функции беспрепятственно в свои приложения.

SQLite
SQLite - это базовый механизм для управления данными приложений и важная часть системы хранения и управления данными Android.

OpenGL
OpenGL отвечает за отрисовку 2D и 3D графики. Он предоставляет API для аппаратного ускорения графики, позволяя приложениям взаимодействовать с графическим процессором (GPU) для более быстрой и эффективной отрисовки.

FreeType
FreeType - это механизм рендеринга шрифтов, используемый для отображения текста в приложениях Android.

SSL/TLS Libraries / Библиотеки
Эти библиотеки для обеспечения безопасности сетевых коммуникаций в приложениях Android. Они обеспечивают низкоуровневое шифрование. (SSL Pinning - это методика повышения безопасности в сетевых коммуникациях. - не путать с библиотеками)

Android Runtime
Android Runtime / Среда выполнения Android (ART) - это основной компонент, отвечающий за выполнение (execution) и управление приложениями Android.

Zygote
Zygote загружает часто используемые общие библиотеки и ресурсы в память, что ускоряет запуск новых приложений. При запуске приложения Android создается новый процесс путем практически полного дублирования процесса Zygote. Этот новый процесс наследует состояние памяти, ресурсы и код от процесса Zygote. Поскольку новый процесс является копией процесса Zygote, он также разделяет загруженные библиотеки и ресурсы из Zygote. Это совместное использование ресурсов позволяет приложениям Android запускаться быстрее и использовать меньше памяти.
По сути, этот процесс загружает библиотеки в память, и при запуске нового приложения этот процесс клонируется, и приложение получает возможность использовать уже загруженные библиотеки, таким образом потребляя меньше места и энергии.

Dalvik VM
Dalvik Virtual Machine (Виртуальная машина) был первоначальным исполнительным механизмом для Android перед ART. Он отвечал за выполнение и управление приложениями Android.

Core Libraries / Основные библиотеки
Эти библиотеки предоставляют фундаментальные функции для разработки приложений Android, служа основой для создания различных функциональных возможностей.

Android Application Framework / Фреймворк приложений Android​

Фреймворк приложений Android - это компонент, который предоставляет широкий спектр услуг как для разработки, так и для запуска приложений. Он служит в качестве высокоуровневой основы (high-level framework), которую разработчики могут использовать в качестве фундамента для своих приложений.

Activity Manager / Менеджер активности
Менеджер активности играет роль в контроле жизненного цикла приложений, обязанности включают в себя запуск, возобновление, приостановку и завершение активностей внутри приложений.

Content Provider / Поставщики контента
Поставщики контента позволяют приложениям извлекать и сохранять данные из других приложений.

Window Manager / Менеджер окон
Менеджер окон отвечает за управление отображением пользовательских интерфейсов на экране. Он занимается позиционированием окон и обеспечивает их взаимодействие.

Package Manager / Менеджер пакетов
Менеджер пакетов отвечает за установку и удаление приложений. Он следит за установленными приложениями и связанными с ними разрешениями.

Notification Manager / Менеджер уведомлений
Менеджер уведомлений позволяет приложениям создавать и управлять уведомлениями.

View System / Система представлений
Система представлений - управляет элементами пользовательского интерфейса (UI) и виджетами, обеспечивая их отображение, расположение (layout) и обработку событий (event handling).

Создаем Лабораторию​

Здесь мы настроим лабораторию, которую в дальнейшем будем использовать при пентестировании Android приложений.
Многие источники утверждают, что пентестинг мобильных приложений Android - это то же самое, что и пентестинг Android. Я не мастер в этом, но есть большая разница между приложениями для тестирования на проникновение и всей операционной системой в целом. Android - это ОС, и все, что мы делаем, - это тестируем приложения, которые работают в этой ОС.

JADX-GUI​

JADX-GUI - это инструмент, предназначенный для декомпиляции и проверки файлов приложений Android (APK). Он декомпилирует файлы APK в исходный код Java и обладает базовыми функциями анализа кода, такими как поиск строк и вызов методов(method call) в коде.

Я использую MAC, я знаю, что не все это делают, поэтому я добавлю видео с YouTube для пользователей Windows о том, как вы можете загружать инструменты. Для пользователей MAC это будет актуально, для других, если у вас возникнут какие-либо вопросы / проблемы при установке, не стесняйтесь комментировать, я постараюсь ответить.


Код:
brew install jadx
jadx-gui

brew jadx.png

Изображение [10]: jadx


jadx.png

Изображение [11]: jadx​

APKTool​

APKTool - это инструмент для декомпиляции, модификации и перекомпиляции APK-файлов. Во время декомпиляции мы можем извлекать ресурсы из APK- изображения, XML-файлй и т.д., Мы также можем редактировать исходный код приложения и перекомпилировать его.


apktool.png

Изображение [12]: apktool​

Android Studio​

Android Studio - это IDE для разработки приложений для Android. В основном он используется разработчиками для отладки и повышения производительности кода. Мы будем использовать его в качестве эмулятора Android. Мы также можем использовать другие приложения, такие как Genymotion. В курсах, которые я проверил, установлена Android Studio, поэтому я думаю, что лучше иметь ее. Из того, что я вижу, это выглядит более удобным.

Вы можете скачать Android Studio с ее официального сайта (https://developer.android.com/studio) , я думаю, что видео с установкой для этого не нужно.

as 1.png

Изображение [13]: Android Studio

as 2.png

Изображение [14]: Android Studio​

Genymotion​

Genymotion - это программа для виртуализации мобильных устройств. Genymotion предоставляет широкий выбор виртуальных мобильных устройств это в нашу пользу + я привык с ней тестить. Правда профессионально мобильным пентестом я не занимался, в основном просто как и в веб чекал API/Запросы, OWASP Top 10 короче. Мы можем скачать Genymotion отсюда: https://www.genymotion.com/download/

Предлаборатория​

Наша лаборатория будет InjuredAndroid https://github.com/B3nac/InjuredAndroid . К сожалению, он больше не доступен в Google Play, но это не проблема. Мы разберемся с флагами начального уровня, а остальное будет в следующей части статьи. Перед началом лабораторной работы я хочу показать вам, как загрузить (pull) приложение из Google Play, поскольку это будет полезно в будущем. Зачем пользоваться apkpure, если мы можем сделать (загрузить приложение из Google Play в наш лаб) сами, верно?

В качестве примера мы используем Marvel Unlimited, но в этой статье мы не будем проводить никакого статического/ динамического анализа.

Итак, давайте сначала создадим устройство в Android Studio. Сначала мы открываем нашу Android Studio и нажимаем на "More Actions". Выбираем “Virtual Device Manager”

as 3.png

Изображение [15]: Android Studio

as 4.png

Изображение [16]: Действия

as 5.png

Изображение [17]: Создание устройства​

Кликаем на “Create Device”, теперь у нас есть большой выбор телефонов, планшетов и так далее. Мы будем использовать телефон, на котором есть Play Store. Мы делаем это для того, чтобы иметь возможность легко загружать приложения. Я выбираю "Pixel 7 Pro" без особой причины, вы можете выбрать все, что захотите, и протестировать чтобы понять подходит ли вам.

as 6.png

Изображение [18]: Создание устройства​

Что такое уровень API Android?
Android похож на большой набор инструментов, который разработчики могут использовать для создания приложений. Уровни API Android представляют собой различные версии Android toolbox. Они пронумерованы по порядку, начиная с 1 и повышаясь по мере разработки новых версий Android.

Что такое версия платформы Android?
Версия платформы Android - это конкретная версия операционной системы Android, которая работает на устройстве.

Итак, что же нам следует выбрать? Давайте пока выберем "Nougat", я объясню причину, когда мы проверим AndroidManifest.xml файл некоторых других приложений.

as 9.png

Изображение [19]: Создание устройства​

Обычно нам понадобятся 2 виртуальные машины Android, одна для извлечения из нее APK-файла, другая для тестирования этого APK-файла. На самом деле с Genymotion нам это не нужно, вы можете иметь устройство с Google Play, скачать APK и протестировать его по своему усмотрению. Единственная причина, по которой мы делаем это с Android Studio, заключается в том, что она широко используется и в будущем может нам понадобиться, так что нам не придется настраивать ее с нуля в будущих статьях. В любом случае, главный смысл этой статьи заключается в том, чтобы у нас была настройка/лаборатория (setup/lab).

Если у вас нет Nougat, вы можете легко установить.

as 10.png

Изображение [20]: Загрузка образа системы (system image)​

После установки просто следуйте инструкциям на скриншотах, и виртуальная машина запустится.

as 11.png

Изображение [21]: Создание устройства

as 12.png

Изображение [22]: Создание устройства

as 13.png

Изображение [23]: Android Готов​

Теперь нам нужно войти в Google Play и установить нужное приложение. Я установлю Marvel Unlimited, он занимает 17 мб и может быть простым для понимания. После установки мы можем просто загрузить apk с нашей виртуальной машины на наш ПК.

as 14.png

Изображение [24]: Google Play

as 15.png

Изображение [25]: Marvel

as 16.png

Изображение [26]: Marvel

Кстати, прежде чем загружать приложение с нашей виртуальной машины Android, мы должны установить ADB.

Что такое SDK?
SDK - Software Development Kit - это набор программных средств, которые мы используем для создания приложений.

Что такое ADB?
ADB - Android Debug Bridge - это инструмент командной строки, который является частью Android SDK. Мы используем его для взаимодействия с нашими устройствами Android с компьютера. Простыми словами, это оболочка (shell/terminal) нашей виртуальной машины.

Как установить adb в Windows?

Для MacOS / OS X
Код:
brew install android-platform-tools
adb shell pm list packages | grep marvel
adb shell pm path com.marvel.unlimited
sudo adb pull /data/app/com.marvel.unlimited-1/base.apk /tuda/kuda/xotim/marvel.apk

as 17.png

Изображение [27]: adb​

Хорошо, теперь у нас есть APK, в этой части мы проведем базовый статический анализ, так что нет необходимости в другой виртуальной машине. НО, поскольку цель этой статьи - создать готовую лабораторию, давайте установим имеющийся у нас APK на нашу вторую виртуальную машину Android. На этот раз я буду использовать "Marshmallow", вы можете установить как раньше, теперь наш пользователь будет "root".

as 18.png

Изображение [28]: Создание устройства​

Хорошо, теперь давайте установим APK в нашу новую виртуальную машину, мы можем сделать это с помощью ADB.
Код:
adb shell whoami
adb install /tuda/kuda/ustanovili/uje/marvel.apk

as 19.png

Изображение [29]: adb​

Как вы можете видеть на скриншоте ниже, наш APK установлен.

as 20.png

Изображение [30]: Marvel Готов​

Мы можем устанавливать приложения из APKPure, если захотим, но я просто не вижу для этого причин, кроме экономии времени. И выполнение того, что я показал, займет максимум 5 минут вашего времени сна, а не времени аниме, время аниме священно.

Хорошо, теперь, когда у нас есть все необходимое, мы можем начать нашу лабораторию.

ЛАБ​

Как вы уже знаете, поврежденный Android недоступен в Google Play, поэтому мы по иронии судьбы загрузим его с APKPure. Ссылка для установки: https://apkpure.com/injuredandroid/b3nac.injuredandroid/download Я не несу ответственности, если вы обнаружите вредоносное ПО (заразитесь).

AndroidManifest.xml​

После установки InjuredAndroid я установил его на свою виртуальную машину. Когда мы открываем приложение, мы видим разные флаги. Прежде чем что-либо решать, давайте разберемся, что такое AndroidManifest.xml .

as 21.png

Изображение [31]: adb

as 22.png

Изображение [32]: InjuredAndroid

as 23.png

Изображение [33]: InjuredAndroid​

Проще говоря, Android Manifest - это XML-файл, который содержит метаданные приложения Android. Давайте проверим файл AndroidManifest нашего приложения. Для этого мы должны открыть наше приложение в JADX GUI.

as 24.png

Изображение [34]: AndroidManifest.xml
Код:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="17" android:versionName="1.0.9" android:compileSdkVersion="29" android:compileSdkVersionCodename="10" package="b3nac.injuredandroid" platformBuildVersionCode="29" platformBuildVersionName="10">
    <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="29"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <application android:theme="@style/AppTheme" android:label="@string/app_name" android:icon="@mipmap/ic_launcher" android:supportsRtl="true" android:networkSecurityConfig="@xml/network_security_config" android:roundIcon="@mipmap/ic_launcher_round" android:appComponentFactory="androidx.core.app.CoreComponentFactory">
        <activity android:theme="@style/AppTheme.NoActionBar" android:label="@string/title_activity_flag_seventeen" android:name="b3nac.injuredandroid.FlagSeventeenActivity"/>
        <activity android:theme="@style/AppTheme.NoActionBar" android:label="@string/title_activity_c_s_p_bypass" android:name="b3nac.injuredandroid.CSPBypassActivity">
            <intent-filter>
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.BROWSABLE"/>
                <data android:scheme="http" android:host="b3nac.com" android:pathPattern="/.*/"/>
                <data android:scheme="https" android:host="b3nac.com" android:pathPattern="/.*/"/>
            </intent-filter>
        </activity>
        <activity android:theme="@style/AppTheme.NoActionBar" android:label="@string/title_activity_assembly" android:name="b3nac.injuredandroid.AssemblyActivity"/>
        <activity android:theme="@style/AppTheme" android:name="io.flutter.embedding.android.FlutterActivity" android:configChanges="fontScale|layoutDirection|density|screenSize|uiMode|screenLayout|orientation|keyboardHidden|keyboard|locale" android:windowSoftInputMode="adjustResize" android:hardwareAccelerated="true"/>
        <activity android:theme="@style/AppTheme.NoActionBar" android:label="@string/title_activity_rce" android:name="b3nac.injuredandroid.RCEActivity">
            <intent-filter android:label="filter_view_flag11">
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.BROWSABLE"/>
                <data android:scheme="flag13" android:host="rce"/>
            </intent-filter>
        </activity>
        <activity android:name="b3nac.injuredandroid.SettingsActivity"/>
        <activity android:theme="@style/AppTheme.NoActionBar" android:label="@string/title_activity_exported_protected_intent" android:name="b3nac.injuredandroid.ExportedProtectedIntent" android:exported="true"/>
        <activity android:name="b3nac.injuredandroid.QXV0aA" android:exported="true"/>
        <activity android:theme="@style/AppTheme.NoActionBar" android:label="@string/title_activity_flag_twelve_protected" android:name="b3nac.injuredandroid.FlagTwelveProtectedActivity"/>
        <activity android:label="@string/title_activity_deep_link" android:name="b3nac.injuredandroid.DeepLinkActivity">
            <intent-filter android:label="filter_view_flag11">
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.BROWSABLE"/>
                <data android:scheme="flag11"/>
            </intent-filter>
            <intent-filter android:label="filter_view_flag11">
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.BROWSABLE"/>
                <data android:scheme="https"/>
            </intent-filter>
        </activity>
        <activity android:theme="@style/AppTheme.NoActionBar" android:label="@string/title_activity_flag_ten_unicode" android:name="b3nac.injuredandroid.FlagTenUnicodeActivity"/>
        <activity android:theme="@style/AppTheme.NoActionBar" android:label="@string/title_activity_flag_one_login" android:name="b3nac.injuredandroid.FlagOneLoginActivity"/>
        <activity android:theme="@style/AppTheme.NoActionBar" android:label="@string/title_activity_flag_nine_firebase" android:name="b3nac.injuredandroid.FlagNineFirebaseActivity"/>
        <activity android:theme="@style/AppTheme.NoActionBar" android:label="@string/title_activity_flag_eight_login" android:name="b3nac.injuredandroid.FlagEightLoginActivity"/>
        <activity android:theme="@style/AppTheme.NoActionBar" android:label="@string/title_activity_flag_seven_sqlite" android:name="b3nac.injuredandroid.FlagSevenSqliteActivity"/>
        <activity android:theme="@style/AppTheme.NoActionBar" android:label="@string/title_activity_flags_overview" android:name="b3nac.injuredandroid.FlagsOverview"/>
        <activity android:theme="@style/AppTheme.NoActionBar" android:label="@string/title_activity_flag_six_login" android:name="b3nac.injuredandroid.FlagSixLoginActivity"/>
        <activity android:name="b3nac.injuredandroid.MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        <activity android:name="b3nac.injuredandroid.XSSTextActivity"/>
        <activity android:name="b3nac.injuredandroid.DisplayPostXSS"/>
        <activity android:name="b3nac.injuredandroid.FlagOneSuccess"/>
        <activity android:name="b3nac.injuredandroid.b25lActivity" android:exported="true"/>
        <activity android:theme="@style/AppTheme.NoActionBar" android:label="@string/title_activity_flag_two" android:name="b3nac.injuredandroid.FlagTwoActivity"/>
        <activity android:theme="@style/AppTheme.NoActionBar" android:label="@string/title_activity_flag_three" android:name="b3nac.injuredandroid.FlagThreeActivity"/>
        <activity android:theme="@style/AppTheme.NoActionBar" android:label="@string/title_activity_flag_four" android:name="b3nac.injuredandroid.FlagFourActivity"/>
        <receiver android:name="b3nac.injuredandroid.FlagFiveReceiver" android:exported="true"/>
        <activity android:theme="@style/AppTheme.NoActionBar" android:label="@string/title_activity_flag_five" android:name="b3nac.injuredandroid.FlagFiveActivity"/>
        <activity android:theme="@style/AppTheme.NoActionBar" android:label="@string/title_activity_test_broadcast_reciever" android:name="b3nac.injuredandroid.TestBroadcastReceiver" android:exported="true"/>
        <activity android:name="b3nac.injuredandroid.ContactActivity"/>
        <activity android:theme="@android:style/Theme.Translucent.NoTitleBar" android:name="com.google.firebase.auth.internal.FederatedSignInActivity" android:permission="com.google.firebase.auth.api.gms.permission.LAUNCH_FEDERATED_SIGN_IN" android:exported="true" android:excludeFromRecents="true" android:launchMode="singleTask"/>
        <service android:name="com.google.firebase.components.ComponentDiscoveryService" android:exported="false" android:directBootAware="true">
            <meta-data android:name="com.google.firebase.components:com.google.firebase.auth.FirebaseAuthRegistrar" android:value="com.google.firebase.components.ComponentRegistrar"/>
            <meta-data android:name="com.google.firebase.components:com.google.firebase.firestore.FirestoreRegistrar" android:value="com.google.firebase.components.ComponentRegistrar"/>
            <meta-data android:name="com.google.firebase.components:com.google.firebase.database.DatabaseRegistrar" android:value="com.google.firebase.components.ComponentRegistrar"/>
        </service>
        <meta-data android:name="flutterProjectType" android:value="module"/>
        <meta-data android:name="flutterEmbedding" android:value="2"/>
        <provider android:name="com.google.firebase.provider.FirebaseInitProvider" android:exported="false" android:authorities="b3nac.injuredandroid.firebaseinitprovider" android:initOrder="100"/>
        <activity android:theme="@android:style/Theme.Translucent.NoTitleBar" android:name="com.google.android.gms.common.api.GoogleApiActivity" android:exported="false"/>
        <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version"/>
    </application>
</manifest>

Давайте попробуем разобраться в некоторых ключевых понятиях здесь. Файл начинается с "<?xml version="1.0" encoding="utf-8"?>", который показывает версию XML и кодировку символов. После этого:

<manifest>
Манифест - это файл, который содержит основную информацию о приложении, такую как его версия, разрешения, компоненты

android:compileSdkVersion="29"
Этот атрибут указывает на версию SDK, используемую для компиляции приложения.

package="b3nac.injuredandroid"
Этот атрибут указывает на уникальное имя пакета приложения.

<uses-sdk>
Этот элемент указывает минимальную и целевую версии SDK, необходимые для запуска приложения. В нашем случаи minSdkVersion="21", a targetSdkVersion="29"

<uses-permission>
Элементы с этим тегом определяют разрешения, необходимые для работы приложения. В нашем случаи:
Код:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

Таким образом, наши разрешения для приложений не кажутся опасными, на самом деле это зависит от того, что приложение собирается записать во внешнее хранилище, поскольку оно может быть доступно другим приложениям. В остальном это приложение кажется обычным.

<application>
Этот элемент описывает основные характеристики приложения, активности, службы и т. д.

<activity>
Элементы с этим тегом описывают активности приложения, это просто экран который пользователь видит и с которым может взаимодействовать. Этот элемент имеет атрибут "exported" который указывает, может ли активность быть доступным для использования или взаимодействия другими приложениями. Этот атрибут может иметь два значения: "true" и "false".
  1. exported="true" - это означает, что другие приложения могут взаимодействовать с этой активностью
  2. exported="false" - это означает, что другие приложения не могут взаимодействовать с этой активностью
<intent-filter>
Элементы с этим тегом описывают намерения, тоесть действия и данные которые она может принимать.

Флаг №1​

Когда мы нажимаем на флаг 1, появляется окно, которое запрашивает ввод, и внизу есть кнопка оповещения, когда мы нажимаем на нее один раз, это говорит о том, что флаг находится у нас под носом, когда мы нажимаем на него во второй раз, это говорит о том, что флаг также находится под графическим интерфейсом. Из этих 2 подсказок мы можем понять, что флаг где-то есть в коде. Гениально, верно?) (я шучу)

as 25.png

Изображение [35]: Флаг №1

as 26.png

Изображение [36]: Флаг №1​


Мы можем просто проверить код, связанный с флагом № 1. Итак, что означает этот код? Существует метод, называемый submitFlag, который выполняет действие при нажатии кнопки. Он проверяет, равен ли текст в EditText строке "F1ag_0n3". Если это значение истинно, то запускается новое действие под названием FlagOneSuccess.

as 27.png

Изображение [37]: JADX

as 28.png

Изображение [38]: Флаг №1

Код:
    public final void submitFlag(View view) {
        EditText editText = (EditText) findViewById(R.id.editText2);
        C2646d.m696b(editText, "editText2");
        if (C2646d.m697a(editText.getText().toString(), "F1ag_0n3")) {
            Intent intent = new Intent(this, FlagOneSuccess.class);
            new FlagsOverview().m3890J(true);
            new ApplicationC1464j().m3870b(this, "flagOneButtonColor", true);
            startActivity(intent);
        }
    }

Теперь мы можем просто ввести флаг, и задача будет решена.

as 29.png

Изображение [39]: Флаг №1

Флаг №2​

Теперь мы делаем то же самое со вторым флагом, это дает нам подсказку, что ключевыми словами являются "activity" и "exported", мы можем проверить наш файл манифеста, чтобы увидеть действия, которые можно экспортировать.

as 30.png

Изображение [40]: Флаг №2


as 31.png

Изображение [41]: Флаг №2​



Существует множество действий, которые можно экспортировать, вы можете спросить меня, почему я выбрал именно это, я внук Ванги или Распутина? Ну, у него есть активность b25lActivity, и когда я искал его (кликнул просто), я увидел "flagTwoButtonColor", вот почему я решил проверить именно эту активность.


as 32.png

Изображение [42]: AndroidManifest.xml

as 33.png

Изображение [43]: b25lActivity
Теперь мы знаем действие, следующий шаг - запустить b25lActivity в приложении b3nac.injuredandroid
Код:
adb shell am start b3nac.injuredandroid/.b25lActivity
as 34.png

Изображение [44]: adb

as 35.png

Изображение [45]: Флаг №2​


Флаг №3​

Теперь мы проверяем "flagThreeActivity", это дает нам подсказку о том, что существует XML-файл, который содержит наш флаг. Обычно файл "strings.xml " может содержать некоторую конфиденциальную информацию, такую как ключи и т.д. Мне лень проверять XML-файлы один за другим, поэтому я просто просмотрю "flagThreeActivity" в JADX-GUI.

Screenshot 2023-10-27 at 17.35.36.png

Изображение [46]: Флаг №3

Screenshot 2023-10-27 at 17.35.31.png

Изображение [47]: Флаг №3​



Когда мы проверяем FlagThreeActivity, мы снова видим метод submitFlag, теперь он проверяет, равен ли введенный нами флаг (EditText) результату getString(R.string.cmVzb3VyY2VzX3lv). Я решил просто проверить "cmVzb3VyY2VzX3lv", чтобы понять, что это такое.

Код:
    public final void submitFlag(View view) {
        EditText editText = (EditText) findViewById(R.id.editText2);
        C2646d.m696b(editText, "editText2");
        if (C2646d.m697a(editText.getText().toString(), getString(R.string.cmVzb3VyY2VzX3lv))) {
            Intent intent = new Intent(this, FlagOneSuccess.class);
            new FlagsOverview().m3888L(true);
            new ApplicationC1464j().m3870b(this, "flagThreeButtonColor", true);
            startActivity(intent);
        }
    }


as 35.png

Изображение [48]: JADX

as 36.png

Изображение [49]: JADX

as 37.png

Изображение [50]: JADX

as 38.png

Изображение [51]: JADX​
Теперь у нас есть флаг, и задача решена.


as 39.png

Изображение [52]: Флаг №3​


Флаг №4​

Давайте на этот раз проверим JADX-GUI напрямую. Итак, я проверил флаг на активность, все так же, как и в предыдущих, но на этот раз код проверяет, равен ли введенный нами флаг m3875a. Поэтому я решил проверить m3875a, чтобы понять, что это такое. Также из кода мы можем сказать, что происходит некоторая расшифровка.

as 40.png

Изображение [53]: JADX

as 41.png

Изображение [54]: JADX
Как мы можем видеть, существует значение, закодированное в Base64, которое декодируется. Если мы решим это сами, то получим флаг.

as 42.png

Изображение [55]: Base64 Decode

as 43.png

Изображение [56]: Флаг №4

Флаг №5​

Это также касается экспортируемое действие. Когда мы открываем FlagFiveActivity, мы получаем некоторую ошибку. В ошибке есть "FlagFiveReceiver", который говорит, что есть какой-то "приемник/receiver". Поэтому я просто проверил AndroidManifest.xml .

as 44.png

Изображение [57]: Флаг №5

as 45.png

Изображение [58]: JADX​


Мы видим, что существует действие "TestBroadcastReceiver", мы решаем лабораторную работу, просто запустив TestBroadcastReceiver

as 46.png

Изображение [59]: adb

as 47.png

Изображение [60]: Флаг №5
Я запускал действие до тех пор, пока не был показан флаг. Мы разобрались с лабораторией, но что-то не то, верно? Почему мы использовали именно это действие? Только из-за названия?

Что ж, на самом деле мы могли бы решить эту проблему и другим способом. Мы могли бы просто проверить ошибку и увидеть "com.b3nac.injuredandroid.intent.action.CUSTOM_INTENT" и просто выполнить поиск по нему.


Screenshot 2023-10-27 at 18.04.59.png

Изображение [61]: JADX
Я надеюсь, вам понравилась эта статья, это было простое введение в пентестирование мобильных приложений, с небольшой разведкой и статическим анализом. Я продолжу писать на эту тему. Это интересно, и мы посмотрим, как далеко мы сможем продвинуться без знания языка программирования.

Автор grozdniyandy

Источник https://xss.pro/​

 

Вложения

  • as 8.png
    as 8.png
    62.7 КБ · Просмотры: 26
  • as 7.png
    as 7.png
    143.5 КБ · Просмотры: 23
  • as 31.png
    as 31.png
    31.5 КБ · Просмотры: 23
Последнее редактирование:
Это не статья, а обзор. Я так и не понял, зачем это пролистал. Учитесь писать, я могу вам дать хорошие книги. Ах да, у вас же есть что читать.
Я сам когда-то тупил и совершал такие же ошибки в шаблонах. Здесь вот видим картинку на которой есть А, и собственно пикча, которые у большинства не открываются дефолтно, трафик ли, файлообменник ли, хедеры, еще что.
нашего курса eMAPT
Вашего курса? А какое, извините, вы отношение имеете к INE? Я просто знаю с кем они сотрудничают, о них я ничего не знаю, там не бюро добрых услуг, если с ними идут на контакт чуть выше уровня, то вполне ответственны. Или вы статьи для них пишите? Если статьи, то не совершайте хотя бы обыкновенных шаблонных ошибок. Я не стану их перечислять, я бегло посмотрел и я не искал ошибки и негатив, просто у вас они заметно повторяются и чаще, чем надо было бы. Это обзор может, авторский стиль, взгляд, и не ебет, то да. А как статья - не очень.
Без всякого злорадства и яда говорю. Я сам был в подобном положении и я был тугодум в плане technical writing. Ну правда уроки были бесценные. Да и что говорить, жрать нечего было, чужие города, съемные квартиры, как это отражено в народном фолькльоре? Когда у тебя, как у латыша - х#й да душа. На этот счет один мой старинный товарищ, аналитик из Риги как-то ответил, что и х#й и душа в сущности могут быть бесполезны, если между этими полюсами больше ничего нет, на слепых болванов, которые ничего другого у латышей не видят, не стоит обижаться.
В каком-то смысле так же и ваше творчество. Деньги, успех. Развитие. Как х#й и душа, балтские и любые другие этносы здесь не при чем.
Главное что бы было хоть что-нибудь между. )) Если есть то будет развитие. Если нет, то и х#й не будет волновать и душа отболит. ))
Вам нужно основы понять сочинительства, минимум хорошего тона, правил. Что бы понимали границы стиля, как и чё надо. Это не сложно, далее думать уже не будете. Очень хорошие и полезные навыки в статьях и обучении это работа с иллюзией легкости постижения и глубины знания разумеется. Это отдельная тема, это талант, обучится этому сложно. Но иногда преподаватели ПТУ, курсов компьютерной грамоты в разы талантливей и зачетней профессуры провинциальных институтов, ВУЗов, образовательных учреждений другой аккредитации, категории.
Я бы так оценивал талант и так тарифно выплачивал за проделанный труд, от этого зависит качество образования, это влияние на учеников. Поэтому если вы хотите что бы у вас кроме хуя да души было что-то - учитесь необычным вещам, но начните просто с основ писательского writing. Это 4-8 академ.часов с вопросами и ответами. Вас не просят первый курс журфака или литфака окончить.
Это на случай занятия любимым делом, образовательная деятельность скучна и оценивать там нечего в большинстве. Минобразования не ставит задачи воспитать гениев, поднять науку, поэтому опустим этот вопрос.
Так что вы херней страдать прекращайте. Это не очень высокий стиль и вкус. Я бы написал круто, но это не мой хлеб и я вряд ли бы делал это просто ради денег, какого-то развития я в этом не вижу, потому и смысла впрягаться. На подобные темы. Я составил не так мало полезного, не буду говорить что, до сих пор пользуются. Поэтому у меня свои ориентиры.
 
Последнее редактирование:
Это не статья, а обзор
Нет, я не был на экзамене, это статья про вход в мобильный пентестинг. Я не делаю обзор чего то.
Учитесь писать, я могу вам дать хорошие книги.
Под хайдом или в ЛС отпишите пожалуйста.
Вашего курса? А какое, извините, вы отношение имеете к INE?
Мы community infosec
Или вы статьи для них пишите?
-, у меня даже их курса нет, сперва беру с мне открытых источников что могу, формирую и сюда. Eстественно курс я возьму, но для интро думаю смысла нет, да и множество инфы в инете и так есть, просто нужно правильно искать и формировать, что я и постараля сделать в этой статье.

Благодарю за то что прочли статью и за ваши мысли, книгам если вы считаете что помогут буду рад, если есть какие то ресурсы скиньте. Что касается того что я писал до этого, я книги не люблю читать, мои это документации, но несколько листов в день не помешают, цель всё таки развиваться.
 
Это не статья, а обзор. Я так и не понял, зачем это пролистал. Учитесь писать, я могу вам дать хорошие книги. Ах да, у вас же есть что читать.
Я сам когда-то тупил и совершал такие же ошибки в шаблонах. Здесь вот видим картинку на которой есть А, и собственно пикча, которые у большинства не открываются дефолтно, трафик ли, файлообменник ли, хедеры, еще что.

Вашего курса? А какое, извините, вы отношение имеете к INE? Я просто знаю с кем они сотрудничают, о них я ничего не знаю, там не бюро добрых услуг, если с ними идут на контакт чуть выше уровня, то вполне ответственны. Или вы статьи для них пишите? Если статьи, то не совершайте хотя бы обыкновенных шаблонных ошибок. Я не стану их перечислять, я бегло посмотрел и я не искал ошибки и негатив, просто у вас они заметно повторяются и чаще, чем надо было бы. Это обзор может, авторский стиль, взгляд, и не ебет, то да. А как статья - не очень.
Без всякого злорадства и яда говорю. Я сам был в подобном положении и я был тугодум в плане technical writing. Ну правда уроки были бесценные. Да и что говорить, жрать нечего было, чужие города, съемные квартиры, как это отражено в народном фолькльоре? Когда у тебя, как у латыша - х#й да душа. На этот счет один мой старинный товарищ, аналитик из Риги как-то ответил, что и х#й и душа в сущности могут быть бесполезны, если между этими полюсами больше ничего нет, на слепых болванов, которые ничего другого у латышей не видят, не стоит обижаться.
В каком-то смысле так же и ваше творчество. Деньги, успех. Развитие. Как х#й и душа, балтские и любые другие этносы здесь не при чем.
Главное что бы было хоть что-нибудь между. )) Если есть то будет развитие. Если нет, то и х#й не будет волновать и душа отболит. ))
Вам нужно основы понять сочинительства, минимум хорошего тона, правил. Что бы понимали границы стиля, как и чё надо. Это не сложно, далее думать уже не будете. Очень хорошие и полезные навыки в статьях и обучении это работа с иллюзией легкости постижения и глубины знания разумеется. Это отдельная тема, это талант, обучится этому сложно. Но иногда преподаватели ПТУ, курсов компьютерной грамоты в разы талантливей и зачетней профессуры провинциальных институтов, ВУЗов, образовательных учреждений другой аккредитации, категории.
Я бы так оценивал талант и так тарифно выплачивал за проделанный труд, от этого зависит качество образования, это влияние на учеников. Поэтому если вы хотите что бы у вас кроме хуя да души было что-то - учитесь необычным вещам, но начните просто с основ писательского writing. Это 4-8 академ.часов с вопросами и ответами. Вас не просят первый курс журфака или литфака окончить.
Это на случай занятия любимым делом, образовательная деятельность скучна и оценивать там нечего в большинстве. Минобразования не ставит задачи воспитать гениев, поднять науку, поэтому опустим этот вопрос.
Так что вы херней страдать прекращайте. Это не очень высокий стиль и вкус. Я бы написал круто, но это не мой хлеб и я вряд ли бы делал это просто ради денег, какого-то развития я в этом не вижу, потому и смысла впрягаться. На подобные темы. Я составил не так мало полезного, не буду говорить что, до сих пор пользуются. Поэтому у меня свои ориентиры.
как и статья - комментарий максимально информативный и объемный, фидбек достойный этой статьи0)
 
Позвольте поинтересоваться, это у которых юр адрес в "1001 4th St SW, Washington, DC 20024, US" ?)
Не, мы на третьем этаже здании FBI, у которых юр адрес «935 Pennsylvania Avenue, NW Washington, D.C. 20535-0001» (шутка)
 
Благодарю за то что прочли статью и за ваши мысли, книгам если вы считаете что помогут буду рад, если есть какие то ресурсы скиньте. Что касается того что я писал до этого, я книги не люблю читать, мои это документации, но несколько листов в день не помешают, цель всё таки развиваться.

Какие ресурсы? Вы должны понять, что вы не умеете составлять тексты и должны хотеть научится этому. Тогда можно об этом подумать.
Возьмите и набросайте планчик. Статья на эту тему, она какие задачи и цели решала бы? Какая аудитория ее читала бы, что их могло заинтересовать, как это лучше подать?
Как лучше это сделать, что и как вы будете описывать. Примерный объем и порядок. Вы можете придти к тому, что эту работу можно было бы сделать по разному, люди разного опыта и умений сделали бы ее по разному. Поэтому рекомендую это делать.
Когда вы научитесь понимать и возможно доказывать, что лучше вас эту работу не сделает никто, а это возможно и доказательства заказчику, кто бы он ни был, будут существенны, тогда можно сказать, что кое чего вы поняли, да и мои советы были даны не напрасно
Единственная причина, по которой я на этом акцентуализируюсь в том, что у вас есть особенная черта, вы цепляетесь за одно, а потом резко уходите в сторону, это именно тенденция и она заметна. В этом материале например вы упомянули UBER.
Причины, по которым это возможно могут быть очень различными, они не могут свидетельствовать ни о чем конкретном, но поскольку это скорее системно, то они не очень важны, какими бы они не были. Я думаю, что это немного показатель потенциала.
Вы, вероятней всего и будете заниматься написанием текстов, просто в случае авторского видения, на таких сайтах можно встретить объявление вроде "блокировщики рекламы убивают шанс на качественную журналистику". Видишь такое и понимаешь в чем ошибка и непонимание.
Блокираторы рекламы если и убивают шансы, то не на качественную журналистику, а на материал, который ради хайпа подается и живет за процент от просмотров, не говоря о совершенно безграмотном построении предложения.
Подумайте об этом.

Мы community infosec
Что, что? ))
Нет, я не был на экзамене, это статья про вход в мобильный пентестинг. Я не делаю обзор чего то.
Это и предполагалось. Просто вы упомянули вполне конкретную авторскую методику обучения и вообще. Это не принципиально важно вероятно, просто может быть конфузным для вас, или кого-то другого.
Это авторская методика, она отсылает к конкретной организации, которая организовывает обучение и аттестацию.
Не очень красиво, я так думаю. Какое такое комьюнити инфосек, я не знаю. Существует элементарное уважение чужого труда, правила приличия, вне зависимости, стоят ли там знаки © или ®.
Вы упомянули курс, к которому не имеете отношения, вы его даже не прослушивали, но упомянули в самом начале. А зачем? Другие могут сделать выводы что это всё фуфло например, почитав ваш материал, или не читая его. Посчитают что раз у этих курсов такая реклама (а так предполагать вполне логично), то это не для нас и тому подобное. Ну сугубо теоретически, если бы аудитория была шире, такой вопрос подняли бы.

как и статья - комментарий максимально информативный и объемный, фидбек достойный этой статьи0)

Не знаю что именно вы имели в виду под информативностью, но умение делать верные выводы важнее самой информативности. Даже если бы вам выдали рафинад голой статистики и фактологической данности, вероятней всего вы запутались бы и в этом. Или определенно запутались бы, если бы такой материал заранее подготовили для этой цели. Не думаю что ваши обывательские умозаключения красят вас, в шутке, или всерьез, они скорее свидетельство того, что вы не очень умеете оценивать вводные данные, верные предпосылки для верных выводов, - это не про вас.
 
Не знаю что именно вы имели в виду под информативностью, но умение делать верные выводы важнее самой информативности. Даже если бы вам выдали рафинад голой статистики и фактологической данности, вероятней всего вы запутались бы и в этом. Или определенно запутались бы, если бы такой материал заранее подготовили для этой цели. Не думаю что ваши обывательские умозаключения красят вас, в шутке, или всерьез, они скорее свидетельство того, что вы не очень умеете оценивать вводные данные, верные предпосылки для верных выводов, - это не про вас.
Скрытый контент для пользователей: stepany4.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх