Skip to content

ShHaWkK/LD_PRELOAD_malware

Repository files navigation

<<<<<<< HEAD

LD_PRELOAD_malware

UZAN Alexandre
KHALIFA Julien

Attendus du projet

Avoir un malware basé sur la technique LD_PRELOAD qui permet d’extraire les clés SSH envoyées par les clients à un serveur openSSH.
Le scénario se basera en assumed breach, dans un premier temps avec le plus de droit possible (root sans mitigation), puis dans un second temps, un soin sera apporté sur le travail de portabilité, notamment à travers la réduction des privilèges des comptes (pas d’infection root mais en tant qu’utilisateur).
Une fois l’extraction de clé obtenue, au choix peut être réalisé par le groupe (ou l’étudiant) :

L’empêchement d’ouverture d’un fichier par le malware.
Un travail de furtivité en cachant les connexions ouvertes du malware vis à vis de la commande netstat -latepun.
Un travail d’anti forensic en supprimant des logs, d’abord en local, puis si le temps le permet, en spoofant les requêtes internet envoyées à des hôtes distants.
Il est attendu aussi un début de port knocking du côté du client (malware), permettant après avoir résolu la séquence, d’exécuter des commandes arbitraires.

Dans un même temps il est attendu d’avoir un serveur de commande et contrôle permettant :
D’enregistrer un malware auprès du C2, et donc de savoir qu’un hôte est infecté (en stockant quelques informations permettant une identification de l’hôte infecté). Une "API" permettant au malware de remonter les clés SSH de l’hôte et de l’utilisateur s’étant fait voler ses clés.
De plus un rapport sur les fonctionnements d’un linker, de LD_PRELOAD, et de comment marche un thread sous Linux, qui aille plus loin que la courte présentation faite en cours.

Pour la partie bonus, cf slides, les idées sont au choix et totalement libres tant qu’elles font développer du code en C et qu’elles sont relativement liées au sujet.

Dépendances

Installs :

  • sudo apt install libssl-dev : pour SSL
  • sudo apt install openssl
  • sudo apt install build-essential : pour GCC et MAKE

Compilation

  • sudo make

Déplacer port_knock.service : sudo mv port_knock.service /etc/systemd/system/
Renommer "utilisateur" avec le nom du compte de session

Fonctionnement du programme

Enregistrez et quitte

Recharge et Relance le service

  • sudo systemctl daemon-reload
  • sudo systemctl reset-failed port_knock.service
  • sudo systemctl start port_knock.service
  • sudo systemctl status port_knock.service =======

🛡️ LD_PRELOAD Malware 🛡️

Par

  • Alexandre UZAN
  • Julien KHALIFA

🌟 Introduction

Ce projet implémente un malware basé sur LD_PRELOAD, une technique puissante permettant d'intercepter les appels système Linux. Voici les objectifs :

  • 📤 Extraction de clés SSH et credentials utilisateur.
  • 🔒 Blocage de fichiers critiques comme /etc/passwd.
  • 🎭 Furtivité avancée : Masquage des connexions réseau et fichiers sensibles.
  • 🔑 Port Knocking : Activation conditionnelle après une séquence de ports spécifiques.
  • 🖥️ Serveur C2 : Communication sécurisée via SSL/TLS pour recevoir et stocker les données exfiltrées.

Tout d'abord, nous allons expliquez ce qu'est le LD_PRELOAD ?

  • LD_PRELOAD est une variable d'environnement qui permet d'injecter une bibliothèque dynamique dans un programme avant même que ses propres bibliothèques ne soient chargées. Cette technique est couramment utilisée pour :
    • Détourner des appels système (hooking dynamique).
    • Modifier le comportement des fonctions standard de la libc.
    • Intercepter et filtrer des données sensibles.

Utilisation de LD_PRELOAD

LD_PRELOAD= ./malware.so ssh testuser@10.0.2.15

Explication du Code

Le malware intercepte les entrées utilisateur, notamment lors de la saisie de mots de passe. De même, write() est détourné pour capturer les identifiants SSH :

📂 Structure des fichiers

🌟 Chaque fichier a une responsabilité précise. Voici une vue d’ensemble :

1. src/malware/

Fichier Description
log_cleanup.c 🔍 Nettoie ou modifie les fichiers de logs comme /var/log/auth.log.
file_hide.c 🎭 Masque les fichiers sensibles (passwd, shadow).
ssl_hook.c 🔒 Intercepte SSL_write pour capturer des données sensibles.
ssh_hook.c 🔑 Capture les credentials SSH.
read_write_hook.c 🛠️ Intercepte les appels système read et write.
port_knock.c 🚪 Implémente le port knocking.
file_hook.c ❌ Bloque l’accès à des fichiers critiques (/etc/passwd, /var/log/).
main.c 🛡️ Initialise les hooks et le port knocking.

2. src/c2/

Fichier Description
server.c 🖥️ Serveur de commande et contrôle (C2), qui écoute sur le port 1337.
api_handler.c 📤 Gère la transmission des données sensibles vers le serveur C2.

3. Fichiers de configuration et scripts

Fichier Description
port_knock.service ⚙️ Configuration du service systemd pour activer le port knocking.
Makefile 🛠️ Script de compilation du projet.
infected_hosts.db 💾 Base de données SQLite utilisée pour stocker les données interceptées.

