VulnHub Zeus:1 (Walkthrough)

Hoje apresento uma máquina virtual que quebrou a cabeça de muitos jogadores de CTF. Zeus é uma VM construída para níveis um pouco mais complexos de exploração, estando entre intermediário e avançado. Esta máquina está disponível no VulnHub e foi criada por Vasile Revnic e o objetivo final é ler as flags “user.txt” e “root.txt”.

Para mais informações e download desta VM, acesse o link abaixo:

Level: Intermediate
VM Alvo: Zeus:1
VM Atacante: Kali Linux 2019.2

So… Let’s go guys!! ( ဖ‿ဖ)人(စ‿စ )

Configuração do Laboratório no VMware

O autor informou que esta máquina foi testada no VMware e que está com IP estático para sub-rede 192.168.131.0/24. Sabendo destas informações, precisamos configurar tanto o VMware quanto nossa máquina atacante (Kali Linux).

Em sua máquina real (hospedeiro), abra as configuração de redes virtuais do VMware: Virtual Network Editor.

Das opções de redes, selecione o tipo “host-only” (se não existir, adicione uma rede) e altere as configurações, seguindo o indicado na imagem:

Para que seja possível as máquinas “se enxergarem na rede”, vamos configurar o adaptador de ambas para “host-only”.

Agora é só inicializar cada uma das máquinas virtuais: Kali Linux e Zeus.

Reconhecimento / Enumeração

Como já sabemos o endereço IP da VM alvo, não é necessário realizar o processo de “host-discovery”. Com o Nmap, vamos enumerar as portas e serviços e, possivelmente encontrar alguma vulnerabilidade:

Observe que neste resultado, há três serviços e portas abertas:

De acorco com o Nmap, é possível acessar o FTP através de login anônimo com usuário “ftp” (ou qualquer outro).

Vamos realizar um teste do serviço de transferência de arquivos (FTP), utilizando um login anônino, neste caso ftp:ftp.

Porém, após o login não conseguimos listar nenhum conteúdo ಠ_ಠ. Neste caso, pode ser necessário utilizar algum outro usuário com permissão de acesso via ftp. A busca com o SearchSploit também não trouxe nenhum resultado para a versão apresentada no banner deste serviço.

Sendo assim, vamos dar continuidade ao processo de enumeração.

Como não possuímos nenhum usuário/credencial desta máquina, não tentaremos ainda acessar o serviço de SSH, restando então, avaliar a aplicação web executando na porta 80.

Podemos acessar e testar através browser ou qualquer outro software de sua preferência (cURL, Burpsuite, etc).

Também é muito indicado avaliar o código-fonte da página em questão.

Infelizmente, além dos diretórios padrões que aparecem no código, não há algo tão útil assim. Portanto, vamos buscar por diretórios e arquivos que possam estar escondidos neste servidor.

(╯°□°)╯︵ ┻━┻

A primeira tentativa foi buscar pelo “/robots.txt”, mas retornou um “404 not found”. Assim, para uma busca rápida, você pode utilizar um software do tipo webcrowler como o Dirb, Gobuster, Dirbuster, DirSearch, etc.

Uma busca básica com Dirb e uma wordlist curta de diretórios, trouxe duas novas pastas ocultas nesta aplicação: “/backups” e “/telecom”.

Assim, vamos tentar acessar o seu conteúdo via browser.

A pasta “/backups” aparentemente não possui nenhum conteúdo (o mesmo resultado no código-fonte). Já a pasta “/telecom”, embora inicialmente não exiba nenhuma informação, seu código-fonte entrega um comentário do desenvolvedor:

Com essa mensagem, podemos então presumir que há um usuário chamado “gogu” nesta máquina ( •_•).

Será algum usuário do FTP ou SSH? ¯\_(ツ)_/¯

Para confirmar se o diretório “/backups” está realmente vazio, você também pode fazer uma outra busca mais profunda, a fim de encotrar arquivos com nomes comuns. Para este procedimento, vamos utilizar o DirSearch.

O resultado desta última busca, trouxe mais um novo arquivo “backups.tar.gz”. Faça o download do mesmo e vamos tentar descompactá-lo.

Observe a imagem acima. Após baixar um arquivo de cerca de 100Mb, e tentar descompactá-lo, nos deparamos com uma mensagem de erro informando que o tipo de arquivo está errado e não se parece com algo “gzip”. Utilizando o comando “file”, faça uma análise deste arquivo e desta forma irá perceber que trata-se de um arquivo com dados encriptados com GnuPG.

Quando tentamos extrair as informações encriptadas deste arquivo, percebemos que exige uma senha para esta ação. Desta forma, vamos continuar buscando por alguma informação que possa ser utilizada, tanto para desencriptar este conteúdo (caso seja necessário), quanto para acessar a conta do usuário “gogu”.

Acesso via SSH

Com o possível nome de usuário que obtemos anteriormente, é possível testar ataques de força bruta nos serviços FTP e SSH. Tentei o ataque de força bruta no FTP, porém não obtive sucesso. Sendo assim, resta o teste com o serviço SSH. Utilizando uma wordlist amplamente conhecida, a boa e velha “rockyou.txt”, conseguimos a senha do usuário “gogu”.

Portanto, com essas credenciais, vamos acessar este servidor através do secure shell.

Perfeito :) pegamos nossa shell!! ᕕ( ᐛ )ᕗ

Linux Restricted Jail Shell

Infelizmente, como nem tudo são flores ლ(ಠ_ಠლ), caimos em uma armadilha de segurança para o SSH.

Agora que temos acesso ao shell, geralmente buscamos por arquivos executáveis SUID e/ou GUID e também por privilégios de SUDO.

Embora a variável PATH esteja configurada para os diretórios padrões dos binários essenciais, não conseguimos executar a maioria dos comandos. Aos poucos, após alguns testes, irá perceber que conseguimos executar: ls, cat, cd, etc…

Após listar arquivos/pastas dos principais diretórios do sistema, percebemos que temos acessa à um número bastante limitado de comandos. Além disso, muitos diretórios também não estão presentes para este ambiente ಥ_ಥ.

Ao ler o conteúdo do arquivo “/etc/passwd”, só há dois usuários para este ambiente: “root” e “gogu”. Mas, após a listagem de diretório “/etc”, descobrimos uma informação muito importante.

O diretório “/etc/jailkit”, indica que estamos dentro um “Jail Shell”, uma configuração de segurança para SSH, SFTP, entre outros e baseada no princípio da mínima segurança e desta forma separar recursos a usuários shell de acordo com suas necessidades, criando um ambiente secundário, aumentando a segurança na disponibilização de acessos remotos à terceiros.

Jailkit é um conjunto de utilitários para limitar as contas de usuário para arquivos específicos usando chroot() e/ou comandos específicos. Configurando um shell chroot, um shell limitado a algum comando específico, ou um daemon dentro de uma jaula, é muito mais fácil e pode ser automatizado usando esses utilitários. Saiba mais acessando o site oficial do Jailkit.

Ao listar o conteúdo do diretório atual, há dois arquivos, um chamado “user.txt” e seu conteúdo é a nossa “primeira flag” e ou outro é um executável chamado “hackme”.

Após alguns testes com binário “hackme”, não parece ter algo de útil e aprovetável no momento. Pode ser apenas um “buraco do coelho”, uma “armadilha(⊙_☉) e ter sido criado apenas para fazer o player perder tempo.

O conteúdo do arquivo “user.txt”, trata-se de uma hash em MD5. Utilizei o site HashKiller e decriptei esta para:

Pode ser alguma senha de acesso (para o usuário root, ou outro usuário), quanto também para aquele arquivo de backup encontrado anteriormente. Após realizar os testes de extração do conteúdo do arquivo de backup e também da tentativa de acesso ao root via SSH, não chegamos à lugar nenhum, seja utilizando a tradução desta hash, seja utilizando o formato em MD5.

Mais uma perda de tempo!! (o・_・)ノ”(ᴗ_ ᴗ。)

Assim, após esgotar as tentativas anteriores, resta-nos continuir procurando por algum arquivo/diretório que possa ser utilizado para escaparmos desta cadeia.

Quando listar recursivamente o conteúdo do diretório do usuário “gogu”, incluindo os arquivos ocultos, você irá perceber uma pasta e um arquivo incomum: “~/…/sysdate

Observe as permissões deste arquivo “/home/gogu/…/sysdate”. Este é um executável SUID, ou seja, possui permissões de execução como super-usuário temporariamente.

Precisamos explorar este executável SUID.

A execução deste arquivo, exibe apenas a data atual do sistema.

Comandos como file, head, tail, strings, entre outros, não estão disponíveis, assim, utilizei o comando cat para tentar ler alguma string aparente deste executável.

Também é possível enviar este arquivo para a nossa máquina atacante (Kali Linux) via SSH e analisar o seu conteúdo, por exemplo, com o comando strings.

Em partes do trecho deste binário, você irá perceber a sintaxe de execução dos comandos “date” e “grep”. Ao que tudo indica, o comando “date” está sendo executado com seu “path” relativo, ou seja, com as informações de caminhos contidas dentro da variável de ambiente PATH.

