2024-11-25

Un serveur VNC vaniteux (Joke over RFB)

Logo VNC modifié pour lire également Vanity
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 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 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. 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 et j'ai passé une petite heure à créer un écran. Je suis parvenu à ça :

Écran de fin de jeu de portal, en noir et blanc, modifié pour afficher mon logo et quelques code QR et mes informations de contact.
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 :

$ 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.

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 ».

Deux poneys de *Mon petit poney* qui s'embrassent. Starlight avec assurance embrasse Trixie légèrement génée.
Le nom du serveur était « chloe was here »

Le serveur 83.249.96.136 qui semble être un serveur de Tele2, un opérateur suédois.

Un renard qui dort, sur le dos en ronflant. Un style dessin au crayon noir sur fond blanc.
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 ».

Un renard anthropomorphisé vu de face jusqu'à la taille. Le genre n'est pas identifiable. Un T-shirt noir avec écrit LINUX en jaune dessus. Un clavier sous le bras.
Le nom du serveur était « just so you know this is literally me »
Un dessin des personnages Susie et Noelle issues du jeu Deltarune. Elles s'embrassent génée.
Le nom du serveur était « i am a lesbian pony with weapons »

(Œuvre originale par Rozavive)

Encore un absolument incompréhensible, le serveur est celui de @mastodon.staropa.net@1024x2, le hackeur semble être Litevex, mais celui-ci affirme avoir hacké htwins.net. 😵‍💫 Bref !

Dessin au crayon blanc sur fond noir très très basique de Mario reconnaissable par le M sur la casquette.
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.

Écran de revendication de la guerre contre Israel, sur fond rouge avec le logo « Free Palestine », le message « You have been hacked » en blanc et la croix de David qui coule dans une mer numérique
Le nom du serveur était « 4629C81  »

À la prochaine fois pour un article sur l'animation sur le Web ... Ou sur les code QR (encore !). 🤷

en