NahamCon CTF 2022

Olá, entre os dias 28/04 e 30/04 eu e meus amigos jogamos o NahamCon CTF 2022, conseguimos uma boa pontuação e resolvemos alguns desafios interessantes.

Abaixo, estão write-ups de alguns desafios que resolvi, espero que gostem!

Gossip

Gossip era um desafio de Privilege Escalation, em que o acesso à maquina nos era fornecido via SSH, e com isso, era necessário escalar para o usuário root.

Inicialmente, tenho acesso ao usuário user, e antes de realizar o download de qualquer script para escalação de privilégios, como o LinPeas, realizo uma enumeração manualmente, buscando por vetores comuns de exploração.

Depois de constatar que o comando sudo não estava presente na máquina, faço a busca por binários que possuam a permissão de SUID. Basicamente, quando é habilitado a "propriedade" SUID em um arquivo executável, é possível que qualquer usuário na máquina possa executar um arquivo como se fosse o dono do programa.

Por padrão, há alguns binários no Linux que apresentam essa permissão, porém, não são vetores para uma possível escalação de privilégio. Mas, o executável dialog me chamou atenção, pois não é comum que ele tenha o SUID habilitado.

Pesquisando no site GTFOBins, pesquiso pelo nome do comando, e vejo que com o binário dialog é possível ler arquivos do sistema. Como o proprietário do executável é o usuário root e ele possui o SUID habilitado, dessa forma, posso ler arquivos do sistema com permissão privilegiada.

Inicialmente, logo pensei em tentar ler o arquivo de flag presente no /root, mas lembrei que na descrição do desafio, o autor já havia comunicado que o arquivo da flag não está em /root/flag.txt e com isso devemos de alguma forma, conseguir uma shell como root, para assim, procurar pela flag.

Primeira coisa que pensei foi tentar ler o arquivo /root/.ssh/id_rsa, o qual contém a chave SSH do usuário root, e funcionou! Agora, basta copiar a chave para minha máquina e realizar o login.

E é isso!! Estou como usuário root, agora basta procurar pela flag.

Listando os diretórios e arquivos, havia um binário get_flag, então basta executá-lo e a flag é retornada! :)

Deafcon

Deafcon era um desafio Web, classificado como hard e teve apenas 45 resoluções.

Inicialmente, temos a pequena descrição do site, o qual permite você ganhar um ingresso gratuitamente para uma conferência de cibersegurança, a Deafcon.

Inserindo meu nome e e-mail, é gerado um PDF com algumas informações sobre o evento e também meus dados.

Testando uma simples payload de SSTI (Server-Side Template Injection), é possível verificar que a aplicação está vulnerável. Logo, "apenas" basta colocar uma payload que permite executar comandos na máquina e ler a flag.

Mas, como esperado, não seria tão fácil assim. Testei a payload abaixo que permite executar comandos na máquina, e o servidor retornou com um erro, informando que a utilização de '()' não é permitida.

{{cycler.__init__.__globals__.os.popen('id').read()}}

Depois disso, passei um bom tempo pesquisando formas de realizar o bypass, e encontrei algo interessante.

Há algumas outras formas de representar os parêntesis, nesse caso, utilizando UTF-8 Full-Width characters. O bypass acontece porque o filtro aplicado no front-end não reconhece %EF%BC%88 como um "(", mas o Jinja2 (template utilizada na aplicação) realiza a decodificação e o código é executado.

Link do site explicitado acima:

Unicode/UTF-8-character table - starting from code position FF00

{{cycler.__init__.__globals__.os.popen%EF%BC%88'id'%EF%BC%89.read%EF%BC%88%EF%BC%89}}

Com a payload acima, consegui executar o comando id e para ler a flag, é necessário utilizar o comando cat${IFS}flag.txt, a fim de realizar bypass na proteção contra utilização de espaços.

{{cycler.__init__.__globals__.os.popen%EF%BC%88'cat${IFS}flag.txt'%EF%BC%89.read%EF%BC%88%EF%BC%89}}

Para questão de curiosidade, as payloads acima já decodificadas pelo navegador, ficam assim:

{{cycler.__init__.__globals__.os.popen('id').read()}}

Pode-se perceber que há um pequeno espaço entre o parêntesis e o caractere ao lado.

Foi isso, muito obrigado a todos que leram o conteúdo e até a próxima!!

Last updated