
iOS 11.0〜11.1.2 向け、LiberiOS および Electra 脱獄対応の Dylib インジェクション
ジェイルブレイク済み64ビットiOS 11.0 - 11.1.2向けの、簡単なdylibインジェクション。ElectraおよびLiberiOSジェイルブレイクに対応しています。
bfinjectは、実行中のApp Storeアプリに任意のdylibを注入します。App Storeアプリの復号を組み込みでサポートしており、iSpyとCycriptが同梱されています。
bfinjectは、bfinject4realzを使用して注入する前にdylibを正しくコード署名する処理を担うラッパーです。完全にスタンドアロンで、jailbreakdやQiLin、そのようなものを一切必要としません。そのまま動作します。
注記: Electraで「Tweaks」が有効になっている場合、bfinjectは動作しません。bfinjectを使用するには、tweaksを有効にせずに再起動してElectraを再実行してください。「thread_create」に関するエラーが表示される場合は、これが原因です。
注記: bfdecryptはスタンドアロンのdylibとしてこちらで入手できます: https://github.com/BishopFox/bfdecrypt/
ssh root@your-device-ip # (the password is 'alpine')
mkdir bfinject
cd bfinject
wget http://<your_server>/bfinject.tar
tar xvf bfinject.tar
ssh root@your-device-ip # (the password is 'alpine')
export PATH=$PATH:/jb/usr/bin:/jb/bin:/jb/sbin:/jb/usr/sbin:/jb/usr/local/bin:
cd /jb
mkdir bfinject
cd bfinject
wget http://<your_server>/bfinject.tar
tar xvf bfinject.tar
bash bfinject と入力してくださいbash を付けることが重要です。付けないと動作しません。サンドボックスがどうのこうの、というわけです。-bash-3.2# bash bfinject
Syntax: bfinject [-p PID | -P appname] [-l /path/to/yourdylib | -L feature]
For example:
bfinject -P Reddit.app -l /path/to/evil.dylib # Injects evil.dylib into the Reddit app
or
bfinject -p 1234 -L cycript # Inject Cycript into PID
or
bfinject -p 4566 -l /path/to/evil.dylib # Injects the .dylib of your choice into PID
Instead of specifying the PID with -p, bfinject can search for the correct PID based on the app name.
Just enter "-P identifier" where "identifier" is a string unique to your app, e.g. "fing.app".
Available features:
cycript - Inject and run Cycript
decrypt - Create a decrypted copy of the target app
test - Inject a simple .dylib to make an entry in the console log
ispy - Inject iSpy. Browse to http://<DEVICE_IP>:31337/
より複雑なことを行う前に、動作するかテストしてください。bfinjectには組み込みのセルフテストがあります。以下はRedditアプリをターゲットにした例です:
Cs-iPhone:~ root# bash bfinject -P Reddit -L test
[+] Electra detected.
[+] Injecting into '/var/containers/Bundle/Application/55C94FAA-A282-4FDC-967D-6A012D01087E/Reddit.app/Reddit'
[+] Getting Team ID from target application...
[+] Thinning dylib into non-fat arm64 image
[+] Signing injectable .dylib with Team ID 2TDUX39LX8 and platform entitlements...
[bfinject4realz] Calling task_for_pid() for PID 486.
[bfinject4realz] Calling thread_create() on PID 486
[bfinject4realz] Looking for ROP gadget... found at 0x1019a2ba0
[bfinject4realz] Fake stack frame at 0x12ac5c000
[bfinject4realz] Calling _pthread_set_self() at 0x182bfb814...
[bfinject4realz] Returned from '_pthread_set_self'
[bfinject4realz] Calling dlopen() at 0x1829bb460...
[bfinject4realz] Returned from 'dlopen'
[bfinject4realz] Success! Library was loaded at 0x1c016e1c0
[+] So long and thanks for all the fish.
デバイスの画面には次のように表示されるはずです:
表示されない場合、どこかが壊れています ;)
ElectraでジェイルブレイクしたiPhone上のRedditアプリを復号する例です:
Cs-iPhone:~ root# bash bfinject -P Reddit -L decrypt
[+] Electra detected.
[+] Injecting into '/var/containers/Bundle/Application/BCEBDD64-6738-45CE-9B3C-C6F933EA0793/Reddit.app/Reddit'
[+] Getting Team ID from target application...
[+] Thinning dylib into non-fat arm64 image
[+] Signing injectable .dylib with Team ID 2TDUX39LX8 and platform entitlements...
[bfinject4realz] Calling task_for_pid() for PID 3218.
[bfinject4realz] Calling thread_create() on PID 3218
[bfinject4realz] Looking for ROP gadget... found at 0x1016a5110
[bfinject4realz] Fake stack frame at 0x10a06c000
[bfinject4realz] Calling _pthread_set_self() at 0x181303814...
[bfinject4realz] Returned from '_pthread_set_self'
[bfinject4realz] Calling dlopen() at 0x1810c3460...
[bfinject4realz] Returned from 'dlopen'
[bfinject4realz] Success! Library was loaded at 0x1c03e1100
[+] So long and thanks for all the fish.
デバイスにはこの画面が表示されます:
完了すると、復号されたIPAをダウンロードするためのサービスを起動するかどうかを尋ねるUIアラートが表示されます:
Yes をタップすると、デバイスのポート31336でサービスが起動されます。そこに接続するとIPAのrawコピーが送信され、次のようにnetcatでダウンロードできます:
carl@calisto-3 /tmp $ nc 192.168.1.33 31336 > decrypted.ipa
carl@calisto-3 /tmp $ ls -l decrypted.ipa
-rw-r--r-- 1 carl wheel 14649063 Jan 25 16:57 decrypted.ipa
carl@calisto-3 /tmp $ file decrypted.ipa
decrypted.ipa: iOS App Zip archive data, at least v2.0 to extract
あるいは、デバイスのコンソールログを確認してください。復号されたIPAの保存場所が表示されます。例:
[dumpdecrypted] Wrote /var/mobile/Containers/Data/Application/6E6A5887-8B58-4FC5-A2F3-7870EDB5E8D1/Documents/decrypted-app.ipa
次のようにファイルシステムからIPAを検索することもできます:
find /var/mobile/Containers/Data/Application/ -name decrypted-app.ipa
デバイスから.ipaを取り出すにはnetcatを使用できます。ラップトップでリスナーサービスをセットアップします:
ncat -l 0.0.0.0 12345 > decrypted.ipa
次に、ジェイルブレイク済みデバイスで:
cat /path/to/decrypted.ipa > /dev/tcp/<IP_OF_YOUR_COMPUTER>/12345
この.ipaは、App Storeの元の.ipaのクローンになります。ただし、メインバイナリとそれに付随するすべてのフレームワークおよび共有ライブラリは復号されます。以前暗号化されていた各ファイルでは、CRYPTIDフラグは0になります。この.ipaを取得してアプリを取り出し、必要に応じて変更し、自分の開発者証明書で再署名し、必要に応じて非ジェイルブレイクデバイスに展開できます。
bfinjectの特徴の1つは、Cycriptのような一般的なペンテストツールを組み込めることです。時間の経過とともにさらに追加される予定です。Cycriptを使用するには、MacBookにCycriptコマンドラインクライアントをインストールしておく必要があります(http://www.cycript.org/)。次に、テストデバイスにbfinjectがインストールされたら、RedditアプリにCycriptを注入する次のような例を実行します:
Cs-iPhone:~ root# bash bfinject -P Reddit -L cycript
[+] Electra detected.
[+] Injecting into '/var/containers/Bundle/Application/55C94FAA-A282-4FDC-967D-6A012D01087E/Reddit.app/Reddit'
[+] Getting Team ID from target application...
[+] Thinning dylib into non-fat arm64 image
[+] Signing injectable .dylib with Team ID 2TDUX39LX8 and platform entitlements...
[bfinject4realz] Calling task_for_pid() for PID 486.
[bfinject4realz] Calling thread_create() on PID 486
[bfinject4realz] Looking for ROP gadget... found at 0x1019a2ba0
[bfinject4realz] Fake stack frame at 0x10ab00000
[bfinject4realz] Calling _pthread_set_self() at 0x182bfb814...
[bfinject4realz] Returned from '_pthread_set_self'
[bfinject4realz] Calling dlopen() at 0x1829bb460...
[bfinject4realz] Returned from 'dlopen'
[bfinject4realz] Success! Library was loaded at 0x1c01786c0
[+] Injecting into '/var/containers/Bundle/Application/55C94FAA-A282-4FDC-967D-6A012D01087E/Reddit.app/Reddit'
[+] Getting Team ID from target application...
[+] Thinning dylib into non-fat arm64 image
[+] Signing injectable .dylib with Team ID 2TDUX39LX8 and platform entitlements...
[bfinject4realz] Calling task_for_pid() for PID 486.
[bfinject4realz] Calling thread_create() on PID 486
[bfinject4realz] Looking for ROP gadget... found at 0x1019a2ba0
[bfinject4realz] Fake stack frame at 0x10ab00000
[bfinject4realz] Calling _pthread_set_self() at 0x182bfb814...
[bfinject4realz] Returned from '_pthread_set_self'
[bfinject4realz] Calling dlopen() at 0x1829bb460...
[bfinject4realz] Returned from 'dlopen'
[bfinject4realz] Success! Library was loaded at 0x1c4179680
[+] So long and thanks for all the fish.
Cycriptが注入されると、デバイスに次のメッセージが表示されます:
MacBookから次のようにCycriptに接続できます(Cycriptを~/bin/にインストールしている場合):
carl@calisto-3 /tmp $ ~/bin/cycript -r 192.168.1.33:1337
cy# UIApp
#"<RedditApplication: 0x102304a30>"
cy#
高レベルで見ると、bfinject4realzは、実行中のApple署名済みApp Storeアプリに自己署名.dylibをサイドロードします。
このプロセスは2段階で行われます。
iOSのコード署名チェックは、ユーザースペースサービス(amfid)とカーネルサービス(AppleMobileFileIntegrity)で構成されています。LiberiOSとElectraはどちらもユーザースペースのamfidプロセスにパッチを当ててコード署名チェックをバイパスしますが、カーネルによって実行されるさらなるチェックがまだあります。
しかし、ElectraとLiberiOSはKPPlessです。つまり、カーネルには1バイトもパッチを当てません。これは、Appleのセキュリティ技術であるKernel Patch Protection("KPP")が、カーネルパッチを検出して阻止するために高度なカーネル検査を行うためです。その結果、カーネルのコード署名チェックは依然として有効です。
幸いなことに、カーネルはamfidがdylibのentitlementsに付与された暗号署名の有効性をすでにチェック済みであると見なしているようです。そのため、カーネルに受け入れさせるには、dylibに2つのentitlementsを自己署名するだけで済みます:
platform-application entitlementです。これは、dylibがAppleのソフトウェアであることを示すものだと思います。2TDUX39LX8で署名されています。したがって、Redditアプリにdylibを注入するには、同じTeam ID 2TDUX39LX8でdylibに署名する必要があります。bfinjectは、署名に関する面倒な処理をすべて代行してくれます。これはありがたいです。
task_for_pid()を使用して、ターゲットプロセスのmachポートを取得します低レベルの説明については、ソースコードを参照してください。
Electraでは、jtool(@morpheus氏のコード署名マルチツール)のバージョンがplatform binary entitlementsをサポートしていないため、bfinjectはLiberiOSからjtoolを提供し、代わりにそれを使用します。bfinjectはElectraのinject_criticaldを使用しません。