Kali Linux sur macOs Big Sur Apple Silicon - M1

Hello les amis, j'ai tellement galéré pour avoir quelque chose de correct, que j'ai décidé d'écrire ce post pour vous partager la manière la plus simple de disposer un environnement Kali Linux sur votre mac.

Dans ce post, je vais vous présenter la procédure que j'ai suivi pour installer un environnement Kali Linux sur mon Mac mini M1 (16Go Ram)


Contrainte : Architecture Arm64 avec puce Apple Silicon (M1)

NB: 2 options envisageables :

  1. Kali linux avec une machine virtuelle (Parallels Desktop Preview)
  2. Container Docker

Dans ce post, je vais vous indiquer les étapes principales à suivre pour installer un container Docker avec Kali Linux sur votre Apple M1.

Etape 1 - Installer Docker

Pour installer docker sur votre Apple M1, il est nécessaire de télécharger la version RC 3 (au 07/01/2021) qui permet de prendre en charge les puces Apple Silicon.

Récupérer docker RC3 ici :
https://desktop.docker.com/mac/stable/arm64/62632/Docker.dmg

Si vous êtes sur ce post, c'est qu'à priori, vous êtes suffisamment compétent pour savoir télécharger et installer des applications, je passerais donc TOUTES les étapes d'installation lorsqu'il n'y a pas de difficultés majeures relevés. Toutefois, si vous avez des questions (ou des remarques) vous pouvez laissez un commentaire (et puis si l'article vous plaît, vous pouvez aussi le dire 😀 ).

Après avoir récupérer docker :

  • installer-le sur votre mac
  • exécuter  Docker Desktop

Etape 2 - Installer la bonne image Kali Linux

Une fois Docker installé et lancé, il nous faut à présent récupérer une image kali linux qui fonctionnera sur notre machine.

lancer Terminal via spotlight:
cmd+espace puis Terminal

Mon terminal personnalisé.

Récupérez l'image KaliLinux/Kalilinux Rolling en tapant la commande suivant dans le terminal :
docker pull kalilinux/kali-rolling

après avoir téléchargé l'image docker, il ne nous reste plus qu'à lancer notre container :

docker run -it --privileged --name Kali-blog kalilinux/kali-rolling /bin/bash

(lisez plus bas avant de choisir si vous souhaitez mettre votre container en mode --privileged)

Ici nous demandons de lancer un container en mode privileged que l'on nommera Kali-blog et qui utilise l'image kalilinux/kali-rolling que nous venons de télécharger en mode intéractif. Le dernier argument nous permet d'indiquer que nous souhaitons ouvrir un shell bash.

Le mode privileged permettra au container d'accéder aux ressources de la machine Host dès lors que nous aurons monté nos ressources via l'instruction mount.
⚠  Attention ceci n'est pas sans risques : si votre container est exposé sur internet, alors votre machine Hôte est également exposée.  Si vous n'avez pas besoin d'accéder aux ressources de l'hôte n'utilisez pas ce switch. De plus, en mode privileged, la vitesse de votre network dans votre container va subir une énorme baisse de débit.

A noter :
docker run n'est à utiliser qu'au tout premier lancement de votre container par la suite, si le container est en cours d'exécution et que vous souhaitez avoir plusieurs bash ouvert de votre container, vous devrez utiliser la commande exec tel qu'ici :
docker exec -it Kali-blog /bin/bash

Pour lancer un container, dans Docker Desktop, allez dans Containers/App puis cliquez sur l'icône de lecture ▶️.

Accédez à votre container en mode interactif :
docker exec -it Kali-blog /bin/bash

