La recherche en sécurité sur iOS devient de plus en plus populaire. Ce post a pour but de vous montrer qu’on a pas besoin d’un Mac pour se lancer dans la recherche en sécurité sur iOS.

macOS

Depuis toujours les chercheurs en sécurité iOS utilisent des Macs et macOS comme système d’exploitation. Pourquoi ? Il y a plusieurs raisons :

  • XNU: c’est le noyau de macOS, mais aussi d’iOS qui a la particularité d’être open source. De plus en cas de découverte d’une faille de sécurité, il est plus facile de tester un exploit sur macOS puis le porter sur iOS.
  • Xcode : le fameux environnement de développement pour iOS et macOS uniquement disponible sur macOS. Celui-ci fournit un SDK complet permettant de debugger des apps etc… Le kit de développement inclut aussi certaines bibliothèques présentes uniquement sur macOS (eg : CoreFoundation et Mach).
  • Mach-O : le format de fichier exécutable sur les systèmes d’exploitation Apple qui sert aussi de base à XNU.
  • La facilité de communication entre les deux systèmes d’exploitation (jusqu’à libimobiledevice ;) ).

Voilà pourquoi il faut à tout prix un Mac… Next !

Outils pour Linux

Pour info, la dernière phrase était ironique.

Tout d’abord la distribution Linux. J’utilise Ubuntu 16.04, stable, fluide, c’est tout ce qu’il faut. De plus le gestionnaire de paquets APT fournit tout ce qu’il faut sans avoir besoin d’ajouter des sources exterieures. Passons aux outils.

Libimobiledevice

Libimobiledevice est une plateforme de bibliothèques logicielles permettant de communiquer avec une appareil iOS. Ces librairies permettent donc de restaurer son iPhone, mais aussi d’obtenir un syslog, d’entrer en mode recovery, obtenir des information plus poussées de son iBidule et tout cela sans iTunes, qui n’est pas disponible sur GNU/Linux.

De plus, sachez que ces librairies ont été utilisées dans plusieurs outils de jailbreak notamment par la team Pangu qui a tenu à remercier ce projet Open Source, mais aussi avec Yalu pour iOS 8.4.1.

Libimobiledevice ne nécessite pas d’appareil jailbreak

Pour l’installer sur Ubuntu ou Debian c’est tout simple, il suffit de suivre les étapes dans un ancien blog post. Vous pouvez aussi utiliser easymobiledevice pour simplifier l’utilisation de Libimobiledevice.

Theos

Un peu plus haut je parlais de Xcode qui permet de compiler des apps et des executables pour iOS uniquement sur macOS. Bien sur il y a une alternative pour Linux : Theos. Theos est kit de developpement basé sur des Makefiles et écrit en Perl permettant de compiler du software pour iOS.

$ cat main.c
#include <stdio.h>
#include <stdlib.h>
int main(){printf("Hello World\n");return 0;}
$ make
> Making all for tool test==> Compiling main.c (armv7)==> Linking tool test (armv7)==> Compiling main.c (arm64)==> Linking tool test (arm64)==> Merging tool test==> Signing test$ file .theos/obj/debug/test
.theos/obj/debug/test: Mach-O universal binary with 2 architectures: [arm_v7: Mach-O arm_v7 executable] [64-bit architecture=12: Mach-O 64-bit 64-bit architecture=12 executable] []

Comme on le voit avec l’output de la commande file l’executable test a été compilé pour l’architecture ARMv7 et arm64, donc pour iPhone, iPod touch et iPad.

Pour installer Theos il suffit de lancer la commande suivante et tout s’installe automatiquement :

curl -JOLks https://git.io/install-theos && bash install-theos

Hopper Disassembler

Hopper est une alternative à IDA Pro qui coute assez cher et qui n’est pas disponible pour Linux.

hopper

Ce logiciel permet de faire du reverse engineering, désassembler, décompiler et debuguer des applications pour différentes architectures. Dans notre cas c’est très utile pour les composants des firmwares iOS (iBoot, LLB, kernelcache, etc…) mais aussi pour les différentes applications et executables mach-O : comme par exemple l’untether de p0sixspwn comme le montre le screen ci-dessus.

