Wednesday, April 29, 2020

Android: Buenas Prácticas de Desarrollo

Android es uno de los sistemas operativos para teléfonos inteligentes más populares en la actualidad. Tiene una gran base de consumidores, así como un gran apoyo de la comunidad de desarrolladores, al momento existen 2,885,938 aplicaciones en Google Play.

Google Play cuenta con el programa de mejora de seguridad de aplicaciones “App Security Improvement”. Gracias a este programa Google analiza las aplicaciones en busca de fallos de seguridad, antes de que éstas sean publicadas, en caso de evidenciarse un fallo, se envía una notificación junto con el consejo o recomendación para mitigar la vulnerabilidad.

Así mismo, si usted encuentra un posibles problemas de seguridad en cualquier aplicación, puede notificarlo por medio de la cuenta: security+asi@android.com.

El programa de Google puede facilitarle en la remediación de vulnerabilidades, pero esto será en la etapa de implementación lo cual puede incurrir en gastos adicionales y aumento en tiempos de entrega, a continuación, podrá encontrar las principales estrategias que le permitirán incrementar los niveles de seguridad en su aplicación:

1. Ofuscación del código

¿Qué tan fácil es hacer ingeniería inversa a la aplicación?
Una aplicación Android(.apk) puede contener código Java, Kotlin(compilado a Java), C/C++ (Java NDK), Corona / LUA, PhoneGap.

La ofuscación de código es el proceso de modificar un ejecutable para evitar que este sea fácilmente legible, sin este proceso el código fuente del apk puede es fácilmente legible por cualquier curioso. Un apk no es más que un archivo comprimido.

¿A qué tipo de riesgos podría estar expuesto?

Robo de propiedad intelectual: El código fuente debería ser leído únicamente por el autor o dueño del producto pero esto no siempre es así, y la lógica de programación, arquitectura, dominios etc., puede ser usados/consultados por un adversario que intentará tomar provecho de cada componente.

Privacidad: El código podría exponer datos de licenciamiento, lógica del proceso de activación o mecanismos para evasión de filtros.

Explotación de vulnerabilidades: Un nuevo día revela una nueva vulnerabilidad en componentes o funciones que no se tuvieron en cuenta en el lanzamiento de la aplicación, éstas podrían ser encontradas por medio de un análisis de código estático y explotadas en tiempo de ejecución.

El propósito de la ofuscación es reducir el tamaño de una aplicación acortando los nombres de las clases, métodos y campos, incrementando el nivel de dificultad en una inspección.

Para mejorar este proceso se recomienda usar herramientas de código abierto como ProGuard o comercial como DexGuard.

2. Almacenamiento de datos

El problema de seguridad más común para una aplicación en Android es que otras aplicaciones puedan acceder a los datos que se guardaron en el dispositivo, toda la información sensible requiere métodos de protección adicionales, en Android existen tres formas fundamentales para guardar los datos:

2.1 Almacenamiento Interno: Por defecto, los archivos que se crean en el almacenamiento interno son accesibles únicamente por la aplicación, tenga en cuenta que los permisos dados a otras aplicaciones podrían permitir el acceso a estos datos.

Para proporcionar protección adicional para datos confidenciales, puede cifrar archivos locales utilizando la biblioteca de Seguridad. Esta librería proporciona una implementación de las mejores prácticas de seguridad relacionadas con la lectura y escritura de datos en reposo, La biblioteca utiliza el patrón del generador para proporcionar configuraciones predeterminadas seguras.
Para la gestión de claves, la biblioteca de seguridad utiliza un sistema de 2 partes para la administración de claves: un conjunto de claves que contiene una o más claves para cifrar un archivo o datos de preferencias compartidas. (Almacenadas en SharedPreferences) y una clave maestra que cifra todos los conjuntos de claves (Almacena en Android keystore system).

2.2 Almacenamiento Externo: Los archivos creados en almacenamiento externo, como las tarjetas SD, se pueden leer y escribir a nivel global. El archivo puede ser modificado o eliminado por el usuario o por cualquier aplicación.

Para leer y escribir archivos en el almacenamiento externo de una manera más segura, considere usar la clase EncryptedFile del paquete androidx.security.crypto soportado desde el nivel de API 23+.
Recuerde utilizar la última versión disponible.

2.3 Proveedor de Contenido: Los proveedores de contenido ofrecen un mecanismo de almacenamiento estructurado que puede limitarse a su propia aplicación o exportarse para permitir el acceso de otras aplicaciones, esto puede ser configurado a través del atributo: android:exported.

Recuerde tener presente el principio de menor privilegio.

3. Criptografía

La criptografía también se puede utilizar para proteger los datos del usuario, Android tiene dos métodos para el cifrado del dispositivo:

3.1 Cifrado basado en archivos: A partir de Android 7.0 se admite el cifrado basado en archivos (FBE), el cual permite cifrar diferentes archivos con diferentes claves que se pueden desbloquear de forma independiente.

3.2 Cifrado utilizando el cifrado de disco: Este proceso codifica todos los datos del usuario en un dispositivo Android, utilizando claves de cifrado simétricas, todos los datos creados por el usuario se encriptan y se desencripta automáticamente antes de enviarlo o leerlo en el disco.

El paquete javax.crypto proporciona las clases e interfaces para operaciones criptográficas. Las cuales incluyen el cifrado, la generación de claves y código de autenticación de mensajes (MAC).
Las clases facilitan la implementación de cifrados simétricos, asimétricos, de bloque y de flujo tales como: AES, AES_128, AES_256, ARC, BLOWFISH, ChaCha20, DES, DESede, RSA.

4. Permisos de las aplicación

