Alarme de maison avec un raspberry pi

raspberry-ban

J’ai un ami qui souhaite vérifier que personne n’entre chez lui quand il n’est pas là. Ceci peut être intéressant pour Dexter mais aussi en cas de propriétaire invasif. Afin de contrôler les allers et venues dans son appartement, nous avons eu l’idée de prendre en photo avec une webcam toutes les personnes qui passent la porte. Les photos pourront ensuite être envoyées par mail ou bien sur une interface web.

Mise en place d’un système de sécurité

Un système de sécurité est composé de capteurs. L’ensemble des capteurs permet de détecter une présence. On va retrouver des capteurs sur les portes et fenêtres qui permettent de savoir si celles ci sont ouvertes. On peut aussi trouver des capteurs de mouvement. Dans notre cas, nous souhaitons utiliser un capteur permettant de détecter l’ouverture d’une porte. Celui ci a été récupéré dans le vieux carton d’un projet de technologie réalisé en 4ième.

capteur

Ce capteur va alors être relié à un GPIO du raspberry pi. Il faudra ensuite prendre une photographie en direction de la porte d’entrée sur laquelle le capteur sera placé. On aurait tout aussi bien pu activer un buzzer.

Partie hardware

le capteur fonctionne avec un commun et une sortie normalement ouvert et normalement fermé. L’idée est de relier ce capteur à un GPIO du raspberry pi afin que l’on détecte sur le GPIO :

  • Un état haut (3.3V) si la porte est fermé
  • Un état bas (0V) si la porte est ouverte

Nous obtenons le câblage suivant :

cablage

Afin de s’assurer que la sortie est à l’état bas lorsque la porte est ouverte nous utiliserons une résistance de pulldown.
pour réaliser ce montage nous utilisons un connecteur au pas de 2.54 ainsi qu’un petit domino et nous obtenons le montage suivant, qui se fixe simplement sur le raspberry pi :

pontRasp

Il faut maintenant détecter le niveau de la pin GPIO22. Pour cela nous allons utiliser, une librairie C conçue pour piloter nos GPIO.

Librairie C pour le BCM 2835

La librairie que nous utilisons est disponible ici : librairie

Sur le raspberry pi, ouvrez un shell :

$ wget http://www.open.com.au/mikem/bcm2835/bcm2835-1.17.tar.gz
$ tar zxvf bcm2835-1.17.tar.gz
$ cd bcm2835-1.17
$ ./configure
$ make
$ sudo make check
$ sudo make install

La librairie est maintenant installée.
Les noms des GPIO sont ceux décrit en orange dans l’image ci dessus. Il sont nommés de RPI_GPIO_P1_01 à RPI_GPIO_P1_26. Et ils correspondent aux 26 broches de sorties. Cependant, ils ne correspondent pas aux sorties que vous pouvez utiliser via le système de fichier. Le GPIO22 que nous allons utiliser est ainsi appelé RPI_GPIO_P1_15.

Sur le site de la librairie nous trouvons directement un exemple que nous allons réutiliser dans notre projet. Si vous souhaitez repartir de la source originale, elle se trouve ici : source
Pour détecter le niveau de sortie du GPIO22, nous utilisons le code C suivant:

//input.c
#include <bcm2835.h>
#include <stdio.h>
// Input sur le GPIO22 qui est nommé 15 dans le système de la librairie
#define PIN RPI_GPIO_P1_15
 
int main(int argc, char ** argv) {
    if (!bcm2835_init()) {
        return 1;
   }
    // Fixe le GPIO en entrée
    bcm2835_gpio_fsel(PIN, BCM2835_GPIO_FSEL_INPT);
    //  avec une résistance de pull down
    bcm2835_gpio_set_pud(PIN, BCM2835_GPIO_PUD_DOWN);
 
    while (1) {
        // lecture du niveau d'entrée
        uint8_t value = bcm2835_gpio_lev(PIN);
        printf("lecture GPIO22: %d\n", value);
 
        // attendre 2s
        delay(2000);
    }
    //Un brin de toilette
    bcm2835_close();
    return 0;
}

Compilons et lançons le programme et amusons nous à déplacer le capteur (équivalent à ouvrir et fermer la porte) :

$ gcc input.c -l rt -l bcm2835 -o input
$ sudo ./input
lecture GPIO22: 1
lecture GPIO22: 1
lecture GPIO22: 0
lecture GPIO22: 0
lecture GPIO22: 1

Photographie avec la webcam

Afin de photographier l’entrée, nous allons réutiliser la librairie openCV. Celle ci avez déjà été utilisé à Halloween pour réaliser un capteur de mouvement avec une webcam. Je vous invite à lire l’article suivant pour l’installation et la programmation : Halloween project

Pour ce qui est de l’installation, elle est faite directement depuis les dépôts.

$ sudo apt-get install libcv-dev libcvaux-dev libhighgui-dev

Le code complet est disponible en annexe.

Envoi par mail et interface graphique

L’envoi par mail et l’interface graphique sont codés en php. Les appels entre les deux langages se font soit via la commande system, soit via des pipes nommées.

Et l’interface web donne:

screenShot

Conclusion

Vous pouvez remplacer le capteur par un détecteur de mouvement. N’hésitez pas à nous contacter si vous souhaitez en savoir d’avantage ou avez d’autres idées saugrenues.

It’s oversimple isn’t it?

Espionner une transaction Monéo

La carte Monéo

La carte Monéo est un porte monnaie électronique. La spécificité d’un porte monnaie électronique est que l’argent n’est pas présent directement sur la carte.

Pour la Monéo, il est nécessaire de présenter votre carte bancaire. Une transaction est effectuée de la même manière que si vous retiriez de l’argent en liquide. Cet argent est alors inscrit sur la carte Monéo. Monéo propose un service de chargement en ligne. Nous allons en profiter pour observer la manière dont fonctionne le chargement d’une telle carte.

L’espion de carte à puce

L’espion fonctionne à partir d’un microprocesseur Microchip PIC32MX512L. Pour plus de détails sur le développement :

Le protocole ISO7816 a été implémenté afin de pouvoir obtenir des traces qui ressemblent à ceci :

T=1:

ATR : 3BE800008131FE454A434F505632343194
Term (S-block):
00C101 FC 3C
Card (S-block):
00E101 FC 1C
Term (I-block):
00000C 00A4040007A0000000041010 0F
Card (I-block):
000025 6F218407A0000000041010A516500A4F56455253494D504C45BF0C07636172647370799000 C3
Term (I-block):
004005 00C0000041 C4

T=0:

ATR : 3B 66 00 00 90 D1 02 01 20 B1 
Term (CLA INS P1 P2 P3):
00 A4 04 0C 06 
Card (Ack):
A4 
Term (UDC):
A00000006900
Card (SW): 
9000
Term (CLA INS P1 P2 P3):
00 B2 01 BC 16
Card (ACK UDR SW): 
B2 9250003840106021502D15091207010250455552011C 9000

Le chargement Monéo

A l’aide de l’espion, nous observons un chargement de Monéo de dix euros effectué sur internet.

Celui ci se décompose en deux parties, la première partie est une lecture des informations de la carte, numéro de PAN, solde etc…

Ensuite un série de commandes est exécutée de cla E0 et d’instructions 30.
La classe E0 nous indique alors qu’il s’agit d’une carte supportant jusqu’à 16 canaux logiques (16 pointeurs de fichier) et que la commande inclus du Secure Messaging.

Edition après le commentaire de SV :

Une petite remarque en passant: CLA = E0 signifie surtout que le bit de poids fort est à 1 donc l’instruction (et la classe) sont propriétaires. La norme ISO/IEC 7816 ne s’applique donc pas pour interpréter l’octet CLA (en particulier les 16 canaux).

Autrement dit, le chargement est protégé par un calcul de MAC. Le mac faisant 8 octets de long, on peut vraisemblablement penser à du 3-DES.

Term (CLA INS P1 P2 P3):
E0 30 00 00 1C 
Card (ACK):
30 
Term (UDC):
00000000001000000000000000007001070600018820121121192244
Card (SW)
6139 
Term (CLA INS P1 P2 P3):
00 C0 00 00 39 
Card (ACK UDR SW):
C0 010005010010000021108888866666001000315D110004010010000100000030000000000000000000000000000000000DCE86FF2230D6A91B 9000
Term (CLA INS P1 P2 P3):
E0 30 80 00 35
Card (ACK):
30 
Term (UDC):
10000501001000250001700107060000000000018820121121192244010000003000000000000000000000000DAE7D69BE5F4394EA 
Card (UDR):
610D 
Term (CLA INS P1 P2 P3):
00 C0 00 00 0D 
Card (ACK UDR SW):
C0 11000501001000003110000000 9000