Pour installer Hopper il suffit de télécharger la version d’essai pour Linux, puis de l’installer. Si comme moi vous avez une distro Ubuntu ou Debian, téléchargez le .deb et lancez la commande suivante :

sudo dpkg -i hopperv3-3.13.0.deb .

La version 4.0 ne devrait par tarder a être publiée pour Linux.

Radare 2

Radare 2 est la deuxième version du framework de Reverse Engineering Radare il est aussi disponible sur iOS, mais sa particularité c’est qu’il se gère seulement via la ligne de commande, donc si vous n’êtes pas adeptes de la ligne de commande essayez Hopper.

Pour les plus courageux, voici un exemple avec l’executable du jailbreak semi-untethered de Pangu pour iOS 9.2 - 9.3.3 pour les appareils 64 bits

[...]
|              ; JMP XREF from 0x10006724c (sub.vm_read_overwrite_efc)
|       .-> 0x100066f68      e83f40b9       ldr w8, [sp + local_3ch]   ; [0x3c:4]=0 ; '<'
|       !   0x100066f6c      e90308aa       mov x9, x8
|       !   0x100066f70      4ac3b952       movz w10, 0xce1a, lsl 16
|       !   0x100066f74      4ad18e72       movk w10, 0x768a
|       !   0x100066f78      08010a6b       subs w8, w8, w10
|       !   0x100066f7c      e93700b9       str w9, [sp + local_34h]
|       !   0x100066f80      e83300b9       str w8, [sp + local_30h_2]
|      ,==< 0x100066f84      2c010054       b.gt 0x100066fa8
|     ,===< 0x100066f88      01000014       b 0x100066f8c
|     ||!      ; JMP XREF from 0x100066f88 (sub.vm_read_overwrite_efc)
|     `---> 0x100066f8c      e8abb752       movz w8, 0xbd5f, lsl 16
|      |!   0x100066f90      084e8e72       movk w8, 0x7270
|      |!   0x100066f94      e93740b9       ldr w9, [sp + local_34h]   ; [0x34:4]=0 ; '4'
|      |!   0x100066f98      2801086b       subs w8, w9, w8
|      |!   0x100066f9c      e82f00b9       str w8, [sp + local_2ch]
|     ,===< 0x100066fa0      c00c0054       b.eq 0x100067138
|    ,====< 0x100066fa4      40000014       b 0x1000670a4
|    |||!      ; JMP XREF from 0x100066f84 (sub.vm_read_overwrite_efc)
|    ||`--> 0x100066fa8      a887a052       movz w8, 0x43d, lsl 16
|    || !   0x100066fac      08e98c72       movk w8, 0x6748
|    || !   0x100066fb0      e93740b9       ldr w9, [sp + local_34h]   ; [0x34:4]=0 ; '4'
|    || !   0x100066fb4      2801086b       subs w8, w9, w8
|    || !   0x100066fb8      e82b00b9       str w8, [sp + local_28h_2]
|    ||,==< 0x100066fbc      2c010054       b.gt 0x100066fe0
|   ,=====< 0x100066fc0      01000014       b 0x100066fc4
|   ||||!      ; JMP XREF from 0x100066fc0 (sub.vm_read_overwrite_efc)
|   `-----> 0x100066fc4      48c3b952       movz w8, 0xce1a, lsl 16
|    |||!   0x100066fc8      68d18e72       movk w8, 0x768b
|    |||!   0x100066fcc      e93740b9       ldr w9, [sp + local_34h]   ; [0x34:4]=0 ; '4'
|    |||!   0x100066fd0      2801086b       subs w8, w9, w8
|    |||!   0x100066fd4      e82700b9       str w8, [sp + local_24h]
|   ,=====< 0x100066fd8      20100054       b.eq 0x1000671dc
|  ,======< 0x100066fdc      32000014       b 0x1000670a4
|  |||||!      ; JMP XREF from 0x100066fbc (sub.vm_read_overwrite_efc)
|  ||||`--> 0x100066fe0      0832a552       movz w8, 0x2990, lsl 16
|  |||| !   0x100066fe4      c83e8b72       movk w8, 0x59f6
|  |||| !   0x100066fe8      e93740b9       ldr w9, [sp + local_34h]   ; [0x34:4]=0 ; '4'
|  |||| !   0x100066fec      2801086b       subs w8, w9, w8
|  |||| !   0x100066ff0      e82300b9       str w8, [sp + local_20h]
|  ||||,==< 0x100066ff4      2c010054       b.gt 0x100067018
| ,=======< 0x100066ff8      01000014       b 0x100066ffc
[...]

