Учимся находить уязвимости в Android-приложениях на примере DIVA

  • Автор темы cracker92
  • Дата начала
  • Просмотров 5920 Просмотров

cracker92

Местный
371
64
22 Июн 2019
Damn Insecure Vulnerable App (DIVA) - это невероятно уязвимое приложение, предназначенное, чтобы познакомить вас с типовыми багами, которые можно повстречать на платформе Android.


68443528df8fdaebfd710.png


Давайте учиться на практике!

Шаг 1. Скачайте DIVA по Для просмотра ссылки Войди или Зарегистрируйся, распакуйте и установите.

Шаг 2. Если у вас все еще отсутсвует Android-лаборатория для анализа, рекомендую развернуть ее с помощью Android Studio. То, как это можно сделать, можно узнать в одной из моих Для просмотра ссылки Войди или Зарегистрируйся статей.

Шаг 3. После того, как Diva будет запущено на эмуляторе, откройте его параллельно в jadx-gui, если хотите просмотреть исходный код на Java.

132a89b23ad9d523513b0.png


Небезопасное логгирование

667561db981bc3c4204a7.png


Находясь в терминале Android Studio, перейдите в папку с adb:


Код:


cd ~/Library/Android/sdk/platform-tools

И запустите оболочку: ./adb shell

Находясь в ней, введите команду ps, чтобы просмотреть список запущенных процессов. Поищите в нем jakhar.aseem.diva и обратите внимание на второй столбец - это PID-идентификатор, который необходимо запомнить. В данном случае он равен 18976.

1*XDTkroWjR4fVz6Dt8TlTMQ.png


Теперь для того, чтобы просмотрить логи нужного приложения (в данном случае, DIVA), я выполняю logcat | grep 18976 (где 18976 - его PID) или ./adb logcat, однако вторую команду использовать не рекомендуется, поскольку она будет выводить логи всех приложений со множеством мусорных строк.


d7275682e24bdf7c38850.png


Как вы можете заметить, в логах иногда проскакивает конфиденциальная информация, которая может быть доступна другим приложениям, если у них будет соотствествующее разрешение на чтение.

Хардкодинг, часть первая

8ee5649339d3f4578d428.png


Как я уже упоминал выше, используя jadx-gui, вы можете просматривать исходный код apk-файла в формате Java. Обратите внимание на жестко запрограммированный ключ доступа - он и есть искомая уязвимость.


a07a56f86fd89c8b6cac5.png



f8682b5978c20fc99e31c.png


Небезопасное хранение данных, часть первая

d9fd2bde0d1ce1cbfe7ec.png


После того, как мы ввели некоторые данные и сохранили их, приложение оповещает о том, что они успешно сохранены. Однако, где?

Потребуется запустить шелл от имени рутового пользователя, как это показано на скриншоте ниже. А затем перейти в директорию /data/data - именно в ней, предположительно, находятся сохраненные сведения.


641778681a51bf284b4b8.png


А, если быть точнее, данные хранятся в каталоге shared_prefs. Я нашел его, когда стокнулся с упоминаниями SharedPreferences в исходном коде.


e1f3418bff3b2338afe3e.png



a1d2fda6b533166881deb.png


Небезопасное хранение данных, часть вторая

f3b13f8a2df21c3b7dbc5.png


Во второй части таска с небезопасных хранением исходный код указывает на то, что учетные данные хранятся в базе данных SQL


6fb43985a87a8e0339d87.png


В той же самой директории, которая была найдена на предыдущем этапе, в подпапке databases лежит 4 файла, ids2 - база данных, в которую была сохранена информация.


80739ff7e334edaeab6dd.png



800bb9120347083c27231.png


Небезопасное хранение данных - часть третья

0577dd6eda90e4ced1b8e.png


После сохранения введенных данных, я в очередной раз взглянул на исходники.

Меня заинтересовал метод createTempFile, создающий, как вы уже поняли, временный файл с информацией, отправленной из формы.


83cf0453e71e4ac07de6a.png


Он точно также, как и раньше, лежит в каталоге /data/data/jakhar.aseem.diva.


dda12e0507b7cb480f444.png


Небезопасное хранение данных, часть четвертая

d06d36a20920cba8206cf.png


«Произошла ошибка файла» - когда я нашал на кнопку "Save".

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


b01af5274fd7852242a08.png


Я попытался еще раз сохранить данные, и на этот раз сработало!


8066f073a5b562127204d.png




Используя терминал, перемещаемся на sdcard и видем, что учетные данные сохранены в /sdcard/.uinfo.txt.


6e8fcba55b457738f86d0.png



2387d742cc44531118d1f.png


Проблемы валидации входных данных, часть первая

032152cd22a3ddedabfb2.png


Приложение просит ввести имя пользователя. Если его ввести верно, то выведется его пароль и данные кредитной карты.

Поскольку в данной секции подразумеваются проблемы с проверкой входных данных, я попробовал реализовать простую SQL-инъекцию - и она сработала.

Проблемы валидации входных данных, часть вторая

a56f4a3bd6810208a5177.png



900e23a6b00b1db02ed44.png


Сначала я попытался обратиться к реально существующему сайту, чтобы проверить, отправится ли к нему запрос. Затем я использовал аббревиатуру file:/ для доступа к локальным файлам на тестируемом устройстве, и смог получить всю конфиденциальную информацию из разных мест.


6bb465c01231fc68aaac8.png



63580e2a4417db381387b.png



1f579148f7b81b92e955e.png


Проблемы контроля доступа, часть первая

78c571d26d5cf9a604d46.png



fa27e50b86d795148a50e.png


Просмотреть учетные данные для подключения к API можно нажав на кнопку «VIEW API CREDENTIALS». Проблема состоит в том, что к этим данным можно также получить доступ и извне.


1b2bbaa3fedc62d02f71f.png


Запустите logcat, чтобы увидеть, что происходит после нажатия на кнопку «VIEW API CREDENTIALS». Здесь есть интересная запись ActivityManager'а и произведенное им действие.


1*dAaW-U2-EiWfGGrWHXjfoQ.png


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


Код:


am start jakhar.aseem.diva/.APICredsActivity



1*Tr0ng1fuG4Ja_8fO4hBthA.png



1*tlvCxS5wmeO4JnvztFr5Ow.png


Проблемы контроля доступа, часть вторая

3943bfd392f8022aca9bb.png


Здесь уже не получится так просто получить данные извне, так как для того, чтобы открыть то же самое окно с критичной информацией, необходимо будет ввести PIN. Давайте нажмем на кнопку "Register Now" и проверим логи (logcat)


1*9cB8xzXkTqpDNRBPGNhrGQ.png



1*5n4px5AnTf9N3QbBOrUHIw.png



1*vgJxnDA3UPPeTrIbPUsoeg.png


Обратите внимание, что фактическое значение chk_pin - check_pin.

Нужно обойти проверку, чтобы получить доступ к учетным данным без пин-кода.

Из logcat мы уже знаем, что диспетчер активности - jakhar.aseem.diva / .APICreds2Activity



Код:


./adb shell am start -n jakhar.aseem.diva / .APICreds2Activity --ez check_pin false



1*rA6UydSz154uSD5xfv4QGQ.png


Теперь давайте переключимся обратно, нажмем на кнопку и удостоверимся в том, что приложение больше не потребовало ввести пин-код.


1*O89Sw5nAae71aOjgsgkpkA.png


Проблемы контроля доступа, часть третья

0918a7ebcf4b5648812f7.png


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

Давайте снова обратимся к исходному коду .xml и .java, чтобы найти недостатки. Нас интересует следующее:

  • AndroidManifest.xml
  • AccessControl3Activity
  • AccessControl3NotesActivity
  • NotesProvider

900ce38dcfaf1d9957096.png


Из logcat мы видим, что диспетчер активности - jakhar.aseem.diva / .AccessControl3Activity


1*lY-HHSJ-mUT7LFvdRTIpzw.png


AndroidManifest.xml показывает поставщика содержимого jakhar.aseem.diva.provider.notesprovider; android: enabled = «true» и android: exported = «true», что означает, что компоненты других приложений могут иметь к нему доступ.

А исходники NotesProvider.java показывают, где хранятся заметки.

CONTENT_URI = Uri.parse(“content://jakhar.aseem.diva.provider.notesprovider/notes”);


3b219f8ee13efb71383cf.png



1*QDv1RmH0jYNE7HtuyRbMuA.png


Выполнение следующей команды предоставляет доступ к содержимому заметок без пин-кода.


Код:


./adb shell content query --uri content://jakhar.aseem.diva.provider.notesprovider/notes



1*To2aQCNxAMa1NhEPGocydA.png


Хардкодинг, часть вторая

2cb9a691f59679318bea2.png


Вместо использования jadx-gui, на этот раз я задумался о том, чтобы перейти к более серьезные инструментам для реверс-инжиниринга. Это нужно для того, чтобы изучить файл библиотеки (.so), который не поддерживается jadx-gui.
[automerge]1619000923[/automerge]
6759a302ee86aec7af3e5.png



a1c5bda5a69991bf5b5b3.png



fabfb532db10b4e3a7491.png


Здесь есть два способа: использовать гидру (читайте Для просмотра ссылки Войди или Зарегистрируйся статью), либо apktool.

Использование apktool

7c3ac098e3d7c485b168e.png


Извлеките содержимое diva-beta.apk, выполнив команду:


Код:


apktool d diva-beta.apk


Теперь, просматривая libdivajni.so, обращайте внимание на любые подозрительные строки и вводите их в поле ввода имени пользователя.


Код:


strings arm64-v8a/libdivajni.so



34390cdb63f8130983a87.png



оригинал на английском можно Для просмотра ссылки Войди или Зарегистрируйся.