Eu sou root. Vamos entender a elevação de privilégios no OS Linux

No primeiro trimestre de 2020, passei o tempo me preparando para o exame OSCP. A busca por informações no Google e várias tentativas "às cegas" consumiram todo o meu tempo livre. Particularmente desafiador foi entender os mecanismos de elevação de privilégios. O curso PWK dedica grande atenção a esse tema, mas sempre faltam materiais instrutivos. Há uma infinidade de manuais úteis na Internet, mas não sou fã de seguir recomendações sem entender onde isso pode levar.

Quero compartilhar com vocês o que consegui aprender durante minha preparação e a bem-sucedida realização do exame (incluindo minhas incursões periódicas no Hack The Box). Senti uma gratidão imensa por cada fragmento de informação que me ajudou a percorrer o caminho Try Harder de forma mais consciente; agora é meu momento de prestar homenagem à comunidade.

Quero fornecer um manual sobre elevação de privilégios em OS Linux, incluindo a análise dos vetores mais comuns e truques relacionados que certamente serão úteis para você. Muitas vezes, os próprios mecanismos de elevação de privilégios são relativamente simples, mas as dificuldades surgem ao estruturar e analisar informações. Por isso, decidi começar com uma "excursão geral" e em seguida abordar cada vetor em um artigo separado. Espero que eu economize seu tempo de estudo sobre o tópico.

Eu sou root. Vamos entender a elevação de privilégios no OS Linux

Então, por que a elevação de privilégios é de fato possível em 2020, se os métodos são bem conhecidos há muito tempo? Na realidade, se o usuário interagir de forma adequada com o sistema, não será possível elevar privilégios nele. O principal problema global que gera tais oportunidades está na configuração insegura. A presença de versões desatualizadas de software no sistema, contendo vulnerabilidades, também é um caso específico de configuração insegura.

Elevação de privilégios através de configuração insegura

Primeiro, vamos entender o que é uma configuração insegura. Começamos com o fato de que profissionais de TI costumam usar manuais e recursos como o stackoverflow, muitos dos quais contêm comandos e configurações inseguras. Um exemplo claro é uma notícia o fato de que o código mais copiado do stackoverflow continha um erro. Um administrador experiente perceberá o erro, mas isso é no mundo ideal. Mesmo profissionais competentes sob alta carga de trabalho podem cometer erros. Imagine que um administrador está ocupado com a preparação e a aprovação da documentação para uma nova licitação, enquanto investiga uma nova tecnologia a ser implementada no próximo trimestre, além de ocasionalmente resolver problemas de suporte ao usuário. E então, de repente, ele recebe a tarefa rápida de levantar algumas máquinas virtuais e instalar serviços nelas. Qual você acha que é a probabilidade de que o administrador simplesmente não perceba o erro? Depois, os especialistas mudam, mas as gambiarras permanecem, enquanto as empresas sempre buscam minimizar custos, incluindo os com profissionais de TI.

Shell pseudocamada e jailbreak

Uma shell de sistema obtida durante a operação frequentemente é limitada, especialmente se você a obteve através de um ato de hacking ao servidor web. Por exemplo, as limitações da shell podem impedir a aplicação do comando sudo, resultando no erro:

sudo: no tty present and no askpass program specified

Após obter a shell, recomendo criar um terminal completo, por exemplo, usando Python.

python -c 'import pty;pty.spawn("/bin/bash")'

Você pode perguntar: "Por que eu precisaria de mil comandos se posso usar um, por exemplo, para transferir arquivos?" A questão é que os sistemas podem ser configurados de maneiras diferentes; no próximo host pode não estar instalado o Python, mas pode haver Perl. A habilidade está em conseguir realizar as operações habituais no sistema sem as ferramentas conhecidas. Uma lista completa de possibilidades pode ser encontrada aqui.

Uma shell de baixo privilégio pode ser obtida usando comandos 1 e comandos 2 (surpreendente, até mesmo o GIMP).

Visualização do histórico de comandos

