Rachou! Destaques da KringleCon 5: anéis de ouro

Rachou! Destaques da KringleCon 5: anéis de ouro

O aprendizado encontra a diversão no 2022 SANS Holiday Hack Challenge – prepare-se para um passeio de crackerjack no Pólo Norte enquanto eu frusto o plano sujo de Grinchum e recupero os cinco anéis de ouro

Este é o meu primeiro ano participando do Desafio de hack de férias do SANS E foi uma explosão. Por meio de uma série de 16 desafios que vão do fácil ao difícil, pratiquei a análise de tráfego de rede suspeito e logs do PowerShell, escrevendo Regras Suricata, saindo de um Container Docker, encontrando chaves vazadas para explorar um Pipeline de CI/CD do GitLab e um usuário da AWS, conduzindo Ataques de entidades externas XML, e hackear um contrato inteligente para comprar um token não fungível.

A melhor parte dessa experiência foi que ela me apresentou a novas ferramentas e tecnologias, ampliando ainda mais meu conhecimento de segurança cibernética. Aqui, compartilho alguns destaques da solução dos desafios.

Orientação

Cada participante recebe um avatar para navegar em um ambiente de videogame no navegador definido no Pólo Norte:

Quebrei! Destaques da KringleCon 5: Golden Rings PlatoBlockchain Data Intelligence. Pesquisa vertical. Ai.

Durante a orientação, você recebe uma carteira de criptomoeda que o jogo usa para premiar KringleCoins por completar desafios e que você usa no último desafio para hackear um contrato inteligente. Curiosamente, o jogo acompanha todas as transações KringleCoin em um blockchain Ethereum, o que significa que um registro completo de seu progresso também é armazenado neste blockchain.

Para o primeiro toque do jogo.

1. Anel de Tolkien

Quebrei! Destaques da KringleCon 5: Golden Rings PlatoBlockchain Data Intelligence. Pesquisa vertical. Ai.

Encontrar o anel de Tolkien exigiu flexionar meus músculos de análise de logs.

phishing Wireshark

Primeiro, usei o Wireshark para analisar os dados fornecidos .pcap arquivo que revelou um servidor em adv.epostoday[.]uk baixando o arquivo Ref_Sept24-2020.zip para um computador:

Quebrei! Destaques da KringleCon 5: Golden Rings PlatoBlockchain Data Intelligence. Pesquisa vertical. Ai.

Espiando dentro do arquivo ZIP, encontrei um executável chamado Ref_Sept24-2020.scr que acionou duas detecções no ESET Endpoint Security: BAT/Runner.ES e Generik.TAGTBG. Esse malware eventualmente leva a um executável malicioso em execução na memória chamado config.dll e detectado pela ESET Scanner de Memória Avançado as Win32/Dridex.DD.

Logs de eventos do Windows

Em seguida, analisei os dados fornecidos .evtx arquivo contendo logs do PowerShell com Visualizador de eventos. Embora existam outras ferramentas para analisar os logs do PowerShell, se os invasores souberem como usar binários que vivem fora da terra para permanecer fora do radar, os defensores também devem ser bem versados ​​nas ferramentas nativas fornecidas por um sistema operacional.

Como os logs continham 10,434 eventos, agrupei os eventos por data e, em seguida, executei a ação Localizar para procurar quaisquer eventos contendo o $ personagem. No PowerShell, $ é usado para criar e referenciar variáveis. Encontrei um ataque acontecendo em 24 de dezembro de 2022, quando o invasor executou o seguinte script:

Quebrei! Destaques da KringleCon 5: Golden Rings PlatoBlockchain Data Intelligence. Pesquisa vertical. Ai.

Parece que o invasor encontrou uma receita secreta, trocou o ingrediente secreto de mel para óleo de peixee, em seguida, criou um novo arquivo de receita. Isso acionou um evento com um ID de 4104, que representa a execução de comandos remotos do PowerShell. Portanto, filtrei os eventos por esse ID, ajudando-me a encontrar eventos maliciosos adicionais mais rapidamente.

Regata Suricata

O último exercício para o Tolkien Ring foi escrever quatro regras Suricata para monitorar o tráfego de rede para uma infestação de Dridex:

alert dns $HOME_NET any -> any any (msg:”Pesquisa de DNS ruim conhecida, possível infecção por Dridex”; dns.query; conteúdo:”adv.epostoday.uk”; nocase; sid:1; rev:1;)

alert http 192.185.57.242 any <> any any (msg:”Investigar conexões suspeitas, possível infecção por Dridex”; sid:2; rev:1;)

