---
pubDate = 2024-11-25
tags = ['rust', 'VNC', 'programmation', 'sécurité', 'hack']
alt_logo = 'res/vnc_vanity.png'
[author]
name = "ache"
email = "ache@ache.one"
[[alt_lang]]
lang = "en"
url = "/articles/a-vanity-vnc-server"
---
# Un serveur VNC vaniteux (Joke over RFB)

VNC est un protocole bien connu de partage de bureau distant.
Ce blog post est l'histoire d'un projet d'un WE qui a conduit à fabriquer un VNC « vaniteux ».
## Petit point sur VNC
VNC, c'est LE protocol de partage de bureau à distance (avec RDP _pour Windows_).
De souvenir, je retenais que c'était un protocol peu sécurisé, à ne pas exposer sur Internet directement.
Justement, il existe le projet [VNC Resolver](https://fedi.computernewb.com/@vncresolver) qui parcourt l'ensemble des serveurs VNC disponibles publiquement sur Internet (IPv4).
Un soir, je suis tombé sur un de leur post mastodon qui publiait un Nyan Cat en plein écrann, certainement une victime du cheval de troie [MEMZ](https://en.wikipedia.org/wiki/MEMZ) qui remplace le secteur d'armorcage d'un ordinateur par un programme qui affiche Nyan-cat en plein écran.
J'ai eu alors l'idée de créer un petit serveur VNC qui afficherait une blague.
## Le projet
Le but est d'avoir n'est pas d'augmenter la surface d'attaque de mon serveur perso (ou plutôt de l'augmenter au minimum), ni de consommer trop de ressources.
Je me suis alors intéresser au protocol VNC avec pour but d'afficher une image fixe depuis un serveur VNC écrit en Rust.
VNC est donc basé sur le protocole RFB (Remote FrameBuffer), c'est un protocole extrêmement simple basé sur la [RFC6143](https://datatracker.ietf.org/doc/html/rfc6143).
C'est ce qui fait également sa puissance.
Il est relativement efficace, car il supporte la mise à jour partielle du « bureau ».
Au niveau sécurité, il faut admettre que ça pèche un peu.
Il existe un mode sans authentification et un mode avec mot de passe, mais sans chiffrement (données en clair sur le réseau).
D'autres sécurités sont envisagées, mais dépendantes du fournisseur et non normalisées.
Bref, ça incite fortement à faire des bêtises, ce qui confirme mes souvenirs d'un protocole « risqué ».
Il est à noter cependant qu'il est désormais courant d'avoir une surcouche TLS qui rend le protocole tout à fait sûr, malheureusement, ça demande un peu plus de travail.
Pour mon projet je me suis tourner donc vers la bibliothèque [rfb](https://crates.io/crates/rfb) et j'ai passé une petite heure à créer un écran.
Je suis parvenu à ça :
Image à afficher par mon serveur VNC vaniteux.
C'est à la fois une carte de visite et une inspiration de l'écran de fin de jeu de Portal.
## VNCTrost
Après quelques tentatives, je me suis rendu compte que le _crate_ rfb n'est pas à jour.
On peut s'en sortir, car cargo permet de remplacer une dépendance par une version locale.
Dans mon cas, j'ai utilisé sub-module git afin d'avoir la dernière version.
Quelques minutes plus tard, j'avais un serveur fonctionnel.
Je me suis même amusé à envoyer un bip quand l'utilisateur tape quelques chose. 🔔
J'ai ensuite créé un service (template) dédié sur mon serveur perso :
```sh
$ systemctl edit --full --force vnctrost@.service
$ systemctl start vnctrost@5900 vnctrost@5901
```
Avec cette configuration :
```
[Unit]
Description=VNCtrost on port %I
After=network.target
[Service]
PrivateTmp=True
WorkingDirectory=/usr/share/vnctrost/
ExecStart=/usr/bin/vnctrost --port %i --screen /usr/share/vnctrost/screen-rfp.png
Restart=on-failure
User=XXXX
Group=XXXX
Environment="RUST_LOG=INFO"
[Install]
WantedBy=multi-user.target
```
Le serveur est ainsi disponible à `ache.one:5900` et `ache.one:5901`.
Le code source du serveur est disponible sur [mon serveur git](https://git.ache.one/vnctrost/).
## Les logs
J'ai été assez surpris du nombre de connections qui sont faites sur ces serveurs.
Environ 1 tentative de connexion par heure.
Voici les logs en temps réel :
## Existant
Je ne suis absolument pas le premier à faire ça.
J'ai trouvé quelques serveurs VNC publiques qui s'en approchaient, souvent, dans le nom du serveur.
Un serveur dont le nom est « chloe was here ».
Le nom du serveur était « chloe was here »
Le serveur `83.249.96.136` qui semble être un serveur de [Tele2](https://fr.wikipedia.org/wiki/Tele2), un opérateur suédois.
Le nom du serveur était « x11vnc »
De nombreux serveurs comme `166.151.167.106` et `166.255.108.226` possèdent plusieurs serveurs VNC, dont les noms indiquent « *just so you know this is literally me* » ou « *i am a lesbian pony with weapons* ».
Je suis très intrigué par ces serveurs qui semblent être des « revendications » d'une hackeuse plus qu'autre chose. Je n'arrive plus à m'y connecter mais ils sont indexés par shodan.io et le « VNC resolver ».
Le nom du serveur était « just so you know this is literally me »Le nom du serveur était « i am a lesbian pony with weapons »
(Œuvre originale par [Rozavive](https://dynasty-scans.com/images/20543))
Encore un absolument incompréhensible, le serveur est celui de @mastodon.staropa.net@1024x2, le hackeur semble être [Litevex](https://litevex.sys42.net/), mais celui-ci affirme avoir hacké htwins.net. 😵💫
Bref !
Le nom du serveur était « litevex hacked htwins.net »
Au sujet des revendications, VNC est un moyen alternatif à la défiguration de site web dans la cyberguerre.
Le nom du serveur était « 4629C81 »
À la prochaine fois pour un article sur l'animation sur le Web ... Ou sur les code QR (encore !). 🤷