Linux compila o histórico de todos os comandos executados em um arquivo ~/.bash_history. Se o servidor está sendo utilizado ativamente e seu histórico não é limpo, há uma grande probabilidade de encontrar credenciais nesse arquivo. Limpar o histórico é, simplesmente, inconveniente. Se um administrador é forçado a escolher entre comandos longos, com certeza será mais fácil chamar esse comando do histórico do que digitá-lo novamente. Além disso, muitos não conhecem esse "hack". Se houver shells alternativas como Zsh ou Fish, elas mantêm seu próprio histórico. Para exibir o histórico de comandos em qualquer shell, é suficiente digitar o comando history.

cat ~/.bash_history
cat ~/.mysql_history
cat ~/.nano_history
cat ~/.php_history
cat ~/.atftp_history

Há hospedagem compartilhada, onde o servidor é usado para hospedar vários sites. Normalmente, nessa configuração, é criado um usuário separado para cada recurso, com seu próprio diretório inicial e host virtual. Portanto, em uma configuração incorreta, é possível encontrar um arquivo .bash_history no diretório raiz do recurso da web.

Busca de senhas no sistema de arquivos e ataques a sistemas relacionados

Arquivos de configuração de vários serviços podem estar acessíveis para leitura pelo seu usuário atual. Neles, você pode encontrar credenciais em texto claro — senhas para acesso ao banco de dados ou serviços relacionados. A mesma senha pode ser usada tanto para acessar o banco de dados quanto para a autenticação do usuário root (credential staffing).
Às vezes, as credenciais encontradas pertencem a serviços em outros hosts. O desenvolvimento de um ataque à infraestrutura através de um host comprometido não é pior do que explorar outros hosts. Sistemas relacionados também podem ser encontrados por meio de busca de endereços IP no sistema de arquivos.

grep -lRi "password" /home /var/www /var/log 2>/dev/null | sort | uniq #Encontrar a string password (sem cs) nesses diretórios
grep -a -R -o '[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}' /var/log/ 2>/dev/null | sort -u | uniq #IPs dentro dos logs

Caso exista uma aplicação web disponível na internet no host comprometido, é melhor excluir seus logs da busca de endereços IP. Os endereços dos usuários do recurso da internet provavelmente não nos serão úteis, enquanto os endereços da rede interna (172.16.0.0/12, 192.168.0.0/16, 10.0.0.0/8) e os locais que eles acessam, de acordo com os logs, podem ser interessantes.

Sudo

O comando sudo permite que o usuário execute comandos no contexto root usando sua própria senha ou até mesmo sem seu uso. Muitas operações no Linux requerem privilégios root, no entanto, trabalhar sob root é considerado uma prática muito ruim. Em vez disso, é melhor aplicar permissões seletivas para executar comandos no contexto root. No entanto, muitas ferramentas Linux, incluindo as padrão como vi, podem ser usadas para aumentar os privilégios de maneiras bastante legítimas. Para encontrar uma maneira adequada, recomendo conferir. aqui.

A primeira coisa a fazer ao obter acesso ao sistema é executar o comando sudo -l. Isso mostrará as permissões para o uso do comando sudo. Se o usuário não tiver senha (por exemplo, apache ou www-data), a possibilidade de elevação de privilégios via sudo é improvável. Ao usar sudo, o sistema solicitará a senha. Através do comando passwd, também não será possível definir uma senha, pois ele pedirá a senha atual do usuário. Mas se sudo estiver disponível, basicamente, é necessário procurar:

  • quaisquer interpretadores, qualquer um pode gerar um shell (PHP, Python, Perl);
  • quaisquer editores de texto (vim, vi, nano);
  • quaisquer visualizadores (less, more);
  • quaisquer opções de manipulação de sistema de arquivos (cp, mv);
  • ferramentas que têm acesso ao bash, interativo ou na forma de comando executável (awk, find, nmap, tcpdump, man, vi, vim, ansible).

Suid/Sgid

