Citar
Investigadores del departamento de seguridad de Google han descubierto que más de 7,4 millones de dispositivos Android han sido infectados con un malware preinstalado.
Los malwares preinstalados han sido utilizados para controlar los dispositivos de forma remota.
La presencia de este malware se debe a que muchos fabricantes de bajo coste han utilizado software de terceros al incorporar el sistema operativo de Android. Dichos softwares muchas veces vienen de fuentes dudosas y como Android tiene un sistema de código abierto, cualquier grupo de ciberdelincuentes puede ofrecer su software con malware preinstalado dentro de las apps que vienen con los dispositivos.
https://www.trecebits.com/2019/08/09/mas-de-7-millones-de-dispositivos-android-tienen-un-malware-preinstalado/Los malwares preinstalados han sido utilizados para controlar los dispositivos de forma remota.
La presencia de este malware se debe a que muchos fabricantes de bajo coste han utilizado software de terceros al incorporar el sistema operativo de Android. Dichos softwares muchas veces vienen de fuentes dudosas y como Android tiene un sistema de código abierto, cualquier grupo de ciberdelincuentes puede ofrecer su software con malware preinstalado dentro de las apps que vienen con los dispositivos.
Me ha parecido interesante y lo he realizado como POC asique voy a mostrar parte del proceso para que observemos la dificultad técnica y todo el control que una aplicación infectada nos puede ofrecer sobre el dispositivo.
Lo primero que voy a hacer es elegir una aplicación de código abierto. Al ser código abierto, el código para crear la aplicación está disponible en internet para cualquiera usuario. Cualquiera usando las herramientas pertinentes puede generar la aplicación o una muy similar a partir del código abierto.
Utilizaré esta lista entre los miles de listas disponibles para seleccionar la aplicación de código abierto. https://en.wikipedia.org/wiki/List_of_free_and_open-source_Android_applications
Suponemos que el dispositivo en el que se instalará la aplicación tendrá Google Play instalado como es frecuente en estos dispositivos. Para que los cambios que hagamos persistan eligiré una aplicación que no se encuentre en la tienda de Google Play y por lo tanto que no va a ser actualizada por parte del usuario con el objetivo de que no se substituya por una versión sin mi código.
En el caso de que en el código original venga reflejada alguna forma de actualizar la aplicación por medios externos a Glogle Play se puede deshabilitar o modificar esa parte del código.
Para tomar la decisión sobre que aplicación elegir tengo en cuenta lo siguiente:
-Comprobar el lenguaje en el cual está escrita la aplicación y que lenguajes soporta para poder añadir mi código en ese u otros lenguajes que soporte la aplicación.
-Comprobar si la aplicación es compatible con la versión o versiones de Android a las que está destinada la aplicación modificada.
-Intentar que el código no sea demasiado extenso para poder analizarlo fácilmente y asegurarme que no utilice herramientas externas a las cuales no vaya a tener acceso, ya que podría verificar o actualizar la aplicación no permitiéndome modificarla a mi antojo.
-Si el control que tiene o debería tener este tipo de aplicación coincide con mi objetivo final. Si decido utilizar un bloc de notas sería un comportamiento extraño que se comunicase por la red, asique es otro factor importante a tener en cuenta.
Siguiendo estas pautas la aplicación que elegí fue - https://en.m.wikipedia.org/wiki/Adblock_Plus
Una extensión para navegadores que tiene escrito código en los lenguajes de programación javascript, Css y XUL. Este último es un dialecto de XML enfocado en realizar la parte visible de la interfaz para facilitar el uso de la aplicación por el usuario final.
Una vez elegida la aplicación me dirijo al lugar en dónde esté publicado el código fuente de la aplicación buscándolo en google. Lo encuentro en una de las múltiples plataformas que dan soporte a la publicación de código abierto como suele ser frecuente. https://github.com/adblockplus
Aquí hay varias versiones. Al entrar en el primer enlace dice que trás actualizaciones del navegador Mozilla ya no funciona en versiones modernas (superiores a la versión 47) asique me dirijo al segundo enlace.
Aquí sale un resumen del archivo LEEME que abro por completo con el siguiente link
https://github.com/adblockplus/adblockpluschrome/blob/master/README.md En este documento vienen explicados el proceso y las herramientas necesarias para poder construir la aplicación:
Citar
Adblock Plus for Chrome, Opera, Microsoft Edge and Firefox
El nombre de la aplicación junto a los distintos navegadores en los cuales funciona.Citar
This repository contains the platform-specific Adblock Plus source code for Chrome, Opera, Microsoft Edge and Firefox. It can be used to build Adblock Plus for these platforms, generic Adblock Plus code will be extracted from other repositories automatically (seedependencies file).
Explica que en estos repositorios solo se encuentra la parte del código específica para cada navegador. El resto del código necesario para otros navegadores será descargado automáticamente de otros repositorios.Citar
Note that the Firefox extension built from this repository is the new WebExtension. The source code of the legacy Adblock Plus extension can be found here.
Dice de que la versión Adblockplus para el navegador Firefox utiliza la API de Mozilla. Nos la provee Mozilla para facilitar el trabajo y aumentar la calidad final de las extensiones realizadas por los programadores de todo el mundo. En el siguiente enlace podremos ver una introducción a la API WebExtensions para saber como funciona:https://developer.mozilla.org/es/docs/Mozilla/Add-ons/WebExtensions/Tu_primera_WebExtension
Esta API fue incluida a partir de la versión 45 del navegador, por lo que las extensiones que utilicen WebExtensions solo funcionarán en navegadores con una versión superior.
Citar
Building
Requirements
Mercurial or Git(whichever you used to clone this repository)
Python 2.7
The Jinja2 module(>= 2.8)
For signed builds:PyCrypto module
Node.js (>= 8.9)
Aquí se encuentran los distintos programas y tecnologías necesarias para poder construir la extensión.Requirements
Mercurial or Git(whichever you used to clone this repository)
Python 2.7
The Jinja2 module(>= 2.8)
For signed builds:PyCrypto module
Node.js (>= 8.9)
Mercurial o Git son programas que nos permiten descargar todo el código, documentación y archivos necesarios automáticamente para construir la aplicación. Así no tenemos que ir link por link buscando todo el código necesario copiando, pegando y guardándolo con las extensiones de archivo necesarias para cada archivo que contenga código. O descargando los archivos uno por uno. Nos ahorra tiempo y simplifica el proceso guardando todo automáticamente en una carpeta de nuestro ordenador.
Python 2.7 es una versión de Python, un lenguaje de programación usado frecuentemente, pero no de forma exclusiva, en aplicaciones de comunicaciones a través de la red.
Jinja2 es un motor escrito en Python que nos ofrece plantillas y muchas funcionalidades orientadas a mejorar la productividad y la seguridad de la aplicación.
Pycripto es un conjunto de algoritmos de cifrado. Se utiliza para cifrar y descifrar las firmas en comunicaciones cliente-servidor o para firmar la aplicación con un certificado digital, util para instalar aplicaciones en Android. Un mecanismo que evita que un usuario o aplicación actualice o acceda a datos de otra aplicación que no le pertenece. https://source.android.com/devices/tech/ota/sign_builds
Node.js es un entorno de ejecución que nos permite ejecutar el código escrito en javascript fuera del navegador, también añade funcionalidades extra al lenguaje.
Citar
Building the extension
Run one of the following commands in the project directory, depending on your target platform:
./build.py build -t chrome -k adblockpluschrome.pem
./build.py build -t edge
./build.py build -t gecko
Gecko es un motor que nos permite la ejecución de varias tecnologías como XUL en cualquier sistema operativo. Es uno de los motores que utiliza el navegador Firefox. Nosotros construiremos la aplicación para firefox asique tendremos que usar el comando Run one of the following commands in the project directory, depending on your target platform:
./build.py build -t chrome -k adblockpluschrome.pem
./build.py build -t edge
./build.py build -t gecko
Citar
./build.py build -t gecko
trás el cual se nos generará el archivo adblockplusfirefox-1.2.3.nnnn.xpi.Citar
The Firefox extension will be unsigned, and therefore is mostly only useful for upload to Mozilla Add-ons. You can also load it for testing purposes underabout:debugging or by disabling signature enforcement in Firefox Nightly.
Aquí explica que la extensión que voy a construir está sin firmar, con lo cual me limita a subirla a la plataforma de extensiones de Mozilla. También indica una alternativa para poder probar la aplicación sin firmar directamente en el dispositivo. Deshabilitar el forzado de firmas en el navegador Firefox Nightly. Una versión del navegador Firefox para que los desarrolladores prueben sus aplicaciones. O en el apartado de depuración about:debugging el cual ofrece herramientas para comprobar el funcionamiento de nuestro programa, principalmente para corregir errores.Citar
Development environment
To simplify the process of testing your changes you can create an unpacked development environment. For that run one of the following commands:
./build.py devenv -t chrome
./build.py devenv -t edge
./build.py devenv -t gecko
This will create a devenv.*directory in the repository. You can load the directory as an unpacked extension, underchrome://extensions in Chrome, underabout:debugging in Firefox or inExtensions menu in Microsoft Edge, after enabling extension development features inabout:flags. After making changes to the source code re-run the command to update the development environment. In Chrome and Firefox the extension should reload automatically after a few seconds.
To simplify the process of testing your changes you can create an unpacked development environment. For that run one of the following commands:
./build.py devenv -t chrome
./build.py devenv -t edge
./build.py devenv -t gecko
This will create a devenv.*directory in the repository. You can load the directory as an unpacked extension, underchrome://extensions in Chrome, underabout:debugging in Firefox or inExtensions menu in Microsoft Edge, after enabling extension development features inabout:flags. After making changes to the source code re-run the command to update the development environment. In Chrome and Firefox the extension should reload automatically after a few seconds.
En este apartado se explica como podemos generar un entorno de desarrollo para las tareas de programación. Usaremos el comando
Citar
./build.py devenv -t gecko
para generar una versión no enpaquetada/construida de la aplicación en una carpeta de nuestro ordenador. Podremos cargar la extensión en el navegador de Firefox trás habilitar la opción que para el desarrollo de extensiones escribiendo la dirección about:flags en el navegador Firefox. Tras realizar cambios en el código de la extensión hay que volver a usar el comando Citar
./build.py devenv -t gecko
para reflejar los cambios que hagamos en la extension.Por último en el documento se ofrecen varias maneras de comprobar que todo funciona en la aplicación. Por ejemplo con Qunit se puede comprobar que el código javascript funciona correctamente. Muy útil para cuando en un proyecto se aúnen varios lenguajes de programación poder identificar cual de ellos es el que crea el conflicto para posteriormente corregirlo.
Veamos lo que hay en la carpeta:
https://github.com/adblockplus/adblockpluschrome?files=1
Dentro se encuentran varios archivos y carpetas con distintas extensiones y propósitos.
Observando el nombre de cada uno de los archivos junto a su extensión en muchos casos podemos identificar para que podría servir cada archivo.
*Para aquellos que estén especializados en un solo lenguaje de programación les recomiendo buscar la extensión en google, por ejemplo .js para saber a que lenguaje o aplicación pertenece. Descargar un manual de referencia del lenguaje, consultar la estructura básica del mismo, varios códigos, buscar las keywords que no entiendan y las librerías usadas para poder comprender que hace cada línea de código en cada archivo.
Paso a comentar los archivos uno por uno hasta que encontrar algo relevante dentro de mis propósitos. Una vez obtenido lo comentaré y lo dejaré ahí, ya que se tendrán suficientes herramientas y pistas para conseguir finalizar el proceso con éxito. Algo que no voy explicar para no dar pie a que cualquiera sin conocimientos se dedique a robar contraseñas de facebook replicando los pasos y haciendo uso de la extensión sin necesidad de tener conocimientos sobre los pasos o que código añadir.
+Las carpetas con el nombre github contienen documentos informativos a cerca de como documentar fallos que encontremos en la aplicación para que se puedan corregir, así como otros relacionados con la plataforma.
+En la carpeta appx_assets hay tres imágenes que corresponden al icono de la aplicación en distintos tamaños. +En gecko.js dentro de la carpeta "target" que se encuentra dentro de "build" está el primer código.
Se añade info para aplicar el parser, metadatos, y toda la información asociada con la nueva build de la aplicación.
+En nightlies.html.tmpl dentro de la carpeta "templates" que se encuentra dentro de "build" está el archivo en el que se muestran los mensajes con información sobre las diversas builds generadas de la aplicación.
+En .eslintrc.json dentro de la carpeta "build" está el código para utilizar node.js con Eslint. Las dos últimas siglas "rc" en el nombre del archivo hacen referencia a "resources" en español dependencias. Eslint se encarga de mantener una calidad en el código en base a reglas y patrones. Se genera un AST para el conformar el estilo y la estructura del código https://es.m.wikipedia.org/wiki/%C3%81rbol_de_sintaxis_abstracta
Este es el parser que utiliza Eslint - https://esprima.org/demo/parse.html
Aquí más información sobre el uso de Eslint con node.js - https://medium.com/the-node-js-collection/why-and-how-to-use-eslint-in-your-project-742d0bc61ed7
El objetivo es mantener el código bajo unas reglas para que todo el mundo pueda modificarlo bajo el mismo estilo y estructura. Se pueden descargar pluggins para añadir más reglas.
+En buildlist.js en la misma carpeta que el anterior archivo tenemos la explicación del código entre comentarios /* */ asique me ahorro comentar la finalidad del archivo, el nombre del archivo ya es bastante descriptivo.
+publish.js el último archivo dentro de "build" se encarga de los argumentos para el parser.
+background.js dentro de "ext" tiene numerosas funciones. Se chequean las respuestas http en busca de indicios de contenido html. Se identifica la apertura de nuevas pestañas o el cambio de pestaña activa. Maneja el contenido en ventanas emergentes y en el propio fondo. Mantiene la estructura del frame actualizada. Prerenderiza iconos...
La funcionalidad más interesante, obtiene la página web y la muestra en un iframe. Asi es como la extensión tiene control sobre la página web antes de ser mostrada y la puede modificar antes de ser mostrada al usuario. Esto todo con el objetivo de eliminar la publicidad de la página web y que el usuario no la vea. https://www.w3schools.com/html/html_iframe.asp
Este archivo es interesante.
Podemos añadir nuestro código malicioso. El iframe nos permite cargar cualquier tipo de contenido. scripts, páginas web externas, anuncios publicitarios... Revisando el código a parte de tener acceso absoluto al iframe antes de mostrarlo al usuario, también tenemos acceso a la direccion URL de la pestaña. Modificando el código podemos cargar contenido específico según la URL de la pestaña al compararla con un string. Como la página solicitada por el usuario no se muestrá directamente, ya que la extensión captura la página web, en esta etapa tenemos el control absoluto sobre todo lo que se le va a mostrar al usuario.