alert tls any any -> any any (msg:”Investigue certificados inválidos, possível infecção por Dridex”; tls.cert_subject; content:”CN=heardbellith.Icanwepeh.nagoya”; sid:3; rev:1;)

alert http any any -> any any (msg:”Função JavaScript suspeita, possível infecção por Dridex”; file_data; content:”let byteCharacters = atob”; sid:4; rev:1;)

Em ordem, essas regras capturam pesquisas de DNS para adv.epostoday[.]uk, conexões com o endereço IP 192.185.57[.]242, o uso do servidor malicioso hearbellith.Icanwepeh[.]nagoya identificado pelo nome comum (CN) em um certificado TLS e o uso do JavaScript a para B() função para decodificar uma string binária contendo dados codificados em base64 no cliente.

Completar esses três desafios me rendeu o Tolkien Ring:

Quebrei! Destaques da KringleCon 5: Golden Rings PlatoBlockchain Data Intelligence. Pesquisa vertical. Ai.

Para o segundo toque.

2. Anel Élfico

Quebrei! Destaques da KringleCon 5: Golden Rings PlatoBlockchain Data Intelligence. Pesquisa vertical. Ai.

Os desafios mais proeminentes para o Elfen Ring foram Prison Escape e Jolly CI/CD.

Prison Escape

O Prison Escape foi um lembrete severo de que conceder privilégios de root a um usuário em um contêiner Docker é tão bom quanto conceder privilégios de root no sistema host. O desafio era sair do contêiner. Bem, feito facilmente quando você é root:

Quebrei! Destaques da KringleCon 5: Golden Rings PlatoBlockchain Data Intelligence. Pesquisa vertical. Ai.

Como usuário root, listei as tabelas de partição para o dispositivo e, em seguida, montei o sistema de arquivos do host, concedendo-me acesso total ao host. Agora eu poderia procurar a chave, que deve estar localizada no diretório inicial, conforme revelado pelas dicas do jogo:

Quebrei! Destaques da KringleCon 5: Golden Rings PlatoBlockchain Data Intelligence. Pesquisa vertical. Ai.

CI/CD alegre

Embora tenha sido rápido, Jolly CI/CD me levou mais tempo para descobrir. Primeiro, recebemos um repositório Git para clonar por HTTP:

Quebrei! Destaques da KringleCon 5: Golden Rings PlatoBlockchain Data Intelligence. Pesquisa vertical. Ai.

Pela URL, pude ver que o nome do repositório era wordpress.flag.net.internal, então mudei para o repositório e encontrei um site WordPress. Eu verifiquei se o site estava no ar:

Quebrei! Destaques da KringleCon 5: Golden Rings PlatoBlockchain Data Intelligence. Pesquisa vertical. Ai.

Sim, o site era funcional. Eu estava curioso para saber se havia alguma chave vazada no histórico do código-fonte. Se sim, devo ser capaz de enviar edições ao código-fonte. Então eu corri gitlog:

Quebrei! Destaques da KringleCon 5: Golden Rings PlatoBlockchain Data Intelligence. Pesquisa vertical. Ai.

Pelas mensagens de commit, parece um commit foi feito depois de adicionar recursos para corrigir um grito. Hora de conferir o commit pré-whoops:

Quebrei! Destaques da KringleCon 5: Golden Rings PlatoBlockchain Data Intelligence. Pesquisa vertical. Ai.

Excelente, encontrei um .ssh diretório com chaves. Vamos copiar essas chaves e configurar um agente SSH e um usuário Git para ver se posso representar o proprietário dessas chaves:

Quebrei! Destaques da KringleCon 5: Golden Rings PlatoBlockchain Data Intelligence. Pesquisa vertical. Ai.

Agora vamos retornar ao ramo principal e testar se podemos enviar uma alteração trivial ao código-fonte (usando o nano, simplesmente adicionei um espaço a um dos arquivos):

Quebrei! Destaques da KringleCon 5: Golden Rings PlatoBlockchain Data Intelligence. Pesquisa vertical. Ai.

Então, consegui a primeira parte do desafio representando um dos desenvolvedores do WordPress, mas o site ainda funcionou depois do meu push?

Quebrei! Destaques da KringleCon 5: Golden Rings PlatoBlockchain Data Intelligence. Pesquisa vertical. Ai.

Meu push mudou alguma coisa porque agora o site redirecionava para a porta 8080.