Há muitos manuais na Internet que recomendam compilar todos os comandos suid/sgid, mas raros artigos fornecem detalhes sobre o que fazer com esses programas. As opções de elevação de privilégios que não consideram a aplicação de exploits podem ser encontradas aqui. Além disso, vários arquivos executáveis têm vulnerabilidades específicas para a versão do sistema operacional, por exemplo.

Num mundo ideal, você deveria passar todos os pacotes instalados pelo menos pelo searchsploit. Na prática, isso deve ser feito com programas mais populares como o sudo. Também sempre há a opção de utilizar e apoiar o desenvolvimento de ferramentas automatizadas que destaque os arquivos executáveis de interesse, sob a perspectiva de elevação de privilégios, com bits suid/sgid definidos. Farei uma lista dessas ferramentas na seção correspondente do artigo.

Scripts graváveis disponíveis, executados pelo Cron ou Init, no contexto do Root

As tarefas cron podem ser executadas no contexto de vários usuários, incluindo o root. Se uma tarefa cron estiver definida com um link para um arquivo executável, e ele estiver disponível para você gravar, pode ser facilmente substituído por um arquivo malicioso e executar a elevação de privilégios. Além disso, por padrão, os arquivos com tarefas cron estão disponíveis para leitura para qualquer usuário.

ls -la /etc/cron.d  # mostrar tarefas cron 

A situação é semelhante com init. A diferença é que as tarefas no cron são executadas periodicamente, enquanto no init — na inicialização do sistema. Para a exploração, será necessária a reinicialização do sistema, e alguns serviços podem não ser iniciados (se não estiverem configurados para inicialização automática).

ls -la /etc/init.d/  # mostrar scripts de inicialização 

Também é possível procurar arquivos que qualquer usuário possa gravar.

find / -perm -2 -type f 2>/dev/null # encontrar arquivos graváveis por todos

O método é bastante conhecido, administradores de sistema experientes utilizam cuidadosamente o comando chmod. No entanto, na maioria dos manuais disponíveis na Internet, é descrita a configuração de permissões máximas. A abordagem de administradores de sistema inexperientes de "apenas fazer funcionar" cria oportunidades para elevação de privilégios. Se possível, é melhor procurar no histórico de comandos o uso inseguro do chmod.

chmod +w /path 
chmod 777 /path

Acessando o shell de outros usuários

Vamos olhar a lista de usuários em /etc/passwd. Preste atenção naqueles que têm shell. Podemos tentar forçar esses usuários — não é impossível que através do usuário obtido, conseguiremos eventualmente elevar privilégios.

Para aumentar a segurança, recomendo sempre seguir o princípio do menor privilégio. Também vale a pena dedicar algum tempo a verificar configurações inseguras que possam ter permanecido após a solução de problemas — isso é uma "dívida técnica" do administrador de sistema.

Código personalizado

É importante olhar com atenção para os arquivos executáveis no diretório pessoal do usuário e do servidor web (/var/www/, se não for especificado outro). Esses arquivos podem ser uma solução completamente insegura e conter gambiarras inacreditáveis. Claro, se você tiver algum framework no diretório do servidor web, não faz sentido procurar nele por zero-day durante um pentest, no entanto, é recomendável encontrar e estudar as personalizações, plugins e componentes.

Para aumentar a segurança, é melhor evitar o uso de credenciais em scripts personalizados, bem como funcionalidades potencialmente perigosas, como a leitura de /etc/shadow ou manipulações com id_rsa.

Elevação de privilégios através da exploração de vulnerabilidades

Antes de tentar elevar privilégios através da exploração, é importante entender a transferência de arquivos para o host alvo. Além dos meios habituais como ssh, ftp, http (wget, curl), existe um "zoológico" de possibilidades.

Para aumentar a segurança do sistema, atualize-o regularmente para as versões estáveis versões, e tente utilizar distribuições voltadas para Enterprise. Caso contrário, raramente, mas existem situações em que o apt upgrade torna o sistema inoperante.

Exploitação de serviços executados no contexto do usuário root