Vous pouvez aussi avoir un mode un peu plus visuel comme avec IDA

r2VV

J’ai pris un exemple différent que le précédent, mais c’est le même principe.

Pour installer radare2 je vous déconseille de passer par les repositories d’Ubuntu ou Debian, mais plutot de compiler manuellement depuis les sources. Car les version sur les repositories par défaut sont obsolètes.

Pour cela : lancez la commande suivante : git clone https://github.com/radare/radare2 && cd radare2 && sys/install.sh

La compilation prend un peu de temps, car c’est un gros logiciel mais après vous serez bien content de l’avoir !

iBoot64helper

Si vous utilisez IDA, vous devez surement savoir qu’on peut utiliser des scripts en Python avec l’API IDA.

Je vais vous parler d’un script en particulier très utile pour l’analyse des bootloaders 64 bits d’Apple : iBoot64helper. Ce script va localiser l’adresse ou est chargé le bootloader (loading address) pour rebaser l’image.

Lorsque vous ouvrez votre bootloader dechiffré et decompressé dans IDA vous obtenez ces lignes en assembleur illisibles.

norebase

Il suffit de lancer le script : file -> Script File ou ALT + F7 puis séléctionnez iboot64helper.py.

Lorsque le script se lance il va rebaser vers l’adresse qu’il a définie, puis définira les fonctions en fonction de cette adresse

[+] rebasing to address 0x1800b0000
Rebasing program to 0x00000001800B0000...
[+] searching and defining functions
[+] iboot64helper finished

rebase

J Levin’s tools

Le dernier set d’outils est pour ma part le plus utile de la bande. Tous écris par Jonathan Levin aka Morpheus. Il est l’auteur de plusieurs livres techniques consacrés aux systèmes d’exploitation d’Apple mais aussi Android. Il a publié différents articles sur tvOS, les mises à jours OTA, mais aussi sur les jailbreaks de ces dernières années, je vous invite à lire tous ses articles.

Joker

Joker a été développé pour le Reverse Engineering des kernels XNU. Vous pouvez dumper KPP mais aussi decompresser les kernelcaches 64 bits sans avoir a connaitre le Magic offset.

$ joker kernelcache.n71
Feeding me a compressed kernelcache, eh? That is fine, now. I can decompress! (Type -dec _file_ if you want to save to file)!
Compressed Size: 14023377, Uncompressed: 32489472. Unknown: 0xe1f02ad9, Unknown 1: 0x1
btw, KPP is at 14023816 (0xd5fc88)..And I saved it for you in /tmp/kpp
Got kernel at 440
This is a 64-bit kernel from iOS 10.x, or later (3705.0.0.2.3)
ARM64 Exception Vector is at file offset @0x7b000 (Addr: 0xfffffff00747f000)

Joker reconnait bien que c’est un kernel d’iOS 10 pour aarch64. Il sauvegarde aussi KPP dans un repertoire temporaire si l’on veut le recuperer. En plus ça on peut dumper les kexts, les sysctl, syscalls, etc…

Pour plus d’info je vous redirige vers l’article complet : http://www.newosxbook.com/tools/joker.html

Jtool

Jtool est multifonction, un vrai couteau suisse pour les exécutables Mach-O. Cet outil permet d’analyser de fond en comble les executables *OS .Premièrement il est possible d’obtenir l’en-tête d’un mach-O.

$ jtool -h test/.theos/obj/debug/arm64/test
Magic:  64-bit Mach-O
Type:   executable
CPU:    ARM64
Cmds:   17
size:   1280 bytes
Flags:  0x200085

De plus on peut desassembler tout ou une partie de celui-ci (je parle du fichier mach-O), ainsi que signer à la façon de ldid des binaires pour iOS.

Bref cet outil est plus que complet, je vous conseil vivement de vous en informer un peu mieux ici

Disarm

Oups encore un autre desassembleur. Cette fois-ci il est plutôt simple. Je l’utilise peu, mais je le trouve assez utile pour les petits programmes.

Vous pouvez l’utiliser pour les Bootloaders (iBoot, LLB). Mais aussi les kernelcaches comme ci-dessous :

$ disarm kernelcache.n71 | more
0x00000000      0xbcd68330      LDUR S16, [X25, #-152]
0x00000004      0x49041683      DCD 0x49041683
0x00000008      0x1650344d      B 0xfffffffff940d13c
        -------------------------------
0x0000000c      0x6e726b04      DCD 0x6e726b04
0x00000010      0x4b1f166c      DCD 0x4b1f166c
0x00000014      0x656e7265      DCD 0x656e7265
0x00000018      0x6361436c      DCD 0x6361436c
0x0000001c      0x75426568      __2DO 0x75426568
0x00000020      0x65646c69      DCD 0x65646c69
0x00000024      0x31312d72      CMN W11, #3147
0x00000028      0x302e3935      ADR X21, #378661        ; X21 = 0x5c74d
0x0000002c      0x312e302e      CMN W1, #2956
0x00000030      0x8304312e      DCD 0x8304312e
0x00000034      0x6351bcd6      DCD 0x6351bcd6
0x00000038      0x6c706d6f      DCD 0x6c706d6f
0x0000003c      0xe173737a      DCD 0xe173737a
0x00000040      0x01d92af0      DCD 0x1d92af0
0x00000044      0x0000c0ef      DCD 0xc0ef
0x00000048      0x00d1fad5      DCD 0xd1fad5
0x0000004c      0x00010000      DCD 0x10000
0x00000050      0x00000000      DCD 0x0
[...]
0x00000058      0x00000000      DCD 0x0
0x000001b4      0xff000000      DCD 0xff000000
0x000001b8      0xfeedfacf      DCD 0xfeedfacf <------------------ Ca vous rappelle rien ?
0x000001bc      0x0100000c      DCD 0x100000c
0x000001c0      0xf0f600d5      ADRP X21, 2015259       ; X21 = 0xec01b000
0x000001c4      0x14f0f602      B 0x3c3d9cc
        -------------------------------
0x000001c8      0x0e38f0f6      DCD 0xe38f0f6
0x000001cc      0x20f1f39a      DCD 0x20f1f39a
0x000001d0      0x1900f1f6      DCD 0x1900f1f6
0x000001d4      0xf0f5f1ff      ADRP X31, 2014783       ; X31 = 0xebe3f000
0x000001d8      0x545f9f5f      __2DO 0x545f9f5f
0x000001dc      0x09545845      DCD 0x9545845
0x000001e0      0x40031c02      DCD 0x40031c02
0x000001e4      0xf00740ff      ADRP X31, 59423         ; X31 = 0xe81f000
0x000001e8      0x00ffffff      DCD 0xffffff
0x000001ec      0x1c0541c0      >>>LDR S0, aa24
0x000001f0      0x2ff0f608      DCD 0x2ff0f608
0x000001f4      0x30013004      ADR X4, #9729   ; X4 = 0x27f5
0x000001f8      0x041c0301      DCD 0x41c0301
0x000001fc      0x635f5f7f      DCD 0x635f5f7f
0x00000200      0x74736e6f      __2DO 0x74736e6f
0x00000204      0x16b6061c      B 0xfffffffffad81a74

Encore une fois je vous invite à aller faire un tour sur la page de disarm pour plus d’infos.

Bien visiter chaque page, pour télécharger chaque tarball et copier chaque fichier dans le $PATH, c’est chiant. Alors je vous propose un petit script qui va le faire pour vous. Il est disponible sur Github et vous n’avez qu’à le rendre executable avec un chmod +x puis vous le lancez.

A noter qu’il est compatible uniquement pour Linux-x86_64. Ce script va installer des outils pour les mises à jour OTA, j’expliquerais ça plus tard dans un autre post.

Les outils que je vous ai présenté sont de loin les meilleurs en ce qui concerne la recherche iOS tout en ayant une machine Linux.

En esperant que ce post ai été utile.

Si vous avez besoin d’infos contactez-moi sur twitter: @matteyeux 

Github : https://github.com/matteyeux