Até agora, eu havia ignorado a parte CI/CD do desafio, que deveria ser a chave para completá-lo. O repositório contém um .gitlab-ci.yml arquivo, que fornece a configuração para um pipeline GitLab CI/CD. Toda vez que você envia para o repositório, o sistema CI/CD entra em ação e um GitLab RunnerName executa os scripts neste arquivo YML. Isso é tão bom quanto conseguir a execução remota de código no servidor onde o GitLab Runner está instalado, pensei.

Olhando mais de perto, vi um rsync script copiando todos os arquivos do repositório Git para o diretório no servidor web do qual o site estava sendo servido. No começo, eu tentei usar rsync para reverter o fluxo de dados copiando todos os arquivos do servidor web para o repositório Git, mas sem sucesso.

Depois de muitos testes de hipóteses, finalmente tive meu insight inovador: em vez de tentar “consertar” o site WordPress ou executar scripts maliciosos por meio do sistema de compilação, forneça um site que vaze informações do servidor da web. Lado de dentro index.php (localizado no nível superior do repositório), posso comentar o código que carrega o site WordPress e executar comandos PHP que investigam o servidor web.

Na verdade, posso até executar comandos shell com PHP. eu achei aquilo passar através() trabalhou facilmente.

In index.php, Eu usei // para comentar duas linhas e eu adicionei passthru('ls -la /'); na última linha. Isso cria um site que lista todos os arquivos no diretório raiz do servidor web:

Quebrei! Destaques da KringleCon 5: Golden Rings PlatoBlockchain Data Intelligence. Pesquisa vertical. Ai.

Em seguida, enviei essa alteração para o repositório Git e o sistema GitLab CI/CD cuidou de atualizar o site para mim:

Quebrei! Destaques da KringleCon 5: Golden Rings PlatoBlockchain Data Intelligence. Pesquisa vertical. Ai.

Ah, o Elfen Ring deve estar em bandeira.txt! Repeti os passos anteriores, mas desta vez usando passthru('cat /flag.txt'); revelando o Elfen Ring na próxima vez que solicitei o site:

Quebrei! Destaques da KringleCon 5: Golden Rings PlatoBlockchain Data Intelligence. Pesquisa vertical. Ai.

No terceiro toque.

3. Anel Web

Quebrei! Destaques da KringleCon 5: Golden Rings PlatoBlockchain Data Intelligence. Pesquisa vertical. Ai.

O desafio mais divertido para mim foi Open Boria Mine Door, embora Glamtariel's Fountain fosse interessante ao mesmo tempo em que apresentava enigmas.

Abra a porta da mina de Boria

Em Open Boria Mine Door, fomos presenteados com seis pinos ou mini-desafios para contornar a validação de entrada ou um Política de Segurança de Conteúdo para conectar os tubos de entrada e saída entre os pinos, inclusive combinando as cores dos tubos. Para a maioria dos pinos, usei HTML para escrever uma lista de letras 'o's de conexão. Aqui está minha solução final:

Quebrei! Destaques da KringleCon 5: Golden Rings PlatoBlockchain Data Intelligence. Pesquisa vertical. Ai.

Pino 1

Não houve validação para o Pin 1, então foi uma simples questão de HTML e CSS inline:

Pino 2

O pino 2 tinha uma política de segurança de conteúdo que não permitia JavaScript, mas permitia CSS embutido, então isso não foi problema para o meu método:

Pino 3

O pino 3 tinha uma política de segurança de conteúdo que não permitia CSS, mas permitia JavaScript embutido, então usei JavaScript para alterar os estilos:

Pino 4

O pino 4 não tinha política de segurança de conteúdo, mas tinha uma função higienInput no lado do cliente que retirava aspas duplas, aspas simples, colchetes de ângulo esquerdo e colchetes de ângulo reto. O truque aqui foi perceber que essa função não foi acionada pelo envio do formulário, mas pelo embaçar evento. Em outras palavras, mover o mouse para longe do campo de entrada acionou o embaçar evento, limpando qualquer entrada. A solução foi enviar o formulário pressionando a tecla Entrar tecla, tomando cuidado para não mover o cursor do mouse fora dos limites do campo de entrada:

Pino 5

O pino 5 tinha o mesmo higienizar entrada função e ignorar junto com uma política de segurança de conteúdo que proíbe CSS embutido, mas permite JavaScript embutido:

Pino 6

Por fim, o pino 6 não limpou a entrada, mas usou uma política de segurança de conteúdo mais rígida que proíbe CSS e JavaScript embutidos. Minha solução foi usar HTML obsoleto para obter os estilos necessários e usar uma tabela em vez de uma lista:

