Desafios de recrutamento ao Mossad 2018 Parte 1
O mossad, como outras organizações de inteligência no mundo, publica um desafio de vez em quando para recrutar hackers e, como a maioria dos pesquisadores que conhecemos, decidimos mergulhar. Só que desta vez, ao contrário de outras vezes, decidimos publicar um artigo com as soluções..
Este desafio foi resolvido por mim, Roman Zaikin e Dikla Barda pesquisadora na check point.
Pessoalmente, de todos os desafios do mossad que resolvemos este foi o mais interessante até agora.
Durante o artigo, iremos descrever as soluções e a maneira de chegar à solução, em desafios desse tipo é preciso pensar muito fora da caixa e ter experiência em resolver outros desafios não atrapalha, é claro :)
Espero que você goste de ler como nós gostamos de resolver...
O desafio começa no seguinte domínio:
www.r-u-ready.xyz
No domínio, vemos a seguinte imagem:
Para extrair o texto da imagem, usei uma ferramenta chamada OCR, OCR é um acrônimo para Optical Character Recognition e, ao pesquisar este método, é usado para contornar mecanismos fracos de captcha.
Para usar o OCR, copiaremos as partes da imagem usando uma ferramenta de recorte e as salvaremos em arquivos separados.:
Agora vamos carregar os arquivos para um dos sites ocr, ao realizar desvios de captcha você também pode usar o módulo python chamado pytesser.
https://www.onlineocr.net/
O resultado ficará assim:
Você pode ver que alguns caracteres estão faltando e o resultado não é perfeito, mas ao mesmo tempo é melhor do que copiar todos os caracteres por nós mesmos.
Agora vamos organizar o resultado de acordo com a imagem, a primeira parte:
Faremos o mesmo para a segunda parte:
Esses caracteres são, na verdade, uma linguagem de programação chamada brainfuck, uma linguagem de programação bastante simples, geralmente usada para desafios..
Para executar o código, você pode usar o seguinte site:
http://www.bf.doleczek.pl/
Depois de executar o código com a segunda parte, obteremos o resultado xor-with-key:
Se olharmos para a primeira parte podemos ver que há um ponto que se repete várias vezes no código que não aparece na segunda parte do código, na linguagem brainfuck se aparecer isso indica uma impressão do local atual na memória, quando tentamos executar o código não vimos nada, então clicamos Para obter a localização das células de memória no código e aqui está o resultado:
Se pegarmos a dica que obtivemos na segunda parte do código de fazer xor com alguma chave, e o fato de a operação xor ser realizada em 2 valores, concluiremos que está faltando algum valor que provavelmente está na imagem.
Portanto, concluímos que o primeiro valor na operação XOR são as células de memória:
7A 46 5C 53 55 59 03 5A 41 03 06 01 00
Olhamos para a imagem novamente e notamos que há outro texto que se repete várias vezes, então concluímos que o segundo valor que falta é o texto que aparece na imagem:
Israel-is-70
Uma vez que o primeiro valor é um valor hexadecimal, devemos converter o texto em hexadecimal também, isso pode ser feito usando python :
"Israel-is-70".encode("hex")
Obteremos:
49737261656c2d69732d3730
Agora vamos executar xor conforme solicitado pelos redatores do desafio:
hex(0x49737261656c2d69732d3730 ^ 0x7A465C535559035A41030601)
E vamos obter o resultado:
33352e3230352e33322e3131
Vamos converter o resultado de volta para ascii, e assim:
"33352e3230352e33322e3131".decode("hex")
E vamos receber:
35.205.32.11
Se formos para o endereço IP, teremos o seguinte desafio:
part 1
O desafio começa com um site pequeno e simples que contém um total de 2 ações:
- inscrição
- Conectar
Vamos examinar o código-fonte do site, e parece que no final do arquivo temos um link para uma página chamada administration:
Se abrirmos a página, parece que recebemos o código de status 401 que indica que a página existe, mas não temos acesso a ela, então o objetivo é claro!
Temos que chegar a esta página de alguma forma, depois de examinar o site em profundidade parece que além do registro não temos muitas opções.
Durante o processo de registro pode-se perceber que a última opção é muito suspeita, os sites não costumam pedir para inserir uma foto de perfil como um link de um site remoto.
Já nesta parte concluímos que a solução ao desafio provavelmente estará de alguma forma relacionada a este url, selecionamos alguma imagem do Google e clicamos no botão TRY:
https://upload.wikimedia.org/wikipedia/he/1/19/Google_Maps_Icon.png
Ao realizar a operação, pode-se ver no burp suite que por algum motivo o link está codificado com base64
Como a base64 atual termina com padding, no final você pode ver o texto %3D%3D Que é realmente a codificação de Url que o navegador executou. Devemos primeiro abrir a codificação de url e só então abrir a base64 para fazer isso facilmente
Selecionamos o texto e pressionamos ctrl + shift + u no qual estamos realizando a decodificação de url e o resultado ficará assim:
aHR0cHM6Ly91cGxvYWQud2lraW1lZGlhLm9yZy93aWtpcGVkaWEvaGUvMS8xOS9Hb29nbGVfTWFwc19JY29uLnBuZw==
Agora marque o texto novamente e pressione ctrl + shift + b ele executa a decodificação base64 e o resultado ficará assim:
Em princípio, ao desenvolver um site, não há razão para codificar base64 para url, então algo é muito suspeito sobre este aplicativo, para continuar pesquisando pressione ctrl + r para movê-lo para-repeater.
Se voltarmos ao sistema, parece que a imagem foi carregada e está no caminho /profilePics/[code].
Tentar entrar em contato com este endereço diretamente irá apresentá-lo Nothing there:
Isso ocorre porque o conteúdo do cookie também deve ser substituído na resposta do upload do arquivo, se você prestar atenção ao enviar o arquivo recebemos do servidor um set-cookie geralmente quando se recebe um set-cookie ele não está lá para nada, ele precisa ser usado para algo.
Até agora, aprendemos a enviar uma imagem no formato base64 e acessá-la, a próxima etapa é fazer uma tentativa de pedido local aos arquivo do lado do servidor, referindo-se ao file assim:
file:///var/www/register.php
Antes de enviá-lo para o servidor, vamos converter a informação para base64 usando ctrl + b e envia-lo:
O lado do servidor nos retorna que não é possível entrar em contato com o endereço porque a extensão não é .png, vamos tentar contornar isso usando byte nulo assim:
file:///var/www/register.php%00.png
E bingo, o servidor carregou o arquivo:
Agora vamos nos voltar para o arquivo acessando o arquivo register.php e atualizar o cookie:
Parece que conseguimos acessar o arquivo, mas não parece haver nada de interessante neste arquivo, então tentamos acessar o arquivo login.php e o resultado foi:
Você pode ver que no arquivo login.php há uma verificação se você está contatando o usuário administrador e se você está vindo do endereço IP 127.0.0.1.
Deve-se levar em consideração que a solicitação é feita pelo servidor, assim não há nenhum impedimento para que ele faça a solicitação para o endereço:
http://127.0.0.1/
E ao enviar o usuário admin pode ser visto de acordo com o código que revelamos que ao lado do servidor anexa ao parâmetro user_name, com base nas informações que recebemos do arquivo faremos a seguinte solicitação:
http://127.0.0.1/login.php?user_name=admin%00.png
E obteremos o cookie chState como antes, agora usaremos o cookie para fazer um pedido a administrations, no qual não conseguimos pedir antes e obteremos:
http://127.0.0.1/administration%00.png
Se abrirmos a página como antes, obteremos:
Se abrirmos a página em um navegador e clicarmos no link, passaremos para o próximo desafio:
Continua na segunda parte Para a segunda parte da solução