Las solicitudes para acceder a información confidencial, sólo deben realizarse cuando el acceso es necesario para el funcionamiento de su aplicación.
Android permite configurar los permisos de las aplicaciones, la aplicación debe publicar los permisos que requiere en la etiqueta <uses-permission> del manifiesto de la aplicación.

Al trabajar con permisos en Android se recomienda seguir los siguientes principios:
4.1 Sólo use los permisos necesarios para que su aplicación funcione.
4.2 Verifique los permisos requeridos por las bibliotecas.
4.3 Sea transparente (Tenga claro a qué está accediendo y porqué)
4.4: Haga que el acceso al sistema sea explícitos e informativo.

Recuerde agregar los permisos requeridos para el correcto funcionamiento de la aplicación.

5. Protección de aplicaciones en tiempo de ejecución

Herramientas como DexGuard protege las aplicaciones contra ataques en tiempo real, evitando que atacantes recopilen conocimiento sobre su comportamiento y lo modifique en tiempo de ejecución.
Implementa detección de herramientas de depuración, emuladores, dispositivos rooteados, marcos de ocultación de raíz y manipulación.


Finalmente, al desarrollar una aplicación recuerde cumplir con las políticas establecidad por Google:

Referencias:
Android Security, Attack And Defenses, Abhishek Dubey | Anmol Misra
Android Developers, Docs Guides https://developer.android.com/topic/security/best-practices
Centro de política del desarrollador: https://play.google.com/about/privacy-security-deception/

AppBrain, Android Statistics https://www.appbrain.com/stats/number-of-android-apps

Tuesday, April 7, 2020

DeepCTF Writeup

WEB Challenges
Oh JS! 120
This is the most secure login form on earth.
We use SECURITY BY OBSCURITY in order to prevent hackers from finding our flags.
I dare you to login.
Seeking in the page's source code we can see a obfuscated code which look like:
function validate() { [][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])
[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]][([][(![]+[])[+
[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+
[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])
[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+...

JSFuck is an esoteric and educational programming style based on the atomic parts of JavaScript.
It uses only six different characters to write and execute code.
By decoding this code, credentials are obtained to enter the website

if (document.forms[0].username.value == "corb3nik" && document.forms[0].password.value == "chickenachos") document.location = "4d4932602a75414640946d38ea6fefbf.php"
So that we got our flag:

Did You Got Trolled? 120
An army of hackers has stolen the flag from our rabbits. Security experts have failed to capture
the flag and some have even gone mad.
Please…GIMME THE FLAG!!


Comments in the code can be good development practice, but sometimes they reveal
filenames, links, usernames or, in this case, our key1:
/*
* What is this doing here?
* Key1 = gimme0x…...
*/

Each post directs redirect to the following URL: http://140.238.254.6:8005/post.html again,
looking in the source code we get a hint:
<span class="subheading">deep.php?page=debug.html</span>
<!--Creds in /home/ubuntu/key2.txt -->

So, with LFI we got our second key:

with these values we obtained the flag:
     



Nothing is Impossible 160
One of our rabbits has lost the keys of his server to access his flag.
He is crying desperately as he only remembers that the flag was in the path: /tmp/flag.php
but he don’t know how to get there. Our friend BugsBunny was performing reconnaissance
tasks when suddenly found a web that could help you, please bring me back his flag.
Author; whitex
In this challenge, we know it’s about LFI the first step is to check if file exists:


and then I tried to get the file’s content:

Apparently it is an LFI but the server but the inclusion was done using the
require_once function of PHP, hence, I used cURL to bypass this filter so that I could read the flag:



CRYPTO Challenges
WarmUp 50

Get Ready For Crypto Fight. Here A Challenge Just For Your WarmUp.
File: w4rmup.txt
Content: 64 33 33 70 01111011 01001010 01110101 00110101 01110100 01011111 00110100 0101111101001110 00110000 01110010 01101101 00110100 01101100 95 67 104 52 108 108
95 95 111 163 156 140 164 137 61 164 77 175
Solution: In order to get the flag the text was decoded using HEX, Binary, and Ascii Table
d33p{Ju5t_4_N0rm4l_Ch4ll__Isn`t_1t?}

Ali3nAgain 100
SPD force needs your help again...!!!!
Flag Format: d33p{UPPERCASE}
File: spdvsalien.png
Solution: Usehttps://www.dafont.com/es/futurama.font
d33p{POWERRANGERSPDFORCEWON}

WierdText 100
I Need A New Keyboard..!!
File: w1erdc1ph3r.txt
Content: c4co"Lct5-vec+H2efw)G-"Ve+$2;5zeef+
Solution: Keyboard Shifting Cipher consists in typing a letter close to another on a computer keyboard. The shift can be on the right, the left, up or down.
d33p{K3yb04rd_N33ds_T0_B3_R3p41r3d}

MISC Challenges

Weirdo 120

We got some wierdo text, we need to decode it to read the secret flag. I think you can do it.
I tried my best but didn't get anything.
File: w1erdc1ph3r.txt
Content: 5nd33p44d33p4qd33p7nd33p63d33p48d33p74d33p79d33p4qd33p48d33p51d33p78d33p4
qd33p31d33p39d33p69d33p4rd33p48d33p4rd33p6pd33p4rd33p6nd33p52d33p66d33p62d33p44d33
p46d33p6qd33p4qd33p33d33p30d33p3q
Hint: 13 - 0x - 64
Solution: In order to get the flag the text was decoded using ROT13, HEX and Base64


OSINT Challenges
History 80
Where did it happen?
'Drunk Hackers'
P.S. Hackers love that place
Flag format - d33p{xxxxxx}
Solution: Drunk Hackers History is a famous space at DefCon @DrunkHackerHist
d33p{defcon}