Privilege Escalation
Para realizar um PrivEsc em Linux, podemos seguir os seguintes itens como um manual de uso:
Exploits do Kernel
Programas executando com root
Softwares Instalados
Reúso de Senha(s)
Services
Suid Misconfiguration
sudo-rights
Scripts que o root utiliza com permissão de escrita
Bad Path Configuration
Cronjobs
Unmounted File Systems
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
IMPORTANTE: Sempre que tiver permissões para utilizar alguma linguagem com privilégios elevados, utilize também seção de Code Injection
para ver como aproveitar dessa falha.
Ferramentas Automatizadas
Existem algumas ferramentas free muito boas, como LinEnum
, LinPEAS
, Unix Privesc
, Linprivchecker.py
e Linux Smart Enumeration
. Também podemos contar com uma ferramenta chamada pspy
, que é uma ferramenta de linha de comando projetada para bisbilhotar processos sem a necessidade de permissões de root. Ele permite que você veja comandos executados por outros usuários, tarefas cron, etc., à medida que são executados.
Para ambas, basta baixar na máquina alvo e executá-la.
LinEnum
Unix Privesc Check
Linux Smart Enumeration
Script Personalizado
O script abaixo trabalha de maneira semelhante ao pspy
Comandos Úteis
As vezes é melhor definirmos datas de modificação nos arquivos que estamos buscando para ter um resultado melhor e mais limpo, como no exemplo abaixo:
SSH
Arquivos onde contém chaves de SSH. Geralmente ficam em /home/<user>/.ssh/
:
Exploit em Kernel
Sempre que precisar procurar algum exploit em kernel, utilize a seguinte Dork no Google: site:exploit-db.com kernel <version>
.
Caso o Linux use Kernel na versão 2.6.39
, utilize os seguintes comandos para virar root no SO:
IMPORTANTE
Não use explorações do kernel se você puder evitá-lo. Se você usá-lo, pode travar a máquina ou colocá-la em um estado instável, além de produzir muitos registros em sys.log
. Portanto, as explorações do kernel devem ser o último recurso. Tente usar um priv-esc mais simples
MySQL
Se estiver logado no mysql via terminal e quiser utilizar o terminal do SO com as mesmas autenticações do MySQL, basta utilizar o comando: \! sh
. Caso o MySQL estiver sendo executado como root, isso acaba se tornando um fácil PrivEsc.
Adicionando User ao Grupo sudo
Utilizando senha para usar sudo
Sem utilizando senha para usar sudo
Lendo Permissões Personalizadas
Útil para saber se o usuário atual tem permissões para acessar determinadas ferramentas e/ou comandos como outro usuários (incluindo o root), sem pedir senha. Esse comando irá ler o arquivo /etc/sudoers
.
DICA: Ao editar o arquivo /etc/sudoers
, utilize o comando visudo
, pois este já verifica erros de sintaxe.
IMPORTANTE: Pode acontecer do sudo -l
não conseguir pegar as permissões, então certifique-se de olhar no arquivo /etc/sudoers e também nos arquivos presentes em /etc/sudoers.d/
.
Pegando a saída de exemplo, vamos ter as seguintes considerações:
SAÍDA DO COMANDO
EXPLICAÇÃO
root
Usuário com permissão sudo
ALL=
Todos os terminais
(ALL:ALL)
User:Group. ALL:ALL pode ser substituído por somente ALL
NOPASSAWD
"TAG opcional" para indicar que não precisará de senha
/bin/cp
Path do diretórios. Se houver mais de um arquivo, pode separá-los com uma vírgula
Se tiver um <user> ALL=ALL
, o usuário terá acesso a todo o sistema e automaticamente a tag NOPASSWD
estará ativo.
Adicione a linha a baixo em /etc/sudoers
para permitir que acesse qualquer comando como root, sem precisar de confirmar a senha atual
Podemos também, ter a saída abaixo, que significa que podemos executar o bash
de qualquer usuário, menos do root
.
Na teoria isso funciona, mas na prática, não. Podemos burlar essa regra em determinadas versões do sudo para pegarmos acesso root, executando o seguinte comando:
Usuários com Senha em Branco
Para pegar todos os usuários que tem senha em branco, utilize o comando
Criando Usuário root Manualmente
A funcionalidade desse tipo de criação de usuário, serve para criar um usuário que servirá como um Backdoor. Para isso, insira a linha abaixo em /etc/passwd
e acesse com o novo usuário que tem permissões de root:
EXPLICAÇÃO
<usuario>
= Nome do usuário / loginx
= Área da senha do usuário. Quando tem um "x" significa que a senha está localizada em/etc/shadow/
. Caso tenha um asterísco (*), significa que a conta está desativada0
= Define o UID (User ID) que varia e 0 a 60000, sendo o UID reservado para oroot
, de 1 a 499 para sistemas e partir de 500 para usuários0
= Define o GID (Group ID) que o usuário pertence. Para ver os grupos disponíveis, confira o arquivo/etc/group
<comentario>
= Informações adicionais do usuário, que pode ser visto pelo comandofinger
/
= Diretório de Login/bin/bash
= Path absoluto da shell definida para o usuário
Agora vá em /etc/shadow
e adicione:
EXPLICAÇÃO
<usuario>:
= Login / ID do usuário:
= (Parâmetro vazio) Senha criptograda11367:
Números em dias da última data de alteração:
= (Parâmetro vazio) Números mínimo em dias para mudança de senha:
= (Parâmetro vazio) Números máximo em dias para mudança de senha:
= (Parâmetro vazio) Números máximo em dias que o usuário pode ficar inativo:
= (Parâmetro vazio) Data de expiração da conta:
= (Parâmetro vazio) Flag reservado
Depois disso já pode acessar com o novo usuário (senha em branco)
Serviços Locais
Pode ser que o usuário esteja executando algum serviço disponível apenas nesse host e você não pode se conectar ao serviço de fora. Esses serviços podem estar em execução como root ou podem ter vulnerabilidades neles. Eles podem ser ainda mais vulneráveis, pois o desenvolvedor ou usuário pode estar pensando que, uma vez que é acessível apenas para um usuário específico, não precisamos gastar tanta segurança".
Podemos também ver quais portas locais estão abertas com esse serviço
Pegando Chave SSH
Ao ter acesso ao shell do nosso alvo, podemos listar todos os usuários em /etc/passwd
, e depois podemos executar o seguinte comando para pegarmos a chave SSH:
Agora jogue o resultado que sair no terminal para sua máquina local em um arquivo chamado <user>.key
e execute os comandos:
Assim você acessa ao SSH do alvo sem precisar inserir a senha
Link Simbólico
Criar um link simbólico de um comando para outro (ex.: de ls
para cat
) também pode ser uma maneira de escalar privilégios
Procurando strings em arquivos
Útil para procurar arquivos com palavras chave como: pass
, senha
, key
, secret
, api
, http
, db
, database
, ssh
, ftp
, mail
, access
, etc
Permissão de Escrita em /etc/passwd
Podemos criar um novo usuário e informando um * no segundo parâmetro. Geralmente o segundo parâmetro é um x, o que significa que a senha está localizada em /etc/shadow
. Informando um *, estamos configurando nosso usuário para que não precise de senha para utilizar o SO.
Também podemos gerar um hash de uma determinada senha, e alterar manualmente o segundo parâmetro de /etc/passwd
(que seria o x ou *), com as seguintes maneiras:
Após gerar a senha (hash), execute o comando abaixo para inserir o novo usuário no /etc/passwd.
Agora basta acessá-lo:
Permissão de Escrita em /etc/shadow
Após ter permissão de escrita em shadow, altere a senha do root (ou crie outro user caso tenha permissão tamém em /etc/passwd
), gerando a senha com o comando abaixo e manipulando o arquivo /etc/shadow
, substituindo a resultado do comando abaixo, pela linha referente ao root, que geralmente é a primeira linha do arquivo.
Permissão de Escrita no Diretório /etc/apt/apt.conf.d
Caso tenha permissão de escrita dentro do diretório /etc/apt/apt.conf.d
, crie um arquivo chamado pwn
, com o seguinte conteúdo:
Após isso, deve-se executar o comando apt-get update
, com um usuário com permissões privilegiadas. Em alguns cenários, esse comando é disparado a cada 2 minutos automaticamente, então verifique isso com pspy.py
.
Caso queira fazer tudo em um único comando, execute:
chroot
C
Crie um arquivo chamado exploit.c
com o seguinte conteúdo:
Depois execute:
Python
Agora basta executar:
PERL
Agora basta executar:
getcap
A saída deve ser semelhante a /usr/bin/python2.6 = cap_setuid+ep
, então execute o comando abaixo para ter acesso root:
rbash
vi
find
Rsync
Geralmente temos o arquivo /etc/rsyncd.secrets
que contém as credenciais de acesso, porém caso não ache esse arquivo, leia o conteúdo do arquivo /etc/rsyncd.conf
e veja o valor de secrets file
.
Sistemas de Arquivos Não Montados
Quando acharmos sistemas de arquivos não montados, podemos montar e iniciar o processo PrivEsc. O primeiro método que podemos utilizar, é a leitura do arquivo fstab
, procurando por algum volume que esteja como none
(caso seja necessáio, utilize um grep
).
Outra maneira de realizarmos tal verificação, são com os comandos abaixo:
Screen
Esse exploit funciona somente na versão 4.5.0
(às vezes pode ser visto como 4.05.00
). Baixe o screen2root
(disponível na página Softwares
deste gitbook) e execute.
Fora isso, também podemos listar todas as Screens ativas e, caso uma delas esteja com o usuário root, podemos pegar a sessão.
Cronjob
O arquivo principal de Cronjob é o /etc/crontab
e nele podemos ver scripts que são executados como root e que podem ter permissão de escrita.
Também podemos ver com o comando crontab -l
(que irá ler /var/spool/cron/crontabs/<user>
) se há alguma crontab configurado para o nosso user atual. E por último utilize os comandos abaixo para verificar se há informações importantes:
Também podemos fazer um PrivEsc através do Cronjob, alterando o caminho de chamadas que está utilizando o PATH para realizar a execução de algum arquivo. Vamos considerar a seguinte crontab abaixo (demais linhas foram ocultadas para melhor leitura):
Note que o arquivo script.sh
será procurado nos diretórios definidos em PATH
, seguindo da esquerda para a direita, então se criarmos um arquivo chamado script.sh
, localizado em /home/mysther
, ele será executado com privilégios root.
Se preferir, pode fazer a cron criar um bash com SUID ativo para conectar-se como root depois.
Outra forma de fazermos isso, é quando o script utiliza o comando cd
para alterar de diretório, criando assim uma nova forma de atacar em um determinado path. No trecho abaixo podemos verificar uma falha de path, pois após entrar no diretório /home/mysther
, o executável cat
pode ser explorado, já que o mesmo não possui o path completo. Para este cenário, basta criar um arquivo malicioso com o nome /home/mysther/cat
.
exports
Primeiro execute o comando abaixo e verifique se encontra uma saída semelhante a /tmp *(rw,sync,insecure,no_root_squash,no_subtree_check)
:
Caso tenha um resultado positivo, execute os seguintes comando na máquina atacante:
Volte para a máquina alvo e execute (lembre-se de verificar o diretório de montagem, que no nosso exemplo é o /tmp
):
Permissão de Disco
Se o usuário for membro do grupo Disco, podemos ler o conteúdo do sistema de arquivos
Permissão de Vídeo
Se o usuário for membro do grupo Vídeo, podemos ler o Framebuffer
Arquivos Modificados Recentemente
TMUX
Ferramenta semelhante a screen
, que permite múltiplas sessões no terminal. Assim como o screen
, se tiver uma sessão aberta como root será um fácil PrivEsc.
Primeiro podemos listar as sessões que estão abertas com o comando:
Analisando o serviço com o comando ps aux | grep -i tmux
, podemos ter um retorno de algo parcido como /usr/bin/tmux -S /.devs/dev_sess
. Verificando as permissões com ls -la /.devs/dev_sess
podemos ver o usuário e, caso seja de interesse, acessarmos a sessão com o comando
Variáveis de Ambiente
SO
Supondo que temos um derterminado comando que está sendo executado como root
, por exemplo script.sh
, podemos criar um arquivo com o mesmo nome em um diretório diferente e fazer o root
executá-lo. Vamos supor que temos a seguinte resultado ao executar o comando: echo $PATH
O arquivo script.sh
está localizado em /usr/bin
, porém se criarmos um arquivo com o mesmo nome, no diretório /usr/local/bin
, ele que será executado, pois a leitura é sempre feita nos diretórios que estão em $PATH
, seguindo da esquerda para a direita.
Python
Seguindo o exemplo acima podemos fazer isso o Python. Vamos supor que temos o seguinte arquivo chamado script.py
que está sendo executado como root
(SUID Bit).
OBS.: Ao executar sudo -l
, certifique-se de que pode alterar as variáveis de ambiente, como no exemplo a seguir: (ALL) SETENV: </path/to/file>
Então vamos criar um arquivo chamado shutil.py
(que irá conter um código malicioso como uma Reverse Shell) e executar o script com o seguinte comando:
OBS.: Antes de fazer esse processo, verifique o Path das Bibliotecas, pois caso tenha acesso a escrita, será bem mais fácil modificá-los diretamente. Para verificar esse path, execute o comando
pip
LD_PRELOAD
Para que esse tipo de PrivEsc dê certo, primeiro execute o sudo -l
(abaixo segue um exemplo de saída) e verifique se aparece o LD_PRELOAD
(geralmente vem como env_keep+=LD_PRELOAD
) na lista de Matching Defaults
. Nesse caso, o comando /usr/bin/find
está com privilégios, então iremos utilizá-lo para realizar nosso ataque
Agora execute os comandos abaixo com o usuário teste
:
Insira o código abaixo:
Agora converta o arquivo feito em C
em so
(extensão de lib em Linux, equivalente a dll
no Windows):
E então execute-o utilizando o comando find
(que estamos usando como exemplo) para escalar privilégio:
Compartilhamento NFS
Se a máquina tiver algum compartilhamento NFS mal configurado, podemos utilizá-lo para aumentar nossos privilégios, pois podemos ler arquivos remotos do alvo.
Verificando se o alvo possui qualquer compartilhamento NFS :
Um ponto importante é sabermos também qual a versão do NFS:
Caso o resultado seja positivo, podemos montar a unidade em nosso SO.
Assim como podemos montar o compartilhamento em nosso host, podemos também desmontá-lo, com o seguinte comando:
Aumentando Privilégios de Forma Manual
Depois de criarmos a montagem, podemos receber mensagem de access denied,
que podemos burlar. Por razões de "segurança", o NFS 4 não mostra o uid e gid remotos reais, mas sim o que corresponde ao usuário e grupo nobody
. No entanto, o NFS 3 mostra o uid e gid remotos reais do proprietário do compartilhamento, o que nós dá uma grande vantagem (caso o NFS 3 esteja disponível), já que podemos criar um usuário/grupo com o mesmo uid/gid.
Utilizando o comando mount
(descrito acima), podemos definir o valor de parâmetro nfsvers
como 3 e depois verificar os respectivos uid/gid, utilziando os comandos abaixo:
Após isso, já sabemos os valores de uid e gid necessários para acessar o(s) arquivo(s), então vamos criar nosso user que possui tais permissão:
DICA: O processo acima também pode ser feito com o comando sudo adduser mysther
e depois alterando o UID e GID do usuário mysther no arquivo /etc/passwd
.
Aumentando Privilégios com NfSpy
Compartilhamento NFS antigo
Utilize o -o nolock
para desabilitar o bloqueio de arquivos.
MOTD
Caso possua permissões de escrita no diretório /etc/update-motd.d
, execute o comando abaixo para sobrescrever o arquivo 00-header
.
Agora para que o arquivo seja executado, é preciso realizar login (pode utilizar o SSH) para que o arquivo 00-header seja executado como root. Assim que executado, podemos ver o arquivo /tmp/bash com SuidBit ativo, então execute o comando abaixo para pegar acesso root.
tar
Para que isso dê certo, certifique-se antes que o usuário alvo (de preferência root) esteja utilizando um comando semelhante a:
Levando em conta de que isso esteja ocorrendo e que estamos todos no mesmo diretório, vamos criar 1 arquivo que será executado pelo bash e 2 arquivos (que irão servir como parâmetros) para a execução do primeiro arquivo criado.
Agora assim que o comando tar
for executado, o arquivo shell.sh
também será executado, usando os privilégios do mesmo usuário que executou o tar
.
VIM
Library Ausente
Quando temos SETUID em um executável que execute/procura por algum arquivo .so
e não o localiza, podemos então criar o nosso próprio arquivo .so
malicioso. Para sabermos onde que devemos salvar esse arquivo, devemos antes ler os arquivos presentes em /etc/ld.so.conf.d/
para descobrir o diretório das libs compartilhadas e depois criar um arquivo com extenção .c
, contendo o conteúdo abaixo.
Alguns código podem manter o diretório em hardcoded, então podemos buscar através do seguinte comando:
Note que no código acima estamos utilizando uma função chamada test
(linha 5), que deve ser alterado para o nome correto da function. Geralmente podemos ver o nome em erros como: <function>: symbol lookup error: <function>: undefined symbol: <function>
Após isso, vamos compilá-lo:
Agora basta executar novamente o executável que chama o arquivo .so
.
É comum pergamos cenário onde o binário irá ler alguma alguma variável do arquivo .so
, então somos obrigado a definí-lo. Para contornar isso e acessar o bash, podemos utilizar um constructor
da seguinte forma:
Vault
Com o vault, podemos gerar uma senha SSH do usuário root, caso uma má configuração permita isso
lxd
Verifique com o comando id
, se o usuário atual faz parte do grupo lxd
. Caso seja positivo, execute o comando abaixo no host atacante.
Transfira o arquivo alpine-v<version>.tar.gz
para o host alvo e depois execute os seguintes comandos (no host alvo).
Agora com permissão root, acesse o diretório /mnt/root
para visualizar todo os arquivos do SO.
Softwares de Terceiros Instalados
Geralmente os softwares de terceiros vão estar em diretórios comuns como:
Podemos também ver os pacotes instalados com os comandos:
Senhas em Texto Limpo
Geralmente podemos pegar tais senhas em arquivos de configurações. Útil também ver nas configurações de e-mail em /var/spool/mail
.
Com o Linenum
, podemos buscar por senhas utilizando o comando: LinEnum.sh -t -k password
.
Arquivos Temporários
Muitos administradores tem mania deixar arquivos importantes em /tmp
e /var/tmp
. Ambos serve, para armazenar arquivos temporários, mas, apesar do nome, /var/tmp
não tem é um diretório que exclui todos os seus arquivos ao reiniciar o SO, diferentemente do /tmp
.
Finger
Mostrando informações do usuário, como senhas telnet.
O comando finger
tabmém serve para obter informações do usuário (como tempo de ociosidade), Host e IP, mas também serve mostrar arquivos .plan
ou .project
em seus diretórios, caso exista.
Sites
Last updated