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?

Raspberry Pi : Installation Archlinux sur carte SD 16GO


Installation d’Archlinux sur Carte SD 16 Go pour un Raspberry Pi Modèle B.

Télechargement de la derniere version de archlinux ARM, sur le site de Raspberry Pi : http://www.raspberrypi.org/downloads

Actuellement la dernière version est celle datant du 18 Septembre 2012 :

$ wget http://files.velocix.com/c1410/images/archlinuxarm/archlinux-hf-2012-09-18/archlinux-hf-2012-09-18.zip

On vérifie l’intégrité (toujours utile) :

$ sha1sum archlinux-hf-2012-09-18.zip
56e043f3c629f6c408759bcc157d2d635ce0b6af  archlinux-hf-2012-09-18.zip

On extrait notre archive zip :

 unzip archlinux-hf-2012-09-18.zip

On met en place notre Carte SD, pour connaitre quel périphérique est utilisé on fait un petit « dmesg »

$ dmesg
...(extrait)...
[ 6685.088186] scsi 7:0:0:0: Direct-Access     Multiple Card  Reader     1.00 PQ: 0 ANSI: 0
[ 6685.826912] sd 7:0:0:0: [sdb] 31504384 512-byte logical blocks: (16.1 GB/15.0 GiB)
[ 6685.828905] sd 7:0:0:0: [sdb] Write Protect is off
[ 6685.828911] sd 7:0:0:0: [sdb] Mode Sense: 03 00 00 00
[ 6685.830904] sd 7:0:0:0: [sdb] No Caching mode page present
[ 6685.830910] sd 7:0:0:0: [sdb] Assuming drive cache: write through
[ 6685.836904] sd 7:0:0:0: [sdb] No Caching mode page present
[ 6685.836910] sd 7:0:0:0: [sdb] Assuming drive cache: write through
[ 6685.838290]  sdb: sdb1 sdb2
[ 6685.843910] sd 7:0:0:0: [sdb] No Caching mode page present
[ 6685.843917] sd 7:0:0:0: [sdb] Assuming drive cache: write through
[ 6685.843921] sd 7:0:0:0: [sdb] Attached SCSI removable disk

on voit que notre carte SD correspond, au device /dev/sdb

On pose notre systeme :

$ sudo dd if=archlinux-hf-2012-09-18.img of=/dev/sdb bs=1M
1886+0 records in
1886+0 records out
1977614336 bytes (2.0 GB) copied, 168.367 s, 11.7 MB/s

On place notre carte dans le raspberry, on branche écran hdmi/clavier usb OU le cable ethernet, on boot et on peut se connecter en ssh sur notre raspberry 😉 (root/root)
Pour connaître notre ip, si on a pas d’écran HDMI (ou d’apdateur HDMI, VGA/DVI) : nmap -sn 192.168.1.0/24

$ nmap 192.168.1.0/24
 
Nmap scan report for 192.168.1.16
Host is up (0.040s latency).
Not shown: 999 closed ports
PORT   STATE SERVICE
22/tcp open  ssh

On se connecte :

ssh root@192.168.1.16

Maintenant, on partitionne les 16 GO sur la Carte SD

# fdisk /dev/mmcblk0

On regarde les partitions avec la commande p :

Command (m for help): p
Disk /dev/mmcblk0: 16.1 GB, 16130244608 bytes
4 heads, 16 sectors/track, 492256 cylinders, total 31504384 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000c21e5
 
        Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1   *        2048      194559       96256    c  W95 FAT32 (LBA)
/dev/mmcblk0p2          194560     3862527     1833984   83  Linux

On supprime la partition 2 afin de la refaire pour nos 16GO, il est possible si vous le désirez de partionner d’une autre manière mais cela reste le même principe

Command (m for help): d  
Partition number (1-4): 2
Partition 2 is deleted

On peut vérifier le résultat :

Command (m for help): p  
Disk /dev/mmcblk0: 16.1 GB, 16130244608 bytes
4 heads, 16 sectors/track, 492256 cylinders, total 31504384 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000c21e5
 
        Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1   *        2048      194559       96256    c  W95 FAT32 (LBA)

On crée une nouvelle partition avec les mêmes infos seul le last sector change.

Command (m for help): n
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p): p
Partition number (1-4, default 2): 2
First sector (194560-31504383, default 194560): 
Using default value 194560
Last sector, +sectors or +size{K,M,G} (194560-31504383, default 31504383): 
Using default value 31504383
Partition 2 of type Linux and of size 15 GiB is set

On enregistre avec la commande w

Command (m for help): w
The partition table has been altered!
 
Calling ioctl() to re-read partition table.
 
WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.

On redémarre.

Le travail n’est pas terminé, il faut l’appliquer pour le filesystem.

Pour cela on resize, c’est assez long.

# resize2fs /dev/mmcblk0p2 
resize2fs 1.42.5 (29-Jul-2012)
Filesystem at /dev/mmcblk0p2 is mounted on /; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
Performing an on-line resize of /dev/mmcblk0p2 to 3913728 (4k) blocks.

Et après, c’est terminé ! On reboot notre système et voila 🙂

Après un petit redémarrage on peut faire les mises à jour, ainsi que changer le nom de la machine.

Pour les mises à jour :

# pacman -Suy

On modifie notre nom de machine.

vi /etc/hostname

Et si vous désirez installer des packages qui ne sont pas présents dans le mirror list pour ARM mais présent sur les dépôts pour x86 et x86_64 :
On récupère un package, on modifie son PKGBUILD de manière à remplacer les architectures existantes par la notre : uname -m
Et après c’est la routine : makepkg –asroot PKGBUILD et voilà
Après on installe notre archive. Dans mon cas, cela a été nécessaire lors de l’installation du package dsniff.

It’s OverSimple, isn’t it ?

Nmap, un scanner puissant !

Ah Nmap qui ne le connait pas ? Le scanner de port qui passe dans pleins de films : Matrix Reloaded, Bourne Ultimatum, Die Hard 4 et pleins d’autres. Plus d’informations ici.

Plus sérieusement, Nmap permet en plus de scanner des ports, d’identifier les services hébergés ainsi que le système d’exploitation distant.

Voici quelques commandes, cette liste est bien sûre non exhaustive, je me permettrai de rajouter les commandes qui peuvent m’être utile par la suite !

Un scan nmap « basique » :

# nmap 192.168.1.1
 
Starting Nmap 6.01 ( http://nmap.org ) at 2012-09-12 20:07 CEST
Nmap scan report for 192.168.1.1
Host is up (0.00040s latency).
Not shown: 989 filtered ports
PORT     STATE  SERVICE
21/tcp   open   ftp
80/tcp   open   http
139/tcp  open   netbios-ssn
445/tcp  open   microsoft-ds
548/tcp  closed afp
554/tcp  open   rtsp
5000/tcp open   upnp
5001/tcp closed commplex-link
5678/tcp open   rrac
8090/tcp open   unknown
9091/tcp open   xmltec-xmlmail
MAC Address: 13:37:13:37:13:37 (La box de mon FAI)
 
Nmap done: 1 IP address (1 host up) scanned in 4.77 seconds

Utiliser le TCP Scan connu sous le nom de Scan SYN. Le paquet SYN est le premier envoyé lors d’une connexion TCP, le TCP handshake sera réinitialisé si le port est détecté comme ouvert.

# nmap -sS 192.168.1.1
 
Starting Nmap 6.01 ( http://nmap.org ) at 2012-09-12 20:07 CEST
Nmap scan report for 192.168.1.1
Host is up (0.00037s latency).
Not shown: 989 filtered ports
PORT     STATE  SERVICE
21/tcp   open   ftp
80/tcp   open   http
139/tcp  open   netbios-ssn
445/tcp  open   microsoft-ds
548/tcp  closed afp
554/tcp  open   rtsp
5000/tcp open   upnp
5001/tcp closed commplex-link
5678/tcp open   rrac
8090/tcp open   unknown
9091/tcp open   xmltec-xmlmail
MAC Address: 13:37:13:37:13:37 (La box de mon FAI)
 
Nmap done: 1 IP address (1 host up) scanned in 5.06 seconds

Et pour voir les ports UDP ouvert :

# nmap -sU 192.168.1.1
 
Starting Nmap 6.01 ( http://nmap.org ) at 2012-09-12 20:20 CEST
Nmap scan report for 192.168.1.17
Nmap scan report for 192.168.1.1
Host is up (0.00035s latency).
Not shown: 993 closed ports
PORT     STATE         SERVICE
53/udp   open          domain
67/udp   open|filtered dhcps
123/udp  open          ntp
137/udp  open          netbios-ns
138/udp  open|filtered netbios-dgm
1900/udp open|filtered upnp
5353/udp open          zeroconf
MAC Address: 13:37:13:37:13:37 (La box de mon FAI)
 
Nmap done: 1 IP address (1 host up) scanned in 1087.27 seconds

Scan de port

Scanner un port bien précis :

nmap -p 1337 192.168.1.1
 
Starting Nmap 6.01 ( http://nmap.org ) at 2012-09-12 20:20 CEST
Nmap scan report for 192.168.1.1
Host is up (0.00024s latency).
PORT     STATE    SERVICE
1337/tcp filtered waste
MAC Address: 13:37:13:37:13:37 (La box de mon FAI)
 
Nmap done: 1 IP address (1 host up) scanned in 0.08 seconds

Lorsque l’on souhaite scanner des plages avec nmap, (plages de ports) :

# nmap -p 1337-7331,80 192.168.1.1
 
Starting Nmap 6.01 ( http://nmap.org ) at 2012-09-12 20:21 CEST
Nmap scan report for 192.168.1.1
Host is up (0.00029s latency).
Not shown: 5991 filtered ports
PORT     STATE  SERVICE
80/tcp   open   http
5000/tcp open   upnp
5001/tcp closed commplex-link
5678/tcp open   rrac
6600/tcp closed mshvlm
MAC Address: 13:37:13:37:13:37 (La box de mon FAI)
 
Nmap done: 1 IP address (1 host up) scanned in 17.94 seconds

Ici on scanne la rangée de port suivante : 1337 à 7331
Ainsi que le port 80.

Avant on faisait un scan de ping ( -sP ), dans les nouvelles versions de nmap c’est  « No port scan » soit -sn.
Quand on fait cette commande avec les droits root, on scanne : ‘ICMP echo request, TCP SYN to port 443, TCP ACK to port 80, and an ICMP timestamp request by default’
Quand on fait cette commande avec les droits utilisateurs : seulement le paquet SYN est envoyé pour le port 80 et 443

No port scan :

# nmap -sn 192.168.1.1
 
Starting Nmap 6.01 ( http://nmap.org ) at 2012-09-12 20:54 CEST
Nmap scan report for 192.168.1.1
Host is up (0.00027s latency).
MAC Address: 13:37:13:37:13:37 (La box de mon FAI)
Nmap done: 1 IP address (1 host up) scanned in 0.21 seconds

Scan système d’exploitation

Découvrir le système d’exploitation de la machine distance :

nmap -O 192.168.1.1
 
Starting Nmap 6.01 ( http://nmap.org ) at 2012-09-12 20:21 CEST
Nmap scan report for 192.168.1.1
Host is up (0.00030s latency).
Not shown: 989 filtered ports
PORT     STATE  SERVICE
21/tcp   open   ftp
80/tcp   open   http
139/tcp  open   netbios-ssn
445/tcp  open   microsoft-ds
548/tcp  closed afp
554/tcp  open   rtsp
5000/tcp open   upnp
5001/tcp closed commplex-link
5678/tcp open   rrac
8090/tcp open   unknown
9091/tcp open   xmltec-xmlmail
MAC Address: 13:37:13:37:13:37 (La box de mon FAI)
Device type: general purpose
Running: Linux 2.6.X|3.X
OS CPE: cpe:/o:linux:kernel:2.6 cpe:/o:linux:kernel:3
OS details: Linux 2.6.38 - 3.2
Network Distance: 1 hop
 
OS detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 6.91 seconds

Si celui-ci n’arrive pas à affiner les recherches, il fait une recherche agressive :

# nmap -O --osscan-guess 192.168.1.1
 
Starting Nmap 6.01 ( http://nmap.org ) at 2012-09-12 20:22 CEST
Nmap scan report for 192.168.1.1
Host is up (0.00028s latency).
Not shown: 989 filtered ports
PORT     STATE  SERVICE
21/tcp   open   ftp
80/tcp   open   http
139/tcp  open   netbios-ssn
445/tcp  open   microsoft-ds
548/tcp  closed afp
554/tcp  open   rtsp
5000/tcp open   upnp
5001/tcp closed commplex-link
5678/tcp open   rrac
8090/tcp open   unknown
9091/tcp open   xmltec-xmlmail
MAC Address: 13:37:13:37:13:37 (La box de mon FAI)
Device type: general purpose
Running: Linux 2.6.X|3.X
OS CPE: cpe:/o:linux:kernel:2.6 cpe:/o:linux:kernel:3
OS details: Linux 2.6.38 - 3.2
Network Distance: 1 hop
 
OS detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 6.74 seconds

Scan exhaustif

Le scan typique de NMAP, qui comprend le scan des ports, le traceroute la détection d’OS et sa version. Et le T4 signifie que le scan doit être plus rapide

# nmap -A -T4 192.168.1.1
 
Starting Nmap 6.01 ( http://nmap.org ) at 2012-09-12 20:23 CEST
Nmap scan report for 192.168.1.1
Host is up (0.00031s latency).
Not shown: 989 filtered ports
PORT     STATE  SERVICE           VERSION
21/tcp   open   ftp               box ftpd
80/tcp   open   http              nginx
|_http-methods: No Allow or Public header in OPTIONS response (status code 405)
| http-robots.txt: 1 disallowed entry 
|_/
|_http-title: Accueil box Server
139/tcp  open   netbios-ssn       Samba smbd 3.X (workgroup: WORKGROUP)
445/tcp  open   netbios-ssn       Samba smbd 3.X (workgroup: WORKGROUP)
548/tcp  closed afp
554/tcp  open   rtsp              box rtspd 1.2
| rtsp-methods: 
|_  DESCRIBE, OPTIONS, SETUP, TEARDOWN, PLAY, PAUSE
5000/tcp open   rtsp              RogueAmoeba Airfoil rtspd 110.63
| rtsp-methods: 
|_  ANNOUNCE, SETUP, RECORD, PAUSE, FLUSH, TEARDOWN, OPTIONS, GET_PARAMETER, SET_PARAMETER, POST, GET
5001/tcp closed commplex-link
5678/tcp open   upnp              fbxigdd 1.0 (AliceBox PM203 UPnP; UPnP 1.0)
8090/tcp open   hadoop-jobtracker Apache Hadoop
|_http-methods: No Allow or Public header in OPTIONS response (status code 302)
|_http-title: Probl\xC3\xA8me de connexion Internet
9091/tcp open   http              nginx
|_http-methods: No Allow or Public header in OPTIONS response (status code 405)
|_http-title: 403 Forbidden
MAC Address: 13:37:13:37:13:37 (La box de mon FAI)
Device type: general purpose
Running: Linux 2.6.X|3.X
OS CPE: cpe:/o:linux:kernel:2.6 cpe:/o:linux:kernel:3
OS details: Linux 2.6.38 - 3.2
Network Distance: 1 hop
Service Info: OSs: Mac OS X, Linux 2.6; Devices: media device, WAP; CPE: cpe:/o:apple:mac_os_x, cpe:/o:linux:kernel:2.6
 
Host script results:
| smb-security-mode: 
|   Account that was used for smb scripts: guest
|   User-level authentication
|   SMB Security: Challenge/response passwords supported
|_  Message signing disabled (dangerous, but default)
|_nbstat: NetBIOS name: box, NetBIOS user: , NetBIOS MAC: 
|_smbv2-enabled: Server doesn't support SMBv2 protocol
| smb-os-discovery: 
|   OS: Unix (Samba 3.0.37)
|   NetBIOS computer name: 
|   Workgroup: WORKGROUP
|_  System time: 2012-09-12 20:23:42 UTC+0
 
TRACEROUTE
HOP RTT     ADDRESS
1   0.31 ms 192.168.1.1
 
OS and Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 23.24 seconds

Nmap bonus

Scanner toujours la meme machine mais on spoof notre adresse mac.

nmap --spoof-mac Apple 192.168.1.1

Starting Nmap 6.01 ( http://nmap.org ) at 2012-09-12 20:24 CEST
Spoofing MAC address 00:03:93:4B:A8:C4 (Apple Computer)
Note: Host seems down. If it is really up, but blocking our ping probes, try -Pn
Nmap done: 1 IP address (0 hosts up) scanned in 0.48 seconds

Sauvegarder les résultats dans un fichier :
XML :

nmap -oX output.xml 192.168.1.1

Standard :

nmap -oN output 192.168.1.1

Ce qui peut aussi être intéressant est Nmap Scripting Engine (NSE) : Le but du NSE est de fournir à Nmap une infrastructure flexible afin d’étendre ses capacités et ainsi offrir à ses utilisateurs une façon simple de créer ses propres tests personnalisés. Plus d’informations ici.

Scan avec les scripts par défaut :

# nmap -sC 192.168.1.254
 
Starting Nmap 6.01 ( http://nmap.org ) at 2012-09-12 21:26 CEST
Nmap scan report for 192.168.1.254
Host is up (0.00035s latency).
Not shown: 989 filtered ports
PORT     STATE  SERVICE
21/tcp   open   ftp
80/tcp   open   http
| http-robots.txt: 1 disallowed entry 
|_/
|_http-methods: No Allow or Public header in OPTIONS response (status code 405)
|_http-title: Accueil box Server
139/tcp  open   netbios-ssn
445/tcp  open   microsoft-ds
548/tcp  closed afp
554/tcp  open   rtsp
| rtsp-methods: 
|_  DESCRIBE, OPTIONS, SETUP, TEARDOWN, PLAY, PAUSE
5000/tcp open   upnp
5001/tcp closed commplex-link
5678/tcp open   rrac
8090/tcp open   unknown
9091/tcp open   xmltec-xmlmail
MAC Address: 13:37:13:37:13:37 (La box de mon FAI)
 
Host script results:
|_nbstat: NetBIOS name: box, NetBIOS user: , NetBIOS MAC: 
| smb-security-mode: 
|   Account that was used for smb scripts: guest
|   User-level authentication
|   SMB Security: Challenge/response passwords supported
|_  Message signing disabled (dangerous, but default)
|_smbv2-enabled: Server doesn't support SMBv2 protocol
| smb-os-discovery: 
|   OS: Unix (Samba 3.0.37)
|   NetBIOS computer name: 
|   Workgroup: WORKGROUP
|_  System time: 2012-09-12 21:26:55 UTC+0
 
Nmap done: 1 IP address (1 host up) scanned in 12.44 seconds

Et en plus de NSE, contourner un pare-feu avec nmap : http://nmap.org/man/fr/man-bypass-firewalls-ids.html

Source :

Le site officiel : http://nmap.org/

Le man de nmap : http://nmap.org/man/fr/

Logo NMAPIt’s oversimple isn’t it?

Halloween tricks

 

 

 

Il faut dire qu’on aime la citrouille. Et puis on vient de recevoir nos raspeberry pi.  En y regardant de plus prêt, on se rend rapidement compte qu’il faut faire quelque chose pour Halloween.

L’idée originale est donc de faire une lampe en citrouille qui s’active par la présence.

Prise en main du Raspberry pi

La première chose à faire est de voir si tout fonctionne. On va utiliser un Debian embarqué tel qu’il est proposé sur le site du raspberry pi. Pour notre projet, nous avons besoin d’allumer une lampe.
Les GPIO sont des broches d’entrée sortie dont on peut lire le niveau électrique (haut ou bas) et sur lequel on peut imposer un niveau de sortie (haut ou bas). Le niveau logique haut est une tension de 3.3V et le bas une tension de 0V.

Le mappage des GPIO est indiqué sur l’image suivante. Remarquez le petit p1 sur votre board et sur le schéma qui permettent de s’orienter.

Nous allons nous en servir en sortie pour activer une led dans un premier temps. Voici une photographie du montage :


Pour ce faire il faut définir la GPIO et indiquer le mode output :

echo "17" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio17/direction

Pour information: les GPIO fonctionnent sur les microcontroleurs (comme l’ARM du Raspberry pi) en three-state logic : Wikipédia

Il suffit maintenant de mettre à l’état haut le GPIO associé avec la commande suivante :

echo "1" > /sys/class/gpio/gpio17/value

Pour le mettre à l’état bas, mettre la valeur 0.

Pour le détecteur de mouvement en pratique il aurait été bon de prendre un détecteur infrarouge. Mais bien que terriblement efficace ce n’est pas aussi amusant que d’utiliser une webcam et de faire un peu de traitement d’image.

Conception du détecteur de mouvement

En ce qui concerne le détecteur de mouvement, nous avons utilisé une webcam ainsi que la librairie OpenCV. Voici un extrait de notre main simplifié :

int main(int argc, char **argv) {
 
	// Initialisation de notre lampe qui se trouve connecté au gpio 17
	// (voir ci-dessus)
 
	// Image
	IplImage *image1=NULL;
	IplImage *image2=NULL;
	IplImage *subImage=NULL;
 
	// Capture vidéo
	CvCapture *capture;
 
	// Ouvrir le flux vidéo,  mettre en paramètre le device de la cam (pour X = /dev/videoX)
	capture = cvCreateCameraCapture(atoi(argv[1]));
 
	//Configuration de la capture par défaut, donc la taille d'une image que l'on va récupérer. 640*480
	cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, 640);
	cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, 480);
	cvSetCaptureProperty(capture, CV_CAP_PROP_BRIGHTNESS, 0.65);
 
	// Vérifier si l'ouverture du flux est ok
	if (!capture) {
		printf("Ouverture du flux vidéo impossible !\n");
		return 1;
	}
 
	printf("Enjoy !");
 
	// On allume notre lampe 2 fois avec une pause de 1 seconde 
 
	while(1) {
		// On récupère une image 
		image1 = cvQueryFrame(capture);
 
		// On attend 50 milisecondes
		cvWaitKey(50);
 
		// On sauvegarde notre image 1.
		cvSaveImage("buffer1.jpg",image1,0);
 
		// On récupère une image 2
		image2 = cvQueryFrame(capture);
 
		// On sauvegarde notre image 2
		cvSaveImage("buffer2.jpg",image2,0);
 
		// On recherche les 2 images
		image1 = cvLoadImage("buffer1.jpg", CV_LOAD_IMAGE_GRAYSCALE);
		image2 = cvLoadImage("buffer2.jpg", CV_LOAD_IMAGE_GRAYSCALE);
 
		// On soustrait les 2 images une à une afin d'avoir une différence.
		subImage = substract(image1, image2);
 
		// On calcul le nombre de pixel différents
		int trigger = count(subImage);
 
		// On compare la différence avec notre TRIGGER de test.
		if(trigger > TRIGGER) {	
			// Si plus de pixel modifié par rapport a notre TRIGGER, 
			// On allume la lampe pendant 10 secondes
		}
	}
 
	// On Libère notre webcam.
	cvReleaseCapture(&capture);
 
	return 0;
}

L’ensemble du code est présent en archive.

Assemblage

Une fois le programme lancé, on lui a apporté quelques modifications afin de changer l’état d’un GPIO en 5V. Pour allumer notre lampe allimentée sur le secteur nous utiliserons un relais activable en 5V.
Cependant, les GPIO du raspberry pi ne peuvent fournir que 3.3V. Pour pouvoir activer notre relais il faut amplifier le signal. Pour cela nous avons utilisé la sortie 5V du raspberry pi et un ampli audio (LM386) avec un montage non inverseur.

L’ensemble des pièces aillant été récupéré ici et là. Ci-dessous le schéma du montage :

Résultat final


OVERSIMPLE : Halloween détecteur de mouvement par oversimple

Source

Site officiel d’OpenCV

GPIO Raspberry Pi

Codes : complete source code
It’s Oversimple isn’t it?

Halloween Tricks [English Version]

 

 

 

We like pumpkin and for halloween we decide to create with our raspberry pi a motion sensor.

How it’s works ?

The idea is simple, when somebody is in the piece, the lamp is putted on.

Discover Raspberry pi

First step, we install a debian on ourraspberry pi.

Second step, we need to start a lamp with the gpio of the raspberry pi.
GPIO are input output spindle, we can have a high voltage (3.3 V) or low voltage ( 0V ).

We can see on the following picture, how to are the GPIO dispatched.

The first thing we do was to put on a LED. This was done by simply connecting a LED to the GPIO 17 and a resistor in serie.


We define the gpio 17 and we use this as an output :

echo "17" /sys/class/gpio/export
echo "out" /sys/class/gpio/gpio17/direction

And to enable the led, we put the voltage high :

echo "1" /sys/class/gpio/gpio17/value

Note : to put off the led we simply replace « 1 » by « 0 »

Create a motion sensor with a webcam

In practice, we could use a infrared motion sensor. However we only  have a webcam, and it’s more challenging with a webcam.

The code is available in the archive.

int main(int argc, char **argv) {
 
	// Initialization GPIO 17
 
	// Image
	IplImage *image1=NULL;
	IplImage *image2=NULL;
	IplImage *subImage=NULL;
 
	// Capture movie
	CvCapture *capture;
 
	// Open the webcam with the number of the device (/dev/videoX for X the number)
	capture = cvCreateCameraCapture(atoi(argv[1]));
 
	//Configure the resolution for the webcam
	cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, 640);
	cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, 480);
	cvSetCaptureProperty(capture, CV_CAP_PROP_BRIGHTNESS, 0.65);
 
	// Check if capture is ok
	if (!capture) {
		printf("Ouverture du flux vidéo impossible !\n");
		return 1;
	}
 
	printf("Enjoy !");
 
	// We start our lamp 2 time for check and give the signal
 
	while(1) {
		// Screen first picture
		image1 = cvQueryFrame(capture);
 
		// Waiting 50 milisecondes
		cvWaitKey(50);
 
		// Save image 1
		cvSaveImage("buffer1.jpg",image1,0);
 
		// Screen second picture
		image2 = cvQueryFrame(capture);
 
		// Save image2
		cvSaveImage("buffer2.jpg",image2,0);
 
		// We save both picture
		image1 = cvLoadImage("buffer1.jpg", CV_LOAD_IMAGE_GRAYSCALE);
		image2 = cvLoadImage("buffer2.jpg", CV_LOAD_IMAGE_GRAYSCALE);
 
		// We substract image1 and image2
		subImage = substract(image1, image2);
 
		// We count the number pixel difference of the image 1 and image 2.
		int trigger = count(subImage);
 
		// We compare with our TRIGGER, if we detect mouvement
		if(trigger > TRIGGER) {	
			// if more pixel modify we start the lamp
		}
	}
 
	// Free capture
	cvReleaseCapture(&capture);
 
	return 0;
}

Assembly

Ok, now the program works but we have a problem with GPIO . to put on our lamp we need 5V. For this reason we use a relay in 5V.

However, the raspberry pi ‘GPIO can only provide 3.3V. We need to amplify the signal.

We use the output 5V of the raspberry and an audio amplify (LM386) in non inverting scheme.

We can see the assembly :

Final result


OVERSIMPLE : Halloween détecteur de mouvement par oversimple

Source

Site officiel d’OpenCV

GPIO Raspberry Pi

Codes : complete source code

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?