jeudi 22 décembre 2011

Récupérer le "Library Persistent ID" à partir d'un l'iPhone et non du PC.

Le Library Persistent ID est un identifiant unique utilisé par iTunes pour associer votre collection de musique, contacts, etc à un iPhone spécifique. En modifiant manuellement ce Persistent ID vous pouvez forcer iTunes à synchroniser avec votre iPhone sur plusieurs PCs. Très utile quand vous changer de PC et que vous voulez changer le PC principal sur lequel vous synchronisez votre appareil. Le problème c'est que pour récupérer cet ID vous avez besoin d'avoir accès au PC originellement utilisé pour synchroniser. Si vous avez oublié de le relevé avant de le reformarter ou si vous en changez suite à un défaut matériel voilà comment récupérer le Library Persistent ID à partir de votre iPhone.

- Connectez votre iPhone à iTunes.
- Click droit et choisir de faire un backup du téléphone.
- Une fois la sauvegarde effectuée naviguez dans:
Windows: %appdata%\apple computer\mobilesync\backup\<unique string>\

OS X: $HOME/Library/Application Support/MobileSync/Backup/<unique string>/
- Vous trouverez un fichier Info.plist dans ce répertoire. La chaine unique string est aléatoire. Pour décoder le fichier Info.plist et retrouver votre ID utiliser cet outil:

http://www.magicspace.eu/static/iTunes_Library_Persistent_ID_recover.php

Si vous voulez l'extraire vous même isoler la partie data de la clé iTunesPrefs. et sauvegardé son contenu dans un fichier itunes.dat cat itunes.dat | base64 -D | hex dump Votre ID se trouve de l'octet 19 à 12 (en partant de 0). A noter que récupérer l'ID de cette manière n'est possible que si vous n'avez pas activé le chiffrement de vos sauvegardes.

jeudi 15 décembre 2011

Créer un package .deb pour Cydia

Avoir son propre repository, on peut y placer des .deb récupérés par si par là mais l'intérêt repose surtout dans la possibilité de publier ses propres applications. Nous allons donc voir dans ce billet comment packager une application au format .deb afin qu'elle soit installable via l'application Cydia. Les fichiers .deb présentent tous une arborescence commune. On va donc créer cette arborescence manuellement, y placer nos propres fichiers et compiler le tout en un fichier .deb. MonApplication
- DEBIAN
     control
     usr/bin (optionnel)
     usr/lib (optionnel) etc
Le contenu du fichier control est le suivant. A vous de remplir les champs. Beaucoup sont optionnels. Package: <ID du package >
Name: <Nom de votre application >
Version: <version >
Architecture: iphoneos-arm
Depends: <ID des packages, séparés par des virgules >
Conflicts: <ID des packages, séparés par des virgules >
Replaces: <ID des packages, séparés par des virgules >
Summary: <Très courte description affichée par cydia >
Homepage: votresite.com
Depiction: <url to package page>;theme=16
Maintainer: [username] <email>
Author: [username] <email>
Sponsor: VotreNom <votremail@gmail.com>
Section: Hacktools
Tag: role::[enduser|hacker|developer] (Choisir une section)
Icon: http://votresite.com/imgs/icon.png
Exemple que j'ai utilisé pour tester certaines apps: A noter que beaucoup de monde disent ne pas réussir à faire prendre en compte le champ icône. Je n'ai personnellement jamais utilisé ce champ. Package: com.test.com
Name: testApp
Version: 1.0
Architecture: iphoneos-arm
Depends: winterboard
Description: test
Homepage: http://www.test.com
Depiction: http://www.test.com
Author: test@aol.com
Section: Utils
Imaginer le répertoire racine de votre package (ici le répertoire MonApplication) comme la racine de votre iPhone. Tout ce que vous y placerez ce retrouva installé dans le répertoire correspondant sur iPhone. Ex: MonApplication/usr/bin/test.exe installera test.exe dans /usr/bin. Ne pas oublier de paramétrer les autorisations de chaque fichier correctement avec chmod Sortez ensuite de votre répertoire racine du package (MonApplication) et lancer la commande suivante: dpkg-deb -b MonApplication MonApplication.deb Assurez vous de bien préciser le nom du fichier de destination sinon vous vous retrouverez un fichier supplémentaire dans votre .deb qui pourrait poser des problèmes de conflit. Vous pouvez ignorez les warnings que vous donne la commande dpkg-deb Vous n'avez plus qu'a copier ce fichier .deb dans le répertoire debs de votre repository cydia et de lancer le script update.sh vu précédemment pour mettre à jour le fichier Packages.gz

Créer un repository Cydia sur OSX

Vous devez avoir les MacPorts d'installé ce qui parait acquis si vous vous intéressez à ce blog. (Notez que de nombreux tutoriaux demande d'installé Fink à la place de MacPort. Personnellement je n'ai pas eu à l'installer) Ensuite si vous ne l'avez pas déjà installez le package dpkg qui contient l'exécutable dpkg-scanpackages sudo port install dpkg Le repository doit contenir les fichiers suivants: Cydiarepo
- Packages.gz
- Release
- debs/ (repertoire)
- update.sh (optional)
Le fichier Release est un fichier metadata renseignant l'identité de votre serveur de repository. Origin: 0xGONE repository
Label: 0xGONE
Suite: stable
Version: 1.0
Codename: 0xgonecode
Architectures: iphoneos-arm
Components: main
Description: My own repo to test apps
Le répertoire debs contient les packages au format .deb disponibles sur votre repository. Le fichier update.sh est un script qui va générer le fichier Packages.gz contenant la liste des fichiers .debs disponibles. C'est ce fichier que Cydia parcourt au démarrage pour obtenir la liste des applications disponibles. update.sh
#!/bin/sh
dpkg-scanpackages -m . /dev/null | gzip -9c >Packages.gz
Ensuite vous devez placer le tout quelque par sur un serveur web. Personnellement j'ai créer un sous domaine cydia.0xgone.com pour réaliser des tests.

mercredi 14 décembre 2011

Compiler directement sur iPhone

Compiler directement des Makefile sur iPhone n'est pas super évident. J'ai du tâtonner pas mal avant d'y arriver ce qui fait que je n'ai pas une liste précise des étapes à effectuer. Je prendrai le temps de noter cela précisément lorsque je réinstallerai iOS (dès que iOS5 sera jailbreaké). En attendant si vous ne devez installer qu'un seul package installez installSDK disponible sur le repository de iNinja. Ce package installe un SDK dans le répertoire /var/sdk. A mon avis ce n'est pas la solution la plus propre car cela installe beaucoup trop de choses mais en attendant ça fonctionne. Le répertoire le plus important est /var/sdk/usr/lib qui contient les libs C et C++ standard. Avant d'avoir installé ce package GCC me renvoyait cette erreur: Undefined symbols:
      "___sprintf_chk", referenced from:
      _formatsize in util.o
      "___strcpy_chk", referenced from:
      _browse_draw in browser.o
      _calc_draw_progress in calc.o
      _cropstr in util.o
ld: symbol(s) not found
Ensuite vous devrez soit linker symboliquement ces libraires vers /usr/include, soit modifier votre Makefile pour ajouter ce chemin ( -I/var/sdk/usr/lib ) soir utiliser la variable d'environnement CFLAGS.

Extraire le contenu d'un .deb

Très utile pour reverse engineerer un programme présent sur Cydia. Beaucoup d'outils de hacking sont des scripts shell ou python. Le simple fait d'extraire le contenu du package .deb vous donne donc directement accès aux sources. ar vx filename.deb Une fois extrait vous obtiendrez des tar.gz à extraire et des fichiers binaires.

lundi 12 décembre 2011

SSH sans taper de mot de passe

J'utilise le SSH pour uploader des fichiers sur mon serveur web et comme j'ai pas mal recours à la ligne de commande j'ai configuré le ssh pour utiliser une clé privée plutôt que d'avoir à retaper mon mot de passe à chaque fois.

Une clé privée fonctionne de la même manière qu'un mot de passe sauf qu'elle est envoyée automatiquement au serveur SSH.

Voilà comment effectuer cette configuration:

Créer un couple clé privée / clé publique ssh-keygen Copier votre clé publique sur le serveur distant scp ~/.ssh/id_rsa.pub user@godaddy:.ssh/authorized_keys Normalement ces deux étapes suffisent pour vous connecter sans mot de passe. Le client ssh choisira de lui même la bonne clé. Pour ma part j'ai du désactiver la sélection automatique des clés pour d'obscures raisons de compatibilité avec un serveur SVN donc je spécifie la clé dans la ligne de commande: ssh -i /Users/username/.ssh/servername.com sshuser@servername.com Lors de la génération de la clé privée ssh-keygen vous demande de spécifier un mot de passe pour accéder à la clé. Cette option est bien sûr beaucoup plus sécurisée (la possession de la clé ne suffit pas à ce connecter) mais nécessite de taper son mot de passe de clé ce qui perd un peu de l'intérêt d'utiliser une clé. Cependant sur de nombreux systèmes on ne doit pas taper le mot de passe à chaque fois. (Par exemple seulement à la première utilisation de la journée). Vous pouvez rajouter des utilisateurs en ajoutant des clés sur le serveur ainsi: cat /Users/username/.ssh/id_rsa_maggy.pub | ssh user@godaddy “cat >> ~/.ssh/authorized_keys” Note technique:

Il est important de comprendre que le client ssh ne transmet pas directement votre clé privée. On perdrait alors toute sécurité. Le processus d'authentification est le suivant:

- Serveur encode un challenge avec votre clé publique et l'envoie au client.
- Le client décrypte le challenge avec sa clé privée et la réencrypte avec la clé publique du serveur et envoie le tout au serveur.
- Le serveur vérifie que vous avez bien décodé le challenge en décryptant votre réponse grâce à sa clé privée.

Création de certificat pour Push Notification Apple

Se rendre sur iOS Provisioning Portal

Onglet "App IDs" et éditer l'application ID de l'application pour laquelle ont veut générer des pushs.

Générer un Certificate Signing Request avec l'application KeyChain -> Certificate Assistante -> Request a Certificate from a Certificate Authority.

Cryptographiquement parlant cette action va créer une paire de clé publique et privée et va placer la clé publique dans le fichier .crs .

On soumet ensuite ce CSR au site d'Apple en cliquant sur le bouton configuration (version développement ou distribution) de l'application ID. A partir de ce CSR (de votre clé publique) le serveur d'Apple va générer un certificat SSL que vous allez télécharger pour le stocker dans votre KeyChain en double cliquant dessus. C'est ce certificat que vous placerez sur votre serveur push. C'est ce fichier SSL qui vous authentifiera auprès du serveur Push d'Apple et qui vous permettra d'envoyer des notifications à l'application associée à ce certificat.

Alternativement si vous n'avez pas votre propre serveur Push mais utilisez un service tel que Urban Airship vous uploaderez ce certificat SSL (extension .cer) au serveur du service en question. Selon le service vous pouvez exporter le fichier .cer au format .p12 ou .pem

SSH iPhone par le cable USB

Très pratique pour éviter les déconnexions intempestives lorsque l'on fait des tests en WIFI et que le téléphone se met en veille.

Tout est expliqué ici:SSH over USB

  • Récupérer le projet usbmuxd
  • Aller dans le répertoire python-client
  • Faire du ficher tcpreplay.py un exécutable avecchmod +x tcpreplay.py- Lancer:./tcpreplay.py -t 22:2222Ainsi toute connexion au port 2222 sera redirigée vers le port 22 de l'iPhone. On peut donc maintenant faire un SSH directement par le câble USB en faisant:ssh root@localhost -p 2222
    Ou un scp
    scp -P 2222 file.tar root@localhost:~/

Jailbreak / Unlock / Tethered / Unthetered

Jailbreak:

Obtenir l'accès root sur le téléphone pour pouvoir installer ce que l'on veut et pas seulement les applications validées par Apple. Donne accès à lein de fonctions supplémentaires tel que l'accès SSH, la vision de l'iPhone comme clé USB, etc …

Unlock:

Permet d'utiliser n'importe quelle carte SIM et pas seulement celle de votre opérateur. Différent et complémentaire ou indépendant du jailbreak.

Tethered Jailbreak:

On perd les effets du Jailbreak à chaque reboot de l'iPhone. En fait l'iPhone ne reboote même pas en mode normal. Même si on reboote son iPhone rarement c'est quand même ennuyeux d'avoir besoin d'un PC/MAC à chaque fois pour le rejailbreaker.

Unthetered Jailbreak:

Le jailbreak définitif sans re-connexion nécessaire à un ordinateur. Jusqu'à la prochaine version du firmware.

Semi thetered Jailbreak:

Il y a aussi une variante semi thetered à laquelle je ne me suis pas intéressé. Plus d'info Ici

Jailbreak = exploit

Pas sûr que beaucoup de gens réalisent que jailbreaker son iPhone revient à l'exploiter au sens hacking du terme. Jailbreaker un iPhone signifie techniquement obtenir l'accès root et contourner les protections du téléphone (notamment la signature des applications) pour en faire ce que l'on veut. Pour jailbreaker, un hacker doit trouver un bug, une faille dans l'OS exactement comme il le ferait pour tout exploit. C'est pour cela que le jailbreak n'est jamais disponible instantanément à chaque nouvelle version d'iOS. On peut même imaginer que le jailbreak devienne impossible ou très difficile à réaliser. Même si paradoxalement il est devenu légal de jailbreaker son iPhone il n'est en revanche pas légal de modifier le code du firmware d'Apple. Ce qui laisse perplexe quand à la possibilité d'effectuer un jailbreak complètement légal sans l'aide d'Apple.

Dans tout les cas gardons bien à l'esprit qu'un iPhone jailbreaké est bien moins sécurisé qu'un iPhone non jailbreaké. Une des premières faille ouverte par le jailbreak n'est rien de moins que l'installation d'un accès SSH sur le téléphone. SSH avec un mot de passe pas défaut ("alpine") que peut de gens se donnent la peine de modifier. Le jailbreak crée donc une grave faille de sécurité qui nous permet d'installer n'importe quelle application et donc potentiellement des malwares. Attention donc à ce que vous installez sur Cydia.

Attention également à la source sur laquelle vous téléchargez le logiciel permettant d'effectuer le jailbreak. Ce logiciel lui même pourrait être malveillant pour votre iPhone ou pour votre ordinateur. Personnellement je télécharge tout directement à la source sur le site de cette équipe de hackers: Dev-Team Blog

Achat d'hébergement avec SSH

J'avais besoin d'un hébergement web pour les besoins du site et pour les projets que j'envisage d'y placer. J'ai fais le tour du net pour trouver un hébergement gratuit et il se trouve qu'il y en a pas mal avec bien assez d'espace disque pour mes besoins (parfois 1Go). Cependant je n'en ai trouvé aucun qui supportait le SSH en gratuit :-/

Ce blog ayant pour objectif de traiter de sécurité informatique il me semblait incohérent de me contenter du FTP et de ses mots de passe en clair. D'autant plus que je compte pouvoir mettre à jour le blog en situation de mobilité, donc potentiellement sur des réseaux WIFI inconnus.

J'ai donc opté pour le serveur le moins cher possible que j'ai trouvé supportant le SSH. Je l'ai pris sur GoDaddy sur lequel j'avais déjà quelques noms de domaine. Le prix et d'environs 4 € par mois sans engagement.