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

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.

Partes passadas: parte 1 , parte 2 e parte 3 .

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 22


Após analisar o código fonte, fica claro que veremos a senha se o parâmetro revelio GET não estiver vazio.

imagem

Mas, na primeira verificação, se a sessão de administrador não estiver instalada, somos redirecionados para esta página sem parâmetros.

imagem

Você só precisa usar o agente da Web e não um navegador, por exemplo, curl.

imagem

imagem

Tiramos a senha.

nível 23


Analisamos o código fonte. A função strstr (s1, s2) retorna uma substring de s1 que começa com s2. O php também lança tipos automaticamente. Ou seja, ao compará-lo, ele levará a string a um número e descartará caracteres extras.

imagem

A string "11iloveyou" será adequada para nossa condição. Na primeira verificação, ele retorna "iloveyou", ou seja, True. Na segunda verificação, 11> 10, ou seja, True.

imagem

nível 24


Este nível também contém um erro lógico. A condição é verdadeira de qualquer maneira, se strcmp retornar FALSE. Mas o strcmp retornará FALSE, mesmo em caso de erro.

imagem

Embora o php projete tipos automaticamente, ele não é capaz de converter um array em uma string. Para fazer isso, abra o código fonte da página e altere o nome do campo de "passwd" para "passwd []".

imagem

Nós enviamos qualquer linha.

imagem

Tiramos a senha.

nível 25


Ao analisar o código-fonte, o mais interessante é a função logRequest (), que processa os campos que o usuário pode controlar. Este é o cabeçalho HTTP do User_Agent e o cookie session_id.

imagem

imagem

imagem

Vale a pena considerar que todas as seqüências “../” são excluídas da string, mas isso pode ser feito por: “... /. /” => “../”.

Idéia da solução: Como o caminho para registrar logs depende do session_id, que podemos controlar, e escolhendo o idioma de exibição, o caminho no servidor é selecionado - devido ao LFI, podemos ler o arquivo de log.

imagem

imagem

imagem

imagem

Agora resta escrever a senha de / etc / natas_webpass / natas26 em nosso arquivo de log. Como nosso agente da Web é gravado primeiro e depois gerado a partir do arquivo, adicionaremos o código php a esse campo.

imagem

imagem

Nós obtemos a senha.

nível 26


Neste exemplo, há uma vulnerabilidade muito séria - a desserialização não filtrada de objetos. A função unserialize () pega uma variável serializada e a converte novamente em um objeto PHP.

imagem

O valor convertido é retornado, que pode ser inteiro, flutuante, sequência, matriz ou objeto. I.e. Você pode executar qualquer código. A classe Logger, quando criada, grava certas informações no arquivo.

imagem

A ideia é a seguinte:

  1. Reescreva a classe Logger, onde, em vez de uma das mensagens, estará contido um código php que produzirá uma senha.
  2. Codifique-o em Base64.
  3. Cole no cookie.
  4. Acesse o arquivo de log.
  5. Tire a senha.

<?php class Logger{ private $logFile; private $initMsg; private $exitMsg; function __construct($file){ $this->initMsg="<? passthru('cat /etc/natas_webpass/natas27'); ?>"; $this->exitMsg="<? passthru('cat /etc/natas_webpass/natas27'); ?>"; $this->logFile = "img/phpobjinj.php"; } function log($msg){ ; } function __destruct(){ ; } } $obj = new Logger("obj"); echo urlencode(base64_encode(serialize($obj))); ?> 

imagem

imagem

imagem

Nós obtemos a senha.

nível 27


Este serviço fornece dados do usuário. Mas se o usuário não existir, ele o cria com o nome de usuário e senha especificados.

imagem

O problema é que, após a criação do usuário, o serviço não verifica sua senha no login. Ao mesmo tempo, apenas os primeiros 64 caracteres do logon e senha após a filtragem caem no banco de dados. Além disso, sabemos o nome de usuário: natas28.

imagem

Crie um usuário com uma senha e um nome vazios: "natas28_60-spaces_ any-character". (Portanto, durante a verificação, não haverá correspondência com o usuário natas28, mas durante a criação, ele será filtrado e adicionado ao banco de dados. Ou seja, a senha não será verificada na próxima chamada).

imagem

imagem

Nós usamos o nome natas28 e uma senha vazia. Nós obtemos os dados do usuário natas28.

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

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


All Articles