Ideias, informações e conhecimentos compartilhados pela equipe
de Investigação, Desenvolvimento e Inovação da BASE4 Security.
O título deste artigo refere-se a “Tantas maneiras de possuir o Dell EMC Networker”. Durante um pentest, esse artigo foi muito útil para nós. Muito obrigado! Recomendamos lê-lo antes de continuar. Em nosso pentest, descobrimos muitas instalações do Networker Client na rede interna. Alguns nos permitiram executar comandos do Networker remotamente. Então tentamos explorar a injeção de comando em “nsrdump”. No entanto, esse comando não foi instalado. Felizmente, “nsr_render_log” estava lá e nos permitiu obter os hashes dos usuários, mas não conseguimos quebrá-los. A exploração via Erlang também não foi possível porque os hosts não estavam executando esse serviço. Portanto, decidimos tentar outros comandos do Networker.
⦁ nsrrcopy arbitrary file upload
Começamos listando os comandos do Networker disponíveis em uma instalação padrão. Um que nos chamou a atenção foi “nsrrcopy”. Talvez porque soe como “Cópia Remota”.
O arquivo “nsrrcopy” é na verdade um script Bash. Em seu código podemos ver que ele executa outro programa chamado “uasm” passando-lhe alguns parâmetros controlados por nós.
Na documentação do “uasm” vemos que sua função é “salvar” e “recuperar” dados do sistema de arquivos. Além disso, diz que pode ser usado de forma semelhante ao comando “tar”.
Por exemplo, para salvar o arquivo “/etc/passwd”, usamos a opção “-s”. Isso cria um fluxo de bytes que é enviado para a saída padrão e redirecionado para o arquivo “stream”.
E, para restaurar o arquivo “/etc/passwd”, usamos a opção “-r”. Isto lê o fluxo de bytes criado anteriormente pela entrada padrão e reconstrói os arquivos. O parâmetro “-iY” serve para sobrescrever arquivos sem aviso prévio.
Em “nsrrcopy” vemos que “uasm” é executado no modo de restauração e sobrescreve os arquivos sem aviso prévio. Adicionalmente vemos que recebe um parâmetro “$1”. Esse parâmetro é opcional e deve ser uma rota. Quando presente, evita que arquivos sejam gravados fora desse caminho. Felizmente, nós o controlamos e se colocarmos “/” podemos escrever em todo o sistema de arquivos.
A ideia é executar “nsrrcopy” de “nsrexec” para fazer upload de arquivos arbitrários para a máquina remota. Mas é claro, “nsrrcopy” (uasm) lê o fluxo de bytes da entrada padrão. Como podemos controlar a entrada padrão do programa remoto? Felizmente, “nsrexec” suporta uma variável de ambiente “STDIN” que permite especificar os dados que serão passados como entrada padrão para o programa remoto.
A dificuldade é que o fluxo de bytes gerado com “uasm” contém muitos bytes nulos e não podemos colocá-lo diretamente em uma variável de ambiente porque seria truncado.
Uma maneira de resolver este problema é usar “netsed” e substituir o valor STDIN diretamente no pacote de rede que é enviado ao host remoto.
Outra forma seria programar um script que fale o protocolo Networker e envie nossa carga diretamente para ele.
⦁ Exploração passo a passo
Criamos nosso script malicioso em “/usr/sbin/nsrwoot”
E damos permissões de execução
Nós empacotamos com “uasm”
Codificamos o fluxo de bytes para passá-lo para “netsed”
Obtemos o seguinte:
Geramos um padrão “AAA…” com o mesmo comprimento de bytes
Configuramos o encaminhamento de porta com socat
Configuramos o redirecionamento e substituição de bytes com netsed
Atribuímos STDIN com o padrão “AAA…”
Executamos “nsrrcopy” no host remoto
Ao final do comando anterior, o script “nsrwoot” terá sido criado no host remoto e podemos executá-lo com “nsrexec”.
⦁ Cronograma de divulgação