Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
bfinject — Injeção de Dylib para iOS 11.0 - 11.1.2 com os jailbreaks LiberiOS e Electra | Kitploit
Ferramentas/GitHubGitHub/bishopfox/bfinject
Análise Dinâmica (Sandboxing)Segurança iOSExploraçãoPentesting de Apps MóveisTestes de PenetraçãoAnálise de BináriosTop em Segurança iOS nº15
GitHubbishopfox/bfinject

bfinject

Injeção de Dylib para iOS 11.0 - 11.1.2 com os jailbreaks LiberiOS e Electra

6411508há 8 anosRevisado pelo Kitploit

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Ver Repositório
Compartilhar

bfinject

Injeção fácil de dylibs para iOS 11.0 - 11.1.2 de 64 bits com jailbreak. Compatível com os jailbreaks Electra e LiberiOS.

O bfinject carrega dylibs arbitrárias em apps da App Store em execução. Ele tem suporte integrado para descriptografar apps da App Store e vem acompanhado de iSpy e Cycript.

O bfinject é um wrapper que cuida da assinatura de código (codesigning) correta das suas dylibs antes de injetá-las usando bfinject4realz. Ele é completamente autônomo, não exige jailbreakd, QiLin nem nada do tipo. Simplesmente funciona.

Nota: o bfinject não funciona no Electra se "Tweaks" estiver ativado. Reinicie e execute o Electra novamente sem tweaks para usar o bfinject. Se você vir erros com "thread_create", esse é o problema.

Nota: o bfdecrypt está disponível como uma dylib autônoma aqui: https://github.com/BishopFox/bfdecrypt/

