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

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

top

(L3) cache
Пользователь
Регистрация
03.02.2020
Сообщения
252
Реакции
342
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.

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


оригинал на английском можно здесь.
перевод Moody
канал Cybred
 


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