Fonte de Glamtariel

Fonte de Glamtariel foi uma oportunidade de praticar Ataques de Entidade Externa XML (XXE). Descobrir como definir uma entidade XML personalizada, definir uma entidade que solicita um arquivo do servidor e adicionar essa entidade como uma carga a uma solicitação HTTP não foi difícil. A parte mais difícil foi descobrir os enigmas do jogo para adivinhar o caminho para os arquivos que o servidor vazaria. Aqui está o pedido de descoberta revelando a localização do anel de ouro:

Quebrei! Destaques da KringleCon 5: Golden Rings PlatoBlockchain Data Intelligence. Pesquisa vertical. Ai.

Quebrei! Destaques da KringleCon 5: Golden Rings PlatoBlockchain Data Intelligence. Pesquisa vertical. Ai.

Quebrei! Destaques da KringleCon 5: Golden Rings PlatoBlockchain Data Intelligence. Pesquisa vertical. Ai.

Gostaria de oferecer duas lições aprendidas com este desafio. Primeiro, use o Conversor de tipo de conteúdo extensão em Arrotar para converter cargas JSON em XML. Em segundo lugar, tente colocar a carga útil XXE em tags diferentes – demorei muito para descobrir que tudo o que eu precisava fazer era colocar o &xxe; carga útil no tipo de pedido tag em vez do imgDrop tag.

No quarto toque.

4. Anel de nuvem

Quebrei! Destaques da KringleCon 5: Golden Rings PlatoBlockchain Data Intelligence. Pesquisa vertical. Ai.

Jogar para o Cloud Ring foi uma incursão de iniciante na interface de linha de comando (CLI) da Amazon Web Services (AWS).

O ponto alto desse conjunto de desafios foi o uso trufado para encontrar as credenciais da AWS em um repositório Git e, em seguida, explorá-las para autenticar como um usuário da AWS. Um atacante que chega a esta posição pode usar aws eu sou comandos para consultar as políticas que se aplicam ao usuário e, portanto, quais ativos da nuvem podem ser acessados ​​e abusados.

No quinto toque.

5. Anel de Fogo Ardente

Quebrei! Destaques da KringleCon 5: Golden Rings PlatoBlockchain Data Intelligence. Pesquisa vertical. Ai.

A parte mais instrutiva desse conjunto de desafios foi aprender sobre Árvores Merkle para explorar um contrato inteligente e entre na lista de pré-venda para adquirir um token não fungível (NFT). Aqui o desafio era descobrir os valores de prova que, juntamente com o endereço da minha carteira e o valor raiz de uma Merkle Tree, comprovavam minha inclusão na lista de pré-venda.

Depois de algumas tentativas malsucedidas de fornecer valores de prova, percebi que nunca seria capaz de descobrir os valores de prova para o valor raiz fornecido porque não havia como saber todos os valores de folha usados ​​para calculá-lo. Eu precisava alterar o valor da raiz para poder fornecer uma Merkle Tree válida.

utilização Ferramenta do Professor QPetabyte, criei uma Merkle Tree a partir de duas folhas que consistem no endereço da minha carteira e no endereço do BSRS_nft contrato inteligente, que encontrei usando o Blockchain Explorer do jogo no bloco dois da blockchain Ethereum do jogo. A ferramenta gerou o valor raiz desta árvore e o valor de prova para o endereço da minha carteira. Em seguida, usei o Burp para interceptar a solicitação ao servidor e alterei o valor padrão da raiz para poder enviar uma Merkle Tree válida. Aqui está o meu esporte NFT comprado a um preço fixo de 100 KringleCoins:

Quebrei! Destaques da KringleCon 5: Golden Rings PlatoBlockchain Data Intelligence. Pesquisa vertical. Ai.

Realmente um espécime feio.

Final

Quebrei! Destaques da KringleCon 5: Golden Rings PlatoBlockchain Data Intelligence. Pesquisa vertical. Ai.

Um grande obrigado aos organizadores do SANS Holiday Hack Challenge por expandir minha mente de novas maneiras e ajudar a aprofundar meu conhecimento sobre segurança cibernética. Não estou apenas ansioso pelo desafio do próximo ano, mas também estarei experimentando as edições de 2020 e 2021 deste desafio. E se você ainda não participou desse desafio, espero que esses destaques tenham despertado seu interesse.

Carimbo de hora:

Mais de Nós Vivemos Segurança