Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
bfinject — iOS 11.0〜11.1.2 向け、LiberiOS および Electra 脱獄対応の Dylib インジェクション | Kitploit
ツール/GitHubGitHub/bishopfox/bfinject
動的分析 (サンドボックス)iOSセキュリティエクスプロイトモバイルアプリペンテストペネトレーションテストバイナリ解析
GitHubbishopfox/bfinject

bfinject

iOS 11.0〜11.1.2 向け、LiberiOS および Electra 脱獄対応の Dylib インジェクション

リポジトリを見る
6411504年前Kitploit レビュー済み

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

bfinject

ジェイルブレイク済み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/

ナビゲーション

  • Electraセットアップ
  • LiberiOSセットアップ
  • bfinjectの使用方法
  • 簡単なテスト
  • App Storeアプリの復号
  • Cycript
  • 仕組み
  • 既知の問題
  • クレジット

Electraセットアップ

  • iOS 11.0 - 11.1.2のデバイスをElectra >= b7でジェイルブレイクします
  • bfinject tarball(https://github.com/BishopFox/bfinject/raw/master/bfinject.tar)をジェイルブレイク済みデバイスにコピーします。GitHubがSSLを強制する一方、Electra版の`wget`はSSLに対応していないため、最初にラップトップへコピーする必要があるかもしれません。
root@kitploit:~
ssh root@your-device-ip # (the password is 'alpine')
mkdir bfinject
cd bfinject
wget http://<your_server>/bfinject.tar
tar xvf bfinject.tar

LiberiOSセットアップ

  • iOS 11.0 - 11.1.2のデバイスをLiberiOS >= 11.0.3でジェイルブレイクします
  • bfinject tarball(https://github.com/BishopFox/bfinject/raw/master/bfinject.tar)をジェイルブレイク済みデバイスにコピーします。GitHubがSSLを強制する一方、LiberiOS版の`wget`はSSLに対応していないため、最初にラップトップへコピーする必要があるかもしれません。
root@kitploit:~
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

bfinjectの使用方法

  • 共有ライブラリを注入する対象アプリを起動します
  • ヘルプを表示するには bash bfinject と入力してください
  • 注記: コマンドの前に bash を付けることが重要です。付けないと動作しません。サンドボックスがどうのこうの、というわけです。
root@kitploit:~
-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アプリをターゲットにした例です:

root@kitploit:~
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.

デバイスの画面には次のように表示されるはずです:

表示されない場合、どこかが壊れています ;)

App Storeアプリの復号

ElectraでジェイルブレイクしたiPhone上のRedditアプリを復号する例です:

root@kitploit:~
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でダウンロードできます:

root@kitploit:~
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の保存場所が表示されます。例:

root@kitploit:~
[dumpdecrypted] Wrote /var/mobile/Containers/Data/Application/6E6A5887-8B58-4FC5-A2F3-7870EDB5E8D1/Documents/decrypted-app.ipa

次のようにファイルシステムからIPAを検索することもできます:

root@kitploit:~
find /var/mobile/Containers/Data/Application/ -name decrypted-app.ipa

デバイスから.ipaを取り出すにはnetcatを使用できます。ラップトップでリスナーサービスをセットアップします:

root@kitploit:~
ncat -l 0.0.0.0 12345 > decrypted.ipa

次に、ジェイルブレイク済みデバイスで:

root@kitploit:~
cat /path/to/decrypted.ipa > /dev/tcp/<IP_OF_YOUR_COMPUTER>/12345

この.ipaは、App Storeの元の.ipaのクローンになります。ただし、メインバイナリとそれに付随するすべてのフレームワークおよび共有ライブラリは復号されます。以前暗号化されていた各ファイルでは、CRYPTIDフラグは0になります。この.ipaを取得してアプリを取り出し、必要に応じて変更し、自分の開発者証明書で再署名し、必要に応じて非ジェイルブレイクデバイスに展開できます。

Cycript

bfinjectの特徴の1つは、Cycriptのような一般的なペンテストツールを組み込めることです。時間の経過とともにさらに追加される予定です。Cycriptを使用するには、MacBookにCycriptコマンドラインクライアントをインストールしておく必要があります(http://www.cycript.org/)。次に、テストデバイスにbfinjectがインストールされたら、RedditアプリにCycriptを注入する次のような例を実行します:

root@kitploit:~
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/にインストールしている場合):

root@kitploit:~
carl@calisto-3 /tmp $ ~/bin/cycript -r 192.168.1.33:1337
cy# UIApp
#"<RedditApplication: 0x102304a30>"
cy#

仕組み

高レベルで見ると、bfinject4realzは、実行中のApple署名済みApp Storeアプリに自己署名.dylibをサイドロードします。

このプロセスは2段階で行われます。

1. 注入するdylibへの署名

iOSのコード署名チェックは、ユーザースペースサービス(amfid)とカーネルサービス(AppleMobileFileIntegrity)で構成されています。LiberiOSとElectraはどちらもユーザースペースのamfidプロセスにパッチを当ててコード署名チェックをバイパスしますが、カーネルによって実行されるさらなるチェックがまだあります。

しかし、ElectraとLiberiOSはKPPlessです。つまり、カーネルには1バイトもパッチを当てません。これは、Appleのセキュリティ技術であるKernel Patch Protection("KPP")が、カーネルパッチを検出して阻止するために高度なカーネル検査を行うためです。その結果、カーネルのコード署名チェックは依然として有効です。

幸いなことに、カーネルはamfidがdylibのentitlementsに付与された暗号署名の有効性をすでにチェック済みであると見なしているようです。そのため、カーネルに受け入れさせるには、dylibに2つのentitlementsを自己署名するだけで済みます:

  • 1つ目はplatform-application entitlementです。これは、dylibがAppleのソフトウェアであることを示すものだと思います。
  • 2つ目は、注入対象のコードの署名に使用された署名証明書のTeam IDです。たとえば、RedditアプリはTeam ID 2TDUX39LX8で署名されています。したがって、Redditアプリにdylibを注入するには、同じTeam ID 2TDUX39LX8でdylibに署名する必要があります。

bfinjectは、署名に関する面倒な処理をすべて代行してくれます。これはありがたいです。

2. 正しく署名されたdylibをターゲットプロセスに注入

  • task_for_pid()を使用して、ターゲットプロセスのmachポートを取得します
  • そのポートを使用して、ターゲットプロセスのスレッドと非実行可能メモリセグメントを操作します
    • 注記: カーネルパッチなしでは、プロセス内の実行可能コードを変更することはできません。
    • そのため、任意のコードを実行するにはROPトリックを使用する必要があります。
  • 新しい一時スタック用に、リモートプロセス内のいくつかのメモリページを割り当てます
  • スタック内の既知の場所に文字列 "/path/to/my.dylib" を配置します
  • いくつかのトリックを使って、リモートプロセス内のdlopen()のアドレスを調べます
  • 実行可能ページ内で単純なRET ROP gadgetを見つけます(arm64ではRET = "\xc0\x03\x5f\xd6")
  • ターゲットプロセス内に新しいスレッドを作成します
  • スレッドのCPUレジスタを設定します:
    • $pc = dlopen()のアドレス
    • $x0 = dlopenのパラメータ1: 一時スタック内の文字列"/path/to/dylib"のアドレス
    • $x1 = dlopenのパラメータ2: 値 RTLD_LAZY | RTLD_GLOBAL
    • $sp = 一時スタックの中央
    • $fp = 一時スタックの4分の1の位置
    • $lr = ROP gadgetのアドレス
  • スレッドを再開します。次のことが発生します:
    • dlopen()のスレッドをセットアップするために_pthread_set_selfが呼び出されます
    • 悪意のある共有ライブラリを注入するためにdlopen()が呼び出されます
    • dlopen()は$lrレジスタ内の値にRETします。これは別のRET命令です
    • RETはRETへ戻り、RETはRETへ戻り...無限に繰り返されます
  • スレッドのレジスタをポーリングして、$pcがROP gadget(RET命令)のアドレスと等しいか確認します
  • gadgetがヒットしたら、スレッドを終了し、メモリを解放して完了です。

低レベルの説明については、ソースコードを参照してください。

既知の問題

Electraでは、jtool(@morpheus氏のコード署名マルチツール)のバージョンがplatform binary entitlementsをサポートしていないため、bfinjectはLiberiOSからjtoolを提供し、代わりにそれを使用します。bfinjectはElectraのinject_criticaldを使用しません。

クレジット

  • Stefan Esser(10n1c): dumpdecryptedの背後にあるオリジナルのアイデアとコードに対して(https://github.com/stefanesser/dumpdecrypted/blob/master/dumpdecrypted.c)
  • Dmitry Rodionov: lorgnetteに対して(https://github.com/rodionovd/liblorgnette/)
  • Jonathan Levin: LiberiOSジェイルブレイクに対して(http://newosxbook.com/liberios/)
  • Ian Beer: async_wakeエクスプロイトに対して(https://bugs.chromium.org/p/project-zero/issues/detail?id=1417)
  • Apple: 素晴らしいモバイルOSに対して
ツールをダウンロード