Conclusion

On retrouve dans la dernière UDC la date de la transaction ainsi que le montant. La sécurité du mécanisme repose la génération des macs par le serveur. Ceci est un système sécurisé à condition que les algorithmes cryptographiques soient correctement implémentés.

Cross compilation avec un raspberry pi

raspberry-ban

Qu’est ce qu’un cross compiler?

Un cross compiler est une chaîne de compilation qui tourne sur une architecture mais qui génère un exécutable binaire pour une autre plate forme.

Avec notre raspberry pi, s’il est assez simple de compiler un code de petite taille,il devient très difficile de compiler de gros programmes.

Enfin, il est beaucoup plus agréable de compiler sur votre machine de guerre vos fichiers en une fraction de seconde que d’attendre une minute entre chaque retouche du code compilé par le petit processeur du raspeberry pi.

NOTE : Afin de fonctionner correctement, il est nécessaire d’utiliser une distribution utilisant le hard-float ABI. Ceci est le cas de la raspian et de la dernière version de d’arch pour le raspberry.

Le jeu d’instruction

Chaque processeur utilise son propre jeu d’instructions. Celui ci correspond au jeu d’instructions assembleur. Ce jeu d’instructions est dépendant de l’architecture du microprocesseur. Il dépend directement de la manière dont sont gravé les circuits en silicium.
L’article suivant en anglais explique le fonctionnement des portes logiques que l’on peut trouver dans un microcprocesseur : Article

247x180xQuiz-Silicon-ARM-247x180.jpg.pagespeed.ic.0dZq6IhOZ8

Le jeu d’instructions supporté par les pc et qui est bien connu des reverser est le x86 qui correspond aux architectures Intel. Pour les AMD, c’est assez simple, c’est le même jeu d’instructions. Donc lorsqu’un code, par exemple du C, est compilé pour votre PC, il génère un assembleur x86 qui correspond à des instructions propres aux processeurs Intel et AMD.
Le problème c’est que le processeur présent sur le raspberry pi est un processeur ARM : 700 MHz ARM11 ARM1176JZF-S

Nous allons donc utiliser une chaîne de compilation qui générera un binaire pour le ARM1176JZF-S. Pour cela nous allons utiliser l’outil crosstool-ng.

Installation de crosstool-ng

Crosstool-ng est un outil permettant de construire des chaînes de compilation pour des plate-formes données.
Pour installer crosstool :

$ wget http://crosstool-ng.org/download/crosstool-ng/crosstool-ng-1.17.0.tar.bz2
$ tar xjf crosstool-ng-1.17.0.tar.bz2
$ cd crosstool-ng-1.17.0/
$ sudo ./configure --prefix=/opt/crosstool
$ make
$ sudo make install

J’ai du installer quelques programmes supplémentaires. Le script configuré indique ce qu’il manque. Dans tous les cas, n’hésitez pas à poster dans les commentaires si vous avez besoin de plus d’informations.

Réaliser la chaîne de compilation pour le raspberry pi

Il va falloir créer un répertoire dans lequel crosstool-ng va enregistrer votre chaîne de configuration.

  • Créer un répertoire pour héberger votre chaîne de compilation
  • Lancer /opt/crosstool/bin/ct-ng menuconfig

Le menu suivant apparaît:
menuconfig

  • Dans Path and misc options cocher Try features marked as EXPERIMENTAL (touche Y)
  • Toujours dans Path and misc options Changer Shell to use as CONFIG SHELL et choisir sh
  • Revenir au menu principal et sélectionner Target options
    • Target architecture : ARM
    • Endianess : little endian
    • Bitness : 32 bits
  • Revenir au menu principal et sélectionner Operating system
  • Choisir Target OS linux
  • Revenir au menu principal et sélectionner Binary utilities
  • Changer binutils version pour la 2.21.1a
  • Revenir au menu principal et sélectionner C compiler
  • Cocher Show Linaro versions (EXPERIMENTAL) (touche Y)
  • Choisir linaro-4.6-2012.04 (EXPERIMENTAL)
  • Quitter et sauvegarder les changements

Cross compilons

La compilation s’effectue alors de la manière suivante :

$ ~/x-tools/arm-unknown-linux-gnueabi/bin/arm-unknown-linux-gnueabi-gcc helloWorld.c -o helloWord
$ ls
helloWord  helloWorld.c
$ scp helloWorld pi@192.168.1.107:helloWorld
pi@192.168.1.107's password: 
helloWord                                     100% 4985     4.9KB/s   00:00

On l’execute maintenant sur le raspeberry pi :

$ ssh pi@192.168.1.107
pi@192.168.1.107's password: 
Linux raspberrypi 3.2.27+ #250 PREEMPT Thu Oct 18 19:03:02 BST 2012 armv6l
 
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
 
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sun Jan 13 13:33:49 2013 from 192.168.1.100
pi@raspberrypi ~ $ ./helloWorld 
Oversimple says hello!

Conclusion

On remarque qu’il est relativement difficile de monter une chaîne de compilation pour un processeur ARM et surtout assez long. La réalisation de la chaîne à pris presque une heure chez moi. Cependant, il devient très vite quasi indispensable de le faire si vous souhaitez développer sur le raspberry.
La conception et la compilation de gros projets devient donc plus simple. A titre d’information, les kernels que l’on récupère sur le site du projet raspberry sont compilé de cette manière.

Source :
helloWorld.c

Décompiler une application android

android

On trouve de nombreux malwares sous android. Ceux ci utilisent généralement des applications payantes crackées pour se diffuser.

Nous allons aujourd’hui voir comment décompiler et visualiser une apk.
Pour cela nous allons utiliser deux outils :

  • JD-GUI
  • dex2jar

La machine de Dalvik

La machine de Dalvik est une machine virtuelle présente sur les téléphones android. Elle est très proche d’une JVM.
D’après Wikipédia, « Un outil appelé dx est utilisé pour convertir quelques .class Java en .dex ».
Si on ouvre un apk avec gestionnaire d’archive on obtient quelque chose comme ça :

archiveAPK

Le fichier classe.dex est celui que nous allons décompiler.

dex2jar

Le logiciel dex2jar est téléchargeable à l’adresse suivante : http://code.google.com/p/dex2jar/downloads/list

Pour l’utiliser il suffit de décompresser le fichier et pour l’utiliser :

$ ./dex2jar.sh classes.dex

On obtient alors un fichier jar. Pour visualiser le .jar, utilisons le logiciel JD-GUI.

JD-GUI

Le logiciel JD-GUI permet d’afficher les fichiers d’un .jar. Les fichiers .class sont alors affichés d’une manière user friendly.

DecompAPK

Conclusion

Il est tellement simple d’observer le contenu d’un apk qu’il serait stupide de s’en passer. Si vous souhaitez en savoir plus sur le langage utilisé par la machine de Dalvik, je vous recommande l’article suivant de Virtualabs :
http://virtualabs.fr/Reversing-d-applications-Android

It’s oversimple isn’t it?

Contourner les caméras de sécurité


Je ne sais pas vous, mais moi, toutes ces caméras qui surveillent mes moindres faits et gestes ça m’ennuie un peu.

Alors certes, c’est certainement pour le bien des citoyens que de les filmer en permanence, mais ça reste un peu intrusif.

Bien sur, je pourrais trouver un hack sympa à faire pour ne plus être filmé en permanence. Peut être même que ce hack concernerait tous les capteurs CCD et donc aussi les radars automatiques et autres webcams qui enregistrent en temps réel.

Let’s investigate (oui maintenant on se la fait à l’américaine).

Etude d’un capteur CCD

On apprend sur Wikipedia qu’il a été inventé par George E. Smith et Willard Boyle , et que ça leur a valu le prix nobel mais sur tout d’après wikipédia : « Un capteur photographique est un composant électronique photosensible servant à convertir un rayonnement électromagnétique (UV, visible ou IR) en un signal électrique analogique. »

On y apprend ensuite que la matrice RGB qui numérise le signal est constituée de photodiodes sensibles au rouge / vert et bleu et que c’est le logiciel qui recalcule les couleurs en fonction de l’intensité enregistrée par chaque photodiode.

Des photodiodes donc…

Les photodiodes ont une courbe de sensibilité centrée sur une longueur d’onde particulière. Ce qui m’intéresse c’est la répartition de cette sensibilité. En effet si cette sensibilité dépasse le domaine du visible et là je pense aux capteurs rouges qui sont proches de l’infra rouge, alors on pourrait imaginer éblouir la caméra sans que cela ne soit visible dans le monde réel.

Recherchons la courbe de sensibilité des photodiodes bleus et rouges, qui pourrait être sensible aux ultra violets et aux infrarouges.
On a, toujours sur Wikipédia, l’information suivante :

Donc il n’est pas sensible qu’au spectre du visible qui s’étend de 400 à 700 nm (0.4 à 0.7 sur le diagramme). Toujours d’après ce même diagramme on peut imaginer que si on tape dans les infrarouges, le capteur rouge est largement éclairé. On pourrait donc l’éblouir et faire une attaque de type DOS dessus.

Essais

Un diode infrarouge peut être récupérée dans n’importe quelle télécommande. On va donc faire un petit essai avec plusieurs capteurs, à commencer par la webcam du pc, le téléphone portable et un appareil photo professionnel. Pour cela j’utilise une diode récupérée sur une vieille télécommande de freebox. J’utilise un des GPIO de mon raspberry pour l’alimenter. Cela permet de l’allumer ou de l’éteindre simplement.

Les résultats parlent d’eux même, le capteur est sensible aux infrarouges. Des résultats similaires on était observé avec l’appareil photo et la webcam.

Cas de la plaque d’immatriculation

Ajoutons une seconde led à notre montage que l’on va placer autour d’un numéro afin d’évaluer les capacités d’obfuscation :

Allumons notre montage :

Conclusion

Il ne s’agit là que de petite diodes. On peut facilement imaginer fabriquer un montage relié à la batterie du véhicule avec des diodes pour contourner les radars (fixes ou mobiles). On peut aussi imaginer dissimuler un visage aux caméras avec une casquette équipée de leds alimentées par une pile 9V.

It’s Oversimple isn’t it?

Open the door

Il n’y a pas si longtemps, je repensais à une scène de 60 secondes chrono. Celle où ils sont devant un garage à attendre que le propriétaire ouvre pour cracker le signal et récupérer le code de l’entrée.

En y repensant de plus près, je me suis souvenu que ma copine avait un badge du genre qui lui permet d’ouvrir une porte de garage en centre ville et on m’a prêté un oscilloscope.

Ni une ni deux je saute sur l’occasion pour vérifier la légende. Let’s open the door -> http://www.youtube.com/watch?v=eIrRPLzDrHU#t=2m03s

Ok c’était naze..

Conception de l’antenne

L’antenne se compose simplement d’un fil que l’on va enrouler. Avant d’entrer dans le vif du sujet, on peut faire un petit point sur la conception de la bobine et se souvenir comment un message électromagnétique peut être transformé en électricité. Wikipédia nous dit que

« Le champ électrique d’une onde électromagnétique induit une tension dans chaque petit segment de tout conducteur électrique.Le champ électrique d’une onde électromagnétique induit une tension dans chaque petit segment de tout conducteur électrique. La tension induite dépend de la valeur du champ électrique et de la longueur du segment. Mais la tension dépend aussi de l’orientation du segment par rapport au champ électrique. »

Ceci nous indique qu’il suffit de faire une antenne en réalisant un cercle avec du fil et de brancher notre fil à l’oscilloscope afin de voir le signal transmis par notre émetteur qui ouvre la porte de garage.

En effet le signal obtenu est très parlant (voir capture ci dessous). On voit apparaître un signal en tout ou rien, modulé en amplitude à 100%, avec une porteuse à 31Mhz environ. Lorsqu’on ouvre le boitier de notre émetteur radio qui ouvre la porte de garage, on retrouve un quartz oscillant à 30.975 Mhz. Tout semble donc en accord avec notre mesure.

Enregistrer le signal

La chose étonnante est que le signal est toujours le même. Il est donc tout à fait envisageable de l’enregistrer bêtement avec une carte d’acquisition et de rejouer le signal. Un simple montage ADC – mémoire – DAC permet de rejouer ce signal radio. Cependant, une carte d’acquisition coûte assez cher et on préférerait utiliser un montage moins lourd. Pour se faire, direction démodulation du signal. Le montage classique est un démodulation avec une diode au germanium. L’objectif étant de faire un détecteur de crêtes, les explications et le montage de ce type de circuit se trouve un peu partout sur le net. Dans le cas précis dans lequel nous nous trouvons (trop pauvre pour une diode au germanium), nous utiliserons une diode infrarouge avec un phototransistor.

Si on reprend la courbe capturée à l’oscilloscope, on voit deux phases: une première avec un niveau électrique à zéro, et une seconde avec un niveau électrique oscillant. Lorsque le niveau sera oscillant, la LED s’allumera de manière quasi continue. De l’autre côté un photo-transistor détectera l’allumage de la LED et il ne nous restera plus qu’à lisser ce signal afin d’obtenir un signal logique démodulé.

Montage

La diode émettrice est branchée directement sur notre antenne artisanale. Cette diode a été récupérée sur une vieille télécommande.

Le photo-transistor est simplement relié à la pile, en série, avec une résistance. Un petit condensateur a été ajouté afin de filtrer le bruit environnant. Ce dernier est maintenu au dessus de notre diode avec un scotch. Pour un meilleur rapport signal sur bruit, il eût été préférable d’écarter le plus possible le circuit émetteur du récepteur. Cependant lors de la découpe de la diode de la télécommande, une petite boulette nous a empêché de profiter pleinement des contacts de celle ci. Enfin ça marche.

Le signal obtenu au borne de la résistance vu à l’oscilloscope :

On observe un signal assez bruité mais ça reste lisible. Nous n’avons malheureusement pas le temps de nous plonger d’avantage dans l’étude et la fabrication d’espion plus puissant, mais on peut cependant noter qu’il ne semble pas y avoir de sécurité de type cryptographique sur la clé radio que nous avons testé.
Il est tout a fait possible d’écouter le signal avec du matériel adapté et relativement simple de le démoduler. Le reproduire consiste alors à refaire le même circuit que celui de la clé ce qui est à la portée de n’importe quel bidouilleur en électronique. Celui peut alors être rejoué simplement puisque dans les observation que nous avons faites, le même signal a toujours été émis ce qui permet le rejeu.

Pour éviter ce genre de chose, il aurait fallut envisager un protocole plus sur avec au moins un échange et permettant d’éviter le rejeu. Une question à laquelle nous espérons pouvoir répondre dès que nous aurons un peu de temps.

It’s oversimple isn’t it?

Interroger une carte à puce avec Java et un lecteur PC/SC

Utiliser la librairie smartcardio de java

La librairie smartcardio permet de comuniquer entre un lecteur pcsc et une application java.
Ceci peut ouvrir la voie à des applications sécurisées par carte à puce. Les cartes à puce permettent de stocker des clés cryptographiques de manière sûre.

Pour l’installation des drivers PC/SC direction cet article : http://oversimple.fr/espionner-une-transaction-avec-carte-a-puce/

Utilisation de la librairie dans eclipse

De base la librairie n’est pas accessible. Pour contourner ce problème, copier le code ci dessous dans une classe java :

/**
 * @param args
 */
public static void main(String[] args) {
	try {
		/* Affiche la liste des lecteurs PCSC */
		TerminalFactory factory = TerminalFactory.getDefault();
		List terminals = factory.terminals().list();
		System.out.println("Terminals: " + terminals);
 
		/* Selectionne le premier lecteur */
		CardTerminal terminal = terminals.get(0);
 
		/* Etablit la connection avec la carte */
		Card card = terminal.connect("*"); 
		/* '*' Laisse le programme choisir le mode de communication */
		System.out.println("card: " + card);
		CardChannel channel = card.getBasicChannel();
 
		// disconnect
		card.disconnect(false);
	} catch (CardException e) {
		e.printStackTrace();
	}
}

Vous devriez avoir l’erreur suivante.

Pour y parer, suivez les étapes décrites ci dessous :

On supprime alors la librairie java.

It’s OverSimple isn’t it?