Alguns serviços Linux funcionam sob o usuário privilegiado root. Você pode encontrá-los usando o comando ps aux | grep root. Nesse caso, o serviço pode não ser anunciado na rede e estar disponível apenas localmente. Se tiver exploits públicos, pode-se aplicá-los sem hesitação: a falha do serviço em caso de erro é muito menos crítica do que a falha do sistema operacional.

ps -aux | grep root # Linux

O melhor cenário seria o funcionamento de um serviço comprometido no contexto do usuário root. A exploração do serviço SMB fornece acesso privilegiado SYSTEM em sistemas Windows (por exemplo, através do ms17-010). No entanto, em sistemas Linux, isso ocorre raramente, por isso é possível gastar bastante tempo elevando privilégios.

Exploitação de vulnerabilidades do núcleo Linux

Este é o caminho a ser seguido por último. A exploração malsucedida pode levar à queda do sistema e, em caso de reinicialização, alguns serviços (incluindo aqueles através dos quais foi obtido o shell inicial) podem não inicializar. Às vezes, o administrador simplesmente esquece de aplicar o comando systemctl enable. Além disso, isso gerará muita insatisfação com seu trabalho, se a exploração não foi acordada.
Se você decidiu usar os códigos-fonte do exploitdb, leia os comentários no início do script. Além do mais, eles geralmente dizem como compilar corretamente este exploit. Se você não tem paciência ou precisava disso 'ontem', pode procurar repositórios com exploits já compilados, por exemplo. No entanto, deve-se entender que, nesse caso, você receberá um gato em uma bolsa. Por outro lado, se o programador entendesse até o byte como o computador e o software que utiliza funcionam, ele não teria escrito uma linha de código em toda a sua vida.

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

Metasploit

Para capturar e manipular uma conexão, é sempre melhor usar o módulo exploit/multi/handler. O principal é definir o payload correto, como generic/shell/reverse_tcp ou generic/shell/bind_tcp. O shell obtido no Metasploit pode ser melhorado até o Meterpreter usando o módulo post/multi/manage/shell_to_meterpreter. Com o Meterpreter, você pode automatizar o processo de pós-exploração. Por exemplo, o módulo post/multi/recon/local_exploit_suggester verifica a plataforma, arquitetura e entidades necessárias para a exploração e sugere módulos do Metasploit para elevação de privilégios no sistema-alvo. Graças ao Meterpreter, a elevação de privilégios às vezes se resume a executar o módulo certo, mas hackear sem entender o que está acontecendo por trás não é 'real' (você ainda precisa escrever o relatório).

Ferramentas

As ferramentas de automação para coleta local de informações economizarão muito esforço e tempo, no entanto, por si só, elas não conseguem identificar completamente o caminho para a elevação de privilégios, especialmente no caso de exploração de vulnerabilidades no kernel. As ferramentas de automação executarão todos os comandos necessários para coletar informações sobre o sistema, mas também é importante saber analisadas os dados obtidos. Espero que meu artigo seja útil para você. Claro, existem muito mais ferramentas do que as que irei listar aqui, mas todas fazem essencialmente a mesma coisa — aqui, é mais uma questão de gosto.

Linpeas

Uma ferramenta relativamente nova, o primeiro commit data de janeiro de 2019. Atualmente, é minha ferramenta favorita. A essência é que ela destaca os vetores de elevação de privilégios mais interessantes. Concorda que é mais conveniente receber uma avaliação especializada nesse nível do que analisar dados brutos monolíticos?

LinEnum

Minha segunda ferramenta favorita, também coleta e organiza os dados obtidos a partir da enumeração local.

Linux-exploit-suggester (1,2)

Esse exploit analisará o sistema em busca de condições adequadas para exploits. Essencialmente, fará o trabalho idêntico ao módulo local_exploit_suggester do Metasploit, mas oferecerá não módulos do Metasploit, e sim links para os códigos fonte no exploit-db.

Linuxprivchecker

Este script coletará e organizará em seções uma grande quantidade de informações que podem ser úteis para formular um vetor de elevação de privilégios.

Em outra ocasião, detalharei a elevação de privilégios no sistema operacional Linux através de suid/sgid.

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster