MonitorsTwo é uma máquina Linux de dificuldade fácil. Nela é preciso abusar de uma vulnerabilidade da aplicação Cacti para obter acesso como www-data em um docker, quebrar um hash para conseguir acesso de usuário na máquina host e por fim utilizar uma vulnerabilidade do Moby para executar um binário do container no host para conseguir root.

MonitorsTwo Banner


Com um scan do nmap encontra-se duas portas abertas nessa máquina, 80 de uma aplicação web e 22 de ssh.

Nmap

Acessando a aplicação web encontrei uma página de login para o Cacti na versão 1.2.22. Essa versão pussui vulnerabilidade de Remote Code Execution (RCE), e há exploits públicos e um módulo no Metasploit.

Cacti

Para explorar essa vulnerabilidade eu utilizei o exploit que tem no exploit-db escrito por Riadh Bouchahoua, pode ser acessado nesse link. Porém para esse exploit funcionar deve ser feito uma alteração, onde está ’local_cacti_ip = self.url.split("//")[1].split("/")[0]’ deve ser alterado para ’local_cacti_ip = “127.0.0.1”'.

...
    def exploit(self):
        # local_cacti_ip  = self.url.split("//")[1].split("/")[0]
        local_cacti_ip  = "127.0.0.1"
        headers = {
            'X-Forwarded-For': f'{local_cacti_ip}'
        }
...

Assim, ao executar o exploit, consegui acesso como usuário www-data dentro de um container docker.

www-data

O binário capsh possui permissão de SUID que podemos utilizar para obter acesso de root nesse docker com o comando abaixo.

capsh --gid=0 --uid=0 --

No diretório raiz do docker há um arquivo chamado entrypoint.sh que possui o login e senha para o banco de dados.

entrypoint.sh

Utilizando essas credenciais pude executar consultas ao banco de dados que tem uma tabela com hashes de senhas de usuários.

user_auth

Os hashes foram produzidos utilizando o algoritmo bcrypt e o do usuário marcus pode ser quebrado com o uso do hashcat.

hashcat -a 0 -m 3200 hash /usr/share/wordlists/rockyou.txt

hashcat

Com essa senha que consegui pude, então, entrar na máquina fora do Docker a partir de SSH e na home do marcus está a primeira flag.

marcus

Ao logar pelo SSH é falado que o marcus possui um email, olhando no /var/mail/marcus é possível ler o email que destaca 3 vulnerabilidades da máquina.

marcus

A terceira vulnerabilidade que está no email, o CVE-2021-41091, pode ser utilizada para fazer o escalonamento de privilégio para root na máquina host. Para isso é preciso voltar ao Docker, como já possuímos privilégio de root lá, daremos privilégio de SUID ao /bin/bash.

chmod u+s /bin/bash

Há um mount do host com o bocker no diretório /var/lib/docker/overlay2/c41d5854e43bd996e128d647cb526b73d04c9ad6325201c85f73fdba372cb2f1/merged, a partir dele podemos acessar e executar os binários do docker.

Esse diretório merged é a mistura do conteúdo da imagem do docker com o container que está sendo executado. O que foi alterado no container em execução com relação a imagem original está salvo na pasta diff. Como alteramos o /bin/bash para ter permissão de SUID, esse binário estará na pasta merged e na diff.

merged overlay

mount

Podemos ver que o bash com SUID está realmente no diretório diff. Por fim, ao executá-lo obtemos root na máquina host e temos acesso a flag.

mount