Salutations!
Ceci est le premier vrai article de ma série à propos de mon publiphone. Comme je vous le disais dans l'introduction, j'ai démonté mon pubiphone en live sur twitch... Malheureusement, c'était ma première fois, et je n'ai rien enregistré du stream... Cependant, j'ai re-filmé l'essentiel, et en ai fait une vidéo dans laquelle j'ai mis tout mon petit coeur! <3
Alors, je vais essayer d'organiser un peu les trucs que j'ai à vous montrer. Tout d'abbord, la machine est un terminal France-Télécom de 1999, elle pèse 8,1Kg, et elle dispose d'un lecteur de carte à puce et d'un lecteur de carte à bande magnétique.
Analyse hardware
la serrure
Avant de pouvoir l'ouvrir, il a fallu que je vienne à bout d'une serrure que j'ai identifié comme un genre d'étrange serrure à disque. J'ai demandé sur twitter, et on m'a répondu que c'était une serrure Abloy Profile
J'ai donc fait un outil, pour tenter une ouverture propre, mais, rapidement, j'ai fini par perdre patience:
Mon outil semblait prometteur, mais, malheureusement, il ne m'a même pas permis d'espérer.
Le perçage n'était pas facile. Pour ce genre de serrure, il semblerait que la meilleure stratégie soit de retirer un maximum de métal sur le pourtour du cylindre. J'y suis allé avec trois forets: 4mm, 6mm, et 12mm, en alternant entre les tailles, et en donnant de l'angle pour bien gratter.
Ouverture, et observation
L'ouverture s'est révélée un peu décevante, mais, pas sans intéret. Dans un premier temps, j'ai relevé la référence des principaux composants de la carte:
Puis, j'ai identifié ce qui semblait le plus intéressant, et cherché les datasheets.
- Datasheet
- Datasheet
- Datasheet
- Datasheet PSB2186N
- Datasheet PSB2161B
TE28F800 Intel
3 Volt Advanced+ Boot BlockFlash Memory Enhancements
C'est la Flash. Elle contient (contiennent, puis-ce qu'il y en a deux) toutes les données persistantes, comme le firmware.
TC554161 TOSHIBA
262,144 WORD x 16 BIT STATIC RAM
Ça, c'est la RAM. Basiquement, c'est là ou le processeur va travailler.
XC68307 CFG16 Motorola
68000 (MC68307)
Lui, c'est le coeur de la machine: le CPU. C'est une variation d'un processeur très connu, le m68k. C'est presque le même qu'on trouve dans les Megadrive, sauf que celui-ci adresse sur 32bits, et qu'il est récent.
PSB2186N / PSB2161B Siemens
ISDN Controller ( RNIS )
Ce composant là, et l'autre, qui lui est associé, permet au téléphone d'encoder sur le réseau téléphonique numérique (RNIS).
Conclusion hardware
C'est joli, mais, un peu décevant. On a un bête système embarqué Processeur/Rom/Ram avec quelque périphériques et un peu d'aiguillage, mais, tout est complètement intégré. Ça reste un bel objet, mais, mis à part si mes investigations me mènent à un port d'accès utilisable, ça restera plus ou moins une brique.
J'ai été ultra déçu de voir des pouets en silicone pour les touches du clavier. J'imaginais qu'un engin comme celui-ci se devait de pouvoir être maintenu facilement, mais, apparement, ils y sont vraiment allé au plus léger. Tout est sur le PCB principal, ou presque.
Des ports à regarder plus tard
Sur la photo de la carte, on remarque des ports (marqués "?"). Je n'ai pas encore eu le temps de m'y intéresser, mais, peut-être que je pourrais y trouver une interface à exploiter?
Analyse software
Je gardais le meilleur (et le plus excitant) pour la fin: Vous vous souvenez que je vous disait que furrtek avait proposé d'essayer de dumper la flash? Et bien, il l'a fait (et très bien). Je lui ai envoyé la carte mère, il a dessoudé les deux flashs, les a implantées sur un projet à lui, et à pu se débrouiller pour les faire chanter!
Prenons un instant pour savourer ce qui est en train de se passer: On va bientôt pouvoir analyser la mémoire d'un 🩹❗️☠️🖕🗜💢📣💉 🩸⛏ de terminal de cabine téléphonique. Oui, absolument, savourons, parce qu'une chose est sûre: C'est pas donné à tout le monde. Grace à Furrtek, Nous faisons maintenant partie de la très petite communauté des gens ayant pu avoir accès à ce genre de truc!
(liens en bas de page)
Alors, pour en savoir plus, il va falloir faire un peu de reverse-engineering. Première étape:
Strings
Pour ma part, je commence toujours par utiliser l'outil strings, qui permet d'extraire les chaines de caractères ASCII d'un fichier binaire. La plupart de ce qu'on verra sera illisible, mais, en parcourant les résultats, on va forcément finir par tomber sur des indices.
Voilà un exemple condensé du genre de résultats qu'on peu avoir:
$ strings flash_publiphone_droite.bin | less
f^Hx
g* <
80&/
88(o
NuNV
#...
NuFIRSTSTART
FIRSTSTART
#...
ip_MagneticData
ip_CardDetection
ip_isdn_Isacs
ip_i2d
ip_isdn_Timer
p_bgp
NODE_task
PROCESS_ses
PROCESS_teh
PROCESS_com
TIMER_task
#...
xxxxx||xxxx0
|||||||x||||
$96V2
TG08
Autant dire que ça va prendre des plombes... Heureusement, Bash est là!
strings flash_publiphone_droite.bin | sort | uniq > flash_publiphone_droite.str
strings flash_publiphone_gauche.bin | sort | uniq > flash_publiphone_gauche.str
En faisant ça, je trie les lignes, et je m'assure de supprimer les doublons. On passe de 17618 lignes à regarder à 1865. Malheureusement, rien de vraiment très intéressant. On retrouve un peu de code C, quelque chaines de caractères en plusieurs langues, des copyrights...
voilà un échantillon choisis:
ABSENT
AC_ALONE.c
AC_ANO.c
ACCEDER AL
ACCEDER AL N
ACCEDER AU
ACCEDER AU NUMERO
ACCEDERE AL NUMERO DI
ACCEPTED
ACCES
ACCESO
ACCESO IMPOSIBLE
ACCESSO IMPOSSIBILE
ACCESS TO
ACCESS TO NUMBER
AC_CHGE.c
AC_DATA.c
AC_DLACC.c
AC_DLCAN.c
ac_enpro.c
ac_entst.c
Action = Dial without echo
Action = Disconnect
Action = End session req
Action = Incoming call acceptance
Action = Increase the output level
Action = Power down the external DTMF detector
Action = Power down the external terminal card
Action = Power up the external DTMF detector
Action = Power up the external terminal card
Action = Reset output level
Action = Ses In Call
Action = Ses Out Call with MP
Action = Ses Out Call without MP
Action = Start busy tone simulation
Action = Start dial tone simulation
Action = Start Eng Proc Rsp
Action = Stop busy tone simulation
Action = Stop dial tone simulation
Action = Stop Eng Proc Rsp
Action = Stop the DTMF
Action = Switch to external terminal
Action = Switch to handset
Action = Take line
Action = Unknown Call Type
Action = Unknown Eng Proc Rsp
CC_PCI - build to Appli KO, code : %d
CC_PCI - build to MPH KO, code : %d
CC_PCI - build to NS KO, code : %d
CC_PCI - Mandat. IE missing in NS_CONN_IN : Bearer Cap
CC_PCI - Mandat. IE missing in NS_CONN_IN : Chan ID
CC_PCI - Unexpected evt from NS, code : %d
CC_PCI - Unexpected evt, SAPI : %d, code : %d
CC_PCI - Unknown code : %d
CC_PCI - Unknown entity, From : %d
CC_PCI - Unknown state : %d
Copyright (c) 1989 - 1990 by OMNITEL SA - All Rights Reserved
Copyright (c) 1989 - 1991 by OMNITEL SA - All Rights Reserved
Copyright (c) 1989 - 1993 by OMNITEL SA - All Rights Reserved
Copyright (c) 1989-1996 by OMNITEL SA - All Rights Reserved
Copyright (c) 1989/96 by OMNITEL SA - All Rights Reserved
Copyright (c) 1990 - 1996 by OMNITEL SA - All Rights Reserved
Copyright (c) 1994 by OMNITEL SA - All Rights Reserved
DLOAD
dl_pck
dl_queue_check : last
dl_queue_check : nb
dl_queue_check: prior
dl_queue_check : sent
dl_rcv
dl_send
d:\M99\dos_lib\gt\lib\g2_lib.c
DO NOT REMOVE CARD
DW - build to ApADM KO, code : %d
DW - build to ApFLD KO, code : %d
DW - build to FT KO, code : %d
.\dw\dw_build.c
.\dw\dw.c
.\dw\dw_rcv.c
.\dw\dw_snd.c
.\dw\dw_state.c
DW - FT Reject, State: %d, Reason :%4x, Prim : %4x, Par : %4x
dwl_exp.c
DW - Prim. rejected by FLD in State: %d, Cause: %d
DW - Unexpected evt from FLD, code : %d
DW - Unexpected evt from FT, code : %d
DW - Unexpected evt, SAPI : %d, code : %d
DW - Unknown code : %d
DW - Unknown entity, From : %d
DW - Unknown state : %d
ECHEC EFFACEMENT
(E)Comp%02d E:0x%02x S:0x%02x
E EUR
Normalement, on peut tomber sur des pistes, en cherchant les messages d'erreur, et le nom de certaines références... Mais là rien. Le code doit être complètement custom (pas étonnant, c'est pas un routeur wifi nonplus) Tout ce que je trouve, c'est des références obscures à de la télécom, et au milieu, un drôle de truc:
NsF o r n a e u s!
J'arrete avec strings, on passe à un peu plus sérieux.
Binwalk
Binwalk va nous permettre d'analyser le dump un peu plus précisément, en repérant les fichiers (ressources, systèmes de fichiers...) qui auraient été fourrés en mémoire.
binwalk -v flash_publiphone_droite.bin
Scan Time: 2020-10-07 21:52:34
Target File: /home/.../flash_publiphone_droite.bin
MD5 Checksum: 026629c31eafa86f13e87523e426bb6c
Signatures: 386
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
789654 0xC0C96 Copyright string: "Copyright (c) 1989 - 1993 by OMNITEL SA - All Rights Reserved"
790394 0xC0F7A Copyright string: "Copyright (c) 1989 - 1993 by OMNITEL SA - All Rights Reserved"
790512 0xC0FF0 Copyright string: "Copyright (c) 1994 by OMNITEL SA - All Rights Reserved"
791440 0xC1390 Copyright string: "Copyright (c) 1989-1996 by OMNITEL SA - All Rights Reserved"
791536 0xC13F0 Copyright string: "Copyright (c) 1989/96 by OMNITEL SA - All Rights Reserved"
802498 0xC3EC2 Copyright string: "Copyright (c) 1989 - 1990 by OMNITEL SA - All Rights Reserved"
802600 0xC3F28 Copyright string: "Copyright (c) 1989 - 1991 by OMNITEL SA - All Rights Reserved"
802714 0xC3F9A Copyright string: "Copyright (c) 1990 - 1996 by OMNITEL SA - All Rights Reserved"
802812 0xC3FFC Copyright string: "Copyright (c) 1990 - 1996 by OMNITEL SA - All Rights Reserved"
802918 0xC4066 Copyright string: "Copyright (c) 1990 - 1996 by OMNITEL SA - All Rights Reserved"
846721 0xCEB81 mcrypt 2.2 encrypted data, algorithm: blowfish-448, mode: ECB, keymode: 8bit
957597 0xE9C9D mcrypt 2.2 encrypted data, algorithm: blowfish-448, mode: ECB, keymode: 8bit
Ah tiens? deux partitions chiffrées? Inespéré! Du coup, j'investigue... Je vais extraire l'une des "partition chiffrée", et regarder ce qu'il y a dedans. Pour ça, j'utilise les infos données par binwalk, et je détermine les octets à dumper. dd
va faire le travail
$ # 846721-> début de la première partition
$ # 110876-> = 957597 - 846721
$ dd if=flash_publiphone_droite.bin of=part.img bs=1 skip=846721 count=110876
Je regarde vite fait, mais, clairement, c'était un faux-positif. En effet, si j'ouvre la partition avec hd, on voit bien que rien n'est chiffré là dedans:
# On confirme que le fichier est toujours celui qu'on cherchait
$ file part.img
part.img: mcrypt 2.2 encrypted data, algorithm: blowfish-448, mode: ECB, keymode: 8bit
$ hd part.img
...
000166f0 00 07 ad 00 00 07 af 00 00 07 b9 00 00 07 bb 00 |................|
00016700 00 07 c1 00 00 07 c7 00 00 07 cb 00 00 07 cd 00 |................|
00016710 00 ff ff 02 20 44 45 53 54 49 4e 41 54 2e 20 4f |.... DESTINAT. O|
00016720 43 43 55 50 41 54 4f 20 20 4c 41 53 43 49 41 52 |CCUPATO LASCIAR|
00016730 45 20 4d 45 53 53 41 47 47 49 4f 3f 00 02 20 20 |E MESSAGGIO?.. |
00016740 44 45 53 54 49 4e 41 54 2e 20 41 53 53 45 4e 54 |DESTINAT. ASSENT|
00016750 45 20 20 4c 41 53 43 49 41 52 45 20 4d 45 53 53 |E LASCIARE MESS|
00016760 41 47 47 49 4f 3f 00 02 c6 20 41 4e 4f 4d 41 4c |AGGIO?... ANOMAL|
Ça pue. Pour en savoir plus; il faudra décompiler les deux images, et tenter d'en tirer des conclusions!
La prochaine fois, je vous dirais ou j'en suis avec objdump
, ghidra
, et radare2
, mais, comme je suis une quiche en ASM (et plus particulièrement en ASM m68k ) ça va pas être joli.
Downloadz
Je vous met les dumps en téléchargement, ainsi que les fichiers que j'ai généré à partir de ceux-ci. Chaque dump fait 1Mo, ce qui fait 2Mo de firmware à décompiler, si certains veulent tenter des trucs...
Encore merci à Furrtek d'avoir dumpé tout ça si vite!