[ Server Pwnage ]
Descrição: Seu objetivo é capturar a bandeira no Servidor da Empresa XYZ, disponível em http://pwnage.ctf-br.org. Caso consiga, submeta a flag para contato@ctf-br.org. É proibido utilizar técnicas que deixam o sistema indisponível, e o primeiro a submeter será o vencedor e ganhará a premiação: Curso da Clavis de Auditoria Web. Boa sorte a todos! 🙂
Server: pwnage.ctf-br.org
Acessamos a página da Empresa XYZ (http://pwnage.ctf-br.org/) e analisamos seu código-fonte:
Conteúdo do index.html:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<!doctype html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>Empresa XYZ</title> </head> <!-- Decepcionado? --> <!-- Desculpe, não temos skillz web =( LOL --> <!-- Pode nao parecer, mas esse site vende autopeças! --> <body background="includes/layout.png" style="background-repeat: no-repeat"> </body> </html> |
Decepcionados? Não, pois sabemos que estas skillz web foram aplicadas para nos enganar. Além da imagem de plano de fundo (includes/layout.png) o site aparentemente não nos oferece mais nada.
Nenhum dos botões da página funcionavam (ex: A Empresa, Nossa Localização, Produtos, etc…), então perdemos algum tempo rodando ferramentas como Dir Buster e Nikto apenas para descobrir outros diretórios existentes na aplicação e encontramos a página de Produtos – http://pwnage.ctf-br.org/produtos. Então a XYZ realmente vende autopeças! o/
Cada um dos produtos era acompanhado por um link “Ver detalhes”, que informava o ID do referido produto (figura abaixo). Então resolvemos testar se esta aplicação era vulnerável a SQL Injection. Utilizamos o sqlmap para realizar os testes na URL a seguir: http://pwnage.ctf-br.org/produtos.php?id=1.
O sqlmap informou que o parâmetro ID era vulnerável, então realizamos um dump completo da base TECLAND:
Ainda utilizando o sqlmap, obtivemos acesso às páginas produtos.php e index.php. Através da página produtos.php, ilustrada a seguir, aprendemos as credenciais utilizadas para conexão com o banco de dados e também como a consulta é construída pela aplicação.
A página index.php é mais interessante, pois descobrimos a existência da variável page que após algumas validações é incluída (linha 18), sabendo disto começamos a pesquisar pela vulnerabilidade de LFI (Local File Inclusion).
Utilizando o parâmetro page, conseguimos explorar a falha de LFI e listar o conteúdo do arquivo passwd. Então descobrimos que o hash da senha do usuário bduser estava na tabela usuários, conforme observado a seguir:
1 |
bduser:x:1001:1001:BD User,,,:/home/bduser:/bin/bash |
Conteúdo da tabela usuarios:
Quebramos o hash do usuário bduser e obtivemos nossa primeira shell no servidor, utilizando as credenciais bduser / ltVZBi1303 para nos conectar via SSH. o/!
OBS: inicialmente nós acessamos o servidor através da porta 22/tcp (SSH). Porém este não era o único serviço SSH disponível na máquina, conforme exibido na figura a seguir:
Demoramos um bom algum tempo até perceber que na verdade havíamos conectado em um Honey Pot. O que estranhamos foi o hostname da máquina que era exibido como ‘servidor-xyz’ e não ‘ubuntu’-512mb-nyc2-01’, conforme informado inicialmente pelo sqlmap. O shell também parecia muito limitado e então percebemos que havíamos sido enganados! >:\ Listamos novamente o conteúdo do arquivo /etc/passwd e para nossa surpresa o bduser não estava mais lá:
Nesta hora lembramos que existia outro serviço SSH em execução na porta 31337/tcp, que coincidentemente era o ID do usuário bduser no banco de dados (vide imagem da tabela usuarios, acima).
Quando conectamos utilizando as credenciais do bduser e porta 31337 fomos recebidos com o banner a seguir:
A partir daí, começamos nossa jornada para escalar privilégios e obter acesso root no servidor do desafio. Tentamos alguns exploits e tivemos sucesso na tentativa de um exploit local para a versão 2.6.39 do kernel:
Compilamos e executamos o exploit no servidor para obter nossa root shell! Sucesso! \o/
No diretório /root/ reparamos que havia um diretório muito suspeito dentro de Documents cujo nome era “…” (três pontos, ou reticências). Neste diretório encontramos um arquivo .wav que possuía uma estranha mensagem.
1 |
scp root@pwnage.ctf-br.org:/root/Documents/.../.morgan\ -\ Conversation.wav . |
Abrimos este arquivo no Audacity e primeiro revertemos o áudio (pois ele soava como se houvesse sido gravado de trás para frente) e em seguida removemos o ruído (remove white-noise).
Após ouvir dezenas de milhares de vezes e solicitar ajuda universitária para entender melhor o conteúdo da mensagem, pudemos definir que a mensagem dizia:
1 |
"remember the key that we talked the other day? it's in a zip file on the filesystem called morgan dot tar dot gz dot gpg and the password is *COMPANY's FONE*" |
Então realizamos uma busca e encontramos o arquivo /etc/skynet/morgan.tar.gz.gpg. Utilizamos o comando gpg -d morgan.tar.gz.gpg -o morgan.tar.gz e informamos o telefone da companhia como senha (+55 49 31337-1337).
O arquivo obtido, morgan.tar.gz, não era realmente um arquivo gzip, conforme a saída do comando file:
Como se tratava de um arquivo KGB, nós precisamos instalar o KGB archiver para conseguir extrair o arquivo 0aee0202.elt e chegar mais perto da solução do desafio…
Começamos a descompactar os arquivos KGB, e reparamos que estávamos novamente lidando com uma mathroshka (:então foi para isto que o Day 1 nos preparou para isso :), que estava alternando entre diversos formatos de arquivos compactados, dentre eles: TAR, GZip, KGB, LHarc e RAR. Para solucionarmos este desafio criamos o script solve.sh:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
#!/bin/bash #set -v #set -x while true; do ARQ=$(ls -1 *elt) #echo "[DEBUG] Arquivo --> $ARQ" #read -p 'Continue?' TIPO=$(file $ARQ | cut -d":" -f2 | cut -d" " -f2) if [ $TIPO == "gzip" ]; then NEW="$ARQ.gz" OLD="$ARQ" mv $OLD $NEW tar zxvf $NEW continue fi if [ $TIPO == "POSIX" ]; then NEW="$ARQ.tar" OLD="$ARQ" mv $OLD $NEW tar xvf $NEW continue fi if [ $TIPO == "RAR" ]; then NEW="$ARQ.rar" OLD="$ARQ" mv $OLD $NEW unrar x $NEW fi if [ $TIPO == "LHa" ] || [ $TIPO == "LHark" ] || [ $TIPO == "LHarc" ]; then OLD="$ARQ" NEW="$ARQ.7z" mv $OLD $NEW 7z x $NEW else OLD="$ARQ" NEW="$ARQ.7z" mv $OLD $NEW 7z x $NEW fi mv $NEW ../bkp/. done |
Após a execução do solve.sh recuperamos um arquivo Flag.odt. Após 8h consecutivas em cima deste challenge, achávamos que havíamos encontrado a flag… #SQN!
Este arquivo nos parabenizava e possuía uma informação codificada que nos informava a senha para acessar o canal #tecland-Yeah:
A senha para acesso ao canal é 3p1c-fl46-15-h3r3.
Após acessarmos o canal com o comando /join #tecland-Yeah 3p1c-fl46-15-h3r3, encontramos uma das flags mais difíceis e desafiadoras desta CPBR9 \o/!
FLAG
7h3_k3y-w45_4ll-7h15_71m3-0n_7h3-r00m_n3x7-d00r.
CRIADO POR
RTFM – Red Team Freakin’ Maniacs
AGRADECIMENTOS
RTFM{ Away, ChOkO, G4mbler e Will } pela persistência na resolução de todos desafios. #gabaritamosFellas!
Todos os responsáveis pelo projeto CTF-BR pela criatividade na criação dos desafios e principalmente por participarem conosco desta CPBR9:
[*] Alisson “gnx_” – CTF-BR;
[*] Bruno “v3ntur4” – CTF-BR;
[*] Dark Shmya – ELT;
[*] Bernardomr – The Goonies;
Todos que organizaram e trabalharam na #CPBR9 mad propz para: Borelli, c0r1ng4 e Gh0St.
Todos patrocinadores, em especial à Clavis e ao Garoa Hacker Clube que descolaram uns prêmios muito legais mesmo!
A todos os velhos e novos membros que participaram local ou remotamente e a todos os membros do Dumont Hackerspace, LampiãoSec e todos os hackerspaces e times de CTF brasileiros ou internacionais!
© 2014 - Todos os Direitos Reservados