🛠️ Installation et Dépendances

Avant de commencer, assurez-vous d’installer les dépendances suivantes :

sudo apt install libssl-dev openssl build-essential libsqlite3-dev psmisc -y
sudo apt update && sudo apt install -y \
    build-essential \
    libssl-dev \
    libsqlite3-dev \
    zlib1g-dev \
    net-tools \
    libdl2 \
    libpthread-stubs0-dev

🏗️ Compilation et Configuration

Compilez l'ensemble du projet à l'aide de la commande suivante :

sudo make

Configuration du service Port Knocking

Créez un fichier port_knock.service pour configurer le service systemd.

sudo nano /etc/systemd/system/port_knock.service

Ajoutez-y le contenu suivant :

[Unit]
Description=Port Knocking Listeners
After=network.target
StartLimitIntervalSec=0

[Service]
ExecStart=/home/UTILISATEUR/Documents/projets/LD_PRELOAD_malware/port_knock_startup.sh
Type=oneshot
RemainAfterExit=yes
Restart=no

[Install]
WantedBy=multi-user.target

Remplacez UTILISATEUR par le nom de votre compte.

Enregistrez et quittez. Ensuite, exécutez les commandes suivantes pour activer et vérifier le service :

sudo systemctl daemon-reload
sudo systemctl reset-failed port_knock.service
sudo systemctl start port_knock.service
sudo systemctl status port_knock.service

Le malware ne s'active qu'après une séquence spécifique de connexions sur des ports prédéfinis :

int check_port_knock(void) {
    int ports[] = {7000, 8000, 9000};
    for (int i = 0; i < 3; i++) {
        int sock = socket(AF_INET, SOCK_STREAM, 0);
        if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
            close(sock);
            return 0;
        }
        close(sock);
    }
    return 1;
}

🚀 Utilisation et Test

  1. Lancer le serveur C2

Dans un premier terminal, lancez le serveur C2 pour écouter les connexions du malware :

sudo ./c2_server

Cela initialise un serveur sécurisé sur le port 1337, prêt à recevoir les données sensibles transmises par le malware. Le serveur écoute sur le port 1337 et reçoit les informations exfiltrées via SSL :

void handle_client(SSL *ssl) {
    char buffer[BUFFER_SIZE] = {0};
    int bytes_read = SSL_read(ssl, buffer, sizeof(buffer) - 1);
    if (bytes_read > 0) {
        insert_into_database(hostname, username, password, ssh_keys);
    }
}

Tester LD_PRELOAD

Dans un second terminal, exécutez les commandes suivantes pour tester les différentes fonctionnalités du malware.

Interception de credentials SSH

Le malware capture les credentials SSH (nom d'utilisateur et mot de passe) et les transmet au serveur C2.

LD_PRELOAD=./malware.so ssh utilisateur@localhost

📤 Résultat attendu : Les credentials sont interceptés et transmis au serveur C2.

Blocage d’accès à des fichiers critiques

Le malware empêche l’accès à certains fichiers sensibles comme /etc/passwd en retournant une erreur "Permission Denied".

LD_PRELOAD=./malware.so cat /etc/passwd

📛 Résultat attendu : Message d’erreur "Permission Denied".

Masquage des fichiers sensibles

Le malware masque certains fichiers comme passwd, shadow ou les fichiers de logs.

LD_PRELOAD=./malware.so ls /etc/
LD_PRELOAD=./malware.so find /var/log/

🎭 Résultat attendu : Les fichiers sensibles ne sont pas affichés dans les résultats.

Masquage des connexions réseau

Le malware cache ses propres connexions réseau dans /proc/net/tcp pour éviter la détection.

LD_PRELOAD=./malware.so cat /proc/net/tcp

🔒 Résultat attendu : Les connexions réseau du malware ne sont pas visibles.

  1. Tester le Port Knocking

Pour activer le malware, utilisez la séquence de ports suivante :

nc -z 127.0.0.1 7000
nc -z 127.0.0.1 8000
nc -z 127.0.0.1 9000

🚪 Résultat attendu : Le malware s’active après la séquence correcte.

  1. Visualiser les données stockées dans SQLite

Le serveur C2 stocke les données interceptées dans une base SQLite (infected_hosts.db). Pour visualiser ces données, utilisez les commandes suivantes :

sqlite3 infected_hosts.db
.tables
SELECT * FROM infected_hosts;
  1. make
  2. Sur C2 : sudo ./c2_server, le programme lance l'écoute du port
  3. Sur Client : sudo ./test_sending_to_C2.sh, le programme enverra au C2 un string test
  4. Le C2 traite la donnée reçue et l'insère dans la base de données

Tester le LD_PRELOAD depuis Client vers C2

Saisir LD_PRELOAD=./malware.so ....(le_fichier_d_envoie.sh)

Les Clefs SSH

openssl req -x509 -newkey rsa:2048 -keyout server.key -out server.crt -days 365 -nodes
LD_PRELOAD=./malware.so ssh (login)

📊 Résultat attendu : Les credentials interceptés sont affichés dans la table infected_hosts.

Si cas de problème avec le port knocking :

  • ./listerner.sh => cela permet de clear le port et de le remettre en service

🚨 Note : Ce projet est uniquement à des fins éducatives. L’utilisation malveillante de ce code est strictement interdite.

Sources intéressantes :

api_complete

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages