Micropython sur TTGO T-Watch 2020

Il y a quelque temps, j’ai eu l’occasion de me procurer une smartwatch Lilygo T-Watch 2020. Il s’agit d’une montre totalement programmable avec un prix plutôt accessible, aux alentours de 30€. Son principal interêt, c’est les différents composants qu’elle embarque, à savoir :

  • Un chip ESP32
  • Un Module RTC PCF8563 (pour une montre c’est mieux)
  • Un écran LCD tactile
  • Un accéleromètre
  • Un vibreur
  • Un haut-parleur
  • Un emetteur infrarouge
  • Un chip WiFi 802.11 b/g/n
  • Un chip Bluetooth 4.2 et BLE

Du coup, c’est plutôt interessant à bricoler et les possibilités de “hack” sont assez importante. Bien que la montre se programme principalement en C++ à l’aide de l’éditeur Arduino, il semble possible de programmer en Python dessus via MicroPython. Du coup, c’est parti.

Créer l’image Micropython

Avant de pouvoir programmer en python sur la T-Watch, il est tout d’abord nécessaire de déployer un firmware avec Micropython dessus. Comme il n’éxiste pas de firmware officiel, nous allons compiler le notre, y inclure quelques librairies python permettant de jouer avec les composants de la montre et le déployer.

La première étape consiste à télécharger les sources de MicroPython et les différentes dépendances du projet :

mkdir twatch-micropython && cd twatch-micropython
# Téléchargement du code Micropython
git clone https://github.com/micropython/micropython/
# Téléchargement du framework de développement Espressif
git clone https://github.com/espressif/esp-idf.git
export ESPIDF=<PATH_TO_DIRECTORY>/esp-idf
# Téléchargement de la toolchain ESP32 Xtensa
wget https://dl.espressif.com/dl/xtensa-esp32-elf-linux64-1.22.0-80-g6c4433a-5.2.0.tar.gz
tar xzvf xtensa-esp32-elf-linux64-1.22.0-80-g6c4433a-5.2.0.tar.gz
export PATH=<PATH_TO_DIRECTORY>/xtensa-esp32-elf/bin:$PATH

# Préparation de l'environnement Micropython
cd micropython
git submodule update --init
make -C mpy-cross

Il est ensuite possible de compiler le firmware avec les commandes suivantes :

make -C ports/esp32 clean
make -C ports/esp32 all

Si tout s’est bien passé, le firmware est présent dans le dossier ports/esp32/build-GENERIC. Nous allons pouvoir le tester.

Tester le firmware

Pour déployer le firmware que nous venons de compiler, il suffit de brancher la T-Watch en USB à l’ordinateur puis d’entrer la commande suivante :

make -C ports/esp32 deploy

Il est ensuite possible de se connecter à un shell interactif python (REPL) via le port USB en série. Par exemple, à l’aide du logiciel picocom :

picocom /dev/ttyUSB0 -b115200

Il est ensuite possible d’entrer un simple code python :

from machine import Pin
buzz=Pin(4,Pin.OUT)

# Faire vibrer la montre
buzz.on()
# Arrêter le vibreur
buzz.off()

Si tout s’est bien passé, nous allons pouvoir passer à la préparation d’un firmware plus spécifique à la T-Watch. Pour quitter picocom, il suffit d’effectuer Ctrl+a Ctrl+x.

Préparer un framework spécifique

Comme nous avons pu le voir, le framework actuel permet d’interagir avec les composants de la montre. Néanmoins, il s’agit d’un environnement basique sans librairies permettant, par exemple, d’interagir facilement avec l’écran LCD ou la puce RTC.

Nous allons donc amener quelques bibliothèques dans notre firmware afin de pouvoir les utiliser sur notre montre. Ce type de bibliothèque est souvent chronophage à développer, heureusement, certains projet sur cette montre commence à pointer le bout de leur nez, c’est par exemple le cas de ce projet dont nous allons récupérer quelques fichiers utiles, à savoir :

Nous allons donc retourner dans nos sources de Micropython et télécharger ces fichiers dans un dossier spécifiques.

cd micropython/ports/esp32/modules
wget https://gitlab.com/mooond/t-watch2020-esp32-with-micropython/-/raw/master/bma423.py
wget https://gitlab.com/mooond/t-watch2020-esp32-with-micropython/-/raw/master/axp202c.py
wget https://gitlab.com/mooond/t-watch2020-esp32-with-micropython/-/raw/master/pcf8563.py
wget https://gitlab.com/mooond/t-watch2020-esp32-with-micropython/-/raw/master/st7789my.py
wget https://gitlab.com/mooond/t-watch2020-esp32-with-micropython/-/raw/master/focaltouch.py

Le dossier modules permet de déposer des bibliothèques écrite en python qui seront intégrées dans notre firmware. Maintenant que c’est fait, nous pouvons recompiler notre firmware et le déployer :

cd micropython/ports/esp32
make all
make deploy

Testons, notre module RTC avec le code suivant :

from machine import Pin,I2C
import pcf8563

i2c = I2C(0,scl=Pin(22), sda=Pin(21))
rtc = pcf8563.PCF8563(i2c)

# Doit renvoyer l'heure actuelle
print(rtc.hours())

# Changement d'heure
rtc.write_all(hours=12)
print(rtc.hours())

Et voilà, il ne reste plus qu’à ajouter quelques autres bibliothèques pour simplifier l’usage de python sur cette montre. Pourquoi pas l’ajout de LVGL pour créer de jolies interfaces ?

Ressources :

Installation de Kippo sous debian

Présentation

Kippo est un honeypot à interaction moyenne, son but est d’émuler un service SSH afin d’archiver les tentatives de brute force des attaquants, mais aussi les interactions qu’ils effectuent une fois connectés.

En effet, il est possible grâce à kippo de définir un mot de passe faible afin de laisser l’attaquant avoir un shell sur la machine. Cet environnement est bien sûr protégé, mais permet à notre système de journaliser les commandes qui ont été entrées ainsi que les fichiers téléchargés.

De plus lorsque l’attaquant pense quitter le shell SSH pour revenir sur son shell local, Kippo l’amène dans un deuxième environnement protégé afin de loguer les commandes qu’il aurait pu entrer sur sa machine pour déclencher l’attaque.

Installation

Installation des dépendances

Pour fonctionner Kippo a juste besoin de Python. Néanmoins pour une installation propre, nous allons installer ses dépendances dans un environnement virtuel avec l’aide de PIP et VirtualEnv. Enfin nous allons installer la librairie MySQL clients au cas où nous voudrions nous interfacer avec une base de données MySQL.

$ sudo apt-get install build-essential python-dev libmysqlclient-dev python-virtualenv python-pip

Il s’agit de la seule commande que l’on doit exécuter en root durant l’installation.

Créer l’environnement virtuel

Il est maintenant nécessaire de créer l’environnement virtuel python que nous appellerons “kippo”. Pour celà, il faut entrer la commande suivante:

$ virtualenv kippo_venv

Puis il faut l’activer afin d’entrer dans cet environnement:

$ source kippo_venv/bin/activate

Après cette commande le shell change afin de ressembler à celui-ci:

(kippo_venv)$

Installer les dépendances Python

Maintenant que l’environnement virtuel est fonctionnel, il est possible d’installer les dépendances python du projet:

(kippo_venv)$ pip install twisted==15 pyasn1 pycrypto

Installation de Kippo

Après avoir installé les dépendances de kippo, il suffit maintenant de le télécharger grâce à git :

(kippo_venv)$ git clone https://github.com/desaster/kippo.git

Configuration de Kippo

La configuration de kippo se situe dans kippo.cfg, Par défaut ce fichier n’existe pas, mais un template est fourni avec une configuration basique, il suffit donc simplement de la copier sous un autre nom:

(kippo_venv)$ cd kippo
(kippo_venv)$ cp kippo.cfg.dist kippo.cfg

Il est aussi possible de créer différents utilisateur dans le fichier data/userdb.txt.

Enfin, il est déconseillé de lancer kippo sur le port 22. En effet sous GNU/Linux tous les ports en dessous de 1024 sont des ports réservés nécessitant des droits privilégiés. Il est donc conseillé de laisser le port 2222 par défaut et d’effectuer du NAT afin de rediriger le port 22 vers le port 2222 de la machine. Si kippo est exécuté sous Windows, il est tout à fait possible de mettre le port 22 qui est habituellement libre.

Rediriger le port 22 vers le port 2222

La configuration du port forwarding se fait via une simple règle IPTables:

$ sudo iptables -t nat -A PREROUTING -p tcp --dport 22 -j REDIRECT --to-port 2222

Utilisation

Kippo peut se lancer de deux manières, soit en arrière-plan, soit au premier plan.

Lancement de Kippo au premier plan

Tout d’abord, pour lancer kippo

(kippo)$ twistd -n -y kippo.tac

Lancement de Kippo au arrière-plan

Contrairement au lancement précédent, celui-ci ne nécessite pas que l’utilisateur soit connecté à l’environnement virtuel. Le script de lancement prend tout simplement le nom de l’environnement en argument:

$ ./start.sh kippo_venv

L’arrêt du logiciel se fera via l’exécution du script stop.sh.