4. Android Static Analysis

Injured Android

๐Ÿ”— InjuredAndroid

๐Ÿ”— InjuredAndroid walk-throughs

  1. Download the latest release injuredandroid.apk from Github

  2. Enable USB debugging on your Android test phone.

  3. Connect your phone and your pc with a USB cable.

  4. Install via adb if installing from releases. (You need to use the absolute path to the .apk file or be in the same directory)

๐Ÿ“Œ Packages name: b3nac.injuredandroid

InjuredAndroid is a a vulnerable Android application that shows simple examples of vulnerabilities in a ctf style.

mkdir ~/apks
cd ~/apks

wget -O InjuredAndroid.apk https://github.com/B3nac/InjuredAndroid/releases/download/v1.0.12/InjuredAndroid-1.0.12-release.apk

adb install InjuredAndroid.apk

EXTRA

  • Check for app's path (and pull base.apk if necessary)

adb shell
pm list packages | grep injured
	package:b3nac.injuredandroid
pm path b3nac.injuredandroid
	package:/data/app/b3nac.injuredandroid-Ms4WCz1i9EefZuncV6Xnpw==/base.apk

# Pull the apk from the path into the host OS
exit # the adb shell
adb pull /data/app/b3nac.injuredandroid-Ms4WCz1i9EefZuncV6Xnpw==/base.apk InjuredAndroid_base.apk

๐Ÿ”ฌ Open InjuredAndroid.apk with jadx-gui for analysis.


The AndroidManifest.xml file contains essential information about the app, declaring the components of the app like minSDKVersion, Permissions, Activities, Services, Content Providers, Intent Filters, Debugging Info, etc.

  • Permissions (Network, Internet, Phone, RW External Storage, etc)

  • Activities (UI elements for user's interaction)

    • hidden screens protected with intent-filters

    • outside exposed activity - android:exported="true"

  • Content Providers (sharing data between apps)

    • dangerous if exported

AndroidManifest.xml
  • Look for

    • minSdkVersion

    • android.permission

    • activity & provider

    • android:exported flags

    • various normal strings

    • backup options


Manual Static Analysis

Apktool CLI Parameters

๐Ÿ”ฌDecompile the app using apktool

  • lib - directory where source code is changed for injection (.so files = shared objects)

  • original - check for sensitive information in the files, AndroidManifest.xml

  • res - resources directory, check the values/strings.xml file

  • smali - directory where the app's source code is stored (Smali is not human readable, use dex2jar converter or jadx-gui that decompile the files directly into Java)

  • AndroidManifest.xml - important for static analysis


Hardcoded Strings

Hardcoded strings refer to strings or text values that are directly written into the source code of a program, typically without being stored in a separate configuration file or resource file.

  • Found in Resources/strings.xml and in Activity source code

Threat vector can be login bypass with hardcoded credentials, exposed URLs and API Keys, Firebase URLs, etc.

๐Ÿ”ฌ Open InjuredAndroid.apk with jadx-gui for analysis, open Resources/resources.arsc/res/values/*.xml files and search for hardcoded strings.

strings.xml

Use the Text search tool to search the source code. Search for useful info like API, URLs, ids, passwords, SQL, Firebase, HTTP/HTTPS, secrets, sensitive data, etc.


Injured Android Flags

Flag1

Using jadx-gui open Source code\b3nac.injuredandroid\FlagOneLoginActivity

FlagOneLoginActivity

The submitFlag method verifies user input against the string "F1ag_0n3" and, if matched, navigates to the FlagOneSuccess activity, with associated actions related to flags and UI.

๐Ÿšฉ F1ag_0n3 - Flag found in the submitFlag method.

Flag2

There is a way to bypass the main activity and invoke other activities that are exported. Activities can be accessed with adb.

In jadx-guid, search for android:exported="true" in the AndroidManifest.xml file.

  • Take the <activity android:name="b3nac.injuredandroid.b25lActivity" android:exported="true"/> activity.

  • b3nac.injuredandroid.b25lActivity can be accessed from anywhere on the phone

๐Ÿšฉ S3c0nd_F1ag

Flag3

R stands for Resources. Check for xml files.

Using jadx-gui open Source code\b3nac.injuredandroid\FlagThreeActivity

FlagThreeActivity

The submitFlag method checks if the user input matches the string resource cmVzb3VyY2VzX3lv. If true, it directs to the FlagOneSuccess activity, with related flag handling and UI.

  • The hardcoded string (containing the flag) is stored in the strings.xml file - easy to reverse engineer.

Search for the cmVzb3VyY2VzX3lv string in the strings.xml file.

๐Ÿšฉ F1ag_thr33

Flag4

Classes and imports.

Using jadx-gui open Source code\b3nac.injuredandroid\FlagFourActivity

FlagFourActivity

The submitFlag method compares the user input with a string decoded from a byte array obtained by the decoder.getData() method. If there's a match, it launches the FlagOneSuccess activity, updating flag status and UI.

Search the obfuscated g class.

  • CyberChef online tool can be used to decode the string or Terminal base64 -d command.

The g class provides a byte array obtained by decoding a Base64-encoded string. The decoded byte array represents the value "4_overdone_omelets" and is accessible through the a() method.

๐Ÿšฉ 4_overdone_omelets

Flag8

AWS Cli, Profiles and Credentials.

๐Ÿ”— Tools

  • cloud_enum - Multi-cloud OSINT tool. Enumerate public resources in AWS, Azure, and Google Cloud.

  • Run cloudenum.py

Check the http://injuredandroid.s3.amazonaws.com/ bucket, the enumeration reveals the flag. Instead of attempting to crack the AWS login secret, one of the discovered URLs will get the flag.

๐Ÿšฉ C10ud_S3cur1ty_lol

EXTRA - Previous AWS with ID & SECRET strings.

Flag9

Use .json trick with database URL.

๐Ÿ”— Tools

Open strings.xml and search for firebase.

Found <string name="firebase_database_url">https://injuredandroid.firebaseio.com</string>.

Open https://injuredandroid.firebaseio.com in a browser - Google login.

  • Enumerating Firebase database (if not found in the strings)

  • Run firebaseEnum.py

Using jadx-gui open Source code\b3nac.injuredandroid\FlagNineFirebaseActivity

FlagNineFirebaseActivity
FlagNineFirebaseActivity

Open https://injuredandroid.firebaseio.com/flags/.json in the browser and find the flag

  • this Firebase directory is not protected.

Base64 encode the found flag [nine!_flag] and input in the app.

๐Ÿšฉ W25pbmUhX2ZsYWdd


MobSF Automated Analysis

๐Ÿ”— MobSF - a security research platform for mobile applications in Android, iOS and Windows Mobile

Run MobSF (with Docker) and import the InjuredAndroid.apk into it for Static Analysis.

MobSF - InjuredAndroid.apk
MobSF Application Security Scorecard - InjuredAndroid 1.0.9

Last updated

Was this helpful?