Descobrir a origem real da solicitação

CibersegurançaBeginner
Pratique Agora

Introdução

Uma loja importa imagens de produtos de um catálogo preparado. Seu navegador pede a uma aplicação que busque uma imagem; essa aplicação tem acesso de rede que o comprador não possui. Você acompanhará a solicitação real e examinará um registro interno inofensivo para entender a falsificação de solicitações do servidor (SSRF).

Use somente as URLs de treinamento fornecidas. Organizações e dados internos são sintéticos. Basta ter familiaridade básica com o terminal: HTTP, campos de URL, papéis de rede e redirecionamentos são explicados aqui. Os contêineres têm espaços de nomes de rede separados e compartilham o kernel de uma instância.

Importar uma imagem comum de produto

Nesta etapa, importe uma imagem real e identifique o servidor que a buscou. Mude para a aba Image Importer. O formulário envia uma URL ao App, o servidor do recurso de imagens. Uma URL é um endereço: http é o protocolo (esquema), catalog.test é o nome de host, 8000 é a porta de escuta e /leaf.png é o caminho do recurso.

Selecione a aba Image Importer na interface do laboratório para começar esta etapa.

Mantenha Image URL em http://catalog.test:8000/leaf.png e Import slot em normal. Clique em Import image. A página Import result mostra o status HTTP real e um objeto JSON, uma resposta composta de campos nomeados. Procure content_type: image/png e um hash, uma impressão digital dos bytes obtidos. O campo body contém os bytes codificados da imagem; você não precisa editar nem decodificar esse campo.

Image Importer exibindo o status real da busca e os campos da resposta

Selecione Back to Image Importer na mesma aba (ou use o botão Voltar do navegador) e atualize a página. Uma imagem verde deve aparecer em Imported responses. Caso contrário, confira a URL e a grafia do slot e envie novamente.

Image Importer mostrando a imagem real importada pelo App

Mude para a aba Workstation, o terminal do contêiner cliente. O programa preparado imagectl.py envia solicitações ao App; python3 executa o programa. show normal lê a importação existente sem buscar novamente:

Mude para a aba Workstation antes de executar o comando a seguir.

python3 imagectl.py show normal

Procure HTTP 200, session: learner-c08 e PNG image content. HTTP é um protocolo de solicitação/resposta; 200 significa sucesso. Leia agora os registros reais do Catalog:

python3 imagectl.py requests

Cada registro contém o endereço client e o path solicitado. Catalog viu o endereço do App na rede do catálogo, não Workstation nem seu navegador. App fez a solicitação de saída. O endereço variável é uma evidência do serviço, não um valor para memorizar. Mude para a aba Topology para comparar as conexões de rede configuradas e a verificação ao vivo da saúde do consumidor interno.

Topology mostrando os papéis de rede configurados e a saúde observada do consumidor

Comparar a conectividade do cliente e do servidor

Nesta etapa, obtenha apenas o estado interno de estoque preparado por meio do App. Um serviço interno está em uma rede reservada aos componentes da aplicação. Workstation pertence à rede frontal; App também pertence à interna. localhost sempre significa o ambiente que executa o comando: o loopback de Workstation não é o do App.

Selecione a aba Workstation na interface do laboratório para começar esta etapa.

Tente uma solicitação direta de Workstation. A ferramenta mostra falhas esperadas sem interromper o shell:

Mude para a aba Workstation antes de executar o comando a seguir.

python3 imagectl.py direct http://internal.test:8000/status

Espere UNREACHABLE from Workstation. Esse nome de host não está disponível nesse contêiner. As redes também isolam o endereço subjacente; não falta apenas o nome. Peça agora ao App que busque o mesmo recurso. fetch realiza uma importação, e o último argumento define o slot da resposta armazenada:

python3 imagectl.py fetch http://internal.test:8000/status internal

Espere HTTP 200 e um corpo JSON com service: inventory, status: synthetic-ready e um training_id variável. Leia a resposta importada novamente:

python3 imagectl.py show internal

O registro pertence a learner-c08. Isso é SSRF: uma entrada controlada pelo cliente faz o servidor usar seu próprio acesso de rede. Workstation não recebeu uma nova conexão de rede. Se aparecer no import, repita usando o slot internal; só importa o registro sintético da VM atual.

Nesta etapa, descubra por que verificar apenas o primeiro destino pode ser insuficiente. Um redirecionamento é uma resposta HTTP que indica ao cliente outra URL. A rota /redirect do Catalog retorna 302 com um Location apontando para o mesmo serviço sintético de estoque. O App vulnerável segue automaticamente.

Selecione a aba Workstation na interface do laboratório para começar esta etapa.

Na aba Workstation, importe essa rota preparada em um slot separado:

Mude para a aba Workstation antes de executar o comando a seguir.

python3 imagectl.py fetch http://catalog.test:8000/redirect redirect

O campo url indica Catalog, mas final_url indica Internal. O corpo é o estado sintético atual do estoque, não uma imagem. Examine a resposta salva e o registro do Catalog:

python3 imagectl.py show redirect
python3 imagectl.py requests

Catalog registrou /redirect; depois App usou sua outra rede para buscar Internal. Um host inicial confiável não torna o próximo destino confiável. O próximo laboratório começa de forma independente e corrige a escolha de destinos e o acompanhamento de redirecionamentos. Este exercício controlado não testa mudanças hostis de DNS, fontes arbitrárias de imagens da Internet nem codificações alternativas de endereços.

Resumo

Você importou uma imagem real, comparou a conectividade do cliente e do servidor e examinou uma resposta realmente redirecionada. Os dados internos eram sintéticos; as solicitações de rede foram reais.