1628 palabras
8 minutos
Notas sobre hacking Android
Android pentest
Índice
- Teoría
- ADB
- Android Tools
Teoría
Rooteando Android
- Otorgarle privilegios de root a tu celular requiere un celular físico o virtual
En caso de celualar físico
- Nota: Cada dispositivo, fabricante y versión de S.O. tiene su propio método, pero a grandes rasgos se debe hacer lo siguiente
- Instalar los drivers de celular
- Desbloquar bootloader
- Instalar TWRP (o equivalente) e inicializarlo
- Instalar Magisk o equivalente (KernelSU, Kitsune, étc)
- Corroborar estado de rooteo con alguna aplicación (Root Checker Basic, RootBeer Ample, Integrity Checker, YASNAC)
- Instalar certificado de PortSwigger
- Instalar plugins/módulos de magisk
- Always Trust User Certificates (Jeroen Beckers) => Confía en el certificado de Burp y puedes leer el tráfico cifrado
- Play Integrity Fix (chiteroman) => Evade la detección de un par de validaciones anti root
- Shamiko (LSPosed Developers) => Evade la detección de un par de validaciones anti root
- Zygisk - LSPosed => Evade la detección de un par de validaciones anti root
- En teoría ahora tienes lo básico en tu celular para hacer pruebas
- En caso de que el dispositivo sea virtual
- Se puede usar GenyMotion
- Está rooteado por defecto, solo debes instalar las aplicaciones correspondientes
- Android Emulator (Android Studio)
- Se puede rootear cuando este no tiene Google Play Services (Al momento de crearse se selecciona sin el icono de PlayStore)
En caso de celualar virtual (Genymotion)
Herramientas utiles
Virtualizadores:
- Genymotion
- Virtualizador
- Android Studio
- Virtualizador
Análisis de código
- Mobile-Security-Framework-MobSF
- All-in-one mobile application (Android/iOS/Windows)
- Análisis automatizado de la aplicación
- apktool
- Decompilar la aplicación
- Puedes hacer modificaciones de código en el Smali
- Compilar la aplicación
- Nota: Se debe firmar la aplicación con jarsigner
- jadx
- Decompilar la aplicación. Tiene el modo —deobf para desofuscar el código
Pruebas dinámicas
- drozer
- Drozer es una herramienta que cuenta con una lista de módulos los cuales nos permiten hacer distintas pruebas de seguridad
- adb
- Android Debug Bridge, para conectarse al teléfono
- SSHDroid
- Servidor SSH
- Frida
- Objection
Utilidades
- Netcat
- Herramienta de red
Locations with information
# System apps are located in/system/app
# User installed apps are located in (here you can find app.apk)/data/app/
# Data of apps/data/data/
## Shared preferences (if an app use a insecure data storage)/data/data/app/shared_prefs/
# It may contains a embebed strings withapp/res/values/strings.xml
Genymotion info
### You can now use these tools from [/opt/genymobile/genymotion]:- genymotion- genymotion-shell- gmtool
### /opt/genymobile/genymotion/tools
Puntos importantes
- Tras decompilar con apktool
- Android Manifest tiene el nombre de las actividades y algunos servicios. A su vez permisos para ejecución
- Activity MAIN ACTIVITY muestra la actividad que ejecutará al inicializar la aplicación
- app/res/values/strings.xml puede tener strings como passwords, API Keys, información interesante
- google_api_key
- google_api_id
- project_id
- If firebase is on debug name you can check all data of your database with something similar to (need to get it with petition intercept)
- Android Manifest tiene el nombre de las actividades y algunos servicios. A su vez permisos para ejecución
- ProGuard is a thing inside of Android Studio to Obfuscate and do small your code
- AndroidManifest.xml => allowBackup=“true” puede ser inseguro
- You can manipulate an apk for allow trusth in users certificates
Basics ADB
Conexión
Basics ADB
Puertos default:
- 5000 (adb)
Comandos Básicos
# Mostrar menú de la herramientaadb
# ADB as rootadb shellsu
# Conectarte a un dispositivo mediante adbadb connect 172.27.253.6:5555
# Listar dispositivosadb devices
# Instalar en aplicación en emuladoradb -s <emulator> install <application.apk>
# Reemplaza la copia existente de la aplicaciónadb -s <emulator> install -r <application.apk>
# Ingresa a una shell de un deviceadb -s <emulator> shell
# Envía un documento a un emuladoradb -s <emulator> push '/home/user/local/file' '/data/local/'
# Descarga un documento desde un emuladoradb -s pull 'sdcard/log.txt' '/home/user/local/file'
# Listar apps instaladasadb shell cmd package list packages
# Start activity on deviceam start -n com.android.package/.activity_name## am start -n com.android.insecurebankv2/.PostLogin
ADB on the network (unencrypted traffic)
# Using usb cable and adb get the ip cellphoneadb shell ip -f inet addr show wlan0adb shell "ip addr show wlan0 | awk '\$1 == \"inet\" {print \$2}' | cut -f1 -d/"
# setting up adb over wlanadb tcpip 5555
# checking service upadb shell netstat -pnta | grep 5555## look LISTEN service
# Exit and disconnect USB cable
# Connectadb connect IP:PORT (192.168.100.10:5555)## Return connected to...
# For disconnectadb disconnect
### Note: The traffict is unencrypted
# For closed service on port over WLANadb usb
ADB útiles
# Ver logsabd logcat
# Create tcpdump in mobiletcpdump -v -s 0 -w my_pcap.pcap
Basics pm
# Listar paquetes instaladospm list packages
# Ver el path de la apppm path com.android.name
Android Tools
apktool
# Decompile the appapktool d app.apk
# The code smali can be modificatedhttp://pallergabor.uw.hu/androidblog/dalvik_opcodes.html
# Doing a patched appapktool b folder -o patched_app.apk
# Sing the new app## Check for "Firmar aplicaciones"
Firmar aplicaciones
# Generate a key to firm the appkeytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000
# Sing the appjarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore your_app.apk alias_name # Install # sudo apt install default-jdk-headless
jadx
# Decompilejadx -d new_folder app.apk
# If the apk is obfuscated## It's better than MobSF to decompile obfuscated codejadx -d new_folder app.apk --deobf
Repositorio
Drozer
# Iniciando el Servidoradb forward tcp:31415 tcp:31415
# Start the app in cellphone
# Connect to drozerdrozer console connect
# List apps and filtraterun app.package.list -f <name>
# Get info apprun app.package.info -a <name>
# View attack surfacerun app.package.attacksurface <name>
# List activitiesrun app.activity.info -a <name>
# Start activitiesrun app.activity.start --component <app_name> <activity_name>
# Scan provider URLsrun scanner.provider.finduris -a <app_name>
## Inside of a shell adb shellcontent query --uri "content://jakhar.aseem.diva.provider.notesprovider/notes"
## Filter by a title of elementcontent query --uri "content://jakhar.aseem.diva.provider.notesprovider/notes" --projection title
## using sql (manual)content query --uri "content://jakhar.aseem.diva.provider.notesprovider/notes" --projection "* FROM sqlite_master; --"
# provider queryrun app.provider.query "content://jakhar.aseem.diva.provider.notesprovider/notes" --projection "* FROM sqlite_master; --"
# Automated scanrun scanner.provider.injection -a <app_name>
# Automated show tablesrun scanner.provider.sqltables -a <app_name>
## Inside of a shell adb shell## Get a verion of sqlitecontent query --uri "content://jakhar.aseem.diva.provider.notesprovider/notes" --projection "sqlite_version() --"
# List broadcast reciversrun app.broadcast.info -a <package_name> -i
# Send broadcast reciversrun app.broadcast.send --action <name> --extra string <var_name> <value> --extra string <var_name> <value>
More info:
Mobile-Security-Framework-MobSF
By Docker install
# To run for first timesudo docker run -it --name mobsf -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest
# Visit your localhost or IP on 8000 portlocalhost:8000## Default user and passwordmobsf:mobsf
# To stop containersudo docker stop mobsf
# To start again the containersudo docker start mobsf
# More info
## To lists all containerssudo docker ps -a
## To lists active containerssudo docker ps
## To remove containerdocker rm <id_contenedor>
## To remove container imagesudo docker rmi <id_imagen>
Dex2jar
Sign
sqlite3
sqlite3 <db>
# List tables.tables
# SelectSELECT * FROM <table>
Objection
- https://medium.com/@ria.banerjee005/bypassing-ssl-pinning-with-frida-and-objection-in-mobile-applications-0b42a778b0f2
- https://petruknisme.medium.com/easy-way-to-bypass-ssl-pinning-with-objection-frida-beginner-friendly-58118be4094
Dependencias
sudo apt install apksignersudo apt install zipalign.
Frida
Frida requiere dos aplicaciones:
- Frida server (instalado en el celular)
- Frida client (Instalado en la computadora)
- Nota: Ambos deben tener la misma versión instalada. Por ejemplo: 16.7.13
Instalar cliente de Frida en Debian 12
# Instalar pipxsudo apt install pipx
# Instalar frida-toolspipx install frida-tools
# Instalar una versión en especificapipx install frida-tools==16.7.13
# Solamente si no lo detecta el PATHpipx ensurepath # Note: '/home/user/.local/bin' is not on your PATH environment variable. These apps will not be globally accessible until your PATH is updated. Run `pipx ensurepath` to automatically add it, or manually
# Obtener la versión de Frida frida --version # 16.7.13
# Actualizar Fridapipx upgrade frida-tools # 17.2.11
# Quitar Fridapipx uninstall frida-tools
Desde la computadora - Descargar Frida Server para el celular (debe coincidir con la que tienes instalada)
- https://github.com/frida/frida
- Releases
- Si tu celular tiene arquitectura de 64 bits (x64)
- Versión Frida-Server Android ARM64 (frida-server-16.7.13-android-arm64.xz)
- https://github.com/frida/frida/releases/download/16.7.13/frida-server-16.7.13-android-arm64.xz
- Si tu celular tiene arquitectura de 32 bits (x86)
- Versión Frida-Server Android ARM (frida-server-16.7.13-android-arm.xz)
- https://github.com/frida/frida/releases/download/16.7.13/frida-server-16.7.13-android-arm.xz
Descomprimir y cargar en el celular frida-server (Desde la computadora)
# Descomprimir frida serverxz -d frida-server-16.7.13-android-arm64.xz
# Cambiar el nombremv frida-server-16.7.13-android-arm64 frida-server
# Subir frida-server al celularadb push frida-server /data/local/tmp
# Inicializar frida-serveradb shellsucd /data/local/tmp/chmod +x frida-server./frida-server &
# Verificar que frida-server este corriendops | grep frida # root 8828 15283 49124 22764 poll_schedule_timeout 0 S frida-server
Objection
Instalar Objection
- Es requerido contar con Frida para hacer uso de este módulo
# Instalar pipxsudo apt install pipx
# Instalar Objectionpipx install objection
# Probar Objectionobjection --gadget "com.android.settings" device-type # Using USB device `moto g 7 play` # Agent injected and responds ok! # Connection: USB # Name: com.android.settings # System: channel # Model: motorola # Version: 10 # Asking jobs to stop... # Unloading objection agent...
Free labs
- https://github.com/atilsamancioglu/MS2-WordGame
- Change the function to gain score with anything word
- https://github.com/dineshshetty/Android-InsecureBankv2
- Insecure Bank app
- https://github.com/atilsamancioglu/MS1-SecureTweet
- Needed a course to explain how to compile
- https://github.com/httptoolkit/android-ssl-pinning-demo
- SSL Pinning
Bypassing SSL Pinning
Frida Scripts
Comentario
- Al correr los scripts hay una diferencia entre la opción
-f
y-F
-f
TARGET, —file TARGET spawn FILE-F
, —attach-frontmost
# Con -f indicas el binario a abrir para hacerle ssl pinning# Este no siempre funciona, puede tronar la appfrida --codeshare akabe1/frida-multiple-unpinning -f YOUR_BINARY
# Con -F agarra la app que tengas abierta# Con este no se obtuvieron erroresfrida --codeshare akabe1/frida-multiple-unpinning -F
akabe1 - frida-multiple-unpinning
Link
Notas:
- Funcionó en determinada aplicación. Muy efectivo.
# Obtener nombre de la aplicaciónfrida-ps -Uia | grep app_name # 29233 My app com.app.name
# From filefrida --device 192.168.1.1:5555 -f com.app.name -l frida-script.js
# From codesharefrida --codeshare akabe1/frida-multiple-unpinning --device 192.168.1.1:5555 -f com.app.name
# Si solo se tiene un dispositivo vinculado, puede hacerse de la siguiente manerafrida --codeshare akabe1/frida-multiple-unpinning -f YOUR_BINARYfrida --codeshare akabe1/frida-multiple-unpinning -U -f com.app.name
Otros scripts de Frida:
frida --codeshare sowdust/universal-android-ssl-pinning-bypass-2 -U -f YOUR_BINARY# No funcionófrida --codeshare pcipolloni/universal-android-ssl-pinning-bypass-with-frida -U -f YOUR_BINARY# No funcionófrida --codeshare sowdust/universal-android-ssl-pinning-bypass-2 -U -f YOUR_BINARY# No funcionófrida --codeshare Q0120S/bypass-ssl-pinning -U -f YOUR_BINARY# No funcionó, pero avanza másfrida --codeshare hyugogirubato/android-ssl-pinning -U -f YOUR_BINARY# No funcionó, pero avanza más
# IOS# frida --codeshare federicodotta/ios13-pinning-bypass -U -f YOUR_BINARY# frida --codeshare federicodotta/ios13-pinning-bypass -U -f YOUR_BINARY
Objection
- No funcionó en determinada aplicación
- (agent) [390586] Called (Android 7+) TrustManagerImpl.checkTrustedRecursive(), not throwing an exception.
# Obtener nombre de la aplicaciónfrida-ps -Uia | grep app_name # 29233 My app com.app.name
# Inicializar la appobjection --gadget "com.app.name" explore
# Deshabilitar ssl pinningandroid sslpinning disable
Instalación adb y fastboot
sudo apt install fastboot adb
Anexo - Otros recursos
Laboratorios de Android
Frida y Objection
Magisk
Notas sobre hacking Android
https://elcaza.github.io/posts/apuntes/hacking_android/