--- 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) ![Logo VNC modifié pour lire également Vanity](res/vnc_vanity-alt.svg) 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 :
É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 : ```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 ».
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](https://fr.wikipedia.org/wiki/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](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 !
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 !). 🤷