Vous voici désormais avec un container Kali-Linux minimaliste. Nous devons désormais l'enrichir d'outils via les métapackages mis à disposition par Kali-Linux. (plus d'information ici)

Installons par exemple le Top 10 des outils Kali via les commandes :

apt update
apt install kali-tools-top10

Après plusieurs minutes vous disposerez des outils du Top 10 Kali :

Si vous le souhaitez vous pouvez ensuite ajouter tous les packages que vous sembleront utiles !

Petits packages supplémentaires

Afin de voir correctement les processus qui tournent dans notre container, récupérons htop. (plus d'information ici)

apt-get install htop

Dans nos différents challenges CTF (capture the flag) nous aurons également besoin de netcat, essentiel dans la toolbox des pentester, pour effectuer nos reverse-shell.

sudo apt-get install netcat-traditional

Nous pourrions être amenés à utiliser dig et nslookup durant nos investigations, installons les :

sudo apt install dnsutils

Pour nos reconnaissances nous pourrions également avoir besoin de gobuster, masscan, massdns et nikto:

sudo apt install gobuster

sudo apt install masscan

sudo apt install massdns

sudo apt install nikto

Il peut s'avérer utile également de disposer d'un simple client ftp :

sudo apt install ftp

Aussi pour identifier l'existence de vulnérabilités liés à nos découverts, nous pourrions être amené à utiliser searchsploit :

sudo apt update && sudo apt -y install exploitdb

Etape 3 - Postgres / Metasploit

Après avoir ajouter nos packages du top 10 et htop, voyons désormais si Metasploit fonctionne correctement.
Comme nous souhaiterons utiliser les fonctionnalités liées à la base de données, nous devons d'abord nous assurer que tout est ok pour assurer le bon fonctionnement de Metasploit avec cette base.

Executer :
service postgresql start
vous obtenez ensuite ce retour :

Starting PostgreSQL 13 database server: main.
┌──(root💀3b17aad14809)-[/]
└─# 

PostgreSQL est lancé, créons les bases et les rôles avec la commande msfdb reinit:

┌──(root💀3b17aad14809)-[/]
└─# msfdb reinit
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
[+] Starting database
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
[+] Deleting configuration file /usr/share/metasploit-framework/config/database.yml
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
[i] Database already stopped
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
[+] Starting database
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
[+] Creating database user 'msf'
[+] Creating databases 'msf'
[+] Creating databases 'msf_test'
[+] Creating configuration file '/usr/share/metasploit-framework/config/database.yml'
[+] Creating initial database schema
┌──(root💀3b17aad14809)-[/]
└─# 

Enfin lançons Metasploit avec la commande  msfconsole

┌──(root💀3b17aad14809)-[/]
└─# msfconsole
                                                  
                                   ___          ____
                               ,-""   `.      < HONK >
                             ,'  _   e )`-._ /  ----
                            /  ,' `-._<.===-'
                           /  /
                          /  ;
              _          /   ;
 (`._    _.-"" ""--..__,'    |
 <_  `-""                     \
  <`-                          :
   (__   <__.                  ;
     `-.   '-.__.      _.'    /
        \      `-.__,-'    _,'
         `._    ,    /__,-'
            ""._\__,'< <____
                 | |  `----.`.
                 | |        \ `.
                 ; |___      \-``
                 \   --<
                  `.`.<
                    `-'



       =[ metasploit v6.0.38-dev                          ]
+ -- --=[ 2114 exploits - 1138 auxiliary - 358 post       ]
+ -- --=[ 592 payloads - 45 encoders - 10 nops            ]
+ -- --=[ 8 evasion                                       ]

Metasploit tip: Use help <command> to learn more 
about any command

msf6 > 

Et vérifions si nous sommes bien connecté à la base de donnée :

msf6 > db_status
[*] Connected to msf. Connection type: postgresql.

C'est parfait ! Metasploit est désormais entièrement opérationnel !

Votre container est prêt à être utilisé ! Il ne vous reste plus qu'à ajouter les paquets qui vous intéresse pour pleinement en profiter !

Bonus

Il peut arriver que vous vous retrouviez avec des erreurs type "Permission Denied sur /dev/null" empêchant la base de donnée de fonctionner correctement, dans ce cas vous pouvez tenter les opérations suivantes :

$ apt-get remove --purge postgresql-13 postgresql-client-13 \
    postgresql-client-common postgresql-common 
$ rm -rf /etc/postgresql 
$ rm -rf /var/lib/postgresql 
$ apt remove postgresql
$ apt-get install metasploit-framework
$ chmod 666  /dev/null      

Etape 4 - Partage de dossier entre l'Hôte et le container

Parfois vous souhaiterez  partager un dossier de votre ordinateur hôte dans votre container. C'est ce que nous allons voir dès à présent.

La première chose à faire c'est de créer une nouvelle image de tout ce que nous venons d'installer.

  1. assurez vous que votre container soit arrêté
  2. Créons une image que nous appelerons kalilinux-ethical-custom à partir de notre container Kali-Blog en tapant la commande suivante :
docker commit Kali-blog kalilinux-ethical-custom

Une nouvelle image est désormais disponible remontons un container, cette fois-ci avec des dossiers qui seront commun entre notre mac mini Hôte et le container Kali Linux.

Je souhaite mettre à disposition mon dossier de téléchargement + mon dossier contenant mes outils de pentest à disposition du container

Nous allons utiliser la commande --mount de docker de la manière suivante :

docker run -it --name Kali-ethical --mount type=bind,source=/Users/julienlange/Desktop/pentest,target=/home/shared/pentest --mount type=bind,source=/Users/julienlange/Download,target=/home/shared/downloads kalilinux-ethical-custom /bin/bash
mount des dossiers partagés entre l'host et le container

Et voilà, nous venons de recréer un container nommé Kali-ethical.

  • le dossier hôte/Users/julienlange/Desktop/pentest est mappé dans le container à l'emplacement /home/shared/pentest  
  • le dossier hôte /Users/julienlange/Download est mappé à l'emplacement /home/shared/downloads

retournons dans le container et vérifions :

 julienlange@Mac-mini-de-Julien  ~  docker exec -it Kali-ethical /bin/bash                                                     ✔  1224  22:54:07
┌──(root💀ee7a5175f812)-[/]
└─# cd /home/shared/downloads
┌──(root💀ee7a5175f812)-[/home/shared/downloads]

Le dossier est bien accessible depuis le container ! Vous pouvez maintenant échanger vos fichiers entre le container et l'host.👍🏻


Etape 5 - Permettre les connexions VPN et le montage de disque NFS

Nous savons tous à quel point les VPN sont pratiques et importantes. Voyons comment permettre tout cela avec docker.

Tout d'abord committons la dernière version de notre container dans l'image kalilinux-ethical-custom

docker commit Kali-ethical kalilinux-ethical-custom

assurez vous de supprimer votre container actuel avec la commande docker rm Kali-ethical puis executer la commande suivante pour permettre les connexions vpn à l'intérieur même de votre container + permettre le montage de disque NFS (notamment).

docker run -it --name Kali-ethical --mount type=bind,source=/Users/julienlange/Desktop/pentest,target=/home/shared/pentest --mount type=bind,source=/Users/julienlange/downloads,target=/home/shared/downloads --cap-add=NET_ADMIN --cap-add=SYS_ADMIN --device /dev/net/tun  --sysctl net.ipv6.conf.all.disable_ipv6=0 kalilinux-ethical-custom /bin/zsh 

Vous êtes prêt à accomplir vos prochains CTF sur TryHackMe, HackTheBox etc.

L'image docker

L'image docker Kali Linux pour Mac M1 est disponible gratuitement :

docker pull langju/kalilinux-mac-m1

Docker Hub
Si vous avez aimé ce post, je vous invite à le partager sur les réseaux sociaux et même à laisser un commentaire ! Tous les commentaires sont lus !