Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
bfinject — Инъекция Dylib для iOS 11.0 - 11.1.2 с джейлбрейками LiberiOS и Electra | Kitploit
Инструменты/GitHubGitHub/bishopfox/bfinject
Динамический анализ (песочница)Безопасность iOSЭксплуатацияПентестинг мобильных приложенийТестирование на ПроникновениеАнализ Бинарных Файлов
GitHubbishopfox/bfinject

bfinject

Инъекция Dylib для iOS 11.0 - 11.1.2 с джейлбрейками LiberiOS и Electra

Репозиторий
6411504 лет назадПроверено Kitploit

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

bfinject

Лёгкая инъекция dylib для джеилбрейкнутых 64-битных устройств на iOS 11.0 - 11.1.2. Совместима с джеилбрейками Electra и LiberiOS.

bfinject загружает произвольные dylib в запущенные приложения из App Store. В неё встроена поддержка дешифрования приложений App Store, и в комплекте поставляются iSpy и Cycript.

bfinject — это обёртка, которая берёт на себя корректную подпись кода ваших dylib перед их инъекцией с помощью bfinject4realz. Полностью автономна, не требует jailbreakd, QiLin или чего-то подобного. Просто работает.

Примечание: bfinject не работает на Electra, если включена опция "Tweaks". Перезагрузите устройство и повторно запустите Electra без твиков, чтобы использовать bfinject. Если вы видите ошибки, связанные с "thread_create", проблема именно в этом.

Примечание: bfdecrypt доступен как отдельный dylib здесь: https://github.com/BishopFox/bfdecrypt/

Навигация

  • Настройка Electra
  • Настройка LiberiOS
  • Использование bfinject
  • Простой тест
  • Дешифрование приложений App Store
  • Cycript
  • Как это работает?
  • Известные проблемы
  • Благодарности

Настройка Electra

  • Выполните джеилбрейк вашего устройства на iOS 11.0 - 11.1.2 с помощью Electra >= b7
  • Скопируйте tarball bfinject, https://github.com/BishopFox/bfinject/raw/master/bfinject.tar, на ваше джеилбрейкнутое устройство. Возможно, понадобится сначала скопировать его на ноутбук, поскольку Github требует SSL, а версия wget от Electra не поддерживает 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
  • Скопируйте tarball bfinject, https://github.com/BishopFox/bfinject/raw/master/bfinject.tar, на ваше джеилбрейкнутое устройство. Возможно, понадобится сначала скопировать его на ноутбук, поскольку Github требует SSL, а версия wget от LiberiOS не поддерживает 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

Вот пример дешифрования приложения Reddit на айфоне с джеилбрейком Electra:

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.

На экране устройства вы увидите следующее:

Когда процесс завершится, появится UI-уведомление с вопросом, хотите ли вы запустить сервис, из которого можно скачать расшифрованный IPA:

Если вы нажмёте Yes, на порту 31336 вашего устройства будет запущен сервис. Подключитесь к нему, и вы получите сырую копию IPA, которую можно скачать с помощью 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 будет клоном оригинального .ipa из App Store, за исключением того, что главный бинарник и все сопутствующие фреймворки и динамические библиотеки будут расшифрованы. Флаг CRYPTID будет равен 0 в каждом ранее зашифрованном файле. Вы можете взять .ipa, извлечь приложение, изменить его по необходимости, переподписать собственным сертификатом разработчика и развернуть на не-джеилбрейкнутых устройствах.

Cycript

Одна из возможностей bfinject — интеграция распространённых инструментов пентеста, таких как Cycript. Со временем будет добавлено больше. Для использования Cycript вам понадобится клиент командной строки Cycript, установленный на вашем MacBook (http://www.cycript.org/). Затем, когда bfinject будет установлен на вашем тестовом устройстве, сделайте что-то вроде этого примера, в котором мы внедряем Cycript в приложение Reddit:

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 на устройстве вы увидите следующее сообщение:

Подключиться к Cycript с MacBook можно так (при условии, что вы установили Cycript в ~/bin/):

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

Как это работает?

На высоком уровне bfinject4realz выполняет боковую загрузку самоподписанного .dylib в запущенное приложение App Store, подписанное Apple.

Процесс состоит из двух этапов.

1. Подпись dylib для инъекции

Проверки кодовой подписи в iOS включают пользовательские сервисы (amfid) и сервисы ядра (AppleMobileFileIntegrity). И LiberiOS, и Electra патчат пользовательский процесс amfid для обхода проверок кодовой подписи, но остаются ещё проверки, выполняемые ядром.

Однако Electra и LiberiOS являются KPPless, а это значит, что они не патчат в ядре ничего; ни одного байта. Это связано с Kernel Patch Protection ("KPP") — технологией безопасности Apple, которая выполняет сложный анализ ядра для обнаружения и предотвращения патчей ядра. В результате проверки кодовой подписи в ядре остаются нетронутыми.

К счастью для нас, похоже, ядро предполагает, что amfid уже проверил действительность криптографической подписи, прикреплённой к энтайтлментам dylib. В результате всё, что нам нужно сделать, — это самоподписать два энтайтлмента в dylib, чтобы ядро приняло его:

  • Первый — это энтайтлмент platform-application, который, как я полагаю, указывает, что dylib является программным обеспечением Apple.
  • Второй — это Team ID сертификата подписи, который использовался для подписи кода, в который мы внедряемся. Например, приложение Reddit подписано Team ID 2TDUX39LX8. Поэтому, чтобы внедрить dylib в приложение Reddit, мы должны подписать dylib тем же Team ID: 2TDUX39LX8.

bfinject берёт на себя все эти манипуляции с подписью, что довольно удобно.

2. Внедрение правильно подписанного dylib в целевой процесс

  • Используя task_for_pid(), получите mach-порт для целевого процесса
  • Используйте порт для управления потоками и неисполняемыми сегментами памяти в целевом процессе
    • Примечание: без патчей ядра невозможно изменять исполняемый код в процессе.
    • Следовательно, нам приходится использовать трюки с ROP для выполнения выбранного нами кода.
  • Выделите несколько страниц памяти в удалённом процессе для нового временного стека
  • Поместите строку "/path/to/my.dylib" по известному адресу в стеке
  • Используйте некоторые трюки для поиска адреса dlopen() в удалённом процессе
  • Найдите простой ROP-гаджет RET на исполняемой странице (RET = "\xc0\x03\x5f\xd6" на arm64)
  • Создайте новый поток в целевом процессе
  • Установите регистры CPU для потока:
    • $pc = адрес dlopen()
    • $x0 = параметр 1 dlopen: адрес строки "/path/to/dylib" во временном стеке
    • $x1 = параметр 2 dlopen: значение RTLD_LAZY | RTLD_GLOBAL
    • $sp = середина временного стека
    • $fp = четверть временного стека
    • $lr = адрес ROP-гаджета
  • Возобновите поток. Произойдёт следующее:
    • вызывается _pthread_set_self для настройки threading для dlopen()
    • вызывается dlopen() для внедрения нашей вредоносной динамической библиотеки
    • dlopen() выполнит RET на значение в регистре $lr, которое является ещё одной инструкцией RET
    • RET будет возвращаться к RET, и так до бесконечности...
  • Опрашивайте регистры потока, чтобы проверить $pc == адрес ROP-гаджета (инструкции RET)
  • Как только гаджет сработает, завершите поток, освободите память — дело сделано.

За низкоуровневым описанием обращайтесь к исходному коду.

Известные проблемы

Обратите внимание, что на Electra версия jtool (мультиинструмента для подписи кода от @morpheus) не поддерживает энтайтлменты платформенных бинарников, поэтому bfinject поставляет jtool из LiberiOS и использует его. bfinject не использует inject_criticald от Electra.

Благодарности

  • 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 за отличную мобильную ОС
Скачать инструмент