Navegação

  • Configuração do Electra
  • Configuração do LiberiOS
  • Usando o bfinject
  • Testando o bfinject
  • Descriptografando apps da App Store
  • Cycript
  • Como funciona?
  • Problemas conhecidos
  • Créditos
  • Configuração do Electra

    • Faça jailbreak no seu dispositivo iOS 11.0 - 11.1.2 com Electra >= b7
    • Copie o tarball do bfinject, https://github.com/BishopFox/bfinject/raw/master/bfinject.tar, para o seu dispositivo com jailbreak. Talvez seja necessário copiá-lo primeiro para o seu laptop porque o Github exige SSL, mas a versão do wget do Electra não suporta 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
    

    Configuração do LiberiOS

    • Faça jailbreak no seu dispositivo iOS 11.0 - 11.1.2 com LiberiOS >= 11.0.3
    • Copie o tarball do bfinject, https://github.com/BishopFox/bfinject/raw/master/bfinject.tar, para o seu dispositivo com jailbreak. Talvez seja necessário copiá-lo primeiro para o seu laptop porque o Github exige SSL, mas a versão do wget do LiberiOS não suporta 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
    

    Usando o bfinject

    • Inicie o app de destino no qual você irá injetar sua biblioteca compartilhada
    • Digite bash bfinject para obter ajuda
    • NOTA: é importante preceder o comando com bash, caso contrário não funcionará. Sandbox, blá-blá-blá.
    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/
    

    Um Teste Simples

    Antes de fazer algo mais complexo, teste se funciona. O bfinject tem autotestes integrados. Aqui está um exemplo usando o app Reddit como alvo:

    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.
    

    Na tela do dispositivo você deve ver isto:

    Se não, algo está quebrado ;)

    Descriptografar apps da App Store

    Aqui está um exemplo de descriptografia do app Reddit em um iPhone com jailbreak via 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.
    

    Você verá esta tela no seu dispositivo:

    Quando terminar, você verá um alerta de interface perguntando se deseja iniciar um serviço a partir do qual você pode baixar o IPA descriptografado:

    Se você tocar em Yes, um serviço será iniciado na porta 31336 do seu dispositivo. Conecte-se a ele e você receberá uma cópia bruta do IPA, que pode ser baixada com netcat da seguinte forma:

    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
    

    Como alternativa, verifique o log do console do dispositivo; ele informará onde o IPA descriptografado está armazenado. Por exemplo:

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

    Você também pode procurar o IPA no sistema de arquivos assim:

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

    Para tirar o .ipa do dispositivo, você pode usar o netcat. No seu laptop, configure um serviço de escuta:

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

    E no dispositivo com jailbreak:

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

    O .ipa será um clone do .ipa original da App Store, exceto que o binário principal e todos os seus frameworks e bibliotecas compartilhadas acompanhantes serão descriptografados. O flag CRYPTID será 0 em cada arquivo anteriormente criptografado. Você pode pegar o .ipa, extrair o app, modificá-lo conforme necessário, reassiná-lo com seu próprio certificado de desenvolvedor e implantá-lo em dispositivos sem jailbreak conforme necessário.

    Cycript

    Um dos recursos do bfinject é incorporar ferramentas comuns de pentest, como o Cycript. Mais serão adicionadas com o tempo. Para usar o Cycript, você precisará do cliente de linha de comando do Cycript instalado no seu MacBook (http://www.cycript.org/). Depois, com o bfinject instalado no seu dispositivo de teste, faça algo como este exemplo, no qual injetamos o Cycript no app 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.
    

    Depois que o Cycript for injetado, você verá a seguinte mensagem no seu dispositivo:

    Você pode se conectar ao Cycript a partir do seu MacBook assim (supondo que você instalou o Cycript em ~/bin/):

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

    Como funciona?

    Em um nível alto, o bfinject4realz faz sideload de uma .dylib autoassinada em um app da App Store assinado pela Apple em execução.

    O processo é feito em duas etapas.

    1. Assinar a dylib a ser injetada

    As verificações de codesigning no iOS envolvem serviços de userspace (amfid) e serviços de kernel (AppleMobileFileIntegrity). Tanto o LiberiOS quanto o Electra aplicam patch no processo userspace amfid para burlar as verificações de codesigning, mas ainda há verificações adicionais executadas pelo kernel.

    No entanto, o Electra e o LiberiOS são KPPless, o que significa que eles não aplicam patch em nada no kernel; nem um único byte. Isso se deve à Kernel Patch Protection ("KPP"), uma tecnologia de segurança da Apple que faz introspecção sofisticada do kernel para detectar e impedir patches no kernel. Como resultado, as verificações de codesigning do kernel continuam intactas.

    Felizmente para nós, parece que o kernel assume que o amfid já verificou a validade da assinatura criptográfica anexada aos entitlements de uma dylib. Como resultado, tudo o que precisamos fazer é autoassinar dois entitlements em uma dylib para que o kernel a aceite:

    • O primeiro é o entitlement platform-application, que eu acredito indicar que a dylib é software da Apple.
    • O segundo é o Team ID do certificado de assinatura usado para assinar o código no qual estamos injetando. Por exemplo, o app Reddit é assinado pelo Team ID 2TDUX39LX8. Portanto, para injetar uma dylib no app Reddit, precisamos assinar a dylib com o mesmo Team ID: 2TDUX39LX8.

    O bfinject cuida de todas essas manhas de assinatura para você, o que é ótimo.

    2. Injetar a dylib corretamente assinada no processo de destino

    • Usando task_for_pid(), obtenha uma porta mach para o processo de destino
    • Use a porta para manipular threads e segmentos de memória não executáveis no processo de destino
      • Nota: sem patches no kernel, não é possível modificar código executável em um processo.
      • Por causa disso, temos que usar truques de ROP para executar o código que escolhermos.
    • Aloque algumas páginas de memória no processo remoto para uma nova pilha temporária
    • Coloque a string "/path/to/my.dylib" em um local conhecido na pilha
    • Use alguns truques para localizar o endereço de dlopen() no processo remoto
    • Encontre um gadget ROP simples de RET em uma página executável (RET = "\xc0\x03\x5f\xd6" no arm64)
    • Crie uma nova thread no processo de destino
    • Defina os registradores da CPU para a thread:
      • $pc = Endereço de dlopen()
      • $x0 = Parâmetro 1 do dlopen: endereço da string "/path/to/dylib" na pilha temporária
      • $x1 = Parâmetro 2 do dlopen: o valor RTLD_LAZY | RTLD_GLOBAL
      • $sp = Meio da pilha temporária
      • $fp = Um quarto do caminho na pilha temporária
      • $lr = Endereço do gadget ROP
    • Retome a thread. O seguinte acontecerá:
      • _pthread_set_self é chamado para configurar o threading para o dlopen()
      • dlopen() é chamado para injetar nossa biblioteca compartilhada maliciosa
      • dlopen() fará RET para o valor no registrador $lr, que é outra instrução RET
      • RET retornará para RET, retornará para RET... ad infinitum
    • Consulte periodicamente os registradores da thread para verificar se $pc == endereço do gadget ROP (a instrução RET)
    • Quando o gadget for atingido, encerre a thread, libere a memória, trabalho concluído.

    Para uma descrição de baixo nível, consulte o código-fonte.

    Problemas conhecidos

    Observe que no Electra, a versão do jtool (multiferramenta de codesigning do @morpheus) não suporta entitlements de binário de plataforma, então o bfinject fornece o jtool do LiberiOS e o usa em seu lugar. O bfinject não usa o inject_criticald do Electra.

    Créditos

    • Stefan Esser (10n1c) pelas ideias e código originais por trás do dumpdecrypted (https://github.com/stefanesser/dumpdecrypted/blob/master/dumpdecrypted.c)
    • Dmitry Rodionov pelo lorgnette (https://github.com/rodionovd/liblorgnette/)
    • Jonathan Levin pelo jailbreak LiberiOS (http://newosxbook.com/liberios/)
    • Ian Beer pelo exploit async_wake (https://bugs.chromium.org/p/project-zero/issues/detail?id=1417)
    • Apple por um ótimo sistema operacional móvel
    Baixar ferramenta