A manipulação aqui poderá ser feita, alterando a própria variável $PATH local deste usuário e, redirecionar o “sysdate” para outro binário ao qual temos controle, ou seja, ao invés de executar em “/bin/date” ele irá executar “/caminho/date-manipulável”.

Sabemos que é possível manipular a execução do “sysdate” através da variável PATH, podemos realizar um pequeno teste. Os passos são os seguintes:

  • criar um arquivo “date” dentro da pasta do usuário
  • alterar a variável PATH acrescentando o diretório do usuário “gogu” como caminho inicial
  • executar “/home/gogu/…/sysdate”.
Caso necessite alterar a saída do “stdout” se não estiver aparecendo nenhuma informação após a execução de algum comando, acrescente ao final deste, o argumento “1<&2”.

Embora tenhamos conseguido um privilégio de root, ainda estamos presos no “Jail Shell”.

Agora é necessário escapar da prisão!! (👁 ͜ʖ👁)

Linux Restricted Jail Shell (Bypass)

Após umas pesquisas realizadas no “Google” e também com a dica de alguns parceiros, encontrei o seguinte artigo do blog Trips of a curious penguin, datado de 2013:

Há dois exemplos de exploração e fuga da prisão. Utilizei o segundo método apresentado no artigo.

Em outra máquina, que tenha possibilidade de “compilar código C” em arquitetura i386, vamos criar um exploit para sair da jaula.

Há algumas formas disponíveis para enviarmos este arquivo para a máquina alvo. O primeiro método e mais simples é repassar através do “comando ssh” a leitura do arquivo com o “comando cat”. Este método, já foi utilizado anteriormente neste guia:

Origem: VM Kali Linux (atacante)
Destino: VM Zeus (alvo)

Após o upload com sucesso, confira na VM alvo o arquivo e não esqueça de dar permissão de execução.

Com o intuito de apresentar métodos alternativos para transferência de arquivos, encontrei uma outra maneira explorando o binário “cpio”, disponível em “/bin” da VM alvo. Confira esta dica de sintaxe apresentada no blog HardCoder:

Origem: VM Kali Linux (atacante)
Destino: VM Zeus (alvo)

Escape Jail Shell + Privilege Escalation

Iremos utilizar o binário SUID encontrado anteriormente para executar nosso exploit e fugir da prisão.

Alterando o conteúdo de “/home/gogu/date”, tendo em vista que a variável PATH está manipulada e apontando inicialmente para o diretório do atual usuário, vamos carregar o exploit.

Perfeito, escapamos da prisão e também estamos com privilégios do usuário root 。◕‿◕。

Para facilitar a navegação, vamos fazer um “spawning shell” com python:

Encontramos a flag final, o arquivo “root.txt”, conforme indicado pelo autor deste desafio.

Considerações finais

O que houve com o arquivo “backups.tar.gz”??
Você deve estar se perguntado neste momento, o que fazer com o arquivo encriptado com GnuPG que encontramos antes… Então, provavelmente este possível arquivo de backup, foi colocado ali para atrair o jogador à uma armadilha e fazer você, por exemplo, perder muito tempo tentando extraí-lo.

Espero que este artigo tenha contribuído bastante para o seu conhecimento e aprendizado. Os conceitos deste desafio, podem ser encontrados em um ambiente real, por muitos, considerado seguro.

Esta máquina virtual, apresentou alguns conceitos do dia a dia de um teste de invasão, embora não muito tradicional, mas que é possível encontrar, como por exemplo, um ambiente SSH mais seguro utilizando o Jailkit.

Jailkit é conhecido por ser usado em dispositivos de segurança de rede a partir de várias empresas líderes de TI de segurança, servidores de internet de várias grandes organizações empresariais, servidores de internet de provedores de serviços de internet, assim como muitas pequenas empresas e usuários domésticos que precisam garantir cvs, sftp, shell ou processos daemon.

Conhecer estes métodos de segurança e principalmente, as várias maneiras de explorá-lo e burlá-lo, são conhecimentos importantes para um profissional de segurança, principalmente para o time de defesa (Blue Team).

Além disso, a utilização do ChRoot é prevista nas provas da LPI: para aqueles que desejam se preparar para a certificação, fica a dica!!.

Thanks guys!! (❍ᴥ❍ʋ)

Cybersecurity & IT Consultant, Pentester and Writer. Loves: Computer Networking, Programming and Hacking!!

Cybersecurity & IT Consultant, Pentester and Writer. Loves: Computer Networking, Programming and Hacking!!