Tixlegeek's DevBlog Code, Gringo, Silicium

qrcode

[publiphone] Partie I: Autopsie

Salutations!

publiphone 1

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:

publiphone 1

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:

publiphone 1

Puis, j'ai identifié ce qui semblait le plus intéressant, et cherché les datasheets.

    TE28F800 Intel

    image-20200919173811061

    3 Volt Advanced+ Boot BlockFlash Memory Enhancements

  • Datasheet
  • 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

    image-20200919173742211

    262,144 WORD x 16 BIT STATIC RAM

  • Datasheet
  • Ça, c'est la RAM. Basiquement, c'est là ou le processeur va travailler.

    XC68307 CFG16 Motorola

    image-20200919173714855

    68000 (MC68307)

  • Datasheet
  • 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

    image-20200919173658423

    ISDN Controller ( RNIS )

  • Datasheet PSB2186N
  • Datasheet PSB2161B
  • 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!

Télécharger les Dumps